telegram-tt/dist/main.c83c34f25b1293a8eaf4.js.map
2022-09-27 22:02:12 +02:00

1 line
992 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"main.c83c34f25b1293a8eaf4.js","mappings":"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uB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAA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","sources":["webpack://telegram-t/webpack/runtime/create fake namespace object","webpack://telegram-t/webpack/runtime/load script","webpack://telegram-t/webpack/runtime/css loading","webpack://telegram-t/./src/api/gramjs/worker/provider.ts","webpack://telegram-t/./src/api/types/media.ts","webpack://telegram-t/./src/api/types/messages.ts","webpack://telegram-t/./src/components/common/AnimatedIcon.tsx","webpack://telegram-t/./src/components/common/AnimatedSticker.tsx","webpack://telegram-t/./src/lib/punycode.js","webpack://telegram-t/./src/components/common/SafeLink.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/components/common/helpers/documentInfo.ts","webpack://telegram-t/./src/components/common/helpers/parseEmojiOnlyString.ts","webpack://telegram-t/./src/components/common/UserLink.tsx","webpack://telegram-t/./src/components/common/MessageLink.tsx","webpack://telegram-t/./src/components/common/ChatLink.tsx","webpack://telegram-t/./src/components/common/GroupCallLink.tsx","webpack://telegram-t/./src/components/common/helpers/renderActionMessageText.tsx","webpack://telegram-t/./src/components/common/helpers/renderMessageText.ts","webpack://telegram-t/./src/components/common/helpers/renderText.tsx","webpack://telegram-t/./src/components/common/spoiler/Spoiler.tsx","webpack://telegram-t/./src/hooks/useEnsureCustomEmoji.ts","webpack://telegram-t/./src/components/common/hooks/useCustomEmoji.ts","webpack://telegram-t/./src/components/common/CustomEmoji.tsx","webpack://telegram-t/./src/components/common/code/CodeOverlay.module.scss?733a","webpack://telegram-t/./src/components/common/code/CodeOverlay.tsx","webpack://telegram-t/./src/components/common/code/PreBlock.tsx","webpack://telegram-t/./src/components/common/code/CodeBlock.tsx","webpack://telegram-t/./src/components/common/helpers/renderTextWithEntities.tsx","webpack://telegram-t/./src/components/middle/helpers/preventMessageInputBlur.ts","webpack://telegram-t/./src/components/middle/message/MentionLink.tsx","webpack://telegram-t/./src/components/ui/Button.tsx","webpack://telegram-t/./src/components/ui/Checkbox.tsx","webpack://telegram-t/./src/components/ui/DropdownMenu.tsx","webpack://telegram-t/./src/components/ui/InputText.tsx","webpack://telegram-t/./src/components/ui/Link.module.scss?2387","webpack://telegram-t/./src/components/ui/Link.tsx","webpack://telegram-t/./src/components/ui/Loading.tsx","webpack://telegram-t/./src/components/ui/Menu.tsx","webpack://telegram-t/./src/components/ui/MenuItem.tsx","webpack://telegram-t/./src/components/ui/RippleEffect.tsx","webpack://telegram-t/./src/components/ui/Spinner.tsx","webpack://telegram-t/./src/components/ui/Transition.tsx","webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/global/actions/api/initial.ts","webpack://telegram-t/./src/global/actions/api/settings.ts","webpack://telegram-t/./src/global/actions/apiUpdaters/initial.ts","webpack://telegram-t/./src/global/actions/ui/initial.ts","webpack://telegram-t/./src/global/actions/ui/settings.ts","webpack://telegram-t/./src/global/cache.ts","webpack://telegram-t/./src/global/helpers/chats.ts","webpack://telegram-t/./src/global/helpers/messages.ts","webpack://telegram-t/./src/global/helpers/reactions.ts","webpack://telegram-t/./src/global/helpers/messageSummary.ts","webpack://telegram-t/./src/global/helpers/messageMedia.ts","webpack://telegram-t/./src/global/helpers/localSearch.ts","webpack://telegram-t/./src/global/helpers/payments.ts","webpack://telegram-t/./src/global/helpers/bots.ts","webpack://telegram-t/./src/global/helpers/media.ts","webpack://telegram-t/./src/global/helpers/users.ts","webpack://telegram-t/./src/global/index.ts","webpack://telegram-t/./src/global/initialState.ts","webpack://telegram-t/./src/global/reducers/chats.ts","webpack://telegram-t/./src/global/reducers/symbols.ts","webpack://telegram-t/./src/global/reducers/users.ts","webpack://telegram-t/./src/global/reducers/globalSearch.ts","webpack://telegram-t/./src/global/reducers/localSearch.ts","webpack://telegram-t/./src/global/reducers/management.ts","webpack://telegram-t/./src/global/reducers/settings.ts","webpack://telegram-t/./src/global/reducers/twoFaSettings.ts","webpack://telegram-t/./src/global/reducers/passcode.ts","webpack://telegram-t/./src/global/reducers/payments.ts","webpack://telegram-t/./src/global/reducers/statistics.ts","webpack://telegram-t/./src/global/reducers/messages.ts","webpack://telegram-t/./src/global/selectors/chats.ts","webpack://telegram-t/./src/global/selectors/symbols.ts","webpack://telegram-t/./src/global/selectors/messages.ts","webpack://telegram-t/./src/global/selectors/localSearch.ts","webpack://telegram-t/./src/global/selectors/statistics.ts","webpack://telegram-t/./src/global/selectors/management.ts","webpack://telegram-t/./src/global/selectors/ui.ts","webpack://telegram-t/./src/global/selectors/globalSearch.ts","webpack://telegram-t/./src/global/selectors/payments.ts","webpack://telegram-t/./src/global/selectors/settings.ts","webpack://telegram-t/./src/global/selectors/users.ts","webpack://telegram-t/./src/hooks/useAsync.ts","webpack://telegram-t/./src/hooks/useBackgroundMode.ts","webpack://telegram-t/./src/hooks/useCurrentOrPrev.ts","webpack://telegram-t/./src/hooks/useDebouncedCallback.ts","webpack://telegram-t/./src/hooks/useEffectWithPrevDeps.ts","webpack://telegram-t/./src/hooks/useFlag.ts","webpack://telegram-t/./src/hooks/useForceUpdate.ts","webpack://telegram-t/./src/hooks/useHeavyAnimationCheck.ts","webpack://telegram-t/./src/hooks/useHistoryBack.ts","webpack://telegram-t/./src/hooks/useIntersectionObserver.ts","webpack://telegram-t/./src/hooks/useKeyboardListNavigation.ts","webpack://telegram-t/./src/hooks/useLang.ts","webpack://telegram-t/./src/hooks/useMedia.ts","webpack://telegram-t/./src/hooks/useMediaTransition.ts","webpack://telegram-t/./src/hooks/useModuleLoader.ts","webpack://telegram-t/./src/hooks/useOnChange.ts","webpack://telegram-t/./src/hooks/usePrevious.ts","webpack://telegram-t/./src/hooks/useShowTransition.ts","webpack://telegram-t/./src/hooks/useThumbnail.ts","webpack://telegram-t/./src/hooks/useVirtualBackdrop.ts","webpack://telegram-t/./src/hooks/useWindowSize.ts","webpack://telegram-t/./src/lib/teact/dom-events.ts","webpack://telegram-t/./src/lib/teact/teact-dom.ts","webpack://telegram-t/./src/lib/teact/teact.ts","webpack://telegram-t/./src/lib/teact/teactn.tsx","webpack://telegram-t/./src/lib/twemojiRegex.js","webpack://telegram-t/./src/types/index.ts","webpack://telegram-t/./src/util/animation.ts","webpack://telegram-t/./src/util/appBadge.ts","webpack://telegram-t/./src/util/arePropsShallowEqual.ts","webpack://telegram-t/./src/util/buildClassName.ts","webpack://telegram-t/./src/util/buildStyle.ts","webpack://telegram-t/./src/util/cacheApi.ts","webpack://telegram-t/./src/util/callbacks.ts","webpack://telegram-t/./src/util/captureEscKeyListener.ts","webpack://telegram-t/./src/util/captureKeyboardListeners.ts","webpack://telegram-t/./src/util/clipboard.ts","webpack://telegram-t/./src/util/cssAnimationEndListeners.ts","webpack://telegram-t/./src/util/dateFormat.ts","webpack://telegram-t/./src/util/emoji.ts","webpack://telegram-t/./src/util/ensureProtocol.ts","webpack://telegram-t/./src/util/environmentWebp.ts","webpack://telegram-t/./src/util/environmentSystemTheme.ts","webpack://telegram-t/./src/util/environment.ts","webpack://telegram-t/./src/util/files.ts","webpack://telegram-t/./src/util/folderManager.ts","webpack://telegram-t/./src/util/forceReflow.ts","webpack://telegram-t/./src/util/formatCurrency.ts","webpack://telegram-t/./src/util/generateIdFor.ts","webpack://telegram-t/./src/util/getReadableErrorText.ts","webpack://telegram-t/./src/util/handleError.ts","webpack://telegram-t/./src/util/installPrompt.ts","webpack://telegram-t/./src/util/iteratees.ts","webpack://telegram-t/./src/util/langProvider.ts","webpack://telegram-t/./src/util/math.ts","webpack://telegram-t/./src/util/oggToWav.ts","webpack://telegram-t/./src/util/mediaLoader.ts","webpack://telegram-t/./src/util/memo.ts","webpack://telegram-t/./src/util/moduleLoader.ts","webpack://telegram-t/./src/util/notifications.ts","webpack://telegram-t/./src/util/passcode.ts","webpack://telegram-t/./src/util/phoneNumber.ts","webpack://telegram-t/./src/util/routing.ts","webpack://telegram-t/./src/util/safePlay.ts","webpack://telegram-t/./src/util/schedulers.ts","webpack://telegram-t/./src/util/searchWords.ts","webpack://telegram-t/./src/util/serverTime.ts","webpack://telegram-t/./node_modules/idb-keyval/dist/index.js","webpack://telegram-t/./node_modules/safari-14-idb-fix/dist/index.js","webpack://telegram-t/./src/util/sessions.ts","webpack://telegram-t/./src/util/switchTheme.ts","webpack://telegram-t/./src/util/textFormat.ts","webpack://telegram-t/./src/util/trimText.ts","webpack://telegram-t/./src/util/webpToPng.ts","webpack://telegram-t/./src/util/websync.ts","webpack://telegram-t/./src/util/windowSize.ts","webpack://telegram-t/./src/util/withCache.ts","webpack://telegram-t/webpack/bootstrap","webpack://telegram-t/webpack/runtime/compat get default export","webpack://telegram-t/webpack/runtime/define property getters","webpack://telegram-t/webpack/runtime/ensure chunk","webpack://telegram-t/webpack/runtime/get javascript chunk filename","webpack://telegram-t/webpack/runtime/get mini-css chunk filename","webpack://telegram-t/webpack/runtime/global","webpack://telegram-t/webpack/runtime/hasOwnProperty shorthand","webpack://telegram-t/webpack/runtime/make namespace object","webpack://telegram-t/webpack/runtime/publicPath","webpack://telegram-t/webpack/runtime/jsonp chunk loading","webpack://telegram-t/./src/util/setupServiceWorker.ts","webpack://telegram-t/./src/global/init.ts","webpack://telegram-t/./src/util/activeTabMonitor.ts","webpack://telegram-t/./src/util/fonts.ts","webpack://telegram-t/./src/hooks/useLangString.ts","webpack://telegram-t/./src/components/auth/helpers/getSuggestedLanguage.ts","webpack://telegram-t/./src/components/auth/CountryCodeInput.tsx","webpack://telegram-t/./src/components/auth/AuthPhoneNumber.tsx","webpack://telegram-t/./src/components/auth/AuthCode.async.tsx","webpack://telegram-t/./src/components/auth/AuthPassword.async.tsx","webpack://telegram-t/./src/components/auth/AuthRegister.async.tsx","webpack://telegram-t/./src/components/auth/AuthQrCode.tsx","webpack://telegram-t/./src/components/auth/Auth.tsx","webpack://telegram-t/./src/components/main/Main.async.tsx","webpack://telegram-t/./src/components/main/LockScreen.async.tsx","webpack://telegram-t/./src/components/main/AppInactive.tsx","webpack://telegram-t/./src/components/common/UiLoader.module.scss?03f6","webpack://telegram-t/./src/components/common/UiLoader.tsx","webpack://telegram-t/./src/App.tsx","webpack://telegram-t/./src/index.tsx","webpack://telegram-t/./src/util/updateWebmanifest.ts"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"telegram-t:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var createStylesheet = (chunkId, fullhref, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"3041\":1,\"3472\":1,\"3779\":1,\"5769\":1,\"8688\":1,\"8878\":1,\"9954\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","import type { Api } from '../../../lib/gramjs';\nimport type { ApiInitialArgs, ApiOnProgress, OnApiUpdate } from '../../types';\nimport type { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport type { WorkerMessageEvent, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\nimport { pause } from '../../../util/schedulers';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nconst HEALTH_CHECK_TIMEOUT = 150;\nconst HEALTH_CHECK_MIN_DELAY = 5 * 1000; // 5 sec\n\nlet worker: Worker;\nconst requestStates = new Map<string, RequestStates>();\nconst requestStatesByCallback = new Map<AnyToVoidFunction, RequestStates>();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, initialArgs: ApiInitialArgs) {\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(new URL('./worker.ts', import.meta.url));\n subscribeToWorker(onUpdate);\n\n if (initialArgs.platform === 'iOS') {\n setupIosHealthCheck();\n }\n }\n\n return makeRequest({\n type: 'initApi',\n args: [initialArgs],\n });\n}\n\nexport function callApi<T extends keyof Methods>(fnName: T, ...args: MethodArgs<T>) {\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 const promise = makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n });\n\n // Some TypeScript magic to make sure `VirtualClass` is never returned from any method\n if (DEBUG) {\n (async () => {\n try {\n type ForbiddenTypes =\n Api.VirtualClass<any>\n | (Api.VirtualClass<any> | undefined)[];\n type ForbiddenResponses =\n ForbiddenTypes\n | (AnyLiteral & { [k: string]: ForbiddenTypes });\n\n // Unwrap all chained promises\n const response = await promise;\n // Make sure responses do not include `VirtualClass` instances\n const allowedResponse: Exclude<typeof response, ForbiddenResponses> = response;\n // Suppress \"unused variable\" constraint\n void allowedResponse;\n } catch (err) {\n // Do noting\n }\n })();\n }\n\n return promise as MethodResponse<T>;\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 requestStates.get(data.messageId)?.callback?.(...data.callbackArgs);\n } else if (data.type === 'unhandledError') {\n throw new Error(data.error?.message);\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<MethodResponse<keyof Methods>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if ('args' in payload && 'name' in payload && typeof payload.args[1] === 'function') {\n payload.withCallback = true;\n\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\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\nconst startedAt = Date.now();\n\n// Workaround for iOS sometimes stops interacting with worker\nfunction setupIosHealthCheck() {\n window.addEventListener('focus', () => {\n void ensureWorkerPing();\n // Sometimes a single check is not enough\n setTimeout(() => ensureWorkerPing(), 1000);\n });\n}\n\nasync function ensureWorkerPing() {\n let isResolved = false;\n\n try {\n await Promise.race([\n makeRequest({ type: 'ping' }),\n pause(HEALTH_CHECK_TIMEOUT)\n .then(() => (isResolved ? undefined : Promise.reject(new Error('HEALTH_CHECK_TIMEOUT')))),\n ]);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (Date.now() - startedAt >= HEALTH_CHECK_MIN_DELAY) {\n window.location.reload();\n }\n } finally {\n isResolved = true;\n }\n}\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\n\nexport enum ApiMediaFormat {\n BlobUrl,\n Progressive,\n Stream,\n DownloadUrl,\n Text,\n}\n\nexport type ApiParsedMedia = string | Blob | ArrayBuffer;\nexport type ApiPreparedMedia = string;\n","import type { ApiWebDocument } from './bots';\nimport type { ApiGroupCall, PhoneCallAction } from './calls';\nimport type { ApiChat } from './chats';\n\nexport interface ApiDimensions {\n width: number;\n height: number;\n}\n\nexport interface ApiPhotoSize extends ApiDimensions {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n}\n\nexport interface ApiVideoSize extends ApiDimensions {\n type: 'u' | 'v';\n videoStartTs: number;\n size: number;\n}\n\nexport interface ApiThumbnail extends ApiDimensions {\n dataUri: string;\n}\n\nexport interface ApiPhoto {\n id: string;\n thumbnail?: ApiThumbnail;\n isVideo?: boolean;\n sizes: ApiPhotoSize[];\n videoSizes?: ApiVideoSize[];\n blobUrl?: string;\n}\n\nexport interface ApiSticker {\n id: string;\n stickerSetInfo: ApiStickerSetInfo;\n emoji?: string;\n isCustomEmoji?: boolean;\n isLottie: boolean;\n isVideo: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n hasEffect?: boolean;\n isFree?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isLottie?: true;\n isVideos?: true;\n isEmoji?: true;\n installedDate?: number;\n id: string;\n accessHash: string;\n title: string;\n hasThumbnail?: boolean;\n count: number;\n stickers?: ApiSticker[];\n packs?: Record<string, ApiSticker[]>;\n covers?: ApiSticker[];\n shortName: string;\n}\n\ntype ApiStickerSetInfoShortName = {\n shortName: string;\n};\n\ntype ApiStickerSetInfoId = {\n id: string;\n accessHash: string;\n};\n\ntype ApiStickerSetInfoMissing = {\n isMissing: true;\n};\n\nexport type ApiStickerSetInfo = ApiStickerSetInfoShortName | ApiStickerSetInfoId | ApiStickerSetInfoMissing;\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 id: string;\n size: number;\n mimeType: string;\n fileName: string;\n duration: number;\n performer?: string;\n title?: string;\n thumbnailSizes?: ApiPhotoSize[];\n}\n\nexport interface ApiVoice {\n id: string;\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 mediaType?: 'photo' | 'video';\n mediaSize?: ApiDimensions;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: string;\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 isMin?: true;\n results?: ApiPollResult[];\n totalVoters?: number;\n recentVoterIds?: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\n// First type used for state, second - for API requests\nexport type ApiInputInvoice = {\n chatId: string;\n messageId: number;\n} | {\n slug: string;\n};\n\nexport type ApiRequestInputInvoice = {\n chat: ApiChat;\n messageId: number;\n} | {\n slug: string;\n};\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photo?: ApiWebDocument;\n amount: number;\n currency: string;\n receiptMsgId?: number;\n isTest?: boolean;\n isRecurring?: boolean;\n recurringTermsUrl?: string;\n}\n\ninterface ApiGeoPoint {\n long: number;\n lat: number;\n accessHash: string;\n accuracyRadius?: number;\n}\n\ninterface ApiGeo {\n type: 'geo';\n geo: ApiGeoPoint;\n}\n\ninterface ApiVenue {\n type: 'venue';\n geo: ApiGeoPoint;\n title: string;\n address: string;\n provider: string;\n venueId: string;\n venueType: string;\n}\n\ninterface ApiGeoLive {\n type: 'geoLive';\n geo: ApiGeoPoint;\n heading?: number;\n period: number;\n}\n\nexport type ApiLocation = ApiGeo | ApiVenue | ApiGeoLive;\n\nexport type ApiGame = {\n title: string;\n description: string;\n photo?: ApiPhoto;\n shortName: string;\n id: string;\n accessHash: string;\n document?: ApiDocument;\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 targetUserIds?: string[];\n targetChatId?: string;\n type: 'historyClear' | 'contactSignUp' | 'chatCreate' | 'other';\n photo?: ApiPhoto;\n amount?: number;\n currency?: string;\n translationValues: string[];\n call?: Partial<ApiGroupCall>;\n phoneCall?: PhoneCallAction;\n score?: number;\n months?: number;\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n type?: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n duration?: number;\n document?: ApiDocument;\n video?: ApiVideo;\n}\n\nexport interface ApiMessageForwardInfo {\n date: number;\n isChannelPost: boolean;\n channelPostId?: number;\n isLinkedChannelPost?: boolean;\n fromChatId?: string;\n senderUserId?: string;\n fromMessageId?: number;\n hiddenUserName?: string;\n adminTitle?: string;\n}\n\nexport type ApiMessageEntityDefault = {\n type: Exclude<\n `${ApiMessageEntityTypes}`,\n `${ApiMessageEntityTypes.Pre}` | `${ApiMessageEntityTypes.TextUrl}` | `${ApiMessageEntityTypes.MentionName}` |\n `${ApiMessageEntityTypes.CustomEmoji}`\n >;\n offset: number;\n length: number;\n};\n\nexport type ApiMessageEntityPre = {\n type: ApiMessageEntityTypes.Pre;\n offset: number;\n length: number;\n language?: string;\n};\n\nexport type ApiMessageEntityTextUrl = {\n type: ApiMessageEntityTypes.TextUrl;\n offset: number;\n length: number;\n url: string;\n};\n\nexport type ApiMessageEntityMentionName = {\n type: ApiMessageEntityTypes.MentionName;\n offset: number;\n length: number;\n userId: string;\n};\n\nexport type ApiMessageEntityCustomEmoji = {\n type: ApiMessageEntityTypes.CustomEmoji;\n offset: number;\n length: number;\n documentId: string;\n};\n\nexport type ApiMessageEntity = ApiMessageEntityDefault | ApiMessageEntityPre | ApiMessageEntityTextUrl |\nApiMessageEntityMentionName | ApiMessageEntityCustomEmoji;\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 Spoiler = 'MessageEntitySpoiler',\n CustomEmoji = 'MessageEntityCustomEmoji',\n Unknown = 'MessageEntityUnknown',\n}\n\nexport interface ApiFormattedText {\n text: string;\n entities?: ApiMessageEntity[];\n}\n\nexport interface ApiMessage {\n id: number;\n chatId: string;\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 location?: ApiLocation;\n game?: ApiGame;\n };\n date: number;\n isOutgoing: boolean;\n senderId?: string;\n replyToChatId?: string;\n replyToMessageId?: number;\n replyToTopMessageId?: number;\n sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed';\n forwardInfo?: ApiMessageForwardInfo;\n isDeleting?: boolean;\n previousLocalId?: number;\n views?: number;\n forwards?: number;\n isEdited?: boolean;\n editDate?: number;\n isMentioned?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n keyboardPlaceholder?: string;\n isKeyboardSingleUse?: boolean;\n viaBotId?: string;\n threadInfo?: ApiThreadInfo;\n adminTitle?: string;\n isScheduled?: boolean;\n shouldHideKeyboardButtons?: boolean;\n isFromScheduled?: boolean;\n seenByUserIds?: string[];\n isProtected?: boolean;\n transcriptionId?: string;\n isTranscriptionError?: boolean;\n reactors?: {\n nextOffset?: string;\n count: number;\n reactions: ApiUserReaction[];\n };\n reactions?: ApiReactions;\n}\n\nexport interface ApiReactions {\n canSeeList?: boolean;\n results: ApiReactionCount[];\n recentReactions?: ApiUserReaction[];\n}\n\nexport interface ApiUserReaction {\n userId: string;\n reaction: string;\n isBig?: boolean;\n isUnread?: boolean;\n}\n\nexport interface ApiReactionCount {\n isChosen?: boolean;\n count: number;\n reaction: string;\n}\n\nexport interface ApiAvailableReaction {\n selectAnimation?: ApiDocument;\n activateAnimation?: ApiDocument;\n effectAnimation?: ApiDocument;\n staticIcon?: ApiDocument;\n centerIcon?: ApiDocument;\n aroundAnimation?: ApiDocument;\n reaction: string;\n title: string;\n isInactive?: boolean;\n isPremium?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: string;\n topMessageId?: number;\n originChannelId?: string;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: string[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport type ApiSponsoredMessage = {\n chatId?: string;\n randomId: string;\n isRecommended?: boolean;\n isBot?: boolean;\n channelPostId?: number;\n startParam?: string;\n chatInviteHash?: string;\n chatInviteTitle?: string;\n text: ApiFormattedText;\n expiresAt: number;\n};\n\n// KeyboardButtons\n\ninterface ApiKeyboardButtonSimple {\n type: 'unsupported' | 'buy' | 'command' | 'requestPhone' | 'game';\n text: string;\n}\n\ninterface ApiKeyboardButtonReceipt {\n type: 'receipt';\n text: string;\n receiptMessageId: number;\n}\n\ninterface ApiKeyboardButtonUrl {\n type: 'url';\n text: string;\n url: string;\n}\n\ninterface ApiKeyboardButtonSimpleWebView {\n type: 'simpleWebView';\n text: string;\n url: string;\n}\n\ninterface ApiKeyboardButtonWebView {\n type: 'webView';\n text: string;\n url: string;\n}\n\ninterface ApiKeyboardButtonCallback {\n type: 'callback';\n text: string;\n data: string;\n}\n\ninterface ApiKeyboardButtonRequestPoll {\n type: 'requestPoll';\n text: string;\n isQuiz?: boolean;\n}\n\ninterface ApiKeyboardButtonSwitchBotInline {\n type: 'switchBotInline';\n text: string;\n query: string;\n isSamePeer?: boolean;\n}\n\ninterface ApiKeyboardButtonUserProfile {\n type: 'userProfile';\n text: string;\n userId: string;\n}\n\ninterface ApiKeyboardButtonUrlAuth {\n type: 'urlAuth';\n text: string;\n url: string;\n buttonId: number;\n}\n\nexport type ApiTranscription = {\n text: string;\n isPending?: boolean;\n transcriptionId: string;\n};\n\nexport type ApiKeyboardButton = (\n ApiKeyboardButtonSimple\n | ApiKeyboardButtonReceipt\n | ApiKeyboardButtonUrl\n | ApiKeyboardButtonCallback\n | ApiKeyboardButtonRequestPoll\n | ApiKeyboardButtonSwitchBotInline\n | ApiKeyboardButtonUserProfile\n | ApiKeyboardButtonWebView\n | ApiKeyboardButtonSimpleWebView\n | ApiKeyboardButtonUrlAuth\n);\n\nexport type ApiKeyboardButtons = ApiKeyboardButton[][];\nexport type ApiReplyKeyboard = {\n keyboardPlaceholder?: string;\n isKeyboardSingleUse?: boolean;\n} & {\n [K in 'inlineButtons' | 'keyboardButtons']?: ApiKeyboardButtons;\n};\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice' | 'profilePhoto';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport type ApiReportReason = 'spam' | 'violence' | 'pornography' | 'childAbuse'\n| 'copyright' | 'geoIrrelevant' | 'fake' | 'illegalDrugs' | 'personalDetails' | 'other';\n\nexport type ApiSendMessageAction = {\n type: 'cancel' | 'typing' | 'recordAudio' | 'chooseSticker' | 'playingGame';\n};\n\nexport type ApiThemeParameters = {\n bg_color: string;\n text_color: string;\n hint_color: string;\n link_color: string;\n button_color: string;\n button_text_color: string;\n secondary_bg_color: string;\n};\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\n","import React, {\n memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport type { OwnProps as AnimatedStickerProps } from './AnimatedSticker';\n\nimport buildClassName from '../../util/buildClassName';\nimport useMediaTransition from '../../hooks/useMediaTransition';\nimport useFlag from '../../hooks/useFlag';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nconst DEFAULT_SIZE = 150;\n\nexport type OwnProps =\n Partial<AnimatedStickerProps>\n & { noTransition?: boolean; nonInteractive?: boolean };\n\nconst loadedAnimationUrls = new Set();\n\nfunction AnimatedIcon(props: OwnProps) {\n const {\n size = DEFAULT_SIZE,\n play = true,\n noLoop = true,\n className,\n noTransition,\n nonInteractive,\n onLoad,\n onClick,\n ...otherProps\n } = props;\n const { tgsUrl } = props;\n\n const key = `${tgsUrl}_${size}`;\n const [isAnimationLoaded, markAnimationLoaded] = useFlag(loadedAnimationUrls.has(key));\n const transitionClassNames = useMediaTransition(noTransition || isAnimationLoaded);\n\n const handleLoad = useCallback(() => {\n markAnimationLoaded();\n loadedAnimationUrls.add(key);\n\n onLoad?.();\n }, [key, markAnimationLoaded, onLoad]);\n\n const [playKey, setPlayKey] = useState(String(Math.random()));\n\n const handleClick = useCallback(() => {\n if (play === true) {\n setPlayKey(String(Math.random()));\n }\n\n onClick?.();\n }, [onClick, play]);\n\n return (\n <AnimatedSticker\n className={buildClassName(className, transitionClassNames)}\n size={size}\n play={play === true ? playKey : play}\n noLoop={noLoop}\n onClick={!nonInteractive ? handleClick : undefined}\n onLoad={handleLoad}\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n {...otherProps}\n />\n );\n}\n\nexport default memo(AnimatedIcon);\n","import type { RefObject } from 'react';\nimport type { FC } from '../../lib/teact/teact';\n\nimport React, {\n useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport buildStyle from '../../util/buildStyle';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\nexport type OwnProps = {\n ref?: RefObject<HTMLDivElement>;\n className?: string;\n style?: string;\n tgsUrl?: string;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n forceOnHeavyAnimation?: boolean;\n color?: [number, number, number];\n onClick?: NoneToVoidFunction;\n onLoad?: NoneToVoidFunction;\n onEnded?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise<RLottieClass>;\nlet RLottie: RLottieClass;\n\n// Time for the main interface to completely load\nconst LOTTIE_LOAD_DELAY = 3000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise<RLottieClass>;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC<OwnProps> = ({\n ref,\n className,\n style,\n tgsUrl,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n color,\n forceOnHeavyAnimation,\n onClick,\n onLoad,\n onEnded,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef<HTMLDivElement>(null);\n if (ref) {\n containerRef = ref;\n }\n\n const [animation, setAnimation] = useState<RLottieInstance>();\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n const isFirstRender = useRef(true);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !tgsUrl) {\n return;\n }\n\n const exec = () => {\n if (!containerRef.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n containerRef.current,\n tgsUrl,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n color,\n onEnded,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (containerRef.current) {\n exec();\n }\n });\n });\n }\n }, [color, animation, tgsUrl, isLowPriority, noLoop, onLoad, quality, size, speed, onEnded]);\n\n useEffect(() => {\n if (!animation) return;\n\n animation.setColor(color);\n }, [color, animation]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else {\n animation.play(shouldRestart);\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation(noLoop);\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [noLoop, playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useEffect(() => {\n if (animation) {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n } else if (tgsUrl) {\n animation.changeData(tgsUrl);\n playAnimation();\n }\n }\n }, [playAnimation, animation, tgsUrl]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation, forceOnHeavyAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n return (\n <div\n ref={containerRef}\n className={buildClassName('AnimatedSticker', className)}\n style={buildStyle(\n size !== undefined && `width: ${size}px; height: ${size}px;`,\n onClick && 'cursor: pointer',\n style,\n )}\n onClick={onClick}\n />\n );\n};\n\nexport default memo(AnimatedSticker);\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n/* eslint-disable @typescript-eslint/naming-convention */\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 type { FC } from '../../lib/teact/teact';\nimport React, { memo, useCallback } from '../../lib/teact/teact';\nimport { getActions } from '../../global';\nimport convertPunycode from '../../lib/punycode';\n\nimport {\n DEBUG,\n} from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport { ensureProtocol } from '../../util/ensureProtocol';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: React.ReactNode;\n isRtl?: boolean;\n};\n\nconst SafeLink: FC<OwnProps> = ({\n url,\n text,\n className,\n children,\n isRtl,\n}) => {\n const { openUrl } = getActions();\n\n const content = children || text;\n const isSafe = url === content;\n\n const handleClick = useCallback((e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n if (!url) return true;\n e.preventDefault();\n openUrl({ url, shouldSkipModal: isSafe });\n\n return false;\n }, [isSafe, openUrl, 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 <a\n href={ensureProtocol(url)}\n title={getDomain(url)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={classNames}\n onClick={handleClick}\n dir={isRtl ? 'rtl' : 'auto'}\n >\n {content}\n </a>\n );\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.replace(/%%/g, '%25'));\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(SafeLink);\n","import MonkeyIdle from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyIdle.tgs';\nimport MonkeyTracking from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyTracking.tgs';\nimport MonkeyClose from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyClose.tgs';\nimport MonkeyPeek from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyPeek.tgs';\n\nimport FoldersAll from '../../../assets/tgs/settings/FoldersAll.tgs';\nimport FoldersNew from '../../../assets/tgs/settings/FoldersNew.tgs';\nimport DiscussionGroups from '../../../assets/tgs/settings/DiscussionGroupsDucks.tgs';\nimport Lock from '../../../assets/tgs/settings/Lock.tgs';\nimport Congratulations from '../../../assets/tgs/settings/Congratulations.tgs';\nimport Experimental from '../../../assets/tgs/settings/Experimental.tgs';\n\nimport CameraFlip from '../../../assets/tgs/calls/CameraFlip.tgs';\nimport HandFilled from '../../../assets/tgs/calls/HandFilled.tgs';\nimport HandOutline from '../../../assets/tgs/calls/HandOutline.tgs';\nimport Speaker from '../../../assets/tgs/calls/Speaker.tgs';\nimport VoiceAllowTalk from '../../../assets/tgs/calls/VoiceAllowTalk.tgs';\nimport VoiceMini from '../../../assets/tgs/calls/VoiceMini.tgs';\nimport VoiceMuted from '../../../assets/tgs/calls/VoiceMuted.tgs';\nimport VoiceOutlined from '../../../assets/tgs/calls/VoiceOutlined.tgs';\n\nimport Peach from '../../../assets/tgs/animatedEmojis/Peach.tgs';\nimport Eggplant from '../../../assets/tgs/animatedEmojis/Eggplant.tgs';\nimport Cumshot from '../../../assets/tgs/animatedEmojis/Cumshot.tgs';\n\nimport JoinRequest from '../../../assets/tgs/invites/Requests.tgs';\nimport Invite from '../../../assets/tgs/invites/Invite.tgs';\n\nimport QrPlane from '../../../assets/tgs/auth/QrPlane.tgs';\n\nexport const LOCAL_TGS_URLS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n Lock,\n CameraFlip,\n HandFilled,\n HandOutline,\n Speaker,\n VoiceAllowTalk,\n VoiceMini,\n VoiceMuted,\n VoiceOutlined,\n Peach,\n Eggplant,\n Cumshot,\n JoinRequest,\n Invite,\n QrPlane,\n Congratulations,\n Experimental,\n};\n","import type { 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","import 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\nconst parseEmojiOnlyString = (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\nexport default parseEmojiOnlyString;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\n\nimport type { ApiChat, ApiUser } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\nimport { getActions } from '../../global';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: React.ReactNode;\n};\n\nconst UserLink: FC<OwnProps> = ({\n className, sender, children,\n}) => {\n const { openChat } = getActions();\n\n const handleClick = useCallback(() => {\n if (sender) {\n openChat({ id: sender.id });\n }\n }, [sender, openChat]);\n\n if (!sender) {\n return children;\n }\n\n return (\n <Link className={buildClassName('UserLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default UserLink;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\nimport { getActions } from '../../global';\n\nimport type { ApiMessage } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n message?: ApiMessage;\n children: React.ReactNode;\n};\n\nconst MessageLink: FC<OwnProps> = ({\n className, message, children,\n}) => {\n const { focusMessage } = getActions();\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 <Link className={buildClassName('MessageLink', className)} onClick={handleMessageClick}>{children}</Link>\n );\n};\n\nexport default MessageLink;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\nimport { getActions } from '../../global';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n chatId?: string;\n children: React.ReactNode;\n};\n\nconst ChatLink: FC<OwnProps> = ({\n className, chatId, children,\n}) => {\n const { openChat } = getActions();\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 <Link className={buildClassName('ChatLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default ChatLink;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\n\nimport type { ApiGroupCall } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\nimport { getActions } from '../../global';\n\ntype OwnProps = {\n className?: string;\n groupCall?: Partial<ApiGroupCall>;\n children: React.ReactNode;\n};\n\nconst GroupCallLink: FC<OwnProps> = ({\n className, groupCall, children,\n}) => {\n const { joinGroupCall } = getActions();\n\n const handleClick = useCallback(() => {\n if (groupCall) {\n joinGroupCall({ id: groupCall.id, accessHash: groupCall.accessHash });\n }\n }, [groupCall, joinGroupCall]);\n\n if (!groupCall) {\n return children;\n }\n\n return (\n <Link className={buildClassName('GroupCallLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default GroupCallLink;\n","import React from '../../../lib/teact/teact';\n\nimport type {\n ApiChat, ApiMessage, ApiUser, ApiGroupCall,\n} from '../../../api/types';\nimport type { TextPart } from '../../../types';\n\nimport type { LangFn } from '../../../hooks/useLang';\nimport {\n getChatTitle,\n getMessageSummaryText,\n getUserFullName,\n} from '../../../global/helpers';\nimport trimText from '../../../util/trimText';\nimport { formatCurrency } from '../../../util/formatCurrency';\nimport { renderMessageSummary } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\nimport GroupCallLink from '../GroupCallLink';\n\ninterface RenderOptions {\n asPlainText?: boolean;\n asTextWithSpoilers?: boolean;\n}\n\nconst MAX_LENGTH = 32;\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n lang: LangFn,\n message: ApiMessage,\n actionOriginUser?: ApiUser,\n actionOriginChat?: ApiChat,\n targetUsers?: ApiUser[],\n targetMessage?: ApiMessage,\n targetChatId?: string,\n options: RenderOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n\n const {\n text, translationValues, amount, currency, call, score,\n } = message.content.action;\n const content: TextPart[] = [];\n const noLinks = options.asPlainText || options.asTextWithSpoilers;\n const translationKey = text === 'Chat.Service.Group.UpdatedPinnedMessage1' && !targetMessage\n ? 'Message.PinnedGenericMessage'\n : text;\n let unprocessed = lang(translationKey, translationValues?.length ? translationValues : undefined);\n if (translationKey.includes('ScoredInGame')) { // Translation hack for games\n unprocessed = unprocessed.replace('un1', '%action_origin%').replace('un2', '%message%');\n }\n if (translationKey === 'ActionGiftOutbound') { // Translation hack for Premium Gift\n unprocessed = unprocessed.replace('un2', '%gift_payment_amount%').replace(/\\*\\*/g, '');\n }\n if (translationKey === 'ActionGiftInbound') { // Translation hack for Premium Gift\n unprocessed = unprocessed\n .replace('un1', '%action_origin%')\n .replace('un2', '%gift_payment_amount%')\n .replace(/\\*\\*/g, '');\n }\n let processed: TextPart[];\n\n if (unprocessed.includes('%payment_amount%')) {\n processed = processPlaceholder(\n unprocessed,\n '%payment_amount%',\n formatCurrency(amount!, currency!, lang.code),\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n }\n\n processed = processPlaceholder(\n unprocessed,\n '%action_origin%',\n actionOriginUser ? (\n renderUserContent(actionOriginUser, noLinks) || NBSP\n ) : actionOriginChat ? (\n renderChatContent(lang, actionOriginChat, noLinks) || NBSP\n ) : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n if (unprocessed.includes('%gift_payment_amount%')) {\n processed = processPlaceholder(\n unprocessed,\n '%gift_payment_amount%',\n formatCurrency(amount!, currency!, lang.code),\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n }\n\n if (unprocessed.includes('%score%')) {\n processed = processPlaceholder(\n unprocessed,\n '%score%',\n score!.toString(),\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n }\n\n processed = processPlaceholder(\n unprocessed,\n '%target_user%',\n targetUsers\n ? targetUsers.map((user) => renderUserContent(user, noLinks)).filter<TextPart>(Boolean as any)\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(lang, targetMessage, options)\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, noLinks)\n : 'another chat',\n );\n processed.forEach((part) => {\n content.push(...renderText(part));\n });\n\n if (options.asPlainText) {\n return content.join('').trim();\n }\n\n if (call) {\n return renderGroupCallContent(call, content);\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(lang: LangFn, message: ApiMessage, options: RenderOptions = {}) {\n const { asPlainText, asTextWithSpoilers } = options;\n\n if (asPlainText) {\n return getMessageSummaryText(lang, message, undefined, MAX_LENGTH);\n }\n\n const messageSummary = renderMessageSummary(lang, message, undefined, undefined, MAX_LENGTH);\n\n if (asTextWithSpoilers) {\n return (\n <span>{messageSummary}</span>\n );\n }\n\n return (\n <MessageLink className=\"action-link\" message={message}>{messageSummary}</MessageLink>\n );\n}\n\nfunction renderGroupCallContent(groupCall: Partial<ApiGroupCall>, text: TextPart[]): string | TextPart | undefined {\n return (\n <GroupCallLink groupCall={groupCall}>\n {text}\n </GroupCallLink>\n );\n}\n\nfunction renderUserContent(sender: ApiUser, noLinks?: boolean): string | TextPart | undefined {\n const text = trimText(getUserFullName(sender), MAX_LENGTH);\n\n if (noLinks) {\n return text;\n }\n\n return <UserLink className=\"action-link\" sender={sender}>{sender && renderText(text!)}</UserLink>;\n}\n\nfunction renderChatContent(lang: LangFn, chat: ApiChat, noLinks?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(lang, chat), MAX_LENGTH);\n\n if (noLinks) {\n return text;\n }\n\n return <ChatLink className=\"action-link\" chatId={chat.id}>{chat && renderText(text!)}</ChatLink>;\n}\n\nfunction renderMigratedContent(chatId: string, noLinks?: boolean): string | TextPart | undefined {\n const text = 'another chat';\n\n if (noLinks) {\n return text;\n }\n\n return <ChatLink className=\"action-link underlined-link\" chatId={chatId}>{text}</ChatLink>;\n}\n\nfunction processPlaceholder(text: string, placeholder: string, replaceValue?: TextPart | 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 if (Array.isArray(replaceValue)) {\n replaceValue.forEach((value, index) => {\n content.push(value);\n if (index + 1 < replaceValue.length) {\n content.push(', ');\n }\n });\n } else {\n content.push(replaceValue);\n }\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","import type { ApiMessage } from '../../../api/types';\nimport { ApiMessageEntityTypes } from '../../../api/types';\nimport type { TextPart } from '../../../types';\nimport type { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport type { LangFn } from '../../../hooks/useLang';\n\nimport {\n getMessageSummaryDescription,\n getMessageSummaryEmoji,\n getMessageSummaryText,\n getMessageText,\n TRUNCATED_SUMMARY_LENGTH,\n} from '../../../global/helpers';\nimport renderText from './renderText';\nimport { renderTextWithEntities } from './renderTextWithEntities';\nimport trimText from '../../../util/trimText';\n\nexport function renderMessageText(\n message: ApiMessage,\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n isSimple?: boolean,\n truncateLength?: number,\n isProtected?: boolean,\n observeIntersection?: ObserveFn,\n) {\n const { text, entities } = message.content.text || {};\n\n if (!text) {\n const contentNotSupportedText = getMessageText(message);\n return contentNotSupportedText ? [trimText(contentNotSupportedText, truncateLength)] : undefined;\n }\n\n return renderTextWithEntities(\n trimText(text, truncateLength),\n entities,\n highlight,\n shouldRenderHqEmoji,\n undefined,\n message.id,\n isSimple,\n isProtected,\n observeIntersection,\n );\n}\n\nexport function renderMessageSummary(\n lang: LangFn,\n message: ApiMessage,\n noEmoji = false,\n highlight?: string,\n truncateLength = TRUNCATED_SUMMARY_LENGTH,\n observeIntersection?: ObserveFn,\n): TextPart[] {\n const { entities } = message.content.text || {};\n\n const hasSpoilers = entities?.some((e) => e.type === ApiMessageEntityTypes.Spoiler);\n const hasCustomEmoji = entities?.some((e) => e.type === ApiMessageEntityTypes.CustomEmoji);\n if (!hasSpoilers && !hasCustomEmoji) {\n const text = trimText(getMessageSummaryText(lang, message, noEmoji), truncateLength);\n\n if (highlight) {\n return renderText(text, ['emoji', 'highlight'], { highlight });\n } else {\n return renderText(text);\n }\n }\n\n const emoji = !noEmoji && getMessageSummaryEmoji(message);\n const emojiWithSpace = emoji ? `${emoji} ` : '';\n\n const text = renderMessageText(\n message, highlight, undefined, true, truncateLength, undefined, observeIntersection,\n );\n const description = getMessageSummaryDescription(lang, message, text);\n\n return [\n ...renderText(emojiWithSpace),\n ...(Array.isArray(description) ? description : [description]),\n ].filter<TextPart>(Boolean);\n}\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX from '../../../lib/twemojiRegex';\n\nimport type { TextPart } from '../../../types';\n\nimport { RE_LINK_TEMPLATE, RE_MENTION_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport {\n fixNonStandardEmoji,\n handleEmojiLoad,\n LOADED_EMOJIS,\n nativeToUnifiedExtendedWithCache,\n} from '../../../util/emoji';\nimport buildClassName from '../../../util/buildClassName';\nimport { compact } from '../../../util/iteratees';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\nexport type TextFilter = (\n 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' |\n 'simple_markdown' | 'simple_markdown_html'\n );\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<TextFilter> = ['emoji'],\n params?: { highlight: string | undefined },\n): TextPart[] {\n if (typeof part !== 'string') {\n return [part];\n }\n\n return compact(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: TextPart[], part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n divEl.innerText = part;\n result.push(divEl.innerHTML);\n\n return result;\n }, []);\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: TextPart[], part: TextPart) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n part = fixNonStandardEmoji(part);\n const parts = part.split(EMOJI_REGEX);\n const emojis: string[] = part.match(EMOJI_REGEX) || [];\n result.push(parts[0]);\n\n return emojis.reduce((emojiResult: TextPart[], emoji, i) => {\n const code = nativeToUnifiedExtendedWithCache(emoji);\n if (!code) return emojiResult;\n const src = `./img-apple-${size === 'big' ? '160' : '64'}/${code}.png`;\n const className = buildClassName(\n 'emoji',\n size === 'small' && 'emoji-small',\n );\n\n if (type === 'jsx') {\n const isLoaded = LOADED_EMOJIS.has(src);\n\n emojiResult.push(\n <img\n src={src}\n className={`${className}${!isLoaded ? ' opacity-transition slow shown' : ''}`}\n alt={emoji}\n data-path={src}\n onLoad={!isLoaded ? handleEmojiLoad : undefined}\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 `<img draggable=\"false\" class=\"${className}\" src=\"./img-apple-${size === 'big' ? '160' : '64'}/${code}.png\" alt=\"${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: TextPart[], part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n const splittenParts = 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' ? <br /> : '<br />',\n );\n }\n\n return parts;\n }, []);\n\n return [...result, ...splittenParts];\n }, []);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce<TextPart[]>((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n result.push(part);\n return result;\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 result.push(part);\n return result;\n }\n\n const newParts: TextPart[] = [];\n newParts.push(part.substring(0, queryPosition));\n newParts.push(\n <span className=\"matching-text-highlight\">\n {part.substring(queryPosition, queryPosition + highlight.length)}\n </span>,\n );\n newParts.push(part.substring(queryPosition + highlight.length));\n\n return [...result, ...newParts];\n }, []);\n}\n\nconst RE_LINK = new RegExp(`${RE_LINK_TEMPLATE}|${RE_MENTION_TEMPLATE}`, 'ig');\n\nfunction addLinks(textParts: TextPart[]): TextPart[] {\n return textParts.reduce<TextPart[]>((result, part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n const links = part.match(RE_LINK);\n if (!links || !links.length) {\n result.push(part);\n return result;\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 <MentionLink username={nextLink}>\n {nextLink}\n </MentionLink>,\n );\n } else {\n if (nextLink.endsWith('?')) {\n nextLink = nextLink.slice(0, nextLink.length - 1);\n }\n\n content.push(\n <SafeLink text={nextLink} url={nextLink} />,\n );\n }\n lastIndex = index + nextLink.length;\n nextLink = links.shift();\n }\n content.push(part.substring(lastIndex));\n\n return [...result, ...content];\n }, []);\n}\n\nfunction replaceSimpleMarkdown(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce<TextPart[]>((result, part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\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 ? <b>{entity.replace(/\\*\\*/g, '')}</b>\n : <i>{entity.replace(/__/g, '')}</i>,\n );\n } else {\n entityResult.push(\n entity.startsWith('**')\n ? `<b>${entity.replace(/\\*\\*/g, '')}</b>`\n : `<i>${entity.replace(/__/g, '')}</i>`,\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 }, []);\n}\n\nexport function areLinesWrapping(text: string, element: HTMLElement) {\n const lines = (text.trim().match(/\\n/g) || '').length + 1;\n const { lineHeight } = getComputedStyle(element);\n const lineHeightParsed = parseFloat(lineHeight.split('px')[0]);\n\n return element.clientHeight >= (lines + 1) * lineHeightParsed;\n}\n","import type { MouseEvent as ReactMouseEvent } from 'react';\nimport type { FC } from '../../../lib/teact/teact';\nimport React, {\n memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { createClassNameBuilder } from '../../../util/buildClassName';\nimport useFlag from '../../../hooks/useFlag';\n\nimport './Spoiler.scss';\n\ntype OwnProps = {\n children?: React.ReactNode;\n messageId?: number;\n};\n\nconst READING_SYMBOLS_PER_SECOND = 23; // Heuristics\nconst MIN_HIDE_TIMEOUT = 5000; // 5s\nconst MAX_HIDE_TIMEOUT = 60000; // 1m\n\nconst actionsByMessageId: Map<number, {\n reveal: VoidFunction;\n conceal: VoidFunction;\n}[]> = new Map();\n\nconst buildClassName = createClassNameBuilder('Spoiler');\n\nconst Spoiler: FC<OwnProps> = ({\n children,\n messageId,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const contentRef = useRef<HTMLDivElement>(null);\n\n const [isRevealed, reveal, conceal] = useFlag();\n\n const handleClick = useCallback((e: ReactMouseEvent<HTMLDivElement, MouseEvent>) => {\n e.preventDefault();\n e.stopPropagation();\n\n actionsByMessageId.get(messageId!)?.forEach((actions) => actions.reveal());\n\n const contentLength = contentRef.current!.innerText.length;\n const readingMs = Math.round(contentLength / READING_SYMBOLS_PER_SECOND) * 1000;\n const timeoutMs = Math.max(MIN_HIDE_TIMEOUT, Math.min(readingMs, MAX_HIDE_TIMEOUT));\n\n setTimeout(() => {\n actionsByMessageId.get(messageId!)?.forEach((actions) => actions.conceal());\n conceal();\n }, timeoutMs);\n }, [conceal, messageId]);\n\n useEffect(() => {\n if (!messageId) {\n return undefined;\n }\n\n if (actionsByMessageId.has(messageId)) {\n actionsByMessageId.get(messageId)!.push({ reveal, conceal });\n } else {\n actionsByMessageId.set(messageId, [{ reveal, conceal }]);\n }\n\n return () => {\n actionsByMessageId.delete(messageId);\n };\n }, [conceal, handleClick, isRevealed, messageId, reveal]);\n\n return (\n <span\n className={buildClassName(\n '&',\n !isRevealed && 'concealed',\n !isRevealed && Boolean(messageId) && 'animated',\n )}\n onClick={messageId && !isRevealed ? handleClick : undefined}\n >\n <span className={buildClassName('content')} ref={contentRef}>\n {children}\n </span>\n </span>\n );\n};\n\nexport default memo(Spoiler);\n","import { getActions, getGlobal } from '../global';\nimport { throttle } from '../util/schedulers';\n\nconst LOAD_QUEUE = new Set<string>();\nconst RENDER_HISTORY = new Set<string>();\nconst THROTTLE = 200;\n\nconst loadFromQueue = throttle(() => {\n getActions().loadCustomEmojis({\n ids: [...LOAD_QUEUE],\n });\n\n LOAD_QUEUE.clear();\n}, THROTTLE, false);\n\nconst updateLastRendered = throttle(() => {\n getActions().updateLastRenderedCustomEmojis({\n ids: [...RENDER_HISTORY].reverse(),\n });\n\n RENDER_HISTORY.clear();\n}, THROTTLE, false);\n\nexport default function useEnsureCustomEmoji(id: string) {\n RENDER_HISTORY.add(id);\n updateLastRendered();\n\n if (getGlobal().customEmojis.byId[id]) {\n return;\n }\n LOAD_QUEUE.add(id);\n loadFromQueue();\n}\n","import { useCallback, useEffect, useState } from '../../../lib/teact/teact';\nimport { addCallback } from '../../../lib/teact/teactn';\nimport { getGlobal } from '../../../global';\n\nimport type { GlobalState } from '../../../global/types';\nimport type { ApiSticker } from '../../../api/types';\n\nconst handlers = new Set<AnyToVoidFunction>();\n\nlet prevGlobal: GlobalState | undefined;\n\naddCallback((global: GlobalState) => {\n const customEmojiById = global.customEmojis.byId;\n\n if (customEmojiById === prevGlobal?.customEmojis.byId) {\n return;\n }\n\n for (const handler of handlers) {\n handler();\n }\n\n prevGlobal = global;\n});\n\nexport default function useCustomEmoji(documentId: string) {\n const [customEmoji, setCustomEmoji] = useState<ApiSticker | undefined>(getGlobal().customEmojis.byId[documentId]);\n\n const handleGlobalChange = useCallback(() => {\n setCustomEmoji(getGlobal().customEmojis.byId[documentId]);\n }, [documentId]);\n\n useEffect(() => {\n if (!documentId) return;\n handleGlobalChange();\n }, [documentId, handleGlobalChange]);\n\n useEffect(() => {\n if (customEmoji) return undefined;\n handlers.add(handleGlobalChange);\n\n return () => {\n handlers.delete(handleGlobalChange);\n };\n }, [customEmoji, documentId, handleGlobalChange]);\n\n return customEmoji;\n}\n","import React, {\n memo, useEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\n\nimport type { FC, TeactNode } from '../../lib/teact/teact';\nimport type { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { IS_WEBM_SUPPORTED } from '../../util/environment';\nimport renderText from './helpers/renderText';\nimport safePlay from '../../util/safePlay';\n\nimport useMedia from '../../hooks/useMedia';\nimport useEnsureCustomEmoji from '../../hooks/useEnsureCustomEmoji';\nimport { useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useThumbnail from '../../hooks/useThumbnail';\nimport useCustomEmoji from './hooks/useCustomEmoji';\n\nimport AnimatedSticker from './AnimatedSticker';\n\ntype OwnProps = {\n documentId: string;\n children?: TeactNode;\n observeIntersection?: ObserveFn;\n};\n\nconst STICKER_SIZE = 24;\n\nconst CustomEmojiInner: FC<OwnProps> = ({\n documentId,\n children,\n observeIntersection,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef<HTMLDivElement>(null);\n // An alternative to `withGlobal` to avoid adding numerous global containers\n const customEmoji = useCustomEmoji(documentId);\n const mediaHash = customEmoji && `sticker${customEmoji.id}`;\n const mediaData = useMedia(mediaHash);\n const thumbDataUri = useThumbnail(customEmoji);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n useEnsureCustomEmoji(documentId);\n\n useEffect(() => {\n if (!customEmoji?.isVideo) return;\n const video = ref.current?.querySelector('video');\n if (!video || isIntersecting === !video.paused) return;\n\n if (isIntersecting) {\n safePlay(video);\n } else {\n video.pause();\n }\n }, [customEmoji, isIntersecting]);\n\n const content = useMemo(() => {\n if (!customEmoji || (!thumbDataUri && !mediaData)) {\n return (children && renderText(children, ['emoji']));\n }\n if (!mediaData || (customEmoji.isVideo && !IS_WEBM_SUPPORTED)) {\n return (\n <img src={thumbDataUri} alt={customEmoji.emoji} />\n );\n }\n if (!customEmoji.isVideo && !customEmoji.isLottie) {\n return (\n <img src={mediaData} alt={customEmoji.emoji} />\n );\n }\n if (customEmoji.isVideo) {\n return (\n <video\n playsInline\n muted\n autoPlay={isIntersecting}\n loop\n src={mediaData}\n />\n );\n }\n return (\n <AnimatedSticker\n size={STICKER_SIZE}\n tgsUrl={mediaData}\n play={isIntersecting}\n isLowPriority\n />\n );\n }, [children, customEmoji, isIntersecting, mediaData, thumbDataUri]);\n\n return (\n <div ref={ref} className=\"text-entity-custom-emoji emoji\">\n {content}\n </div>\n );\n};\n\nexport default memo(CustomEmojiInner);\n","// extracted by mini-css-extract-plugin\nexport default {\"overlay\":\"SwhO2lEtk47g68_ixpDe\",\"copy\":\"deqdY4TS7mStC8qkslV4\",\"wrap\":\"iEZTJnlmMCct8jJztTx8\",\"wrapOn\":\"B4kEjXkw8Sse9g0Xv_OO\",\"content\":\"d09hp4fxFTuFw1emBUDA\",\"hidden\":\"We_Wcr7YvkkUM8ICjRAs\"};","import type { FC } from '../../../lib/teact/teact';\nimport React, {\n memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getActions } from '../../../global';\n\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport buildClassName from '../../../util/buildClassName';\nimport { areLinesWrapping } from '../helpers/renderText';\n\nimport useWindowSize from '../../../hooks/useWindowSize';\nimport useLang from '../../../hooks/useLang';\n\nimport styles from './CodeOverlay.module.scss';\n\nexport type OwnProps = {\n className?: string;\n text: string;\n noCopy?: boolean;\n onWordWrapToggle?: (wrap: boolean) => void;\n};\n\nconst CodeOverlay: FC<OwnProps> = ({\n text, className, noCopy, onWordWrapToggle,\n}) => {\n const { showNotification } = getActions();\n // eslint-disable-next-line no-null/no-null\n const ref = useRef<HTMLDivElement>(null);\n const windowSize = useWindowSize();\n const lang = useLang();\n const [isWordWrap, setIsWordWrap] = useState(true);\n const [withWordWrapButton, setWithWordWrapButton] = useState(false);\n\n const checkWordWrap = useCallback(() => {\n const isWrap = areLinesWrapping(text, ref.current!.parentElement!);\n setWithWordWrapButton(isWrap);\n }, [text]);\n\n useEffect(() => {\n if (isWordWrap) {\n checkWordWrap();\n }\n }, [checkWordWrap, isWordWrap, text, windowSize]);\n\n const handleCopy = useCallback(() => {\n copyTextToClipboard(text);\n showNotification({\n message: lang('TextCopied'),\n });\n }, [lang, showNotification, text]);\n\n const handleWordWrapClick = useCallback(() => {\n setIsWordWrap(!isWordWrap);\n onWordWrapToggle?.(!isWordWrap);\n }, [isWordWrap, onWordWrapToggle]);\n\n const contentClass = buildClassName(styles.content, !withWordWrapButton && noCopy && styles.hidden);\n const overlayClass = buildClassName(styles.overlay, className);\n const wrapClass = buildClassName(styles.wrap, isWordWrap && styles.wrapOn);\n\n return (\n <div className={overlayClass} ref={ref}>\n <div className={contentClass}>\n {withWordWrapButton && (\n <div className={wrapClass} onClick={handleWordWrapClick} title=\"Word Wrap\">\n <i className=\"icon-word-wrap\" />\n </div>\n )}\n {!noCopy && (\n <div className={styles.copy} onClick={handleCopy} title={lang('Copy')}>\n <i className=\"icon-copy\" />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(CodeOverlay);\n","import type { FC } from '../../../lib/teact/teact';\nimport React, { memo, useCallback, useState } from '../../../lib/teact/teact';\n\nimport buildClassName from '../../../util/buildClassName';\n\nimport CodeOverlay from './CodeOverlay';\n\ntype OwnProps = {\n text: string;\n noCopy?: boolean;\n};\n\nconst PreBlock: FC<OwnProps> = ({ text, noCopy }) => {\n const [isWordWrap, setWordWrap] = useState(true);\n\n const handleWordWrapToggle = useCallback((wrap) => {\n setWordWrap(wrap);\n }, []);\n\n const blockClass = buildClassName('text-entity-pre', !isWordWrap && 'no-word-wrap');\n\n return (\n <pre className={blockClass}>\n <div className=\"pre-code custom-scroll-x\">{text}</div>\n <CodeOverlay\n text={text}\n className=\"code-overlay\"\n onWordWrapToggle={handleWordWrapToggle}\n noCopy={noCopy}\n />\n </pre>\n );\n};\n\nexport default memo(PreBlock);\n","import type { FC } from '../../../lib/teact/teact';\nimport React, { memo, useCallback, useState } from '../../../lib/teact/teact';\n\nimport buildClassName from '../../../util/buildClassName';\n\nimport useAsync from '../../../hooks/useAsync';\n\nimport PreBlock from './PreBlock';\nimport CodeOverlay from './CodeOverlay';\n\nimport './CodeBlock.scss';\n\nexport type OwnProps = {\n text: string;\n language?: string;\n noCopy?: boolean;\n};\n\nconst CodeBlock: FC<OwnProps> = ({ text, language, noCopy }) => {\n const [isWordWrap, setWordWrap] = useState(true);\n\n const { result: highlighted } = useAsync(() => {\n if (!language) return Promise.resolve(undefined);\n return import('../../../util/highlightCode')\n .then((lib) => lib.default(text, language));\n }, [language, text]);\n\n const handleWordWrapToggle = useCallback((wrap) => {\n setWordWrap(wrap);\n }, []);\n\n if (!highlighted) {\n return <PreBlock text={text} noCopy={noCopy} />;\n }\n\n const blockClass = buildClassName('code-block', !isWordWrap && 'no-word-wrap');\n\n return (\n <pre className={blockClass}>\n {highlighted}\n <CodeOverlay\n text={text}\n className=\"code-overlay\"\n onWordWrapToggle={handleWordWrapToggle}\n noCopy={noCopy}\n />\n </pre>\n );\n};\n\nexport default memo(CodeBlock);\n","import React from '../../../lib/teact/teact';\nimport { getActions } from '../../../global';\n\nimport type { TextPart } from '../../../types';\nimport type { ApiFormattedText, ApiMessageEntity } from '../../../api/types';\nimport { ApiMessageEntityTypes } from '../../../api/types';\nimport type { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport type { TextFilter } from './renderText';\n\nimport buildClassName from '../../../util/buildClassName';\nimport renderText from './renderText';\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport { getTranslation } from '../../../util/langProvider';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\nimport Spoiler from '../spoiler/Spoiler';\nimport CustomEmoji from '../CustomEmoji';\nimport CodeBlock from '../code/CodeBlock';\n\ninterface IOrganizedEntity {\n entity: ApiMessageEntity;\n organizedIndexes: Set<number>;\n nestedEntities: IOrganizedEntity[];\n}\n\nexport function renderTextWithEntities(\n text: string,\n entities?: ApiMessageEntity[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n messageId?: number,\n isSimple?: boolean,\n isProtected?: boolean,\n observeIntersection?: ObserveFn,\n) {\n if (!entities || !entities.length) {\n return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple);\n }\n\n const result: TextPart[] = [];\n let deleteLineBreakAfterPre = false;\n\n const organizedEntities = organizeEntities(entities);\n\n // Recursive function to render regular and nested entities\n function renderEntity(\n textPartStart: number,\n textPartEnd: number,\n organizedEntity: IOrganizedEntity,\n isLastEntity: boolean,\n ) {\n const renderResult: TextPart[] = [];\n const { entity, nestedEntities } = organizedEntity;\n const { offset, length, type } = entity;\n\n // Render text before the entity\n let textBefore = text.substring(textPartStart, offset);\n const textBeforeLength = textBefore.length;\n if (textBefore) {\n if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\\n') {\n textBefore = textBefore.substr(1);\n deleteLineBreakAfterPre = false;\n }\n if (textBefore) {\n renderResult.push(...renderMessagePart(\n textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple,\n ) as TextPart[]);\n }\n }\n\n const entityStartIndex = textPartStart + textBeforeLength;\n const entityEndIndex = entityStartIndex + length;\n\n let entityContent: TextPart = text.substring(offset, offset + length);\n const nestedEntityContent: TextPart[] = [];\n\n if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\\n') {\n entityContent = entityContent.substr(1);\n deleteLineBreakAfterPre = false;\n }\n\n if (type === ApiMessageEntityTypes.Pre) {\n deleteLineBreakAfterPre = true;\n }\n\n // Render nested entities, if any\n if (nestedEntities.length) {\n let nestedIndex = entityStartIndex;\n\n nestedEntities.forEach((nestedEntity, nestedEntityIndex) => {\n const {\n renderResult: nestedResult,\n entityEndIndex: nestedEntityEndIndex,\n } = renderEntity(\n nestedIndex,\n entityEndIndex,\n nestedEntity,\n nestedEntityIndex === nestedEntities.length - 1,\n );\n\n nestedEntityContent.push(...nestedResult);\n nestedIndex = nestedEntityEndIndex;\n });\n }\n\n // Render the entity itself\n const newEntity = shouldRenderAsHtml\n ? processEntityAsHtml(entity, entityContent, nestedEntityContent)\n : processEntity(\n entity, entityContent, nestedEntityContent, highlight, messageId, isSimple, isProtected, observeIntersection,\n );\n\n if (Array.isArray(newEntity)) {\n renderResult.push(...newEntity);\n } else {\n renderResult.push(newEntity);\n }\n\n // Render text after the entity, if it is the last entity in the text,\n // or the last nested entity inside of another entity\n if (isLastEntity && entityEndIndex < textPartEnd) {\n let textAfter = text.substring(entityEndIndex, textPartEnd);\n if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\\n') {\n textAfter = textAfter.substring(1);\n }\n if (textAfter) {\n renderResult.push(...renderMessagePart(\n textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple,\n ) as TextPart[]);\n }\n }\n\n return {\n renderResult,\n entityEndIndex,\n };\n }\n\n // Process highest-level entities\n let index = 0;\n\n organizedEntities.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntities.length - 1,\n );\n\n result.push(...renderResult);\n index = entityEndIndex;\n });\n\n return result;\n}\n\nexport function getTextWithEntitiesAsHtml(formattedText?: ApiFormattedText) {\n const { text, entities } = formattedText || {};\n if (!text) {\n return '';\n }\n\n const result = renderTextWithEntities(\n text,\n entities,\n undefined,\n undefined,\n true,\n );\n\n if (Array.isArray(result)) {\n return result.join('');\n }\n\n return result;\n}\n\nfunction renderMessagePart(\n content: TextPart | TextPart[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n isSimple?: boolean,\n) {\n if (Array.isArray(content)) {\n const result: TextPart[] = [];\n\n content.forEach((c) => {\n result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple));\n });\n\n return result;\n }\n\n if (shouldRenderAsHtml) {\n return renderText(content, ['escape_html', 'emoji_html', 'br_html']);\n }\n\n const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji';\n\n const filters: TextFilter[] = [emojiFilter];\n if (!isSimple) {\n filters.push('br');\n }\n\n if (highlight) {\n return renderText(content, filters.concat('highlight'), { highlight });\n } else {\n return renderText(content, filters);\n }\n}\n\n// Organize entities in a tree-like structure to better represent how the text will be displayed\nfunction organizeEntities(entities: ApiMessageEntity[]) {\n const organizedEntityIndexes: Set<number> = new Set();\n const organizedEntities: IOrganizedEntity[] = [];\n\n entities.forEach((entity, index) => {\n if (organizedEntityIndexes.has(index)) {\n return;\n }\n\n const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes);\n if (organizedEntity) {\n organizedEntity.organizedIndexes.forEach((organizedIndex) => {\n organizedEntityIndexes.add(organizedIndex);\n });\n\n organizedEntities.push(organizedEntity);\n }\n });\n\n return organizedEntities;\n}\n\nfunction organizeEntity(\n entity: ApiMessageEntity,\n index: number,\n entities: ApiMessageEntity[],\n organizedEntityIndexes: Set<number>,\n): IOrganizedEntity | undefined {\n const { offset, length } = entity;\n const organizedIndexes = new Set([index]);\n\n if (organizedEntityIndexes.has(index)) {\n return undefined;\n }\n\n // Determine any nested entities inside current entity\n const nestedEntities: IOrganizedEntity[] = [];\n const parsedNestedEntities = entities\n .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length)\n .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes))\n .filter<IOrganizedEntity>(Boolean as any);\n\n parsedNestedEntities.forEach((parsedEntity) => {\n let isChanged = false;\n\n parsedEntity.organizedIndexes.forEach((organizedIndex) => {\n if (!isChanged && !organizedIndexes.has(organizedIndex)) {\n isChanged = true;\n }\n\n organizedIndexes.add(organizedIndex);\n });\n\n if (isChanged) {\n nestedEntities.push(parsedEntity);\n }\n });\n\n return {\n entity,\n organizedIndexes,\n nestedEntities,\n };\n}\n\nfunction processEntity(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n highlight?: string,\n messageId?: number,\n isSimple?: boolean,\n isProtected?: boolean,\n observeIntersection?: ObserveFn,\n) {\n const entityText = typeof entityContent === 'string' && entityContent;\n const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent;\n\n function renderNestedMessagePart() {\n return renderMessagePart(\n renderedContent, highlight, undefined, undefined, isSimple,\n );\n }\n\n if (!entityText) {\n return renderNestedMessagePart();\n }\n\n if (isSimple) {\n const text = renderNestedMessagePart();\n if (entity.type === ApiMessageEntityTypes.Spoiler) {\n return <Spoiler>{text}</Spoiler>;\n }\n\n if (entity.type === ApiMessageEntityTypes.CustomEmoji) {\n return (\n <CustomEmoji documentId={entity.documentId} observeIntersection={observeIntersection}>\n {renderNestedMessagePart()}\n </CustomEmoji>\n );\n }\n return text;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return <strong>{renderNestedMessagePart()}</strong>;\n case ApiMessageEntityTypes.Blockquote:\n return <blockquote>{renderNestedMessagePart()}</blockquote>;\n case ApiMessageEntityTypes.BotCommand:\n return (\n <a\n onClick={handleBotCommandClick}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Hashtag:\n return (\n <a\n onClick={handleHashtagClick}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Cashtag:\n return (\n <a\n onClick={handleHashtagClick}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Code:\n return (\n <code\n className={buildClassName('text-entity-code', !isProtected && 'clickable')}\n onClick={!isProtected ? handleCodeClick : undefined}\n role=\"textbox\"\n tabIndex={0}\n >\n {renderNestedMessagePart()}\n </code>\n );\n case ApiMessageEntityTypes.Email:\n return (\n <a\n href={`mailto:${entityText}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Italic:\n return <em>{renderNestedMessagePart()}</em>;\n case ApiMessageEntityTypes.MentionName:\n return (\n <MentionLink userId={entity.userId}>\n {renderNestedMessagePart()}\n </MentionLink>\n );\n case ApiMessageEntityTypes.Mention:\n return (\n <MentionLink username={entityText}>\n {renderNestedMessagePart()}\n </MentionLink>\n );\n case ApiMessageEntityTypes.Phone:\n return (\n <a\n href={`tel:${entityText}`}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Pre:\n return <CodeBlock text={entityText} language={entity.language} noCopy={isProtected} />;\n case ApiMessageEntityTypes.Strike:\n return <del>{renderNestedMessagePart()}</del>;\n case ApiMessageEntityTypes.TextUrl:\n case ApiMessageEntityTypes.Url:\n return (\n <SafeLink\n url={getLinkUrl(entityText, entity)}\n text={entityText}\n >\n {renderNestedMessagePart()}\n </SafeLink>\n );\n case ApiMessageEntityTypes.Underline:\n return <ins>{renderNestedMessagePart()}</ins>;\n case ApiMessageEntityTypes.Spoiler:\n return <Spoiler messageId={messageId}>{renderNestedMessagePart()}</Spoiler>;\n case ApiMessageEntityTypes.CustomEmoji:\n return (\n <CustomEmoji documentId={entity.documentId} observeIntersection={observeIntersection}>\n {renderNestedMessagePart()}\n </CustomEmoji>\n );\n default:\n return renderNestedMessagePart();\n }\n}\n\nfunction processEntityAsHtml(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const rawEntityText = typeof entityContent === 'string' ? entityContent : undefined;\n\n // Prevent adding newlines when editing\n const content = entity.type === ApiMessageEntityTypes.Pre ? (entityContent as string).trimEnd() : entityContent;\n\n const renderedContent = nestedEntityContent.length\n ? nestedEntityContent.join('')\n : renderText(content, ['escape_html', 'emoji_html', 'br_html']).join('');\n\n if (!rawEntityText) {\n return renderedContent;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return `<b>${renderedContent}</b>`;\n case ApiMessageEntityTypes.Italic:\n return `<i>${renderedContent}</i>`;\n case ApiMessageEntityTypes.Underline:\n return `<u>${renderedContent}</u>`;\n case ApiMessageEntityTypes.Code:\n return `<code class=\"text-entity-code\">${renderedContent}</code>`;\n case ApiMessageEntityTypes.Pre:\n return `\\`\\`\\`${entity.language || ''}<br/>${renderedContent}<br/>\\`\\`\\`<br/>`;\n case ApiMessageEntityTypes.Strike:\n return `<del>${renderedContent}</del>`;\n case ApiMessageEntityTypes.MentionName:\n return `<a\n class=\"text-entity-link\"\n data-entity-type=\"${ApiMessageEntityTypes.MentionName}\"\n data-user-id=\"${entity.userId}\"\n contenteditable=\"false\"\n dir=\"auto\"\n >${renderedContent}</a>`;\n case ApiMessageEntityTypes.Url:\n case ApiMessageEntityTypes.TextUrl:\n return `<a\n class=\"text-entity-link\"\n href=${getLinkUrl(rawEntityText, entity)}\n data-entity-type=\"${entity.type}\"\n dir=\"auto\"\n >${renderedContent}</a>`;\n case ApiMessageEntityTypes.Spoiler:\n return `<span\n class=\"spoiler\"\n data-entity-type=\"${ApiMessageEntityTypes.Spoiler}\"\n >${renderedContent}</span>`;\n default:\n return renderedContent;\n }\n}\n\nfunction getLinkUrl(entityContent: string, entity: ApiMessageEntity) {\n const { type } = entity;\n return type === ApiMessageEntityTypes.TextUrl && entity.url ? entity.url : entityContent;\n}\n\nfunction handleBotCommandClick(e: React.MouseEvent<HTMLAnchorElement>) {\n getActions().sendBotCommand({ command: e.currentTarget.innerText });\n}\n\nfunction handleHashtagClick(e: React.MouseEvent<HTMLAnchorElement>) {\n getActions().setLocalTextSearchQuery({ query: e.currentTarget.innerText });\n getActions().searchTextMessagesLocal();\n}\n\nfunction handleCodeClick(e: React.MouseEvent<HTMLElement>) {\n copyTextToClipboard(e.currentTarget.innerText);\n getActions().showNotification({\n message: getTranslation('TextCopied'),\n });\n}\n","import type React from '../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { IS_IOS } from '../../../util/environment';\n\nexport function preventMessageInputBlur(e: React.MouseEvent<HTMLElement>, withBubbling = false) {\n if (\n IS_IOS\n || !document.activeElement\n || document.activeElement.id !== EDITABLE_INPUT_ID\n || (!withBubbling && e.target !== e.currentTarget)\n ) {\n return;\n }\n\n e.preventDefault();\n}\n\nexport function preventMessageInputBlurWithBubbling(e: React.MouseEvent<HTMLElement>) {\n preventMessageInputBlur(e, true);\n}\n","import type { FC } from '../../../lib/teact/teact';\nimport React from '../../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../../global';\n\nimport type { ApiChat, ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../global/selectors';\n\ntype OwnProps = {\n userId?: string;\n username?: string;\n children: React.ReactNode;\n};\n\ntype StateProps = {\n userOrChat?: ApiUser | ApiChat;\n};\n\nconst MentionLink: FC<OwnProps & StateProps> = ({\n username,\n userOrChat,\n children,\n}) => {\n const {\n openChat,\n openChatByUsername,\n } = getActions();\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 <a onClick={handleClick} className=\"text-entity-link\" dir=\"auto\">\n {children}\n </a>\n );\n};\n\nexport default withGlobal<OwnProps>(\n (global, { userId }): StateProps => {\n return {\n userOrChat: userId ? selectUser(global, userId) : undefined,\n };\n },\n)(MentionLink);\n","import type { MouseEvent as ReactMouseEvent, RefObject } from 'react';\n\nimport type { FC } from '../../lib/teact/teact';\nimport React, { useRef, useCallback, useState } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport buildStyle from '../../util/buildStyle';\n\nimport Spinner from './Spinner';\nimport RippleEffect from './RippleEffect';\n\nimport './Button.scss';\n\nexport type OwnProps = {\n ref?: RefObject<HTMLButtonElement | HTMLAnchorElement>;\n type?: 'button' | 'submit' | 'reset';\n children: React.ReactNode;\n size?: 'default' | 'smaller' | 'tiny';\n color?: (\n 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'translucent-black' | 'dark'\n );\n backgroundImage?: string;\n id?: string;\n className?: string;\n round?: boolean;\n pill?: boolean;\n fluid?: boolean;\n isText?: boolean;\n isLoading?: boolean;\n ariaLabel?: string;\n ariaControls?: string;\n hasPopup?: boolean;\n href?: string;\n download?: string;\n disabled?: boolean;\n allowDisabledClick?: boolean;\n ripple?: boolean;\n faded?: boolean;\n tabIndex?: number;\n isRtl?: boolean;\n isShiny?: boolean;\n withPremiumGradient?: boolean;\n noPreventDefault?: boolean;\n shouldStopPropagation?: boolean;\n style?: string;\n onClick?: (e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => void;\n onContextMenu?: (e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => void;\n onMouseDown?: (e: ReactMouseEvent<HTMLButtonElement>) => void;\n onMouseEnter?: NoneToVoidFunction;\n onMouseLeave?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n};\n\n// Longest animation duration;\nconst CLICKED_TIMEOUT = 400;\n\nconst Button: FC<OwnProps> = ({\n ref,\n type = 'button',\n id,\n onClick,\n onContextMenu,\n onMouseDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n children,\n size = 'default',\n color = 'primary',\n backgroundImage,\n className,\n round,\n pill,\n fluid,\n isText,\n isLoading,\n isShiny,\n withPremiumGradient,\n ariaLabel,\n ariaControls,\n hasPopup,\n href,\n download,\n disabled,\n allowDisabledClick,\n ripple,\n faded,\n tabIndex,\n isRtl,\n noPreventDefault,\n shouldStopPropagation,\n style,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef<HTMLButtonElement | HTMLAnchorElement>(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 allowDisabledClick && 'click-allowed',\n isText && 'text',\n isLoading && 'loading',\n ripple && 'has-ripple',\n faded && 'faded',\n isClicked && 'clicked',\n backgroundImage && 'with-image',\n isShiny && 'shiny',\n withPremiumGradient && 'premium',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => {\n if ((allowDisabledClick || !disabled) && onClick) {\n onClick(e);\n }\n\n if (shouldStopPropagation) e.stopPropagation();\n\n setIsClicked(true);\n setTimeout(() => {\n setIsClicked(false);\n }, CLICKED_TIMEOUT);\n }, [allowDisabledClick, disabled, onClick, shouldStopPropagation]);\n\n const handleMouseDown = useCallback((e: ReactMouseEvent<HTMLButtonElement>) => {\n if (!noPreventDefault) e.preventDefault();\n\n if ((allowDisabledClick || !disabled) && onMouseDown) {\n onMouseDown(e);\n }\n }, [allowDisabledClick, disabled, noPreventDefault, onMouseDown]);\n\n if (href) {\n return (\n <a\n ref={elementRef as RefObject<HTMLAnchorElement>}\n id={id}\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n aria-label={ariaLabel}\n aria-controls={ariaControls}\n style={style}\n >\n {children}\n {!disabled && ripple && (\n <RippleEffect />\n )}\n </a>\n );\n }\n\n return (\n <button\n ref={elementRef as RefObject<HTMLButtonElement>}\n id={id}\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 aria-controls={ariaControls}\n aria-haspopup={hasPopup}\n title={ariaLabel}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n style={buildStyle(backgroundImage && `background-image: url(${backgroundImage})`)}\n >\n {isLoading ? (\n <div>\n <span dir={isRtl ? 'auto' : undefined}>Please wait...</span>\n <Spinner color={isText ? 'blue' : 'white'} />\n </div>\n ) : children}\n {!disabled && ripple && (\n <RippleEffect />\n )}\n </button>\n );\n};\n\nexport default Button;\n","import type { ChangeEvent } from 'react';\nimport type { FC, TeactNode } from '../../lib/teact/teact';\nimport React, { memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\n\nimport Spinner from './Spinner';\n\nimport './Checkbox.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: TeactNode;\n subLabel?: string;\n checked: boolean;\n disabled?: boolean;\n tabIndex?: number;\n round?: boolean;\n blocking?: boolean;\n isLoading?: boolean;\n withCheckedCallback?: boolean;\n className?: string;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Checkbox: FC<OwnProps> = ({\n id,\n name,\n value,\n label,\n subLabel,\n checked,\n tabIndex,\n disabled,\n round,\n blocking,\n isLoading,\n className,\n onChange,\n onCheck,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const labelClassName = buildClassName(\n 'Checkbox',\n disabled && 'disabled',\n round && 'round',\n isLoading && 'loading',\n blocking && 'blocking',\n className,\n );\n\n return (\n <label className={labelClassName} dir={lang.isRtl ? 'rtl' : undefined}>\n <input\n type=\"checkbox\"\n id={id}\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n tabIndex={tabIndex}\n onChange={handleChange}\n />\n <div className=\"Checkbox-main\">\n <span className=\"label\" dir=\"auto\">{typeof label === 'string' ? renderText(label) : label}</span>\n {subLabel && <span className=\"subLabel\" dir=\"auto\">{renderText(subLabel)}</span>}\n </div>\n {isLoading && <Spinner />}\n </label>\n );\n};\n\nexport default memo(Checkbox);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useState, useRef, useCallback } 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 forceOpen?: boolean;\n onOpen?: NoneToVoidFunction;\n onClose?: NoneToVoidFunction;\n children: React.ReactNode;\n};\n\nconst DropdownMenu: FC<OwnProps> = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n forceOpen,\n onOpen,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef<HTMLDivElement>(null);\n // eslint-disable-next-line no-null/no-null\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const toggleIsOpen = () => {\n setIsOpen(!isOpen);\n if (isOpen) {\n if (onClose) onClose();\n } else if (onOpen) onOpen();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<any>) => {\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 = useCallback(() => {\n setIsOpen(false);\n if (onClose) onClose();\n }, [onClose]);\n\n return (\n <div\n ref={dropdownRef}\n className={`DropdownMenu ${className || ''}`}\n onKeyDown={handleKeyDown}\n >\n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n <Menu\n ref={menuRef}\n containerRef={dropdownRef}\n isOpen={isOpen || Boolean(forceOpen)}\n className={className || ''}\n positionX={positionX}\n positionY={positionY}\n footer={footer}\n autoClose\n onClose={handleClose}\n shouldSkipTransition={forceOpen}\n >\n {children}\n </Menu>\n </div>\n );\n};\n\nexport default DropdownMenu;\n","import type {\n ChangeEvent, FormEvent, RefObject,\n} from 'react';\nimport type { FC } from '../../lib/teact/teact';\nimport React, { memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\ntype OwnProps = {\n ref?: RefObject<HTMLInputElement>;\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 tabIndex?: number;\n teactExperimentControlled?: boolean;\n inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n onInput?: (e: FormEvent<HTMLInputElement>) => void;\n onKeyPress?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onPaste?: (e: React.ClipboardEvent<HTMLInputElement>) => void;\n};\n\nconst InputText: FC<OwnProps> = ({\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 tabIndex,\n teactExperimentControlled,\n onChange,\n onInput,\n onKeyPress,\n onKeyDown,\n onBlur,\n onPaste,\n}) => {\n const lang = useLang();\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 <div className={fullClassName} dir={lang.isRtl ? 'rtl' : undefined}>\n <input\n ref={ref}\n className=\"form-control\"\n type=\"text\"\n id={id}\n dir=\"auto\"\n value={value || ''}\n tabIndex={tabIndex}\n placeholder={placeholder}\n maxLength={maxLength}\n autoComplete={autoComplete}\n inputMode={inputMode}\n disabled={disabled}\n readOnly={readOnly}\n onChange={onChange}\n onInput={onInput}\n onKeyPress={onKeyPress}\n onKeyDown={onKeyDown}\n onBlur={onBlur}\n onPaste={onPaste}\n aria-label={labelText}\n teactExperimentControlled={teactExperimentControlled}\n />\n {labelText && (\n <label htmlFor={id}>{labelText}</label>\n )}\n </div>\n );\n};\n\nexport default memo(InputText);\n","// extracted by mini-css-extract-plugin\nexport default {\"link\":\"h_qmZuKBrM7SWOEcmH68\",\"isPrimary\":\"iZ_WxIDQyqM2SOYqu4Y8\"};","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport styles from './Link.module.scss';\n\ntype OwnProps = {\n children: React.ReactNode;\n className?: string;\n isRtl?: boolean;\n isPrimary?: boolean;\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n};\n\nconst Link: FC<OwnProps> = ({\n children, isPrimary, className, isRtl, onClick,\n}) => {\n const handleClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n onClick!(e);\n }, [onClick]);\n\n return (\n <a\n href=\"#\"\n className={buildClassName(styles.link, className, isPrimary && styles.isPrimary)}\n dir={isRtl ? 'rtl' : 'auto'}\n onClick={onClick ? handleClick : undefined}\n >\n {children}\n </a>\n );\n};\n\nexport default Link;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\nimport buildClassName from '../../util/buildClassName';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black' | 'yellow';\n backgroundColor?: 'light' | 'dark';\n onClick?: NoneToVoidFunction;\n};\n\nconst Loading: FC<OwnProps> = ({ color = 'blue', backgroundColor, onClick }) => {\n return (\n <div className={buildClassName('Loading', onClick && 'interactive')} onClick={onClick}>\n <Spinner color={color} backgroundColor={backgroundColor} />\n </div>\n );\n};\n\nexport default memo(Loading);\n","import type { RefObject } from 'react';\nimport type { FC } from '../../lib/teact/teact';\nimport React, { 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 buildStyle from '../../util/buildStyle';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';\nimport { IS_BACKDROP_BLUR_SUPPORTED, IS_COMPACT_MENU } from '../../util/environment';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject<HTMLDivElement>;\n containerRef?: RefObject<HTMLElement>;\n isOpen: boolean;\n id?: string;\n className?: string;\n style?: string;\n bubbleStyle?: string;\n ariaLabelledBy?: string;\n transformOriginX?: number;\n transformOriginY?: number;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n shouldSkipTransition?: boolean;\n footer?: string;\n noCloseOnBackdrop?: boolean;\n noCompact?: boolean;\n onKeyDown?: (e: React.KeyboardEvent<any>) => void;\n onCloseAnimationEnd?: () => void;\n onClose: () => void;\n onMouseEnter?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n onMouseLeave?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n children: React.ReactNode;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Menu: FC<OwnProps> = ({\n ref,\n containerRef,\n isOpen,\n id,\n className,\n style,\n bubbleStyle,\n ariaLabelledBy,\n children,\n transformOriginX,\n transformOriginY,\n positionX = 'left',\n positionY = 'top',\n autoClose = false,\n footer,\n noCloseOnBackdrop = false,\n noCompact,\n onCloseAnimationEnd,\n onClose,\n onMouseEnter,\n onMouseLeave,\n shouldSkipTransition,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let menuRef = useRef<HTMLDivElement>(null);\n if (ref) {\n menuRef = ref;\n }\n const backdropContainerRef = containerRef || menuRef;\n\n const {\n transitionClassNames,\n } = useShowTransition(\n isOpen,\n onCloseAnimationEnd,\n shouldSkipTransition,\n undefined,\n shouldSkipTransition,\n );\n\n useEffect(\n () => (isOpen ? captureEscKeyListener(onClose) : undefined),\n [isOpen, onClose],\n );\n\n useHistoryBack({\n isActive: isOpen,\n onBack: onClose,\n shouldBeReplaced: true,\n });\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n if (isOpen || (!isOpen && prevIsOpen === true)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n }, [isOpen]);\n\n const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined, undefined, true);\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 const transformOriginYStyle = transformOriginY !== undefined ? `${transformOriginY}px` : undefined;\n const transformOriginXStyle = transformOriginX !== undefined ? `${transformOriginX}px` : undefined;\n\n return (\n <div\n id={id}\n className={buildClassName(\n 'Menu no-selection',\n !noCompact && IS_COMPACT_MENU && 'compact',\n !IS_BACKDROP_BLUR_SUPPORTED && 'no-blur',\n className,\n )}\n style={style}\n aria-labelledby={ariaLabelledBy}\n role={ariaLabelledBy ? 'menu' : undefined}\n onKeyDown={isOpen ? handleKeyDown : undefined}\n onMouseEnter={onMouseEnter}\n onMouseLeave={isOpen ? onMouseLeave : undefined}\n >\n {isOpen && (\n // This only prevents click events triggering on underlying elements\n <div className=\"backdrop\" onMouseDown={preventMessageInputBlurWithBubbling} />\n )}\n <div\n role=\"presentation\"\n ref={menuRef}\n className={bubbleClassName}\n style={buildStyle(\n `transform-origin: ${transformOriginXStyle || positionX} ${transformOriginYStyle || positionY}`,\n bubbleStyle,\n )}\n onClick={autoClose ? onClose : undefined}\n >\n {children}\n {footer && <div className=\"footer\">{footer}</div>}\n </div>\n </div>\n );\n};\n\nexport default Menu;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\n\nimport { IS_TEST } from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\nimport { IS_COMPACT_MENU } from '../../util/environment';\n\nimport './MenuItem.scss';\n\ntype OnClickHandler = (e: React.SyntheticEvent<HTMLDivElement | HTMLAnchorElement>) => void;\n\ntype OwnProps = {\n icon?: string;\n customIcon?: React.ReactNode;\n className?: string;\n children: React.ReactNode;\n onClick?: OnClickHandler;\n onContextMenu?: (e: React.UIEvent) => void;\n href?: string;\n download?: string;\n disabled?: boolean;\n destructive?: boolean;\n ariaLabel?: string;\n withWrap?: boolean;\n};\n\nconst MenuItem: FC<OwnProps> = (props) => {\n const {\n icon,\n customIcon,\n className,\n children,\n onClick,\n href,\n download,\n disabled,\n destructive,\n ariaLabel,\n withWrap,\n onContextMenu,\n } = props;\n\n const lang = useLang();\n const handleClick = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\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<HTMLDivElement>) => {\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 IS_COMPACT_MENU && 'compact',\n withWrap && 'wrap',\n );\n\n const content = (\n <>\n {!customIcon && icon && (\n <i className={`icon-${icon}`} data-char={icon.startsWith('char-') ? icon.replace('char-', '') : undefined} />\n )}\n {customIcon}\n {children}\n </>\n );\n\n if (href) {\n return (\n <a\n tabIndex={0}\n className={fullClassName}\n href={href}\n download={download}\n aria-label={ariaLabel}\n title={ariaLabel}\n target={href.startsWith(window.location.origin) || IS_TEST ? '_self' : '_blank'}\n rel=\"noopener noreferrer\"\n dir={lang.isRtl ? 'rtl' : undefined}\n onClick={onClick}\n >\n {content}\n </a>\n );\n }\n\n return (\n <div\n role=\"menuitem\"\n tabIndex={0}\n className={fullClassName}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onContextMenu={onContextMenu}\n aria-label={ariaLabel}\n title={ariaLabel}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n {content}\n </div>\n );\n};\n\nexport default MenuItem;\n","import type { FC } from '../../lib/teact/teact';\nimport React, {\n 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<Ripple[]>([]);\n\n const cleanUpDebounced = useMemo(() => {\n return debounce(() => {\n setRipples([]);\n }, ANIMATION_DURATION_MS, false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent<HTMLDivElement, 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 <div className=\"ripple-container\" onMouseDown={handleMouseDown}>\n {ripples.map(({ x, y, size }) => (\n <span\n style={`left: ${x}px; top: ${y}px; width: ${size}px; height: ${size}px;`}\n />\n ))}\n </div>\n );\n};\n\nexport default memo(RippleEffect);\n","import type { FC } from '../../lib/teact/teact';\nimport React 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' | 'yellow';\n backgroundColor?: 'light' | 'dark';\n}> = ({\n color = 'blue',\n backgroundColor,\n}) => {\n return (\n <div className={buildClassName('Spinner', color, backgroundColor && 'with-background', `bg-${backgroundColor}`)}>\n <div />\n </div>\n );\n};\n\nexport default Spinner;\n","import type { RefObject } from 'react';\nimport type { FC } from '../../lib/teact/teact';\nimport React, { useLayoutEffect, useRef } from '../../lib/teact/teact';\nimport { getGlobal } from '../../global';\nimport type { GlobalState } from '../../global/types';\n\nimport { ANIMATION_LEVEL_MIN } from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport forceReflow from '../../util/forceReflow';\nimport { waitForAnimationEnd, waitForTransitionEnd } from '../../util/cssAnimationEndListeners';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Transition.scss';\n\nexport type ChildrenFn = (isActive: boolean, isFrom: boolean, currentKey: number) => React.ReactNode;\nexport type TransitionProps = {\n ref?: RefObject<HTMLDivElement>;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'slide-rtl' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'slide-layers'\n | 'fade' | 'push-slide' | 'reveal' | 'slide-optimized' | 'slide-optimized-rtl'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n cleanupExceptionKey?: number;\n isDisabled?: boolean;\n id?: string;\n className?: string;\n onStart?: NoneToVoidFunction;\n onStop?: NoneToVoidFunction;\n children: React.ReactNode | ChildrenFn;\n};\n\nconst classNames = {\n active: 'Transition__slide--active',\n};\n\nconst Transition: FC<TransitionProps> = ({\n ref,\n activeKey,\n name,\n direction = 'auto',\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\n id,\n className,\n onStart,\n onStop,\n children,\n}) => {\n // No need for a container to update on change\n const { animationLevel } = getGlobal().settings.byKey;\n const currentKeyRef = useRef<number>();\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef<HTMLDivElement>(null);\n if (ref) {\n containerRef = ref;\n }\n\n const rendersRef = useRef<Record<number, React.ReactNode | ChildrenFn>>({});\n const prevActiveKey = usePrevious<any>(activeKey);\n const forceUpdate = useForceUpdate();\n\n const activeKeyChanged = prevActiveKey !== undefined && activeKey !== prevActiveKey;\n\n if (!renderCount && activeKeyChanged) {\n rendersRef.current = { [prevActiveKey]: rendersRef.current[prevActiveKey] };\n }\n\n rendersRef.current[activeKey] = children;\n\n useLayoutEffect(() => {\n function cleanup() {\n if (!shouldCleanup) {\n return;\n }\n\n const preservedRender = cleanupExceptionKey !== undefined ? rendersRef.current[cleanupExceptionKey] : undefined;\n\n rendersRef.current = preservedRender ? { [cleanupExceptionKey!]: preservedRender } : {};\n\n forceUpdate();\n }\n\n const container = containerRef.current!;\n\n const childElements = container.children;\n if (childElements.length === 1 && !activeKeyChanged) {\n if (name.startsWith('slide-optimized')) {\n (childElements[0] as HTMLElement).style.transition = 'none';\n (childElements[0] as HTMLElement).style.transform = 'translate3d(0, 0, 0)';\n }\n\n childElements[0].classList.add(classNames.active);\n\n return;\n }\n\n const childNodes = Array.from(container.childNodes);\n\n if (!activeKeyChanged || !childNodes.length) {\n return;\n }\n\n currentKeyRef.current = activeKey;\n\n const isBackwards = (\n direction === -1\n || (direction === 'auto' && prevActiveKey > activeKey)\n || (direction === 'inverse' && prevActiveKey < activeKey)\n );\n\n const keys = Object.keys(rendersRef.current).map(Number);\n const prevActiveIndex = renderCount ? prevActiveKey : keys.indexOf(prevActiveKey);\n const activeIndex = renderCount ? activeKey : keys.indexOf(activeKey);\n\n if (name === 'slide-optimized' || name === 'slide-optimized-rtl') {\n performSlideOptimized(\n animationLevel,\n name,\n isBackwards,\n cleanup,\n activeKey,\n currentKeyRef,\n container,\n shouldRestoreHeight,\n onStart,\n onStop,\n childNodes[activeIndex] as HTMLElement,\n childNodes[prevActiveIndex] as HTMLElement,\n );\n\n return;\n }\n\n container.classList.remove('animating');\n container.classList.toggle('backwards', isBackwards);\n\n if (name === 'none' || animationLevel === ANIMATION_LEVEL_MIN) {\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle(classNames.active, i === activeIndex);\n }\n });\n\n cleanup();\n\n return;\n }\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove(classNames.active);\n node.classList.toggle('from', i === prevActiveIndex);\n node.classList.toggle('through', (\n (i > prevActiveIndex && i < activeIndex) || (i < prevActiveIndex && i > activeIndex)\n ));\n node.classList.toggle('to', i === activeIndex);\n }\n });\n\n const dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n onStart?.();\n\n function onAnimationEnd() {\n requestAnimationFrame(() => {\n if (activeKey !== currentKeyRef.current) {\n return;\n }\n\n container.classList.remove('animating', 'backwards');\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle(classNames.active, i === activeIndex);\n }\n });\n\n if (shouldRestoreHeight) {\n const activeElement = container.querySelector<HTMLDivElement>(`.${classNames.active}`);\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n\n onStop?.();\n dispatchHeavyAnimationStop();\n cleanup();\n });\n }\n\n const watchedNode = name === 'mv-slide'\n ? childNodes[activeIndex]?.firstChild\n : name === 'reveal' && isBackwards\n ? childNodes[prevActiveIndex]\n : childNodes[activeIndex];\n\n if (watchedNode) {\n waitForAnimationEnd(watchedNode, onAnimationEnd);\n } else {\n onAnimationEnd();\n }\n });\n }, [\n activeKey,\n prevActiveKey,\n activeKeyChanged,\n direction,\n name,\n onStart,\n onStop,\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\n animationLevel,\n forceUpdate,\n ]);\n\n useLayoutEffect(() => {\n if (shouldRestoreHeight) {\n const container = containerRef.current!;\n const activeElement = container.querySelector<HTMLDivElement>(`.${classNames.active}`)\n || container.querySelector<HTMLDivElement>('.from');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n container.style.flexBasis = `${activeElement.clientHeight}px`;\n }\n }\n }, [shouldRestoreHeight, children]);\n\n const renders = rendersRef.current;\n const renderKeys = Object.keys(renderCount ? new Array(renderCount).fill(undefined) : renders).map(Number);\n const contents = renderKeys.map((key) => {\n const render = renders[key];\n if (!render) {\n return undefined;\n }\n\n return (\n <div key={key} teactOrderKey={key}>{\n typeof render === 'function'\n ? render(key === activeKey, key === prevActiveKey, activeKey)\n : render\n }\n </div>\n );\n });\n\n return (\n <div\n ref={containerRef}\n id={id}\n className={buildClassName('Transition', className, name)}\n teactFastList={!renderCount}\n >\n {contents}\n </div>\n );\n};\n\nexport default Transition;\n\nfunction performSlideOptimized(\n animationLevel: GlobalState['settings']['byKey']['animationLevel'],\n name: 'slide-optimized' | 'slide-optimized-rtl',\n isBackwards: boolean,\n cleanup: NoneToVoidFunction,\n activeKey: number,\n currentKeyRef: { current: number | undefined },\n container: HTMLElement,\n shouldRestoreHeight?: boolean,\n onStart?: NoneToVoidFunction,\n onStop?: NoneToVoidFunction,\n toSlide?: HTMLElement,\n fromSlide?: HTMLElement,\n) {\n if (!fromSlide || !toSlide) {\n return;\n }\n\n if (animationLevel === ANIMATION_LEVEL_MIN) {\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = '';\n fromSlide.classList.remove(classNames.active);\n\n toSlide.style.transition = 'none';\n toSlide.style.transform = 'translate3d(0, 0, 0)';\n toSlide.classList.add(classNames.active);\n\n cleanup();\n\n return;\n }\n\n if (name === 'slide-optimized-rtl') {\n isBackwards = !isBackwards;\n }\n\n const dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n requestAnimationFrame(() => {\n onStart?.();\n\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = 'translate3d(0, 0, 0)';\n\n toSlide.style.transition = 'none';\n toSlide.style.transform = `translate3d(${isBackwards ? '-' : ''}100%, 0, 0)`;\n\n forceReflow(toSlide);\n\n fromSlide.style.transition = '';\n fromSlide.style.transform = `translate3d(${isBackwards ? '' : '-'}100%, 0, 0)`;\n\n toSlide.style.transition = '';\n toSlide.style.transform = 'translate3d(0, 0, 0)';\n\n fromSlide.classList.remove(classNames.active);\n toSlide.classList.add(classNames.active);\n\n waitForTransitionEnd(fromSlide, () => {\n if (activeKey !== currentKeyRef.current) {\n return;\n }\n\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = '';\n\n if (shouldRestoreHeight) {\n toSlide.style.height = 'auto';\n container.style.height = `${toSlide.clientHeight}px`;\n }\n\n onStop?.();\n dispatchHeavyAnimationStop();\n cleanup();\n });\n });\n}\n","import type { ApiLimitType } from './global/types';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION!;\nexport const RELEASE_DATETIME = process.env.RELEASE_DATETIME;\n\nexport const PRODUCTION_HOSTNAME = 'web.telegram.org';\n\nexport const DEBUG = process.env.APP_ENV !== 'production';\nexport const DEBUG_MORE = false;\n\nexport const IS_MOCKED_CLIENT = process.env.APP_MOCKED_CLIENT === '1';\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\nexport const IS_BETA = process.env.APP_ENV === 'staging';\n\nexport const BETA_CHANGELOG_URL = 'https://telegra.ph/WebZ-Beta-04-01';\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 PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const DEBUG_PAYMENT_SMART_GLOCAL = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\nexport const PASSCODE_CACHE_NAME = 'tt-passcode';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 500;\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 200;\nexport const GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_CUSTOM_EMOJI_LIMIT = 150;\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-v13';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\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_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;\nexport const COMMON_CHATS_LIMIT = 100;\nexport const GROUP_CALL_PARTICIPANTS_LIMIT = 100;\nexport const REACTION_LIST_LIMIT = 100;\nexport const REACTION_UNREAD_SLICE = 100;\nexport const MENTION_UNREAD_SLICE = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\nexport const PLAYBACK_RATE_FOR_AUDIO_MIN_DURATION = 20 * 60; // 20 min\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;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n// eslint-disable-next-line max-len\nexport const EDITABLE_INPUT_CSS_SELECTOR = `.messages-layout .Transition__slide--active #${EDITABLE_INPUT_ID}, .messages-layout .Transition > .to #${EDITABLE_INPUT_ID}`;\n\nexport const CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\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 MAX_SCREEN_WIDTH_FOR_EXPAND_PINNED_MESSAGES = 1340; // 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_MIN_ID = 1e11; // `Date.now()` is always used as base\nexport const TMP_CHAT_ID = '0';\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const LOCK_SCREEN_ANIMATION_DURATION_MS = 200;\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 EMOJI_SIZE_PICKER = 40;\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 EMOJI_SIZE_MODAL = 40;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_PASSCODE = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 100;\nexport const STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const STICKER_SIZE_JOIN_REQUESTS = 140;\nexport const STICKER_SIZE_INVITES = 140;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const RECENT_SYMBOL_SET_ID = 'recent';\nexport const FAVORITE_SYMBOL_SET_ID = 'favorite';\nexport const CHAT_STICKER_SET_ID = 'chatStickers';\nexport const PREMIUM_STICKER_SET_ID = 'premium';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const VIDEO_MOV_TYPE = 'video/quicktime';\nexport const VIDEO_WEBM_TYPE = 'video/webm';\n\nexport const SUPPORTED_IMAGE_CONTENT_TYPES = new Set([\n 'image/png', 'image/gif', 'image/jpeg',\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', // video/quicktime added dynamically in environment.ts\n]);\n\nexport const SUPPORTED_AUDIO_CONTENT_TYPES = new Set([\n 'audio/mp3',\n 'audio/ogg',\n 'audio/wav',\n 'audio/mpeg',\n 'audio/flac',\n 'audio/aac',\n 'audio/m4a',\n 'audio/mp4',\n 'audio/x-m4a',\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_IMAGE_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\n\nexport const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram.';\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,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?/;\nexport const RE_TME_LINK = /^(https?:\\/\\/)?([-a-zA-Z0-9@:%_+~#=]{1,32}\\.)?t\\.me/;\nexport const RE_TELEGRAM_LINK = /^(https?:\\/\\/)?telegram\\.org\\//;\nexport const TME_LINK_PREFIX = 'https://t.me/';\n\n// eslint-disable-next-line max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\nexport const API_CHAT_TYPES = ['bots', 'channels', 'chats', 'users'] as const;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\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_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\n\nexport const LIGHT_THEME_BG_COLOR = '#99BA92';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DEFAULT_PATTERN_COLOR = '#4A8E3A8C';\nexport const DARK_THEME_PATTERN_COLOR = '#0A0A0A8C';\nexport const MAX_UPLOAD_FILEPART_SIZE = 524288;\n\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\nexport const GROUP_CALL_THUMB_VIDEO_DISABLED = true;\n\nexport const DEFAULT_LIMITS: Record<ApiLimitType, readonly [number, number]> = {\n uploadMaxFileparts: [4000, 8000],\n stickersFaved: [5, 10],\n savedGifs: [200, 400],\n dialogFiltersChats: [100, 200],\n dialogFilters: [10, 20],\n dialogFolderPinned: [5, 10],\n captionLength: [1024, 2048],\n channels: [500, 1000],\n channelsPublic: [10, 20],\n aboutLength: [70, 140],\n};\n","import {\n addActionHandler, getActions, getGlobal, setGlobal,\n} from '../../index';\n\nimport { initApi, callApi } from '../../../api/gramjs';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n IS_TEST,\n LOCK_SCREEN_ANIMATION_DURATION_MS,\n} from '../../../config';\nimport {\n IS_MOV_SUPPORTED, IS_WEBM_SUPPORTED, MAX_BUFFER_SIZE, PLATFORM_ENV,\n} from '../../../util/environment';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n storeSession,\n loadStoredSession,\n clearStoredSession,\n importLegacySession,\n clearLegacySessions,\n} from '../../../util/sessions';\nimport { forceWebsync } from '../../../util/websync';\nimport { clearGlobalForLockScreen, updatePasscodeSettings } from '../../reducers';\nimport { clearEncryptedSession, encryptSession, forgetPasscode } from '../../../util/passcode';\nimport { serializeGlobal } from '../../cache';\n\naddActionHandler('initApi', async (global, actions) => {\n if (!IS_TEST) {\n await importLegacySession();\n void clearLegacySessions();\n }\n\n void initApi(actions.apiUpdate, {\n userAgent: navigator.userAgent,\n platform: PLATFORM_ENV,\n sessionData: loadStoredSession(),\n isTest: window.location.search.includes('test'),\n isMovSupported: IS_MOV_SUPPORTED,\n isWebmSupported: IS_WEBM_SUPPORTED,\n maxBufferSize: MAX_BUFFER_SIZE,\n });\n});\n\naddActionHandler('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber.replace(/[^\\d]/g, ''));\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddActionHandler('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\naddActionHandler('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\naddActionHandler('uploadProfilePhoto', (global, actions, payload) => {\n const { file } = payload!;\n\n void callApi('uploadProfilePhoto', file);\n});\n\naddActionHandler('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\naddActionHandler('returnToAuthPhoneNumber', (global) => {\n void callApi('restartAuth');\n\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddActionHandler('goToAuthQrCode', (global) => {\n void callApi('restartAuthWithQr');\n\n return {\n ...global,\n authIsLoadingQrCode: true,\n authError: undefined,\n };\n});\n\naddActionHandler('saveSession', (global, actions, payload) => {\n if (global.passcode.isScreenLocked) {\n return;\n }\n\n const { sessionData } = payload;\n if (sessionData) {\n storeSession(payload.sessionData, global.currentUserId);\n } else {\n clearStoredSession();\n }\n});\n\naddActionHandler('signOut', async (_global, actions, payload) => {\n if ('hangUp' in actions) actions.hangUp();\n if ('leaveGroupCall' in actions) actions.leaveGroupCall();\n\n try {\n await unsubscribe();\n await callApi('destroy');\n await forceWebsync(false);\n } catch (err) {\n // Do nothing\n }\n\n getActions().reset();\n\n if (payload?.forceInitApi) {\n getActions().initApi();\n }\n});\n\naddActionHandler('reset', () => {\n clearStoredSession();\n clearEncryptedSession();\n\n void cacheApi.clear(MEDIA_CACHE_NAME);\n void cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n void cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n void cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n\n const langCachePrefix = LANG_CACHE_NAME.replace(/\\d+$/, '');\n const langCacheVersion = (LANG_CACHE_NAME.match(/\\d+$/) || [0])[0];\n for (let i = 0; i < langCacheVersion; i++) {\n void cacheApi.clear(`${langCachePrefix}${i === 0 ? '' : i}`);\n }\n\n void clearLegacySessions();\n\n updateAppBadge(0);\n\n getActions().init();\n});\n\naddActionHandler('disconnect', () => {\n void callApi('disconnect');\n});\n\naddActionHandler('loadNearestCountry', async (global) => {\n if (global.connectionState !== 'connectionStateReady') {\n return;\n }\n\n const authNearestCountry = await callApi('fetchNearestCountry');\n\n setGlobal({\n ...getGlobal(),\n authNearestCountry,\n });\n});\n\naddActionHandler('setDeviceToken', (global, actions, deviceToken) => {\n return {\n ...global,\n push: {\n deviceToken,\n subscribedAt: Date.now(),\n },\n };\n});\n\naddActionHandler('deleteDeviceToken', (global) => {\n return {\n ...global,\n push: undefined,\n };\n});\n\naddActionHandler('lockScreen', async (global) => {\n const sessionJson = JSON.stringify({ ...loadStoredSession(), userId: global.currentUserId });\n const globalJson = serializeGlobal(global);\n\n await encryptSession(sessionJson, globalJson);\n forgetPasscode();\n clearStoredSession();\n updateAppBadge(0);\n\n global = getGlobal();\n setGlobal(updatePasscodeSettings(\n global,\n {\n isScreenLocked: true,\n invalidAttemptsCount: 0,\n },\n ));\n\n setTimeout(() => {\n setGlobal(clearGlobalForLockScreen(getGlobal()));\n }, LOCK_SCREEN_ANIMATION_DURATION_MS);\n\n try {\n await unsubscribe();\n await callApi('destroy', true);\n } catch (err) {\n // Do nothing\n }\n});\n","import { addActionHandler, getGlobal, setGlobal } from '../../index';\n\nimport type { GlobalState } from '../../types';\nimport type {\n ApiPrivacyKey, PrivacyVisibility, InputPrivacyRules, InputPrivacyContact,\n} from '../../../types';\nimport {\n ProfileEditProgress,\n UPLOADING_WALLPAPER_SLUG,\n} from '../../../types';\n\nimport { COUNTRIES_WITH_12H_TIME_FORMAT } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { subscribe, unsubscribe } from '../../../util/notifications';\nimport { setTimeFormat } from '../../../util/langProvider';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n addNotifyExceptions,\n} from '../../reducers';\nimport { isUserId } from '../../helpers';\n\naddActionHandler('updateProfile', async (global, actions, payload) => {\n const {\n photo, firstName, lastName, bio: about, username,\n } = payload!;\n\n const { currentUserId } = global;\n if (!currentUserId) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.InProgress,\n },\n });\n\n if (photo) {\n await callApi('updateProfilePhoto', photo);\n }\n\n if (firstName || lastName || about) {\n const result = await callApi('updateProfile', { firstName, lastName, about });\n if (result) {\n global = getGlobal();\n const currentUser = currentUserId && selectUser(global, currentUserId);\n\n if (currentUser) {\n setGlobal(updateUser(\n global,\n currentUser.id,\n {\n firstName,\n lastName,\n fullInfo: {\n ...currentUser.fullInfo,\n bio: about,\n },\n },\n ));\n }\n }\n }\n\n if (username) {\n const result = await callApi('updateUsername', username);\n if (result && currentUserId) {\n setGlobal(updateUser(getGlobal(), currentUserId, { username }));\n }\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.Complete,\n },\n });\n});\n\naddActionHandler('checkUsername', async (global, actions, payload) => {\n const { username } = payload!;\n\n // No need to check the username if profile update is already in progress\n if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) {\n return;\n }\n\n setGlobal({\n ...global,\n profileEdit: {\n progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle,\n isUsernameAvailable: undefined,\n },\n });\n\n const isUsernameAvailable = await callApi('checkUsername', username);\n\n global = getGlobal();\n setGlobal({\n ...global,\n profileEdit: {\n ...global.profileEdit!,\n isUsernameAvailable,\n },\n });\n});\n\naddActionHandler('loadWallpapers', async () => {\n const result = await callApi('fetchWallpapers');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: result.wallpapers,\n },\n });\n});\n\naddActionHandler('uploadWallpaper', async (global, actions, payload) => {\n const file = payload;\n const previewBlobUrl = URL.createObjectURL(file);\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n {\n slug: UPLOADING_WALLPAPER_SLUG,\n document: {\n fileName: '',\n size: file.size,\n mimeType: file.type,\n previewBlobUrl,\n },\n },\n ...(global.settings.loadedWallpapers || []),\n ],\n },\n });\n\n const result = await callApi('uploadWallpaper', file);\n if (!result) {\n return;\n }\n\n const { wallpaper } = result;\n\n global = getGlobal();\n if (!global.settings.loadedWallpapers) {\n return;\n }\n\n const firstWallpaper = global.settings.loadedWallpapers[0];\n if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) {\n return;\n }\n\n const withLocalMedia = {\n ...wallpaper,\n document: {\n ...wallpaper.document,\n previewBlobUrl,\n },\n };\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n withLocalMedia,\n ...global.settings.loadedWallpapers.slice(1),\n ],\n },\n });\n});\n\naddActionHandler('loadBlockedContacts', async (global) => {\n const result = await callApi('fetchBlockedContacts');\n if (!result) {\n return;\n }\n\n global = getGlobal();\n\n if (result.users?.length) {\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n }\n if (result.chats?.length) {\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n }\n\n global = {\n ...global,\n blocked: {\n ...global.blocked,\n ids: [...(global.blocked.ids || []), ...result.blockedIds],\n totalCount: result.totalCount,\n },\n };\n\n setGlobal(global);\n});\n\naddActionHandler('blockContact', async (global, actions, payload) => {\n const { contactId, accessHash } = payload!;\n\n const result = await callApi('blockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n setGlobal(addBlockedContact(getGlobal(), contactId));\n});\n\naddActionHandler('unblockContact', async (global, actions, payload) => {\n const { contactId } = payload!;\n let accessHash: string | undefined;\n const isPrivate = isUserId(contactId);\n\n if (isPrivate) {\n const user = selectUser(global, contactId);\n if (!user) {\n return;\n }\n\n accessHash = user.accessHash;\n }\n\n const result = await callApi('unblockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n setGlobal(removeBlockedContact(getGlobal(), contactId));\n});\n\naddActionHandler('loadNotificationExceptions', async (global) => {\n const { serverTimeOffset } = global;\n\n const result = await callApi('fetchNotificationExceptions', { serverTimeOffset });\n if (!result) {\n return;\n }\n\n setGlobal(addNotifyExceptions(getGlobal(), result));\n});\n\naddActionHandler('loadNotificationSettings', async (global) => {\n const { serverTimeOffset } = global;\n const result = await callApi('fetchNotificationSettings', {\n serverTimeOffset,\n });\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n});\n\naddActionHandler('updateNotificationSettings', async (global, actions, payload) => {\n const { peerType, isSilent, shouldShowPreviews } = payload!;\n\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, shouldShowPreviews });\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, shouldShowPreviews));\n});\n\naddActionHandler('updateWebNotificationSettings', (global, actions, payload) => {\n setGlobal(replaceSettings(global, payload));\n\n const { hasPushNotifications, hasWebNotifications } = global.settings.byKey;\n if (hasWebNotifications && hasPushNotifications) {\n void subscribe();\n } else {\n void unsubscribe();\n }\n});\n\naddActionHandler('updateContactSignUpNotification', async (global, actions, payload) => {\n const { isSilent } = payload!;\n\n const result = await callApi('updateContactSignUpNotification', isSilent);\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent }));\n});\n\naddActionHandler('loadLanguages', async () => {\n const result = await callApi('fetchLanguages');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { languages: result }));\n});\n\naddActionHandler('loadPrivacySettings', async (global) => {\n const [\n phoneNumberSettings,\n lastSeenSettings,\n profilePhotoSettings,\n forwardsSettings,\n chatInviteSettings,\n phoneCallSettings,\n phoneP2PSettings,\n voiceMessagesSettings,\n ] = await Promise.all([\n callApi('fetchPrivacySettings', 'phoneNumber'),\n callApi('fetchPrivacySettings', 'lastSeen'),\n callApi('fetchPrivacySettings', 'profilePhoto'),\n callApi('fetchPrivacySettings', 'forwards'),\n callApi('fetchPrivacySettings', 'chatInvite'),\n callApi('fetchPrivacySettings', 'phoneCall'),\n callApi('fetchPrivacySettings', 'phoneP2P'),\n callApi('fetchPrivacySettings', 'voiceMessages'),\n ]);\n\n if (\n !phoneNumberSettings\n || !lastSeenSettings\n || !profilePhotoSettings\n || !forwardsSettings\n || !chatInviteSettings\n || !phoneCallSettings\n || !phoneP2PSettings\n || !voiceMessagesSettings\n ) {\n return;\n }\n\n global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n privacy: {\n ...global.settings.privacy,\n phoneNumber: phoneNumberSettings,\n lastSeen: lastSeenSettings,\n profilePhoto: profilePhotoSettings,\n forwards: forwardsSettings,\n chatInvite: chatInviteSettings,\n phoneCall: phoneCallSettings,\n phoneP2P: phoneP2PSettings,\n voiceMessages: voiceMessagesSettings,\n },\n },\n });\n});\n\naddActionHandler('setPrivacyVisibility', async (global, actions, payload) => {\n const { privacyKey, visibility } = payload!;\n\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility,\n allowedIds: [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n if (!result) {\n return;\n }\n\n global = getGlobal();\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n privacy: {\n ...global.settings.privacy,\n [privacyKey]: result,\n },\n },\n });\n});\n\naddActionHandler('setPrivacySettings', async (global, actions, payload) => {\n const { privacyKey, isAllowList, contactsIds } = payload!;\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility: settings.visibility,\n allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n if (!result) {\n return;\n }\n\n global = getGlobal();\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n privacy: {\n ...global.settings.privacy,\n [privacyKey]: result,\n },\n },\n });\n});\n\nfunction buildInputPrivacyRules(global: GlobalState, {\n visibility,\n allowedIds,\n deniedIds,\n}: {\n visibility: PrivacyVisibility;\n allowedIds: string[];\n deniedIds: string[];\n}): InputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: InputPrivacyRules = {\n visibility,\n };\n let users: InputPrivacyContact[];\n let chats: InputPrivacyContact[];\n\n const collectUsers = (userId: string) => {\n if (!isUserId(userId)) {\n return undefined;\n }\n const { id, accessHash } = usersById[userId] || {};\n if (!id) {\n return undefined;\n }\n\n return { id, accessHash };\n };\n\n const collectChats = (userId: string) => {\n if (isUserId(userId)) {\n return undefined;\n }\n const chat = chatsById[userId];\n\n return chat ? { id: chat.id } : undefined;\n };\n\n if (visibility === 'contacts' || visibility === 'nobody') {\n users = allowedIds.map(collectUsers).filter(Boolean) as InputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as InputPrivacyContact[];\n\n if (users.length > 0) {\n rules.allowedUsers = users;\n }\n if (chats.length > 0) {\n rules.allowedChats = chats;\n }\n }\n\n if (visibility === 'everybody' || visibility === 'contacts') {\n users = deniedIds.map(collectUsers).filter(Boolean) as InputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as InputPrivacyContact[];\n\n if (users.length > 0) {\n rules.blockedUsers = users;\n }\n if (chats.length > 0) {\n rules.blockedChats = chats;\n }\n }\n\n return rules;\n}\n\naddActionHandler('updateIsOnline', (global, actions, payload) => {\n callApi('updateIsOnline', payload);\n});\n\naddActionHandler('loadContentSettings', async () => {\n const result = await callApi('fetchContentSettings');\n if (!result) return;\n\n setGlobal(replaceSettings(getGlobal(), result));\n});\n\naddActionHandler('updateContentSettings', async (global, actions, payload) => {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: payload }));\n\n const result = await callApi('updateContentSettings', payload);\n if (!result) {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: !payload }));\n }\n});\n\naddActionHandler('loadCountryList', async (global, actions, payload = {}) => {\n let { langCode } = payload;\n if (!langCode) langCode = global.settings.byKey.language;\n\n const countryList = await callApi('fetchCountryList', { langCode });\n if (!countryList) return;\n\n setGlobal({\n ...getGlobal(),\n countryList,\n });\n});\n\naddActionHandler('ensureTimeFormat', async (global, actions) => {\n if (global.authNearestCountry) {\n const timeFormat = COUNTRIES_WITH_12H_TIME_FORMAT.has(global.authNearestCountry.toUpperCase()) ? '12h' : '24h';\n actions.setSettingOption({ timeFormat });\n setTimeFormat(timeFormat);\n }\n\n if (global.settings.byKey.wasTimeFormatSetManually) {\n return;\n }\n\n const nearestCountryCode = await callApi('fetchNearestCountry');\n if (nearestCountryCode) {\n const timeFormat = COUNTRIES_WITH_12H_TIME_FORMAT.has(nearestCountryCode.toUpperCase()) ? '12h' : '24h';\n actions.setSettingOption({ timeFormat });\n setTimeFormat(timeFormat);\n }\n});\n\naddActionHandler('loadAppConfig', async () => {\n const appConfig = await callApi('fetchAppConfig');\n if (!appConfig) return;\n\n setGlobal({\n ...getGlobal(),\n appConfig,\n });\n});\n\naddActionHandler('loadGlobalPrivacySettings', async () => {\n const globalSettings = await callApi('fetchGlobalPrivacySettings');\n if (!globalSettings) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), {\n shouldArchiveAndMuteNewNonContact: globalSettings.shouldArchiveAndMuteNewNonContact,\n }));\n});\n\naddActionHandler('updateGlobalPrivacySettings', async (global, actions, payload) => {\n const { shouldArchiveAndMuteNewNonContact } = payload;\n setGlobal(replaceSettings(getGlobal(), { shouldArchiveAndMuteNewNonContact }));\n\n const result = await callApi('updateGlobalPrivacySettings', { shouldArchiveAndMuteNewNonContact });\n\n setGlobal(replaceSettings(getGlobal(), {\n shouldArchiveAndMuteNewNonContact: !result\n ? !shouldArchiveAndMuteNewNonContact\n : result.shouldArchiveAndMuteNewNonContact,\n }));\n});\n","import {\n addActionHandler, getActions, getGlobal, setGlobal,\n} from '../../index';\n\nimport type { GlobalState } from '../../types';\n\nimport type {\n ApiUpdateAuthorizationState,\n ApiUpdateAuthorizationError,\n ApiUpdateConnectionState,\n ApiUpdateSession,\n ApiUpdateCurrentUser, ApiUpdateServerTimeOffset,\n} from '../../../api/types';\nimport { DEBUG, SESSION_USER_KEY } from '../../../config';\nimport { subscribe } from '../../../util/notifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\nimport { selectNotifySettings } from '../../selectors';\nimport { forceWebsync } from '../../../util/websync';\nimport { getShippingError, shouldClosePaymentModal } from '../../../util/getReadableErrorText';\n\naddActionHandler('apiUpdate', (global, actions, update) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus' && update['@type'] !== 'updateServerTimeOffset') {\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 'updateSession':\n onUpdateSession(update);\n break;\n\n case 'updateServerTimeOffset':\n onUpdateServerTimeOffset(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 const paymentShippingError = getShippingError(update.error);\n if (paymentShippingError) {\n actions.addPaymentError({ error: paymentShippingError });\n } else if (shouldClosePaymentModal(update.error)) {\n actions.closePaymentModal();\n } else if (actions.showDialog) {\n actions.showDialog({ data: update.error });\n }\n\n break;\n }\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n const { hasWebNotifications, hasPushNotifications } = selectNotifySettings(global);\n if (hasWebNotifications && hasPushNotifications) {\n void subscribe();\n }\n void 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 void forceWebsync(false);\n\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 void forceWebsync(true);\n\n setGlobal({\n ...global,\n isLoggingOut: false,\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 if (connectionState === global.connectionState) {\n return;\n }\n\n setGlobal({\n ...global,\n connectionState,\n });\n\n if (connectionState === 'connectionStateBroken') {\n // When mounting Auth `initApi` will be called from an effect. Otherwise, we force it here.\n const isOnAuth = !global.authState || [\n 'authorizationStateWaitPhoneNumber',\n 'authorizationStateWaitCode',\n 'authorizationStateWaitPassword',\n 'authorizationStateWaitRegistration',\n 'authorizationStateWaitQrCode',\n ].includes(global.authState);\n\n getActions().signOut({ forceInitApi: isOnAuth });\n }\n}\n\nfunction onUpdateSession(update: ApiUpdateSession) {\n const { sessionData } = update;\n const { authRememberMe, authState } = getGlobal();\n const isEmpty = !sessionData || !sessionData.mainDcId;\n\n if (!authRememberMe || authState !== 'authorizationStateReady' || isEmpty) {\n return;\n }\n\n getActions().saveSession({ sessionData });\n}\n\nfunction onUpdateServerTimeOffset(update: ApiUpdateServerTimeOffset) {\n const global = getGlobal();\n\n if (global.serverTimeOffset === update.serverTimeOffset) {\n return;\n }\n\n setGlobal({\n ...global,\n serverTimeOffset: update.serverTimeOffset,\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 updateSessionUserId(currentUser.id);\n}\n\nfunction updateSessionUserId(currentUserId: string) {\n const sessionUserAuth = localStorage.getItem(SESSION_USER_KEY);\n if (!sessionUserAuth) return;\n\n const userAuth = JSON.parse(sessionUserAuth);\n userAuth.id = currentUserId;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify(userAuth));\n}\n","import { addActionHandler, getGlobal, setGlobal } from '../../index';\n\nimport { ANIMATION_LEVEL_MAX } from '../../../config';\nimport {\n IS_ANDROID, IS_IOS, IS_MAC_OS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\nimport { selectTheme } from '../../selectors';\nimport { startWebsync } from '../../../util/websync';\n\nconst HISTORY_ANIMATION_DURATION = 450;\n\nsubscribeToSystemThemeChange();\n\naddActionHandler('init', (global) => {\n const { animationLevel, messageTextSize, language } = global.settings.byKey;\n const theme = selectTheme(global);\n\n void setLanguage(language, undefined, true);\n\n document.documentElement.style.setProperty(\n '--composer-text-size', `${Math.max(messageTextSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-meta-height', `${Math.floor(messageTextSize * 1.3125)}px`);\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.documentElement.setAttribute('data-message-text-size', messageTextSize.toString());\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\n switchTheme(theme, animationLevel === ANIMATION_LEVEL_MAX);\n\n startWebsync();\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 } else if (IS_MAC_OS) {\n document.body.classList.add('is-macos');\n }\n if (IS_SAFARI) {\n document.body.classList.add('is-safari');\n }\n});\n\naddActionHandler('setInstallPrompt', (global, actions, payload) => {\n const { canInstall } = payload;\n return {\n ...global,\n canInstall,\n };\n});\n\naddActionHandler('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\naddActionHandler('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n return {\n ...global,\n authPhoneNumber: phoneNumber,\n };\n});\n\naddActionHandler('setAuthRememberMe', (global, actions, payload) => {\n return {\n ...global,\n authRememberMe: Boolean(payload),\n };\n});\n\naddActionHandler('clearAuthError', (global) => {\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddActionHandler('disableHistoryAnimations', () => {\n setTimeout(() => {\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: false,\n });\n document.body.classList.remove('no-animate');\n }, HISTORY_ANIMATION_DURATION);\n\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: true,\n }, { forceSyncOnIOs: true });\n});\n\nfunction subscribeToSystemThemeChange() {\n function handleSystemThemeChange() {\n const currentThemeMatch = document.documentElement.className.match(/theme-(\\w+)/);\n const currentTheme = currentThemeMatch ? currentThemeMatch[1] : 'light';\n const global = getGlobal();\n const nextTheme = selectTheme(global);\n const { animationLevel } = global.settings.byKey;\n\n if (nextTheme !== currentTheme) {\n switchTheme(nextTheme, animationLevel === ANIMATION_LEVEL_MAX);\n // Force-update component containers\n setGlobal({ ...global });\n }\n }\n\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n }\n}\n","import { addActionHandler } from '../../index';\nimport type { ISettings, IThemeSettings, ThemeKey } from '../../../types';\nimport { replaceSettings, replaceThemeSettings } from '../../reducers';\n\naddActionHandler('setSettingOption', (global, actions, payload?: Partial<ISettings>) => {\n return replaceSettings(global, payload);\n});\n\naddActionHandler('setThemeSettings', (global, actions, payload: { theme: ThemeKey } & Partial<IThemeSettings>) => {\n const { theme, ...settings } = payload;\n\n return replaceThemeSettings(global, theme, settings);\n});\n\naddActionHandler('requestNextSettingsScreen', (global, actions, nextScreen) => {\n return {\n ...global,\n settings: {\n ...global.settings,\n nextScreen,\n },\n };\n});\n","import { addCallback, removeCallback } from '../lib/teact/teactn';\n\nimport { addActionHandler, getGlobal } from './index';\n\nimport type { GlobalState } from './types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nimport { onBeforeUnload, onIdle, throttle } from '../util/schedulers';\nimport {\n DEBUG,\n GLOBAL_STATE_CACHE_DISABLED,\n GLOBAL_STATE_CACHE_KEY,\n GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,\n GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT,\n GLOBAL_STATE_CACHE_CUSTOM_EMOJI_LIMIT,\n ALL_FOLDER_ID,\n ARCHIVED_FOLDER_ID,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n DEFAULT_VOLUME,\n DEFAULT_PLAYBACK_RATE,\n DEFAULT_PATTERN_COLOR,\n DEFAULT_LIMITS,\n} from '../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\nimport { isHeavyAnimating } from '../hooks/useHeavyAnimationCheck';\nimport { pick, unique } from '../util/iteratees';\nimport {\n selectCurrentChat,\n selectCurrentMessageList,\n selectVisibleUsers,\n} from './selectors';\nimport { hasStoredSession } from '../util/sessions';\nimport { INITIAL_STATE } from './initialState';\nimport { parseLocationHash } from '../util/routing';\nimport { isUserId } from './helpers';\nimport { getOrderedIds } from '../util/folderManager';\nimport { clearGlobalForLockScreen } from './reducers';\nimport { encryptSession } from '../util/passcode';\n\nconst UPDATE_THROTTLE = 5000;\n\nconst updateCacheThrottled = throttle(() => onIdle(updateCache), UPDATE_THROTTLE, false);\n\nlet isCaching = false;\nlet unsubscribeFromBeforeUnload: NoneToVoidFunction | undefined;\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n const resetCache = () => {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n\n if (!isCaching) {\n return;\n }\n\n clearCaching();\n };\n\n addActionHandler('saveSession', () => {\n if (isCaching) {\n return;\n }\n\n setupCaching();\n });\n\n addActionHandler('reset', resetCache);\n}\n\nexport function loadCache(initialState: GlobalState): GlobalState | undefined {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return undefined;\n }\n\n const cache = readCache(initialState);\n\n if (cache.passcode.hasPasscode || hasStoredSession(true)) {\n setupCaching();\n\n return cache;\n } else {\n clearCaching();\n\n return undefined;\n }\n}\n\nfunction setupCaching() {\n isCaching = true;\n unsubscribeFromBeforeUnload = onBeforeUnload(updateCache, true);\n window.addEventListener('blur', updateCache);\n addCallback(updateCacheThrottled);\n}\n\nfunction clearCaching() {\n isCaching = false;\n removeCallback(updateCacheThrottled);\n window.removeEventListener('blur', updateCache);\n if (unsubscribeFromBeforeUnload) {\n unsubscribeFromBeforeUnload();\n }\n}\n\nfunction readCache(initialState: GlobalState): 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 migrateCache(cached, initialState);\n }\n\n const newState = {\n ...initialState,\n ...cached,\n };\n\n const parsedMessageList = !IS_SINGLE_COLUMN_LAYOUT ? parseLocationHash() : undefined;\n\n return {\n ...newState,\n messages: {\n ...newState.messages,\n messageLists: parsedMessageList ? [parsedMessageList] : [],\n },\n };\n}\n\nexport function migrateCache(cached: GlobalState, initialState: GlobalState) {\n // Migrate from legacy setting names\n if ('shouldAutoDownloadMediaFromContacts' in cached.settings.byKey) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n ...rest\n } = cached.settings.byKey;\n\n cached.settings.byKey = {\n ...rest,\n canAutoLoadPhotoFromContacts: shouldAutoDownloadMediaFromContacts,\n canAutoLoadVideoFromContacts: shouldAutoDownloadMediaFromContacts,\n canAutoLoadPhotoInPrivateChats: shouldAutoDownloadMediaInPrivateChats,\n canAutoLoadVideoInPrivateChats: shouldAutoDownloadMediaInPrivateChats,\n canAutoLoadPhotoInGroups: shouldAutoDownloadMediaInGroups,\n canAutoLoadVideoInGroups: shouldAutoDownloadMediaInGroups,\n canAutoLoadPhotoInChannels: shouldAutoDownloadMediaInChannels,\n canAutoLoadVideoInChannels: shouldAutoDownloadMediaInChannels,\n canAutoPlayVideos: shouldAutoPlayVideos,\n canAutoPlayGifs: shouldAutoPlayGifs,\n };\n }\n\n // Pre-fill settings with defaults\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n\n cached.settings.themes = {\n ...initialState.settings.themes,\n ...cached.settings.themes,\n };\n\n cached.chatFolders = {\n ...initialState.chatFolders,\n ...cached.chatFolders,\n };\n\n if (!cached.stickers.greeting) {\n cached.stickers.greeting = initialState.stickers.greeting;\n }\n\n if (!cached.stickers.premium) {\n cached.stickers.premium = initialState.stickers.premium;\n }\n\n if (!cached.activeDownloads) {\n cached.activeDownloads = {\n byChatId: {},\n };\n }\n\n if (!cached.serviceNotifications) {\n cached.serviceNotifications = [];\n }\n\n if (cached.audioPlayer.volume === undefined) {\n cached.audioPlayer.volume = DEFAULT_VOLUME;\n }\n\n if (cached.audioPlayer.playbackRate === undefined) {\n cached.audioPlayer.playbackRate = DEFAULT_PLAYBACK_RATE;\n }\n\n if (cached.mediaViewer.volume === undefined) {\n cached.mediaViewer.volume = DEFAULT_VOLUME;\n }\n\n if (cached.mediaViewer.playbackRate === undefined) {\n cached.mediaViewer.playbackRate = DEFAULT_PLAYBACK_RATE;\n }\n\n if (!cached.groupCalls) {\n cached.groupCalls = initialState.groupCalls;\n }\n\n if (!cached.users.statusesById) {\n cached.users.statusesById = {};\n }\n\n if (!cached.messages.sponsoredByChatId) {\n cached.messages.sponsoredByChatId = {};\n }\n\n if (!cached.activeReactions) {\n cached.activeReactions = {};\n }\n\n if (!cached.pollModal) {\n cached.pollModal = {\n isOpen: false,\n };\n }\n\n if (!cached.attachMenu) {\n cached.attachMenu = {\n bots: {},\n };\n }\n\n if (!cached.trustedBotIds) {\n cached.trustedBotIds = [];\n }\n\n if (!cached.passcode) {\n cached.passcode = {};\n }\n\n if (cached.activeSessions?.byHash === undefined) {\n cached.activeSessions = {\n byHash: {},\n orderedHashes: [],\n };\n }\n\n if (!cached.activeWebSessions) {\n cached.activeWebSessions = {\n byHash: {},\n orderedHashes: [],\n };\n }\n\n if (!cached.transcriptions) {\n cached.transcriptions = {};\n }\n\n if (cached.appConfig && !cached.appConfig.limits) {\n cached.appConfig.limits = DEFAULT_LIMITS;\n }\n\n if (!cached.customEmojis) {\n cached.customEmojis = {\n added: {},\n byId: {},\n lastRendered: [],\n };\n }\n\n if (!cached.stickers.premiumSet) {\n cached.stickers.premiumSet = {\n stickers: [],\n };\n }\n\n // TODO Remove in Jan 2023 (this was re-designed but can be hardcoded in cache)\n const { light: lightTheme } = cached.settings.themes;\n if (lightTheme?.patternColor === 'rgba(90, 110, 70, 0.6)' || !lightTheme?.patternColor) {\n cached.settings.themes.light = {\n ...lightTheme,\n patternColor: DEFAULT_PATTERN_COLOR,\n };\n }\n\n cached.serviceNotifications.forEach((notification) => {\n const { isHidden } = notification as any;\n if (isHidden) {\n notification.isDeleted = isHidden;\n }\n });\n}\n\nfunction updateCache() {\n const global = getGlobal();\n if (!isCaching || global.isLoggingOut || isHeavyAnimating()) {\n return;\n }\n\n forceUpdateCache();\n}\n\nexport function forceUpdateCache(noEncrypt = false) {\n const global = getGlobal();\n const { hasPasscode, isScreenLocked } = global.passcode;\n const serializedGlobal = serializeGlobal(global);\n\n if (hasPasscode) {\n if (!isScreenLocked && !noEncrypt) {\n void encryptSession(undefined, serializedGlobal);\n }\n\n const serializedGlobalClean = JSON.stringify(clearGlobalForLockScreen(global));\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, serializedGlobalClean);\n\n return;\n }\n\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, serializedGlobal);\n}\n\nexport function serializeGlobal(global: GlobalState) {\n const reducedGlobal: GlobalState = {\n ...INITIAL_STATE,\n ...pick(global, [\n 'appConfig',\n 'authState',\n 'authPhoneNumber',\n 'authRememberMe',\n 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'topPeers',\n 'topInlineBots',\n 'recentEmojis',\n 'recentCustomEmojis',\n 'push',\n 'shouldShowContextMenuHint',\n 'leftColumnWidth',\n 'serviceNotifications',\n ]),\n audioPlayer: {\n volume: global.audioPlayer.volume,\n playbackRate: global.audioPlayer.playbackRate,\n isMuted: global.audioPlayer.isMuted,\n },\n customEmojis: reduceCustomEmojis(global),\n mediaViewer: {\n volume: global.mediaViewer.volume,\n playbackRate: global.mediaViewer.playbackRate,\n isMuted: global.mediaViewer.isMuted,\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 chatFolders: reduceChatFolders(global),\n groupCalls: reduceGroupCalls(global),\n availableReactions: reduceAvailableReactions(global),\n isCallPanelVisible: undefined,\n trustedBotIds: global.trustedBotIds,\n passcode: pick(global.passcode, [\n 'isScreenLocked',\n 'hasPasscode',\n 'invalidAttemptsCount',\n ]),\n };\n\n return JSON.stringify(reducedGlobal);\n}\n\nfunction reduceCustomEmojis(global: GlobalState): GlobalState['customEmojis'] {\n const { lastRendered, byId } = global.customEmojis;\n const idsToSave = lastRendered.slice(0, GLOBAL_STATE_CACHE_CUSTOM_EMOJI_LIMIT);\n const byIdToSave = pick(byId, idsToSave);\n\n return {\n byId: byIdToSave,\n lastRendered: idsToSave,\n added: {},\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, statusesById }, currentUserId } = global;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const visibleUserIds = selectVisibleUsers(global)?.map(({ id }) => id);\n\n const idsToSave = unique([\n ...currentUserId ? [currentUserId] : [],\n ...currentChatId && isUserId(currentChatId) ? [currentChatId] : [],\n ...visibleUserIds || [],\n ...global.topPeers.userIds || [],\n ...getOrderedIds(ALL_FOLDER_ID)?.filter(isUserId) || [],\n ...getOrderedIds(ARCHIVED_FOLDER_ID)?.filter(isUserId) || [],\n ...global.contactList?.userIds || [],\n ...global.globalSearch.recentlyFoundChatIds?.filter(isUserId) || [],\n ...Object.keys(byId),\n ]).slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave),\n statusesById: pick(statusesById, idsToSave),\n };\n}\n\nfunction reduceChats(global: GlobalState): GlobalState['chats'] {\n const { chats: { byId }, currentUserId } = global;\n const currentChat = selectCurrentChat(global);\n const idsToSave = unique([\n ...currentUserId ? [currentUserId] : [],\n ...currentChat ? [currentChat.id] : [],\n ...getOrderedIds(ALL_FOLDER_ID) || [],\n ...getOrderedIds(ARCHIVED_FOLDER_ID) || [],\n ...global.globalSearch.recentlyFoundChatIds || [],\n ...Object.keys(byId),\n ]).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);\n\n return {\n ...global.chats,\n isFullyLoaded: {},\n byId: pick(global.chats.byId, idsToSave),\n };\n}\n\nfunction reduceMessages(global: GlobalState): GlobalState['messages'] {\n const { currentUserId } = global;\n const byChatId: GlobalState['messages']['byChatId'] = {};\n const { chatId: currentChatId, threadId, type } = selectCurrentMessageList(global) || {};\n const chatIdsToSave = [\n ...currentChatId ? [currentChatId] : [],\n ...currentUserId ? [currentUserId] : [],\n ...getOrderedIds(ALL_FOLDER_ID)?.slice(0, GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT) || [],\n ];\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 return {\n byChatId,\n messageLists: currentChatId && threadId && type ? [{ chatId: currentChatId, threadId, type }] : [],\n sponsoredByChatId: {},\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey, themes } = global.settings;\n\n return {\n byKey,\n themes,\n privacy: {},\n notifyExceptions: {},\n };\n}\n\nfunction reduceChatFolders(global: GlobalState): GlobalState['chatFolders'] {\n return {\n ...global.chatFolders,\n activeChatFolder: 0,\n };\n}\n\nfunction reduceGroupCalls(global: GlobalState): GlobalState['groupCalls'] {\n return {\n ...global.groupCalls,\n byId: {},\n activeGroupCallId: undefined,\n };\n}\n\nfunction reduceAvailableReactions(global: GlobalState): GlobalState['availableReactions'] {\n return global.availableReactions\n ?.map((r) => pick(r, ['reaction', 'staticIcon', 'title', 'isInactive']));\n}\n","import type {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n} from '../../api/types';\nimport {\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport type { NotifyException, NotifySettings } from '../../types';\nimport type { LangFn } from '../../hooks/useLang';\n\nimport { ARCHIVED_FOLDER_ID, REPLIES_USER_ID, TME_LINK_PREFIX } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { formatDateToString, formatTime } from '../../util/dateFormat';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\nimport { getVideoAvatarMediaHash } from './media';\n\nconst FOREVER_BANNED_DATE = Date.now() / 1000 + 31622400; // 366 days\n\nconst VERIFIED_PRIORITY_BASE = 3e9;\nconst PINNED_PRIORITY_BASE = 3e8;\n\nexport function isUserId(entityId: string) {\n // Workaround for old-fashioned IDs stored locally\n if (typeof entityId === 'number') {\n return entityId > 0;\n }\n\n return !entityId.startsWith('-');\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 isChatWithRepliesBot(chatId: string) {\n return chatId === REPLIES_USER_ID;\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(lang: LangFn, chat: ApiChat, user?: ApiUser, isSelf = false) {\n if (isSelf || (user && chat.id === user.id && user.isSelf)) {\n return lang('SavedMessages');\n }\n return chat.title || lang('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 if (username) {\n return `${TME_LINK_PREFIX}${username}`;\n }\n\n const { inviteLink } = chat.fullInfo || {};\n\n return inviteLink;\n}\n\nexport function getChatAvatarHash(\n owner: ApiChat | ApiUser,\n size: 'normal' | 'big' = 'normal',\n type: 'photo' | 'video' = 'photo',\n) {\n if (!owner.avatarHash) {\n return undefined;\n }\n const { fullInfo } = owner;\n\n if (type === 'video') {\n if (fullInfo?.profilePhoto?.isVideo) {\n return getVideoAvatarMediaHash(fullInfo.profilePhoto);\n }\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?.[key])\n || (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.isForbidden || chat.migratedTo || chat.isNotJoined || isChatWithRepliesBot(chat.id)) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isUserId(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')) && (!isUserId(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(\n lang: LangFn,\n currentUserBannedRights?: ApiChatBannedRights,\n defaultBannedRights?: ApiChatBannedRights,\n) {\n if (currentUserBannedRights?.sendMessages) {\n const { untilDate } = currentUserBannedRights;\n return untilDate && untilDate < FOREVER_BANNED_DATE\n ? lang(\n 'Channel.Persmission.Denied.SendMessages.Until',\n lang(\n 'formatDateAtTime',\n [formatDateToString(new Date(untilDate * 1000), lang.code), formatTime(lang, untilDate * 1000)],\n ),\n )\n : lang('Channel.Persmission.Denied.SendMessages.Forever');\n }\n\n if (defaultBannedRights?.sendMessages) {\n return lang('Channel.Persmission.Denied.SendMessages.DefaultRestrictedText');\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 isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function selectIsChatMuted(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions: Record<string, NotifyException> = {},\n) {\n // If this chat is in exceptions they take precedence\n if (notifyExceptions[chat.id] && notifyExceptions[chat.id].isMuted !== undefined) {\n return notifyExceptions[chat.id].isMuted;\n }\n\n return (\n chat.isMuted\n || (isUserId(chat.id) && !notifySettings.hasPrivateChatsNotifications)\n || (isChatChannel(chat) && !notifySettings.hasBroadcastNotifications)\n || (isChatGroup(chat) && !notifySettings.hasGroupNotifications)\n );\n}\n\nexport function selectShouldShowMessagePreview(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions: Record<string, NotifyException> = {},\n) {\n const {\n hasPrivateChatsMessagePreview = true,\n hasBroadcastMessagePreview = true,\n hasGroupMessagePreview = true,\n } = notifySettings;\n // If this chat is in exceptions they take precedence\n if (notifyExceptions[chat.id] && notifyExceptions[chat.id].shouldShowPreviews !== undefined) {\n return notifyExceptions[chat.id].shouldShowPreviews;\n }\n\n return (isUserId(chat.id) && hasPrivateChatsMessagePreview)\n || (isChatChannel(chat) && hasBroadcastMessagePreview)\n || (isChatGroup(chat) && hasGroupMessagePreview);\n}\n\nexport function getCanDeleteChat(chat: ApiChat) {\n return isChatBasicGroup(chat) || ((isChatSuperGroup(chat) || isChatChannel(chat)) && chat.isCreator);\n}\n\nexport function getFolderDescriptionText(lang: LangFn, folder: ApiChatFolder, chatsCount?: number) {\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 chatsCount !== undefined && (\n Object.values(filters).filter(Boolean).length > 1\n || (excludedChatIds?.length)\n || (includedChatIds?.length)\n )) {\n return lang('Chats', chatsCount);\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\nexport function getMessageSenderName(lang: LangFn, chatId: string, sender?: ApiUser) {\n if (!sender || isUserId(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return lang('FromYou');\n }\n\n return getUserFirstOrLastName(sender);\n}\n\nexport function sortChatIds(\n chatIds: string[],\n chatsById: Record<string, ApiChat>,\n shouldPrioritizeVerified = false,\n priorityIds?: string[],\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 += VERIFIED_PRIORITY_BASE; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n priority = Date.now() + PINNED_PRIORITY_BASE + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\n\nexport function filterChatsByName(\n lang: LangFn,\n chatIds: string[],\n chatsById: Record<string, ApiChat>,\n query?: string,\n currentUserId?: string,\n) {\n if (!query) {\n return chatIds;\n }\n\n const searchWords = prepareSearchWordsForNeedle(query);\n\n return chatIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return false;\n }\n\n return searchWords(getChatTitle(lang, chat, undefined, id === currentUserId));\n });\n}\n","import type {\n ApiChat, ApiMessage, ApiMessageEntityTextUrl, ApiReactions, ApiUser,\n} from '../../api/types';\nimport { ApiMessageEntityTypes } from '../../api/types';\nimport type { LangFn } from '../../hooks/useLang';\n\nimport {\n CONTENT_NOT_SUPPORTED,\n LOCAL_MESSAGE_MIN_ID,\n RE_LINK_TEMPLATE,\n SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../config';\nimport { getUserFullName } from './users';\nimport { IS_OPUS_SUPPORTED, isWebpSupported } from '../../util/environment';\nimport { getChatTitle, isUserId } from './chats';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\nimport { getGlobal } from '../index';\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nexport type MessageKey = `msg${string}-${number}`;\n\nexport function getMessageHtmlId(messageId: number) {\n return `message${messageId.toString().replace('.', '-')}`;\n}\n\nexport function getMessageKey(message: ApiMessage): MessageKey {\n const { chatId, id, previousLocalId } = message;\n\n return buildMessageKey(chatId, isServiceNotificationMessage(message) ? previousLocalId || id : id);\n}\n\nexport function buildMessageKey(chatId: string, msgId: number): MessageKey {\n return `msg${chatId}-${msgId}`;\n}\n\nexport function parseMessageKey(key: MessageKey) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: match[1], messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageTranscription(message: ApiMessage) {\n const { transcriptionId } = message;\n const global = getGlobal();\n\n return transcriptionId && global.transcriptions[transcriptionId]?.text;\n}\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice, location,\n game, action,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document\n || contact || poll || webPage || invoice || location || game || action?.phoneCall) {\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?.isRound)) {\n return true;\n }\n\n if (!text || text.entities?.length || 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) || text.entities?.length) {\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?.entities) {\n const firstTextUrl = text.entities.find((entity): entity is ApiMessageEntityTextUrl => (\n entity.type === ApiMessageEntityTypes.TextUrl\n ));\n if (firstTextUrl) {\n match = firstTextUrl.url.match(RE_LINK);\n }\n\n if (!match) {\n const firstUrl = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url);\n if (firstUrl) {\n const { offset, length } = firstUrl;\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 Boolean(message.content.action);\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && Math.round(message.id) !== message.id;\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && !isUserId(message.senderId!) && isOwnMessage(message);\n}\n\nexport function getSenderTitle(lang: LangFn, sender: ApiUser | ApiChat) {\n return isUserId(sender.id) ? getUserFullName(sender as ApiUser) : getChatTitle(lang, 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_MIN_ID;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n\nexport function getMessageContentFilename(message: ApiMessage) {\n const { content } = message;\n\n const video = content.webPage ? content.webPage.video : content.video;\n const photo = content.webPage ? content.webPage.photo : content.photo;\n const document = content.webPage ? content.webPage.document : content.document;\n if (document) {\n return document.fileName;\n }\n\n if (video) {\n return video.fileName;\n }\n\n if (content.sticker) {\n const extension = content.sticker.isLottie ? 'tgs' : content.sticker.isVideo\n ? 'webm' : isWebpSupported() ? 'webp' : 'png';\n return `${content.sticker.id}.${extension}`;\n }\n\n if (content.audio) {\n return content.audio.fileName;\n }\n\n const baseFilename = getMessageKey(message);\n\n if (photo) {\n return `${baseFilename}.jpg`;\n }\n\n if (content.voice) {\n return IS_OPUS_SUPPORTED ? `${baseFilename}.ogg` : `${baseFilename}.wav`;\n }\n\n return baseFilename;\n}\n\nexport function areReactionsEmpty(reactions: ApiReactions) {\n return !reactions.results.some((l) => l.count > 0);\n}\n\nexport function isGeoLiveExpired(message: ApiMessage, timestamp = Date.now() / 1000) {\n const { location } = message.content;\n if (location?.type !== 'geoLive') return false;\n return (timestamp - (message.date || 0) >= location.period);\n}\n\nexport function getMessageSingleInlineButton(message: ApiMessage) {\n return message.inlineButtons?.length === 1\n && message.inlineButtons[0].length === 1\n && message.inlineButtons[0][0];\n}\n","import type { ApiMessage, ApiReactions } from '../../api/types';\nimport type { GlobalState } from '../types';\n\nexport function getMessageRecentReaction(message: Partial<ApiMessage>) {\n return message.isOutgoing ? message.reactions?.recentReactions?.[0] : undefined;\n}\nexport function checkIfHasUnreadReactions(global: GlobalState, reactions: ApiReactions) {\n const { currentUserId } = global;\n return reactions?.recentReactions?.some(\n ({ isUnread, userId }) => isUnread && userId !== currentUserId,\n );\n}\n","import type { ApiMessage } from '../../api/types';\nimport { ApiMessageEntityTypes } from '../../api/types';\nimport { CONTENT_NOT_SUPPORTED } from '../../config';\n\nimport type { TextPart } from '../../types';\nimport type { LangFn } from '../../hooks/useLang';\n\nimport trimText from '../../util/trimText';\nimport { getMessageText, getMessageTranscription } from './messages';\nimport { getMessageRecentReaction } from './reactions';\n\nconst SPOILER_CHARS = ['⠺', '⠵', '⠞', '⠟'];\nexport const TRUNCATED_SUMMARY_LENGTH = 80;\n\nexport function getMessageSummaryText(\n lang: LangFn,\n message: ApiMessage,\n noEmoji = false,\n truncateLength = TRUNCATED_SUMMARY_LENGTH,\n noReactions = true,\n isExtended = false,\n) {\n const emoji = !noEmoji && getMessageSummaryEmoji(message, noReactions);\n const emojiWithSpace = emoji ? `${emoji} ` : '';\n const text = trimText(getMessageTextWithSpoilers(message), truncateLength);\n const description = getMessageSummaryDescription(lang, message, text, noReactions, isExtended);\n\n return `${emojiWithSpace}${description}`;\n}\n\nexport function getMessageTextWithSpoilers(message: ApiMessage) {\n const transcription = getMessageTranscription(message);\n\n const textWithoutTranscription = getMessageText(message);\n if (!textWithoutTranscription) {\n return transcription;\n }\n\n const { entities } = message.content.text || {};\n if (!entities?.length) {\n return transcription ? `${transcription}\\n${textWithoutTranscription}` : textWithoutTranscription;\n }\n\n const text = entities.reduce((accText, {\n type,\n offset,\n length,\n }) => {\n if (type !== ApiMessageEntityTypes.Spoiler) {\n return accText;\n }\n\n const spoiler = generateBrailleSpoiler(length);\n\n return `${accText.substr(0, offset)}${spoiler}${accText.substr(offset + length, accText.length)}`;\n }, textWithoutTranscription);\n\n return transcription ? `${transcription}\\n${text}` : text;\n}\n\nexport function getMessageSummaryEmoji(message: ApiMessage, noReactions = true) {\n const {\n photo,\n video,\n audio,\n voice,\n document,\n sticker,\n poll,\n } = message.content;\n\n if (message.groupedId || photo) {\n return '🖼';\n }\n\n if (video) {\n return '📹';\n }\n\n if (sticker) {\n return sticker.emoji;\n }\n\n if (audio) {\n return '🎧';\n }\n\n if (voice) {\n return '🎤';\n }\n\n if (document) {\n return '📎';\n }\n\n if (poll) {\n return '📊';\n }\n\n const reaction = !noReactions && getMessageRecentReaction(message);\n if (reaction) {\n return reaction.reaction;\n }\n\n return undefined;\n}\n\nexport function getMessageSummaryDescription(\n lang: LangFn,\n message: ApiMessage,\n truncatedText?: string | TextPart[],\n noReactions = true,\n isExtended = false,\n) {\n const {\n text,\n photo,\n video,\n audio,\n voice,\n document,\n sticker,\n contact,\n poll,\n invoice,\n location,\n game,\n } = message.content;\n\n let summary: string | TextPart[] | undefined;\n\n if (message.groupedId) {\n summary = truncatedText || lang('lng_in_dlg_album');\n }\n\n if (photo) {\n summary = truncatedText || lang('AttachPhoto');\n }\n\n if (video) {\n summary = truncatedText || lang(video.isGif ? 'AttachGif' : 'AttachVideo');\n }\n\n if (sticker) {\n summary = lang('AttachSticker').trim();\n }\n\n if (audio) {\n summary = getMessageAudioCaption(message) || lang('AttachMusic');\n }\n\n if (voice) {\n summary = truncatedText || lang('AttachAudio');\n }\n\n if (document) {\n summary = isExtended ? document.fileName : (truncatedText || document.fileName);\n }\n\n if (contact) {\n summary = lang('AttachContact');\n }\n\n if (poll) {\n summary = poll.summary.question;\n }\n\n if (invoice) {\n summary = `${lang('PaymentInvoice')}: ${invoice.text}`;\n }\n\n if (text) {\n if (isExtended && summary) {\n summary += `\\n${truncatedText}`;\n } else {\n summary = truncatedText;\n }\n }\n\n if (location?.type === 'geo' || location?.type === 'venue') {\n summary = lang('Message.Location');\n }\n\n if (location?.type === 'geoLive') {\n summary = lang('Message.LiveLocation');\n }\n\n if (game) {\n summary = `🎮 ${game.title}`;\n }\n\n const reaction = !noReactions && getMessageRecentReaction(message);\n if (summary && reaction) {\n summary = `to your \"${summary}\"`;\n }\n\n return summary || CONTENT_NOT_SUPPORTED;\n}\n\nexport function generateBrailleSpoiler(length: number) {\n return new Array(length)\n .fill(undefined)\n .map(() => SPOILER_CHARS[Math.floor(Math.random() * SPOILER_CHARS.length)])\n .join('');\n}\n\nfunction getMessageAudioCaption(message: ApiMessage) {\n const {\n audio,\n text,\n } = message.content;\n\n return (audio && [audio.title, audio.performer].filter(Boolean)\n .join(' — ')) || (text?.text);\n}\n","import type {\n ApiAudio,\n ApiDimensions,\n ApiDocument,\n ApiGame,\n ApiLocation,\n ApiMessage,\n ApiMessageSearchType,\n ApiPhoto,\n ApiVideo,\n ApiWebDocument,\n} from '../../api/types';\nimport { ApiMediaFormat } from '../../api/types';\n\nimport {\n IS_OPFS_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_PROGRESSIVE_SUPPORTED,\n IS_SAFARI,\n MAX_BUFFER_SIZE,\n} from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\ntype Target =\n 'micro'\n | 'pictogram'\n | 'inline'\n | 'viewerPreview'\n | 'viewerFull'\n | 'download';\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?.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 isMessageDocumentPhoto(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'photo' : undefined;\n}\n\nexport function isMessageDocumentVideo(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'video' : undefined;\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 getMessageLocation(message: ApiMessage) {\n return message.content.location;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n return getMessageWebPage(message)?.photo;\n}\n\nexport function getMessageWebPageDocument(message: ApiMessage) {\n return getMessageWebPage(message)?.document;\n}\n\nexport function getMessageWebPageVideo(message: ApiMessage): ApiVideo | undefined {\n return getMessageWebPage(message)?.video;\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 || getMessageWebPageVideo(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n return getMessageMediaThumbnail(message)?.dataUri;\n}\n\nexport function getDocumentMediaHash(document: ApiDocument) {\n return `document${document.id}`;\n}\n\nexport function buildStaticMapHash(\n geo: ApiLocation['geo'],\n width: number,\n height: number,\n zoom: number,\n scale: number,\n) {\n const {\n long, lat, accessHash, accuracyRadius,\n } = geo;\n\n // eslint-disable-next-line max-len\n return `staticMap:${accessHash}?lat=${lat}&long=${long}&w=${width}&h=${height}&zoom=${zoom}&scale=${scale}&accuracyRadius=${accuracyRadius}`;\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 const webPageVideo = getMessageWebPageVideo(message);\n\n const messageVideo = video || webPageVideo;\n const messagePhoto = photo || webPagePhoto;\n\n const content = messagePhoto || messageVideo || sticker || audio || voice || document;\n\n if (!content) {\n return undefined;\n }\n\n const mediaId = content.id;\n const base = `${getMessageKey(message)}${mediaId ? `:${mediaId}` : ''}`;\n\n if (messageVideo) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? getVideoOrAudioBaseHash(messageVideo, base) : undefined;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(messageVideo, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (messagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? `${base}?size=x` : undefined;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n case 'download':\n return `${base}?size=z`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n case 'viewerPreview':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n case 'viewerFull':\n case 'download':\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 case 'inline':\n return base;\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return getAudioHasCover(audio) ? `${base}?size=m` : undefined;\n case 'inline':\n return getVideoOrAudioBaseHash(audio, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n case 'inline':\n return base;\n case 'download':\n return `${base}?download`;\n }\n }\n\n return undefined;\n}\n\nexport function getWebDocumentHash(webDocument?: ApiWebDocument) {\n if (!webDocument) return undefined;\n return `webDocument:${webDocument.url}`;\n}\n\nexport function getGamePreviewPhotoHash(game: ApiGame) {\n const { photo } = game;\n\n if (photo) {\n return `photo${photo.id}?size=x`;\n }\n\n return undefined;\n}\n\nexport function getGamePreviewVideoHash(game: ApiGame) {\n const { document } = game;\n\n if (document) {\n return `document${document.id}`;\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 getAudioHasCover(media: ApiAudio) {\n return media.thumbnailSizes && media.thumbnailSizes.length > 0;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n video, audio, voice, document,\n } = message.content;\n const fullVideo = video || getMessageWebPageVideo(message);\n const size = (video || audio || document)?.size!;\n if (target === 'download') {\n if (IS_PROGRESSIVE_SUPPORTED && size > MAX_BUFFER_SIZE && !IS_OPFS_SUPPORTED) {\n return ApiMediaFormat.DownloadUrl;\n }\n return ApiMediaFormat.BlobUrl;\n }\n\n if (fullVideo && IS_PROGRESSIVE_SUPPORTED && (\n target === 'viewerFull' || target === 'inline'\n )) {\n return ApiMediaFormat.Progressive;\n }\n\n 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 getMessageFileName(message: ApiMessage) {\n const {\n photo, video, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n if (photo || webPagePhoto) {\n return `photo${message.date}.jpeg`;\n }\n\n const { fileName } = video || webPageVideo || document || {};\n\n return fileName;\n}\n\nexport function getMessageFileSize(message: ApiMessage) {\n const { video, document } = message.content;\n const webPageVideo = getMessageWebPageVideo(message);\n const { size } = video || webPageVideo || document || {};\n\n return size;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo?.blobUrl) || (video?.blobUrl) || (document?.previewBlobUrl);\n}\n\nexport function getChatMediaMessageIds(\n messages: Record<number, ApiMessage>, listedIds: number[], isFromSharedMedia = false,\n) {\n return getMessageContentIds(messages, listedIds, isFromSharedMedia ? 'media' : 'inlineMedia');\n}\n\nexport function getPhotoFullDimensions(photo: Pick<ApiPhoto, 'sizes' | 'thumbnail'>): ApiDimensions | 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: Pick<ApiPhoto, 'sizes' | 'thumbnail'>): ApiDimensions | 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): ApiDimensions | undefined {\n if (video.width && video.height) {\n return video as ApiDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isLoadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isLoadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record<number, ApiMessage>, messageIds: number[], contentType: ApiMessageSearchType | 'inlineMedia',\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 case 'voice':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessageVoice(message) || (video && video.isRound);\n };\n break;\n\n case 'inlineMedia':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return (\n getMessagePhoto(message)\n || (video && !video.isRound && !video.isGif)\n || isMessageDocumentPhoto(message)\n || isMessageDocumentVideo(message)\n );\n };\n break;\n\n default:\n return [] as Array<number>;\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<number>);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video || getMessageWebPageVideo(message);\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: string, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import type { ApiFieldError } from '../../api/types';\n\nconst STRIPE_ERRORS: Record<string, ApiFieldError> = {\n missing_payment_information: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n message: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n message: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n message: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n message: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n message: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n message: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message: description, code, param } = error;\n const { field, message } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n\n return { field, message, description };\n}\n","import type { ApiPhoto } from '../../api/types';\n\nexport function getBotCoverMediaHash(photo: ApiPhoto) {\n return `photo${photo.id}?size=x`;\n}\n","import type { ApiPhoto } from '../../api/types';\n\nexport function getVideoAvatarMediaHash(photo: ApiPhoto) {\n return `videoAvatar${photo.id}?size=u`;\n}\n","import type { ApiChat, ApiUser, ApiUserStatus } from '../../api/types';\n\nimport { SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport { formatFullDate, formatTime } from '../../util/dateFormat';\nimport { orderBy } from '../../util/iteratees';\nimport type { LangFn } from '../../hooks/useLang';\nimport { getServerTime } from '../../util/serverTime';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\nimport { formatPhoneNumber } from '../../util/phoneNumber';\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 if (user.phoneNumber) {\n return `+${formatPhoneNumber(user.phoneNumber)}`;\n }\n\n break;\n }\n }\n\n return undefined;\n}\n\nexport function getUserStatus(\n lang: LangFn, user: ApiUser, userStatus: ApiUserStatus | undefined, serverTimeOffset: number,\n) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return lang('Bot');\n }\n\n if (!userStatus) {\n return '';\n }\n\n switch (userStatus.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 } = userStatus;\n\n if (!wasOnline) return lang('LastSeen.Offline');\n\n const now = new Date(new Date().getTime() + serverTimeOffset * 1000);\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 const serverToday = new Date(today.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverToday) {\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(lang, wasOnlineDate));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const serverYesterday = new Date(yesterday.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverYesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(lang, wasOnlineDate));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(lang, 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, userStatus?: ApiUserStatus) {\n const { id, type } = user;\n\n if (!userStatus) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return userStatus.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n return (user.type === 'userTypeDeleted' || user.type === 'userTypeUnknown')\n && user.id !== SERVICE_NOTIFICATIONS_USER_ID;\n}\n\nexport function isUserBot(user: ApiUser) {\n return user.type === 'userTypeBot';\n}\n\nexport function getCanAddContact(user: ApiUser) {\n return !user.isContact && !isUserBot(user);\n}\n\nexport function sortUserIds(\n userIds: string[],\n usersById: Record<string, ApiUser>,\n userStatusesById: Record<string, ApiUserStatus>,\n priorityIds?: string[],\n serverTimeOffset = 0,\n) {\n return orderBy(userIds, (id) => {\n const now = getServerTime(serverTimeOffset);\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 const userStatus = userStatusesById[id];\n if (!user || !userStatus) {\n return 0;\n }\n\n if (userStatus.type === 'userStatusOnline') {\n return userStatus.expires;\n } else if (userStatus.type === 'userStatusOffline' && userStatus.wasOnline) {\n return userStatus.wasOnline;\n }\n\n switch (userStatus.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\nexport function filterUsersByName(\n userIds: string[],\n usersById: Record<string, ApiUser>,\n query?: string,\n currentUserId?: string,\n savedMessagesLang?: string,\n) {\n if (!query) {\n return userIds;\n }\n\n const searchWords = prepareSearchWordsForNeedle(query);\n\n return userIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const name = id === currentUserId ? savedMessagesLang : getUserFullName(user);\n return (name && searchWords(name)) || searchWords(user.username);\n });\n}\n\nexport function getUserIdDividend(userId: string) {\n // Workaround for old-fashioned IDs stored locally\n if (typeof userId === 'number') {\n return Math.abs(userId);\n }\n\n return Math.abs(Number(userId));\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 ? getUserIdDividend(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import { typify } from '../lib/teact/teactn';\nimport type { GlobalState, ActionPayloads, NonTypedActionNames } from './types';\n\nconst typed = typify<GlobalState, ActionPayloads, NonTypedActionNames>();\n\nexport const getGlobal = typed.getGlobal;\nexport const setGlobal = typed.setGlobal;\nexport const getActions = typed.getActions;\nexport const addActionHandler = typed.addActionHandler;\nexport const withGlobal = typed.withGlobal;\n","import type { GlobalState } from './types';\nimport { NewChatMembersProgress } from '../types';\n\nimport {\n ANIMATION_LEVEL_DEFAULT, DARK_THEME_PATTERN_COLOR, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR,\n DEFAULT_PLAYBACK_RATE,\n DEFAULT_VOLUME,\n IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX, MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX,\n} from '../config';\nimport { IS_IOS, IS_MAC_OS } from '../util/environment';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n newChatMembersProgress: NewChatMembersProgress.Closed,\n uiReadyState: 0,\n serverTimeOffset: 0,\n isUpdateAvailable: false,\n\n authRememberMe: true,\n countryList: {\n phoneCodes: [],\n general: [],\n },\n\n blocked: {\n ids: [],\n totalCount: 0,\n },\n\n users: {\n byId: {},\n statusesById: {},\n },\n\n chats: {\n listIds: {},\n isFullyLoaded: {},\n orderedPinnedIds: {},\n totalCount: {},\n byId: {},\n },\n\n messages: {\n byChatId: {},\n messageLists: [],\n sponsoredByChatId: {},\n },\n\n groupCalls: {\n byId: {},\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n activeChatFolder: 0,\n },\n\n fileUploads: {\n byMessageLocalId: {},\n },\n\n recentEmojis: ['grinning', 'kissing_heart', 'christmas_tree', 'brain', 'trophy', 'duck', 'cherries'],\n recentCustomEmojis: ['5377305978079288312'],\n\n stickers: {\n setsById: {},\n added: {},\n recent: {\n stickers: [],\n },\n favorite: {\n stickers: [],\n },\n greeting: {\n stickers: [],\n },\n premium: {\n stickers: [],\n },\n premiumSet: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n customEmojis: {\n lastRendered: [],\n byId: {},\n added: {},\n },\n\n emojiKeywords: {},\n\n gifs: {\n saved: {},\n search: {},\n },\n\n inlineBots: {\n isLoading: false,\n byUsername: {},\n },\n\n globalSearch: {},\n\n userSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n topInlineBots: {},\n\n mediaViewer: {\n volume: DEFAULT_VOLUME,\n playbackRate: DEFAULT_PLAYBACK_RATE,\n isMuted: false,\n },\n\n audioPlayer: {\n volume: DEFAULT_VOLUME,\n playbackRate: DEFAULT_PLAYBACK_RATE,\n isMuted: false,\n },\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n dialogs: [],\n\n activeSessions: {\n byHash: {},\n orderedHashes: [],\n },\n\n activeWebSessions: {\n byHash: {},\n orderedHashes: [],\n },\n\n settings: {\n byKey: {\n theme: 'light',\n shouldUseSystemTheme: true,\n messageTextSize: IS_IOS\n ? IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX\n : (IS_MAC_OS ? MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX : DEFAULT_MESSAGE_TEXT_SIZE_PX),\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n canAutoLoadPhotoFromContacts: true,\n canAutoLoadPhotoInPrivateChats: true,\n canAutoLoadPhotoInGroups: true,\n canAutoLoadPhotoInChannels: true,\n canAutoLoadVideoFromContacts: true,\n canAutoLoadVideoInPrivateChats: true,\n canAutoLoadVideoInGroups: true,\n canAutoLoadVideoInChannels: true,\n canAutoLoadFileFromContacts: false,\n canAutoLoadFileInPrivateChats: false,\n canAutoLoadFileInGroups: false,\n canAutoLoadFileInChannels: false,\n autoLoadFileMaxSizeMb: 10,\n hasWebNotifications: true,\n hasPushNotifications: true,\n notificationSoundVolume: 5,\n canAutoPlayGifs: true,\n canAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n timeFormat: '24h',\n wasTimeFormatSetManually: false,\n isConnectionStatusMinimized: true,\n shouldArchiveAndMuteNewNonContact: false,\n },\n themes: {\n light: {\n isBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n },\n dark: {\n isBlurred: true,\n patternColor: DARK_THEME_PATTERN_COLOR,\n },\n },\n privacy: {},\n notifyExceptions: {},\n },\n\n twoFaSettings: {},\n passcode: {},\n activeReactions: {},\n\n shouldShowContextMenuHint: true,\n\n activeDownloads: {\n byChatId: {},\n },\n\n serviceNotifications: [],\n\n statistics: {\n byChatId: {},\n },\n\n pollModal: {\n isOpen: false,\n },\n\n trustedBotIds: [],\n\n attachMenu: {\n bots: {},\n },\n\n transcriptions: {},\n};\n","import type { GlobalState } from '../types';\nimport type { ApiChat, ApiChatMember, ApiPhoto } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { areSortedArraysEqual, omit } from '../../util/iteratees';\nimport { selectChatListType } from '../selectors';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: string[] | 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: string[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = 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<string, ApiChat>): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n byId: newById,\n },\n };\n}\n\nexport function updateChat(\n global: GlobalState, chatId: string, chatUpdate: Partial<ApiChat>, photo?: ApiPhoto,\n noOmitUnreadReactionCount = false,\n): GlobalState {\n const { byId } = global.chats;\n\n const updatedChat = getUpdatedChat(global, chatId, chatUpdate, photo, noOmitUnreadReactionCount);\n if (!updatedChat) {\n return global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, newById: Record<string, ApiChat>): GlobalState {\n const updatedById = Object.keys(newById).reduce((acc: Record<string, ApiChat>, id) => {\n const updatedChat = getUpdatedChat(global, id, newById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n }\n\n return acc;\n }, {});\n\n global = replaceChats(global, {\n ...global.chats.byId,\n ...updatedById,\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, newById: Record<string, ApiChat>): GlobalState {\n const { byId } = global.chats;\n let isUpdated = false;\n\n const addedById = Object.keys(newById).reduce<Record<string, ApiChat>>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !newById[id].isMin)) {\n const updatedChat = getUpdatedChat(global, id, newById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n if (!isUpdated) {\n isUpdated = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (!isUpdated) {\n return global;\n }\n\n global = replaceChats(global, {\n ...byId,\n ...addedById,\n });\n\n return global;\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedChat(\n global: GlobalState, chatId: string, chatUpdate: Partial<ApiChat>, photo?: ApiPhoto,\n noOmitUnreadReactionCount = false,\n) {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n\n chatUpdate = noOmitUnreadReactionCount\n ? chatUpdate : omit(chatUpdate, ['unreadReactionsCount']);\n const updatedChat: ApiChat = {\n ...chat,\n ...(shouldOmitMinInfo\n ? omit(chatUpdate, ['isMin', 'accessHash'])\n : chatUpdate),\n ...(photo && { photos: [photo, ...(chat.photos || [])] }),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return undefined;\n }\n\n return updatedChat;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: string,\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<keyof typeof currentListIds>).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?: string[];\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\nexport function leaveChat(global: GlobalState, leftChatId: string): GlobalState {\n const listType = selectChatListType(global, leftChatId);\n if (!listType) {\n return global;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== leftChatId));\n }\n\n global = updateChat(global, leftChatId, { isNotJoined: true });\n\n return global;\n}\n\nexport function addChatMembers(global: GlobalState, chat: ApiChat, membersToAdd: ApiChatMember[]): GlobalState {\n const currentMembers = chat.fullInfo?.members;\n const newMemberIds = new Set(membersToAdd.map((m) => m.userId));\n const updatedMembers = [\n ...currentMembers?.filter((m) => !newMemberIds.has(m.userId)) || [],\n ...membersToAdd,\n ];\n const currentIds = currentMembers?.map(({ userId }) => userId) || [];\n const updatedIds = updatedMembers.map(({ userId }) => userId);\n\n if (areSortedArraysEqual(currentIds, updatedIds)) {\n return global;\n }\n\n return updateChat(global, chat.id, {\n fullInfo: {\n ...chat.fullInfo,\n members: updatedMembers,\n },\n });\n}\n","import type { GlobalState } from '../types';\nimport type { 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: string,\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 const regularSetIds = sets.filter((set) => !set.isEmoji).map((set) => set.id);\n const addedEmojiSetIds = category === 'added' ? sets.filter((set) => set.isEmoji).map((set) => set.id) : [];\n const customEmojis = sets.filter((set) => set.isEmoji)\n .map((set) => set.stickers)\n .flat()\n .filter(Boolean);\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 : {\n setIds: [\n ...(global.stickers[category].setIds || []),\n ...regularSetIds,\n ],\n }\n ),\n },\n },\n customEmojis: {\n ...global.customEmojis,\n added: {\n ...global.customEmojis.added,\n hash,\n setIds: [\n ...(global.customEmojis.added.setIds || []),\n ...addedEmojiSetIds,\n ],\n },\n byId: {\n ...global.customEmojis.byId,\n ...buildCollectionByKey(customEmojis, 'id'),\n },\n },\n };\n}\n\nexport function updateStickerSet(\n global: GlobalState, stickerSetId: string, update: Partial<ApiStickerSet>,\n): GlobalState {\n const currentStickerSet = global.stickers.setsById[stickerSetId] || {};\n const isCustomEmoji = update.isEmoji || currentStickerSet.isEmoji;\n const addedSets = (isCustomEmoji ? global.customEmojis.added.setIds : global.stickers.added.setIds) || [];\n let setIds: string[] = addedSets;\n if (update.installedDate && addedSets && !addedSets.includes(stickerSetId)) {\n setIds = [stickerSetId, ...setIds];\n }\n\n if (!update.installedDate && addedSets?.includes(stickerSetId)) {\n setIds = setIds.filter((id) => id !== stickerSetId);\n }\n\n const customEmojiById = isCustomEmoji && currentStickerSet.stickers\n && buildCollectionByKey(currentStickerSet.stickers, 'id');\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n added: {\n ...global.stickers.added,\n ...(!isCustomEmoji && { setIds }),\n },\n setsById: {\n ...global.stickers.setsById,\n [stickerSetId]: {\n ...currentStickerSet,\n ...update,\n },\n },\n },\n customEmojis: {\n ...global.customEmojis,\n byId: {\n ...global.customEmojis.byId,\n ...customEmojiById,\n },\n added: {\n ...global.customEmojis.added,\n ...(isCustomEmoji && { setIds }),\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?: string,\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 if (global.stickers.forEmoji) {\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\n return global;\n}\n","import type { GlobalState } from '../types';\nimport type { ApiUser, ApiUserStatus } from '../../api/types';\n\nimport { omit, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\nimport { updateChat } from './chats';\n\nexport function replaceUsers(global: GlobalState, newById: Record<string, ApiUser>): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n byId: newById,\n },\n };\n}\n\nfunction updateContactList(global: GlobalState, updatedUsers: ApiUser[]): GlobalState {\n const { userIds: contactUserIds } = global.contactList || {};\n\n if (!contactUserIds) return global;\n\n const newContactUserIds = updatedUsers\n .filter((user) => user?.isContact && !contactUserIds.includes(user.id))\n .map((user) => user.id);\n\n if (newContactUserIds.length === 0) return global;\n\n return {\n ...global,\n contactList: {\n userIds: [\n ...newContactUserIds,\n ...contactUserIds,\n ],\n },\n };\n}\n\nexport function updateUser(global: GlobalState, userId: string, userUpdate: Partial<ApiUser>): GlobalState {\n const { byId } = global.users;\n\n const updatedUser = getUpdatedUser(global, userId, userUpdate);\n if (!updatedUser) {\n return global;\n }\n\n global = updateContactList(global, [updatedUser]);\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, newById: Record<string, ApiUser>): GlobalState {\n const updatedById = Object.keys(newById).reduce((acc: Record<string, ApiUser>, id) => {\n const updatedUser = getUpdatedUser(global, id, newById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n }\n\n return acc;\n }, {});\n\n global = replaceUsers(global, {\n ...global.users.byId,\n ...updatedById,\n });\n\n global = updateContactList(global, Object.values(updatedById));\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, newById: Record<string, ApiUser>): GlobalState {\n const { byId } = global.users;\n let isUpdated = false;\n\n const addedById = Object.keys(newById).reduce<Record<string, ApiUser>>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !newById[id].isMin)) {\n const updatedUser = getUpdatedUser(global, id, newById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n if (!isUpdated) {\n isUpdated = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (!isUpdated) {\n return global;\n }\n\n global = replaceUsers(global, {\n ...byId,\n ...addedById,\n });\n\n global = updateContactList(global, Object.values(addedById));\n\n return global;\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedUser(global: GlobalState, userId: string, userUpdate: Partial<ApiUser>) {\n const { byId } = global.users;\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return undefined;\n }\n\n return updatedUser;\n}\n\nexport function deleteContact(global: GlobalState, userId: string): GlobalState {\n const { byId } = global.users;\n const { userIds } = global.contactList || {};\n\n global = {\n ...global,\n contactList: {\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n global = replaceUsers(global, {\n ...byId,\n [userId]: {\n ...byId[userId],\n isContact: undefined,\n },\n });\n\n return updateChat(global, userId, {\n settings: undefined,\n });\n}\n\nexport function updateUserSearch(\n global: GlobalState,\n searchStatePartial: Partial<GlobalState['userSearch']>,\n) {\n return {\n ...global,\n userSearch: {\n ...global.userSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateUserSearchFetchingStatus(\n global: GlobalState, newState: boolean,\n) {\n return updateUserSearch(global, {\n fetchingStatus: newState,\n });\n}\n\nexport function updateUserBlockedState(global: GlobalState, userId: string, isBlocked: boolean) {\n const { byId } = global.users;\n const user = byId[userId];\n if (!user || !user.fullInfo) {\n return global;\n }\n\n return updateUser(global, userId, {\n ...user,\n fullInfo: {\n ...user.fullInfo,\n isBlocked,\n },\n });\n}\n\nexport function replaceUserStatuses(global: GlobalState, newById: Record<string, ApiUserStatus>): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n statusesById: newById,\n },\n };\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUserStatuses(global: GlobalState, newById: Record<string, ApiUserStatus>): GlobalState {\n const { statusesById } = global.users;\n\n const newKeys = Object.keys(newById).filter((id) => !statusesById[id]);\n if (!newKeys.length) {\n return global;\n }\n\n global = replaceUserStatuses(global, {\n ...statusesById,\n ...pick(newById, newKeys),\n });\n\n return global;\n}\n\nexport function closeNewContactDialog(global: GlobalState): GlobalState {\n return {\n ...global,\n newContact: undefined,\n };\n}\n","import type { GlobalState } from '../types';\nimport type { GlobalSearchContent } from '../../types';\nimport type { 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<GlobalState['globalSearch']>,\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<string, ApiMessage>);\n const foundIdsForType = resultsByType?.[type]?.foundIds;\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 type { GlobalState } from '../types';\nimport type { ApiMessageSearchType } from '../../api/types';\n\nimport { areSortedArraysEqual, unique } from '../../util/iteratees';\nimport type { 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<Record<SharedMediaType, {\n totalCount?: number;\n nextOffsetId: number;\n foundIds: number[];\n }>>;\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: string,\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: string,\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: string,\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?.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: string,\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: string,\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: string,\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: string,\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?.[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) => b - a);\n}\n","import type { GlobalState } from '../types';\nimport type { ManagementProgress, ManagementState } from '../../types';\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: string, update: Partial<ManagementState>): 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 type { GlobalState } from '../types';\nimport type {\n ISettings, IThemeSettings, ThemeKey, NotifyException,\n} from '../../types';\nimport type { ApiNotifyException } from '../../api/types';\nimport { updateUserBlockedState } from './users';\n\nexport function replaceSettings(global: GlobalState, newSettings?: Partial<ISettings>): 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 replaceThemeSettings(\n global: GlobalState, theme: ThemeKey, newSettings?: Partial<IThemeSettings>,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n themes: {\n ...global.settings.themes,\n [theme]: {\n ...(global.settings.themes[theme] || {}),\n ...newSettings,\n },\n },\n },\n };\n}\n\nexport function addNotifyExceptions(\n global: GlobalState, notifyExceptions: ApiNotifyException[],\n): GlobalState {\n notifyExceptions.forEach((notifyException) => {\n const { chatId, ...exceptionData } = notifyException;\n global = addNotifyException(global, chatId, exceptionData);\n });\n\n return global;\n}\n\nexport function addNotifyException(\n global: GlobalState, id: string, notifyException: NotifyException,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n notifyExceptions: {\n ...global.settings.notifyExceptions,\n [id]: notifyException,\n },\n },\n };\n}\n\n// eslint-disable-next-line consistent-return\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, shouldShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: shouldShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasGroupMessagePreview: shouldShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: shouldShowPreviews }),\n });\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: string): GlobalState {\n global = updateUserBlockedState(global, contactId, true);\n\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: string): GlobalState {\n global = updateUserBlockedState(global, contactId, false);\n\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 type { GlobalState } from '../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 type { GlobalState } from '../types';\nimport { INITIAL_STATE } from '../initialState';\n\nexport function updatePasscodeSettings(\n global: GlobalState,\n update: GlobalState['passcode'],\n): GlobalState {\n return {\n ...global,\n passcode: {\n ...global.passcode,\n ...update,\n },\n };\n}\n\nexport function clearPasscodeSettings(global: GlobalState): GlobalState {\n return {\n ...global,\n passcode: {},\n };\n}\n\nexport function clearGlobalForLockScreen(global: GlobalState): GlobalState {\n const {\n theme,\n shouldUseSystemTheme,\n animationLevel,\n language,\n } = global.settings.byKey;\n\n return {\n ...INITIAL_STATE,\n passcode: global.passcode,\n settings: {\n ...INITIAL_STATE.settings,\n byKey: {\n ...INITIAL_STATE.settings.byKey,\n theme,\n shouldUseSystemTheme,\n animationLevel,\n language,\n },\n },\n };\n}\n","import type { GlobalState } from '../types';\nimport type { ShippingOption, PaymentStep } from '../../types';\nimport type {\n ApiInvoice, ApiMessage, ApiPaymentForm, ApiReceipt,\n} 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 requestId: 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 setInvoiceInfo(global: GlobalState, invoice: ApiInvoice): GlobalState {\n const {\n title,\n text,\n amount,\n currency,\n isTest,\n photo,\n isRecurring,\n recurringTermsUrl,\n } = invoice;\n\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n photo,\n amount,\n currency,\n isTest,\n isRecurring,\n recurringTermsUrl,\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 setSmartGlocalCardInfo(\n global: GlobalState,\n cardInfo: { type: string; token: string },\n): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n smartGlocalCredentials: {\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 setConfirmPaymentUrl(global: GlobalState, url?: string): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n confirmPaymentUrl: url,\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 {\n photo, text, title,\n } = (messageInvoice || {});\n\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: {\n ...receipt,\n photo,\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 type { GlobalState } from '../types';\nimport type {\n ApiChannelStatistics, ApiGroupStatistics, ApiMessageStatistics, StatisticsGraph,\n} from '../../api/types';\n\nexport function updateStatistics(\n global: GlobalState, chatId: string, statistics: ApiChannelStatistics | ApiGroupStatistics,\n): GlobalState {\n return {\n ...global,\n statistics: {\n byChatId: {\n ...global.statistics.byChatId,\n [chatId]: statistics,\n },\n },\n };\n}\n\nexport function updateMessageStatistics(\n global: GlobalState, statistics: ApiMessageStatistics,\n): GlobalState {\n return {\n ...global,\n statistics: {\n ...global.statistics,\n currentMessage: statistics,\n },\n };\n}\n\nexport function updateStatisticsGraph(\n global: GlobalState, chatId: string, name: string, update: StatisticsGraph,\n): GlobalState {\n return {\n ...global,\n statistics: {\n ...global.statistics,\n byChatId: {\n ...global.statistics.byChatId,\n [chatId]: {\n ...(global.statistics.byChatId[chatId] || {}),\n [name]: update,\n },\n },\n },\n };\n}\n","import type {\n GlobalState, MessageList, MessageListType, Thread,\n} from '../types';\nimport type { ApiMessage, ApiSponsoredMessage, ApiThreadInfo } from '../../api/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport type { FocusDirection } from '../../types';\n\nimport {\n IS_MOCKED_CLIENT,\n IS_TEST, MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT, TMP_CHAT_ID,\n} 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<number, ApiMessage>;\n threadsById: Record<number, Thread>;\n};\n\nexport function updateCurrentMessageList(\n global: GlobalState,\n chatId: string | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n shouldReplaceHistory?: boolean,\n): GlobalState {\n const { messageLists } = global.messages;\n let newMessageLists: MessageList[] = messageLists;\n if (shouldReplaceHistory || (IS_TEST && !IS_MOCKED_CLIENT)) {\n newMessageLists = chatId ? [{ chatId, threadId, type }] : [];\n } else if (chatId) {\n const last = messageLists[messageLists.length - 1];\n if (!last || last.chatId !== chatId || last.threadId !== threadId || last.type !== type) {\n if (last && last.chatId === TMP_CHAT_ID) {\n newMessageLists = [...messageLists.slice(0, -1), { chatId, threadId, type }];\n } else {\n newMessageLists = [...messageLists, { chatId, threadId, type }];\n }\n }\n } else {\n newMessageLists = messageLists.slice(0, -1);\n }\n\n return {\n ...global,\n messages: {\n ...global.messages,\n messageLists: newMessageLists,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: string, newById: Record<number, ApiMessage>): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nexport function updateThread(\n global: GlobalState, chatId: string, threadId: number, threadUpdate: Partial<Thread>,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current?.threadsById),\n [threadId]: {\n ...(current?.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: string, update: Partial<MessageStoreSections>,\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<T extends keyof Thread>(\n global: GlobalState, chatId: string, 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<string, Record<number, ApiMessage>>);\n\n Object.keys(addedByChatId).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: string, newById: Record<number, ApiMessage>,\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: string, messageId: number, messageUpdate: Partial<ApiMessage>,\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: string, messageId: number, messageUpdate: Partial<ApiMessage>,\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 });\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: string,\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?.isLinkedChannelPost,\n );\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\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 let newMessageCount = threadInfo?.messagesCount;\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n if (newMessageCount !== undefined) newMessageCount -= 1;\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 if (threadInfo && newMessageCount !== undefined) {\n global = replaceThreadParam(global, chatId, threadId, 'threadInfo', {\n ...threadInfo,\n messagesCount: newMessageCount,\n });\n }\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?.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: string,\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);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: string,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = 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: string,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = 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: string,\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: string,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const currentIds = selectViewportIds(global, chatId, threadId) || [];\n const newIds = orderHistoryIds(newViewportIds);\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(currentIds, newIds) ? currentIds : newIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: string, threadId: number, update: Partial<ApiThreadInfo> | 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: string, updates: Partial<ApiThreadInfo>[],\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: string, newById: Record<number, ApiMessage>,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: string, update: Partial<{ byId: Record<number, ApiMessage> }>,\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?: string, messageId?: number, noHighlight = false, isResizingContainer = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n isResizingContainer,\n },\n };\n}\n\nexport function updateSponsoredMessage(\n global: GlobalState, chatId: string, message: ApiSponsoredMessage,\n): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n sponsoredByChatId: {\n ...global.messages.sponsoredByChatId,\n [chatId]: message,\n },\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: string,\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: string,\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\nexport function updateThreadUnreadFromForwardedMessage(\n global: GlobalState,\n originMessage: ApiMessage,\n chatId: string,\n lastMessageId: number,\n isDeleting?: boolean,\n) {\n const { channelPostId, fromChatId } = originMessage.forwardInfo || {};\n if (channelPostId && fromChatId) {\n const threadInfoOld = selectThreadInfo(global, chatId, channelPostId);\n if (threadInfoOld) {\n global = replaceThreadParam(global, chatId, channelPostId, 'threadInfo', {\n ...threadInfoOld,\n lastMessageId,\n messagesCount: threadInfoOld.messagesCount + (isDeleting ? -1 : 1),\n });\n }\n }\n return global;\n}\n","import type { ApiChatType, ApiChat } from '../../api/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport type { GlobalState } from '../types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isUserId, isHistoryClearMessage, isUserBot, isUserOnline,\n} from '../helpers';\nimport { selectBot, selectUser } from './users';\nimport {\n ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE, SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../config';\n\nexport function selectChat(global: GlobalState, chatId: string): 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: string) {\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 (isUserId(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 (\n userId !== global.currentUserId\n && global.users.byId[userId]\n && isUserOnline(global.users.byId[userId], global.users.statusesById[userId])\n ) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: string) {\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 selectIsTrustedBot(global: GlobalState, botId: string) {\n const bot = selectUser(global, botId);\n return bot && (bot.isVerified || global.trustedBotIds.includes(botId));\n}\n\nexport function selectChatType(global: GlobalState, chatId: string) : ApiChatType | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) return undefined;\n\n const bot = selectBot(global, chatId);\n if (bot) {\n return 'bots';\n }\n\n const user = selectChatUser(global, chat);\n if (user) {\n return 'users';\n }\n\n if (isChatChannel(chat)) {\n return 'channels';\n }\n\n return 'chats';\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: string) {\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: string, 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: string): '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: string, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return Boolean(active?.includes(chatId));\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return Boolean(archived?.includes(chatId));\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return Boolean(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 selectIsServiceChatReady(global: GlobalState) {\n return Boolean(selectChat(global, SERVICE_NOTIFICATIONS_USER_ID));\n}\n\nexport function selectSendAs(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n if (!chat) return undefined;\n\n const id = chat?.fullInfo?.sendAsId;\n if (!id) return undefined;\n\n return selectUser(global, id) || selectChat(global, id);\n}\n\nexport function selectRequestedText(global: GlobalState, chatId: string) {\n if (global.requestedDraft?.chatId === chatId) {\n return global.requestedDraft.text;\n }\n return undefined;\n}\n\nexport function filterChatIdsByType(global: GlobalState, chatIds: string[], filter: readonly ApiChatType[]) {\n return chatIds.filter((id) => {\n const type = selectChatType(global, id);\n if (!type) {\n return false;\n }\n return filter.includes(type);\n });\n}\n","import type { GlobalState } from '../types';\nimport type { ApiStickerSetInfo, ApiSticker, ApiStickerSet } from '../../api/types';\n\nimport { selectIsCurrentUserPremium } from './users';\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 | ApiStickerSetInfo) {\n if (typeof id === 'string') {\n return global.stickers.setsById[id];\n }\n\n if ('id' in id) {\n return global.stickers.setsById[id.id];\n }\n\n if ('isMissing' in id) return undefined;\n\n return Object.values(global.stickers.setsById).find(({ shortName }) => (\n shortName.toLowerCase() === id.shortName.toLowerCase()\n ));\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const addedSets = global.stickers.added.setIds;\n let stickersForEmoji: ApiSticker[] = [];\n // Favorites\n global.stickers.favorite.stickers.forEach((sticker) => {\n if (sticker.emoji === emoji) stickersForEmoji.push(sticker);\n });\n\n // Added sets\n addedSets?.forEach((id) => {\n const packs = global.stickers.setsById[id].packs;\n if (!packs) {\n return;\n }\n\n stickersForEmoji = stickersForEmoji.concat(packs[emoji] || [], packs[cleanEmoji(emoji)] || []);\n });\n return stickersForEmoji;\n}\n\nexport function selectCustomEmojiForEmoji(global: GlobalState, emoji: string) {\n const isCurrentUserPremium = selectIsCurrentUserPremium(global);\n const addedCustomSets = global.customEmojis.added.setIds;\n let customEmojiForEmoji: ApiSticker[] = [];\n\n // Added sets\n addedCustomSets?.forEach((id) => {\n const packs = global.stickers.setsById[id].packs;\n if (!packs) {\n return;\n }\n\n customEmojiForEmoji = customEmojiForEmoji.concat(packs[emoji] || [], packs[cleanEmoji(emoji)] || []);\n });\n return isCurrentUserPremium ? customEmojiForEmoji : customEmojiForEmoji.filter(({ isFree }) => isFree);\n}\n\nexport function selectIsSetPremium(stickerSet: ApiStickerSet) {\n return stickerSet.isEmoji && stickerSet.stickers?.some((sticker) => !sticker.isFree);\n}\n\nfunction cleanEmoji(emoji: string) {\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n return emoji.replace('\\ufe0f', '');\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n const cleanedEmoji = cleanEmoji(emoji);\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectAnimatedEmojiEffect(global: GlobalState, emoji: string) {\n const { animatedEmojiEffects } = global;\n if (!animatedEmojiEffects || !animatedEmojiEffects.stickers) {\n return undefined;\n }\n\n const cleanedEmoji = cleanEmoji(emoji);\n\n return animatedEmojiEffects.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectAnimatedEmojiSound(global: GlobalState, emoji: string) {\n return global?.appConfig?.emojiSounds[cleanEmoji(emoji)];\n}\n\nexport function selectLocalAnimatedEmoji(global: GlobalState, emoji: string) {\n const cleanedEmoji = cleanEmoji(emoji);\n\n return cleanedEmoji === '🍑' ? 'Peach' : (cleanedEmoji === '🍆' ? 'Eggplant' : undefined);\n}\n\nexport function selectLocalAnimatedEmojiEffect(emoji: string) {\n return emoji === 'Eggplant' ? 'Cumshot' : undefined;\n}\n\nexport function selectLocalAnimatedEmojiEffectByName(name: string) {\n return name === 'Cumshot' ? '🍆' : undefined;\n}\n","import type { GlobalState, MessageListType, Thread } from '../types';\nimport type {\n ApiChat,\n ApiStickerSetInfo,\n ApiMessage,\n ApiMessageEntityCustomEmoji,\n ApiMessageOutgoingStatus,\n ApiUser,\n} from '../../api/types';\nimport {\n MAIN_THREAD_ID,\n ApiMessageEntityTypes,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_MIN_ID, REPLIES_USER_ID, SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport {\n selectChat, selectChatBot, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser, selectUserStatus } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isUserId,\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 getMessageWebPageVideo,\n getMessagePhoto,\n getMessageAudio,\n getMessageVoice,\n getMessageDocument,\n getMessageWebPagePhoto,\n getMessageOriginalId,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\nimport { getServerTime } from '../../util/serverTime';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nconst MESSAGE_EDIT_ALLOWED_TIME = 172800; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (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: string) {\n return global.messages.byChatId[chatId]?.byId;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: string) {\n return global.scheduledMessages.byChatId[chatId]?.byId;\n}\n\nexport function selectThreadParam<K extends keyof Thread>(\n global: GlobalState,\n chatId: string,\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: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: string, 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: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingDraft(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingDraft');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectEditingScheduledDraft(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledDraft');\n}\n\nexport function selectDraft(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectReplyStack(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyStack');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: string, 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: string, 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: string, 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<Thread>(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 selectIsMessageInCurrentMessageList(global: GlobalState, chatId: string, 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: string, 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_MIN_ID && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: string, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: string, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: string, 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: string) {\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 isUserId(senderId) ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectReplySender(global: GlobalState, message: ApiMessage, isForwarded = false) {\n if (isForwarded) {\n const { senderUserId, hiddenUserName } = message.forwardInfo || {};\n if (senderUserId) {\n return isUserId(senderUserId) ? selectUser(global, senderUserId) : selectChat(global, senderUserId);\n }\n if (hiddenUserName) return undefined;\n }\n\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return isUserId(senderId) ? 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) || selectChat(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 = isUserId(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 isLocal = isMessageLocal(message);\n const isServiceNotification = isServiceNotificationMessage(message);\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n\n const canEditMessagesIndefinitely = isChatWithSelf\n || (isSuperGroup && getHasAdminRight(chat, 'pinMessages'))\n || (isChannel && getHasAdminRight(chat, 'editMessages'));\n const isMessageEditable = (\n (\n canEditMessagesIndefinitely\n || getServerTime(global.serverTimeOffset) - message.date < MESSAGE_EDIT_ALLOWED_TIME\n ) && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video?.isRound) || content.location\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n && !chat.isForbidden\n );\n\n const canReply = !isLocal && !isServiceNotification && !chat.isForbidden && getCanPostInChat(chat, threadId);\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isLocal && !isServiceNotification && !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 = !isLocal && !isServiceNotification && (\n isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages')\n );\n\n const canReport = !isPrivate && !isOwn;\n\n const canDeleteForAll = canDelete && !chat.isForbidden && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages') || chat.isCreator\n ))\n );\n\n const canEdit = !isLocal && !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isLocal && !isAction;\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\n const canDownload = Boolean(content.webPage?.document || content.webPage?.video || content.webPage?.photo\n || content.audio || content.voice || content.photo || content.video || content.document || content.sticker);\n\n const canSaveGif = message.content.video?.isGif;\n\n const poll = content.poll;\n const canRevote = !poll?.summary.closed && !poll?.summary.quiz && poll?.results.results?.some((r) => r.isChosen);\n const canClosePoll = isOwn && poll && !poll.summary.closed;\n\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canReport,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n canSaveGif,\n canRevote,\n canClosePoll,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canReport,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n canSaveGif,\n canRevote,\n canClosePoll,\n };\n}\n\n// This selector always returns a new object which can not be safely used in shallow-equal checks\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 selectCanReportSelectedMessages(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 false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.every((actions) => actions.canReport);\n}\n\nexport function selectCanDownloadSelectedMessages(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 false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.some((actions) => actions.canDownload);\n}\n\nexport function selectIsDownloading(global: GlobalState, message: ApiMessage) {\n const activeInChat = global.activeDownloads.byChatId[message.chatId];\n return activeInChat ? activeInChat.includes(message.id) : false;\n}\n\nexport function selectActiveDownloadIds(global: GlobalState, chatId: string) {\n return global.activeDownloads.byChatId[chatId] || MEMO_EMPTY_ARRAY;\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n return global.fileUploads.byMessageLocalId[getMessageOriginalId(message)]?.progress;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: string, 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: string, 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\n || (threadInfo.lastMessageId !== undefined && 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 const lastReadServiceNotificationId = chatId === SERVICE_NOTIFICATIONS_USER_ID\n ? global.serviceNotifications.reduce((max, notification) => {\n return !notification.isUnread && notification.id > max ? notification.id : max;\n }, -1)\n : -1;\n\n function findAfterLastReadId(listIds: number[]) {\n return listIds.find((id) => {\n return (\n (!lastReadId || id > lastReadId)\n && byId[id]\n && (!byId[id].isOutgoing || byId[id].isFromScheduled)\n && id > lastReadServiceNotificationId\n );\n });\n }\n\n if (outlyingIds) {\n const found = findAfterLastReadId(outlyingIds);\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = findAfterLastReadId(listedIds);\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 Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, 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: string, 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: string, 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: string, 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: string,\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 selectCanAutoLoadMedia(global: GlobalState, message: ApiMessage) {\n const chat = selectChat(global, message.chatId);\n if (!chat) {\n return undefined;\n }\n\n const sender = selectSender(global, message);\n\n const isPhoto = Boolean(getMessagePhoto(message) || getMessageWebPagePhoto(message));\n const isVideo = Boolean(getMessageVideo(message) || getMessageWebPageVideo(message));\n const isFile = Boolean(getMessageAudio(message) || getMessageVoice(message) || getMessageDocument(message));\n\n const {\n canAutoLoadPhotoFromContacts,\n canAutoLoadPhotoInPrivateChats,\n canAutoLoadPhotoInGroups,\n canAutoLoadPhotoInChannels,\n canAutoLoadVideoFromContacts,\n canAutoLoadVideoInPrivateChats,\n canAutoLoadVideoInGroups,\n canAutoLoadVideoInChannels,\n canAutoLoadFileFromContacts,\n canAutoLoadFileInPrivateChats,\n canAutoLoadFileInGroups,\n canAutoLoadFileInChannels,\n } = global.settings.byKey;\n\n if (isPhoto) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadPhotoFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadPhotoInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadPhotoInGroups,\n canAutoLoadMediaInChannels: canAutoLoadPhotoInChannels,\n });\n }\n\n if (isVideo) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadVideoFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadVideoInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadVideoInGroups,\n canAutoLoadMediaInChannels: canAutoLoadVideoInChannels,\n });\n }\n\n if (isFile) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadFileFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadFileInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadFileInGroups,\n canAutoLoadMediaInChannels: canAutoLoadFileInChannels,\n });\n }\n\n return true;\n}\n\nfunction canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts,\n canAutoLoadMediaInPrivateChats,\n canAutoLoadMediaInGroups,\n canAutoLoadMediaInChannels,\n}: {\n global: GlobalState;\n chat: ApiChat;\n canAutoLoadMediaFromContacts: boolean;\n canAutoLoadMediaInPrivateChats: boolean;\n canAutoLoadMediaInGroups: boolean;\n canAutoLoadMediaInChannels: boolean;\n sender?: ApiChat | ApiUser;\n}) {\n const isMediaFromContact = Boolean(sender && (\n sender.id === global.currentUserId || selectIsUserOrChatContact(global, sender)\n ));\n\n return Boolean(\n (isMediaFromContact && canAutoLoadMediaFromContacts)\n || (!isMediaFromContact && canAutoLoadMediaInPrivateChats && isUserId(chat.id))\n || (canAutoLoadMediaInGroups && isChatGroup(chat))\n || (canAutoLoadMediaInChannels && isChatChannel(chat)),\n );\n}\n\nexport function selectCanAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message) || getMessageWebPageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n canAutoPlayVideos,\n canAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (canAutoPlayVideos && !asGif) || (canAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n\nexport function selectLastServiceNotification(global: GlobalState) {\n const { serviceNotifications } = global;\n const maxId = Math.max(...serviceNotifications.map(({ id }) => id));\n\n return serviceNotifications.find(({ id, isDeleted }) => !isDeleted && id === maxId);\n}\n\nexport function selectIsMessageProtected(global: GlobalState, message?: ApiMessage) {\n return message ? message.isProtected || selectChat(global, message.chatId)?.isProtected : false;\n}\n\nexport function selectHasProtectedMessage(global: GlobalState, chatId: string, messageIds?: number[]) {\n if (selectChat(global, chatId)?.isProtected) {\n return true;\n }\n\n if (!messageIds) {\n return false;\n }\n\n const messages = selectChatMessages(global, chatId);\n\n return messageIds.some((messageId) => messages[messageId]?.isProtected);\n}\n\nexport function selectSponsoredMessage(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n const message = chat && isChatChannel(chat) ? global.messages.sponsoredByChatId[chatId] : undefined;\n\n return message && message.expiresAt >= Math.round(Date.now() / 1000) ? message : undefined;\n}\n\nexport function selectDefaultReaction(global: GlobalState, chatId: string) {\n if (chatId === SERVICE_NOTIFICATIONS_USER_ID) return undefined;\n\n const isPrivate = isUserId(chatId);\n const defaultReaction = global.appConfig?.defaultReaction;\n const { availableReactions } = global;\n if (!defaultReaction || !availableReactions?.some(\n (l) => l.reaction === defaultReaction && !l.isInactive,\n )) {\n return undefined;\n }\n\n if (isPrivate) {\n return defaultReaction;\n }\n\n const enabledReactions = selectChat(global, chatId)?.fullInfo?.enabledReactions;\n if (!enabledReactions?.includes(defaultReaction)) {\n return undefined;\n }\n\n return defaultReaction;\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectVisibleUsers(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const messageIds = selectThreadParam(global, chatId, threadId, 'viewportIds');\n if (!messageIds) {\n return undefined;\n }\n\n return messageIds.map((messageId) => {\n const { senderId } = selectChatMessage(global, chatId, messageId) || {};\n return senderId ? selectUser(global, senderId) : undefined;\n }).filter(Boolean);\n}\n\nexport function selectShouldSchedule(global: GlobalState) {\n return selectCurrentMessageList(global)?.type === 'scheduled';\n}\n\nexport function selectCanScheduleUntilOnline(global: GlobalState, id: string) {\n const isChatWithSelf = selectIsChatWithSelf(global, id);\n const chatBot = id === REPLIES_USER_ID && selectChatBot(global, id);\n return Boolean(\n !isChatWithSelf && !chatBot && isUserId(id) && selectUserStatus(global, id)?.wasOnline,\n );\n}\n\nexport function selectCustomEmojis(message: ApiMessage) {\n const entities = message.content.text?.entities;\n return entities?.filter((entity): entity is ApiMessageEntityCustomEmoji => (\n entity.type === ApiMessageEntityTypes.CustomEmoji\n ));\n}\n\nexport function selectMessageCustomEmojiSets(\n global: GlobalState, message: ApiMessage,\n): ApiStickerSetInfo[] | undefined {\n const customEmojis = selectCustomEmojis(message);\n if (!customEmojis) return MEMO_EMPTY_ARRAY;\n const documents = customEmojis.map((entity) => global.customEmojis.byId[entity.documentId]);\n // If some emoji still loading, do not return empty array\n if (!documents.every(Boolean)) return undefined;\n const sets = documents.map((doc) => doc.stickerSetInfo);\n const setsWithoutDuplicates = sets.reduce((acc, set) => {\n if ('shortName' in set) {\n if (acc.some((s) => 'shortName' in s && s.shortName === set.shortName)) {\n return acc;\n }\n }\n\n if ('id' in set) {\n if (acc.some((s) => 'id' in s && s.id === set.id)) {\n return acc;\n }\n }\n acc.push(set); // Optimization\n return acc;\n }, [] as ApiStickerSetInfo[]);\n return setsWithoutDuplicates;\n}\n\nexport function selectForwardsContainVoiceMessages(global: GlobalState) {\n const { messageIds, fromChatId } = global.forwardMessages;\n if (!messageIds) return false;\n const chatMessages = selectChatMessages(global, fromChatId!);\n return messageIds.some((messageId) => {\n const message = chatMessages[messageId];\n return Boolean(message.content.voice) || message.content.video?.isRound;\n });\n}\n","import type { GlobalState } from '../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 selectCurrentMediaSearch(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[chatId];\n}\n","import type { GlobalState } from '../types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\n\nexport function selectStatistics(global: GlobalState, chatId: string) {\n return global.statistics.byChatId[chatId];\n}\n\nexport function selectIsStatisticsShown(global: GlobalState) {\n if (!global.isStatisticsShown) {\n return false;\n }\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const chat = currentChatId ? selectChat(global, currentChatId) : undefined;\n\n return chat?.fullInfo?.canViewStatistics;\n}\n\nexport function selectIsMessageStatisticsShown(global: GlobalState) {\n if (!global.isStatisticsShown) {\n return false;\n }\n\n return Boolean(global.statistics.currentMessageId);\n}\n","import type { GlobalState } from '../types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isUserId } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: string) {\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 (isUserId(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 type { GlobalState } from '../types';\nimport { NewChatMembersProgress, RightColumnContent } from '../../types';\n\nimport { getSystemTheme, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectIsStatisticsShown, selectIsMessageStatisticsShown } from './statistics';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.mediaId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n return selectIsPollResultsOpen(global) ? (\n RightColumnContent.PollResults\n ) : !IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global) ? (\n RightColumnContent.Search\n ) : selectCurrentManagement(global) ? (\n RightColumnContent.Management\n ) : selectIsMessageStatisticsShown(global) ? (\n RightColumnContent.MessageStatistics\n ) : selectIsStatisticsShown(global) ? (\n RightColumnContent.Statistics\n ) : selectCurrentStickerSearch(global).query !== undefined ? (\n RightColumnContent.StickerSearch\n ) : selectCurrentGifSearch(global).query !== undefined ? (\n RightColumnContent.GifSearch\n ) : global.newChatMembersProgress !== NewChatMembersProgress.Closed ? (\n RightColumnContent.AddingMembers\n ) : global.isChatInfoShown && selectCurrentMessageList(global) ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n\nexport function selectTheme(global: GlobalState) {\n const { theme, shouldUseSystemTheme } = global.settings.byKey;\n\n return shouldUseSystemTheme ? getSystemTheme() : theme;\n}\n","import type { GlobalState } from '../types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","import type { GlobalState } from '../types';\n\nexport function selectPaymentInputInvoice(global: GlobalState) {\n return global.payment.inputInvoice;\n}\n\nexport function selectPaymentFormId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.requestId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams?.publishableKey;\n}\n\nexport function selectProviderPublicToken(global: GlobalState) {\n return global.payment.nativeParams?.publicToken;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n\nexport function selectSmartGlocalCredentials(global: GlobalState) {\n return global.payment.smartGlocalCredentials;\n}\n","import type { GlobalState } from '../types';\n\nexport function selectNotifySettings(global: GlobalState) {\n return global.settings.byKey;\n}\n\nexport function selectNotifyExceptions(global: GlobalState) {\n return global.settings.notifyExceptions;\n}\n","import type { GlobalState } from '../types';\nimport type { ApiChat, ApiUser, ApiUserStatus } from '../../api/types';\nimport { isUserBot } from '../helpers';\n\nexport function selectUser(global: GlobalState, userId: string): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\nexport function selectUserStatus(global: GlobalState, userId: string): ApiUserStatus | undefined {\n return global.users.statusesById[userId];\n}\n\nexport function selectIsUserBlocked(global: GlobalState, userId: string) {\n const user = selectUser(global, userId);\n\n return user?.fullInfo?.isBlocked;\n}\n\nexport function selectIsCurrentUserPremium(global: GlobalState) {\n if (!global.currentUserId) return false;\n\n return Boolean(global.users.byId[global.currentUserId].isPremium);\n}\n\nexport function selectIsPremiumPurchaseBlocked(global: GlobalState) {\n return global.appConfig?.isPremiumPurchaseBlocked ?? true;\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\n// Slow, not to be used in `withGlobal`\nexport function selectUserByPhoneNumber(global: GlobalState, phoneNumber: string) {\n const phoneNumberCleaned = phoneNumber.replace(/[^0-9]/g, '');\n\n return Object.values(global.users.byId).find((user) => user?.phoneNumber === phoneNumberCleaned);\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n\nexport function selectBot(global: GlobalState, userId: string): ApiUser | undefined {\n const user = selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n","import { useEffect, useState } from '../lib/teact/teact';\n\nconst useAsync = <T>(fn: () => Promise<T>, deps: any[], defaultValue?: T) => {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | undefined>();\n const [result, setResult] = useState<T | undefined>(defaultValue);\n useEffect(() => {\n setIsLoading(true);\n let wasCancelled = false;\n fn().then((res) => {\n if (wasCancelled) return;\n setIsLoading(false);\n setResult(res);\n }, (err) => {\n if (wasCancelled) return;\n setIsLoading(false);\n setError(err);\n });\n return () => {\n wasCancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n return { isLoading, error, result };\n};\n\nexport default useAsync;\n","import { useEffect } from '../lib/teact/teact';\n\nexport default function useBackgroundMode(\n onBlur?: AnyToVoidFunction,\n onFocus?: AnyToVoidFunction,\n) {\n useEffect(() => {\n if (onBlur && !document.hasFocus()) {\n onBlur();\n }\n\n if (onBlur) {\n window.addEventListener('blur', onBlur);\n }\n\n if (onFocus) {\n window.addEventListener('focus', onFocus);\n }\n\n return () => {\n if (onFocus) {\n window.removeEventListener('focus', onFocus);\n }\n\n if (onBlur) {\n window.removeEventListener('blur', onBlur);\n }\n };\n }, [onBlur, onFocus]);\n}\n","import usePrevious from './usePrevious';\n\nexport default function useCurrentOrPrev<T extends any>(\n current: T, shouldSkipUndefined = false, shouldForceCurrent = false,\n): T | undefined {\n const prev = usePrevious(current, shouldSkipUndefined);\n\n // eslint-disable-next-line no-null/no-null\n return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev;\n}\n","import { useCallback, useMemo } from '../lib/teact/teact';\n\nimport { debounce } from '../util/schedulers';\n\nexport default function useDebouncedCallback<T extends AnyToVoidFunction>(\n fn: T,\n deps: any[],\n ms: number,\n noFirst?: boolean,\n noLast?: boolean,\n) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const fnMemo = useCallback(fn, deps);\n\n return useMemo(() => {\n return debounce(fnMemo, ms, !noFirst, !noLast);\n }, [fnMemo, ms, noFirst, noLast]);\n}\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nconst useEffectWithPrevDeps = <T extends readonly any[]>(\n cb: (args: T | readonly []) => void, dependencies: T, debugKey?: string,\n) => {\n const prevDeps = usePrevious<T>(dependencies);\n return useEffect(() => {\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies, debugKey);\n};\n\nexport default useEffectWithPrevDeps;\n","import { useCallback, useState } from '../lib/teact/teact';\n\nconst useFlag = (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\nexport default useFlag;\n","import { useCallback, useState } from '../lib/teact/teact';\n\nconst useForceUpdate = () => {\n const [, setTrigger] = useState<boolean>(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\n\nexport default useForceUpdate;\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\n// Make sure to end even if end callback was not called (which was some hardly-reproducible bug)\nconst AUTO_END_TIMEOUT = 1000;\n\nconst useHeavyAnimationCheck = (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n isDisabled = false,\n) => {\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\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 }, [isDisabled, handleAnimationEnd, handleAnimationStart]);\n};\n\nexport function isHeavyAnimating() {\n return isAnimating;\n}\n\nexport function dispatchHeavyAnimationEvent(duration = AUTO_END_TIMEOUT) {\n if (!isAnimating) {\n isAnimating = true;\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n }\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n // Race condition may happen if another `dispatchHeavyAnimationEvent` is called before `onEnd`\n function onEnd() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n }\n\n timeout = window.setTimeout(onEnd, duration);\n\n return onEnd;\n}\n\nexport default useHeavyAnimationCheck;\n","import useOnChange from './useOnChange';\nimport { useEffect, useRef } from '../lib/teact/teact';\nimport { IS_TEST } from '../config';\nimport { fastRaf } from '../util/schedulers';\nimport { IS_IOS } from '../util/environment';\nimport { getActions } from '../lib/teact/teactn';\n\nexport const LOCATION_HASH = window.location.hash;\nconst PATH_BASE = `${window.location.pathname}${window.location.search}`;\n// Carefully selected by swiping and observing visual changes\n// TODO: may be different on other devices such as iPad, maybe take dpi into account?\nconst SAFARI_EDGE_BACK_GESTURE_LIMIT = 300;\nconst SAFARI_EDGE_BACK_GESTURE_DURATION = 350;\n\ntype HistoryRecord = {\n index: number;\n // Should this record be replaced by the next record (for example Menu)\n shouldBeReplaced?: boolean;\n // Mark this record as replaced by the next record. Only used to check if needed to perform effectBack\n markReplaced?: VoidFunction;\n onBack?: VoidFunction;\n // Set if the element is closed in the UI, but not in the real history\n isClosed?: boolean;\n};\n\ntype HistoryOperationGo = {\n type: 'go';\n delta: number;\n};\n\ntype HistoryOperationState = {\n type: 'pushState' | 'replaceState';\n data: any;\n hash?: string;\n};\n\ntype HistoryOperation = HistoryOperationGo | HistoryOperationState;\n\n// Needed to dismiss any 'trashed' history records from the previous page reloads.\nconst historyUniqueSessionId = Number(new Date());\n// Reflects real history state, but also contains information on which records should be replaced by the next record and\n// which records are deferred to close on the next operation\nlet historyState: HistoryRecord[];\n// Reflects current real history index\nlet historyCursor: number;\n// If we alter real history programmatically, the popstate event will be fired, which we don't need\nlet isAlteringHistory = false;\n// Unfortunately Safari doesn't really like when there's 2+ consequent history operations in one frame, so we need\n// to delay them to the next raf\nlet deferredHistoryOperations: HistoryOperation[] = [];\nlet deferredPopstateOperations: HistoryOperationState[] = [];\nlet isSafariGestureAnimation = false;\n\n// Do not remove: used for history unit tests\nif (IS_TEST) {\n (window as any).TEST_getHistoryState = () => historyState;\n (window as any).TEST_getHistoryCursor = () => historyCursor;\n}\n\nfunction handleTouchStart(event: TouchEvent) {\n const x = event.touches[0].pageX;\n\n if (x <= SAFARI_EDGE_BACK_GESTURE_LIMIT || x >= window.innerWidth - SAFARI_EDGE_BACK_GESTURE_LIMIT) {\n isSafariGestureAnimation = true;\n }\n}\n\nfunction handleTouchEnd() {\n if (!isSafariGestureAnimation) {\n return;\n }\n\n setTimeout(() => {\n isSafariGestureAnimation = false;\n }, SAFARI_EDGE_BACK_GESTURE_DURATION);\n}\n\nif (IS_IOS) {\n window.addEventListener('touchstart', handleTouchStart);\n window.addEventListener('touchend', handleTouchEnd);\n window.addEventListener('popstate', handleTouchEnd);\n}\n\nfunction applyDeferredHistoryOperations() {\n const goOperations = deferredHistoryOperations.filter((op) => op.type === 'go') as HistoryOperationGo[];\n const stateOperations = deferredHistoryOperations.filter((op) => op.type !== 'go') as HistoryOperationState[];\n const goCount = goOperations.reduce((acc, op) => acc + op.delta, 0);\n\n deferredHistoryOperations = [];\n\n if (goCount) {\n window.history.go(goCount);\n\n // If we have some `state` operations after the `go` operations, we need to wait until the popstate event\n // so the order of operations is correctly preserved\n if (stateOperations.length) {\n deferredPopstateOperations.push(...stateOperations);\n return;\n }\n }\n\n processStateOperations(stateOperations);\n}\n\nfunction processStateOperations(stateOperations: HistoryOperationState[]) {\n stateOperations.forEach((op) => window.history[op.type](op.data, '', op.hash));\n}\n\nfunction deferHistoryOperation(historyOperation: HistoryOperation) {\n if (!deferredHistoryOperations.length) fastRaf(applyDeferredHistoryOperations);\n deferredHistoryOperations.push(historyOperation);\n}\n\n// Resets history to the `root` state\nfunction resetHistory() {\n historyCursor = 0;\n historyState = [{\n index: 0,\n onBack: () => window.history.back(),\n }];\n\n window.history.replaceState({ index: 0, historyUniqueSessionId }, PATH_BASE);\n}\n\nresetHistory();\n\nfunction cleanupClosed(alreadyClosedCount = 1) {\n let countClosed = alreadyClosedCount;\n for (let i = historyCursor - 1; i > 0; i--) {\n if (!historyState[i].isClosed) break;\n countClosed++;\n }\n if (countClosed) {\n isAlteringHistory = true;\n deferHistoryOperation({\n type: 'go',\n delta: -countClosed,\n });\n }\n return countClosed;\n}\n\nfunction cleanupTrashedState() {\n // Navigation to previous page reload, state of which was trashed by reload\n for (let i = historyState.length - 1; i > 0; i--) {\n if (historyState[i].isClosed) {\n continue;\n }\n if (isSafariGestureAnimation) {\n getActions().disableHistoryAnimations();\n }\n historyState[i].onBack?.();\n }\n\n resetHistory();\n}\n\nwindow.addEventListener('popstate', ({ state }: PopStateEvent) => {\n if (isAlteringHistory) {\n isAlteringHistory = false;\n if (deferredPopstateOperations.length) {\n processStateOperations(deferredPopstateOperations);\n deferredPopstateOperations = [];\n }\n return;\n }\n\n if (!state) {\n cleanupTrashedState();\n\n if (!window.location.hash) {\n return;\n }\n return;\n }\n\n const { index, historyUniqueSessionId: previousUniqueSessionId } = state;\n if (previousUniqueSessionId !== historyUniqueSessionId) {\n cleanupTrashedState();\n return;\n }\n\n // New real history state matches the old virtual one. Not possible in theory, but in practice we have Safari\n if (index === historyCursor) {\n return;\n }\n\n if (index < historyCursor) {\n // Navigating back\n let alreadyClosedCount = 0;\n for (let i = historyCursor; i > index - alreadyClosedCount; i--) {\n if (historyState[i].isClosed) {\n alreadyClosedCount++;\n continue;\n }\n if (isSafariGestureAnimation) {\n getActions().disableHistoryAnimations();\n }\n historyState[i].onBack?.();\n }\n\n const countClosed = cleanupClosed(alreadyClosedCount);\n historyCursor += index - historyCursor - countClosed;\n\n // Can happen when we have deferred a real back for some element (for example Menu), closed via UI,\n // pressed back button and caused a pushState.\n if (historyCursor < 0) {\n historyCursor = 0;\n }\n } else if (index > historyCursor) {\n // Forward navigation is not yet supported\n isAlteringHistory = true;\n deferHistoryOperation({\n type: 'go',\n delta: -(index - historyCursor),\n });\n }\n});\n\nexport default function useHistoryBack({\n isActive,\n shouldBeReplaced,\n hash,\n onBack,\n}: {\n isActive?: boolean;\n shouldBeReplaced?: boolean;\n hash?: string;\n title?: string;\n onBack: VoidFunction;\n}) {\n // Active index of the record\n const indexRef = useRef<number>();\n const wasReplaced = useRef(false);\n\n const isFirstRender = useRef(true);\n\n const pushState = (forceReplace = false) => {\n // Check if the old state should be replaced\n const shouldReplace = forceReplace || historyState[historyCursor].shouldBeReplaced;\n indexRef.current = shouldReplace ? historyCursor : ++historyCursor;\n\n historyCursor = indexRef.current;\n\n // Mark the previous record as replaced so effectBack doesn't perform back operation on the new record\n const previousRecord = historyState[indexRef.current];\n if (previousRecord && !previousRecord.isClosed) {\n previousRecord.markReplaced?.();\n }\n\n historyState[indexRef.current] = {\n index: indexRef.current,\n onBack,\n shouldBeReplaced,\n markReplaced: () => {\n wasReplaced.current = true;\n },\n };\n\n // Delete forward navigation in the virtual history. Not really needed, just looks better when debugging `logState`\n for (let i = indexRef.current + 1; i < historyState.length; i++) {\n delete historyState[i];\n }\n\n deferHistoryOperation({\n type: shouldReplace ? 'replaceState' : 'pushState',\n data: {\n index: indexRef.current,\n historyUniqueSessionId,\n },\n hash: hash ? `#${hash}` : undefined,\n });\n };\n\n const processBack = () => {\n // Only process back on open records\n if (indexRef.current && historyState[indexRef.current] && !wasReplaced.current) {\n historyState[indexRef.current].isClosed = true;\n wasReplaced.current = true;\n if (indexRef.current === historyCursor && !shouldBeReplaced) {\n historyCursor -= cleanupClosed();\n }\n }\n };\n\n // Process back navigation when element is unmounted\n useEffect(() => {\n isFirstRender.current = false;\n return () => {\n if (!isActive || wasReplaced.current) return;\n processBack();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useOnChange(() => {\n if (isFirstRender.current && !isActive) return;\n\n if (isActive) {\n pushState();\n } else {\n processBack();\n }\n }, [isActive]);\n}\n","import type { RefObject } from 'react';\nimport {\n useEffect, useRef, useCallback, useState,\n} from '../lib/teact/teact';\n\nimport { throttle, debounce } from '../util/schedulers';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\n\ntype TargetCallback = (entry: IntersectionObserverEntry) => void;\ntype RootCallback = (entries: IntersectionObserverEntry[]) => void;\ntype ObserveCleanup = NoneToVoidFunction;\nexport type ObserveFn = (target: HTMLElement, targetCallback?: TargetCallback) => ObserveCleanup;\n\ninterface IntersectionController {\n observer: IntersectionObserver;\n callbacks: Map<HTMLElement, TargetCallback>;\n}\n\ninterface Response {\n observe: ObserveFn;\n freeze: NoneToVoidFunction;\n unfreeze: NoneToVoidFunction;\n}\n\nexport function useIntersectionObserver({\n rootRef,\n throttleMs,\n debounceMs,\n shouldSkipFirst,\n margin,\n threshold,\n isDisabled,\n}: {\n rootRef: RefObject<HTMLDivElement>;\n throttleMs?: number;\n debounceMs?: number;\n shouldSkipFirst?: boolean;\n margin?: number;\n threshold?: number | number[];\n isDisabled?: boolean;\n}, rootCallback?: RootCallback): Response {\n const controllerRef = useRef<IntersectionController>();\n const rootCallbackRef = useRef<RootCallback>();\n const freezeFlagsRef = useRef(0);\n const onUnfreezeRef = useRef<NoneToVoidFunction>();\n\n rootCallbackRef.current = rootCallback;\n\n const freeze = useCallback(() => {\n freezeFlagsRef.current++;\n }, []);\n\n const unfreeze = useCallback(() => {\n if (!freezeFlagsRef.current) {\n return;\n }\n\n freezeFlagsRef.current--;\n\n if (!freezeFlagsRef.current && onUnfreezeRef.current) {\n onUnfreezeRef.current();\n onUnfreezeRef.current = undefined;\n }\n }, []);\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\n return () => {\n if (controllerRef.current) {\n controllerRef.current.observer.disconnect();\n controllerRef.current.callbacks.clear();\n controllerRef.current = undefined;\n }\n };\n }, [isDisabled]);\n\n function initController() {\n const callbacks = new Map();\n const entriesAccumulator = new Map<Element, IntersectionObserverEntry>();\n const observerCallbackSync = () => {\n const entries = Array.from(entriesAccumulator.values());\n\n entries.forEach((entry: IntersectionObserverEntry) => {\n const callback = callbacks.get(entry.target);\n if (callback) {\n callback!(entry, entries);\n }\n });\n\n if (rootCallbackRef.current) {\n rootCallbackRef.current(entries);\n }\n\n entriesAccumulator.clear();\n };\n const scheduler = throttleMs ? throttle : debounceMs ? debounce : undefined;\n const observerCallback = scheduler\n ? scheduler(observerCallbackSync, (throttleMs || debounceMs)!, !shouldSkipFirst)\n : observerCallbackSync;\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n entriesAccumulator.set(entry.target, entry);\n });\n\n if (freezeFlagsRef.current) {\n onUnfreezeRef.current = () => {\n observerCallback();\n };\n } else {\n observerCallback();\n }\n },\n {\n root: rootRef.current,\n rootMargin: margin ? `${margin}px` : undefined,\n threshold,\n },\n );\n\n controllerRef.current = { observer, callbacks };\n }\n\n const observe = useCallback((target, targetCallback) => {\n if (!controllerRef.current) {\n initController();\n }\n\n const controller = controllerRef.current!;\n controller.observer.observe(target);\n\n if (targetCallback) {\n controller.callbacks.set(target, targetCallback);\n }\n\n return () => {\n if (targetCallback) {\n controller.callbacks.delete(target);\n }\n\n controller.observer.unobserve(target);\n };\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDisabled]);\n\n return { observe, freeze, unfreeze };\n}\n\nexport function useOnIntersect(\n targetRef: RefObject<HTMLDivElement>, observe?: ObserveFn, callback?: TargetCallback,\n) {\n useEffect(() => {\n return observe ? observe(targetRef.current!, callback) : undefined;\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport function useIsIntersecting(\n targetRef: RefObject<HTMLDivElement>, observe?: ObserveFn, callback?: TargetCallback,\n) {\n const [isIntersecting, setIsIntersecting] = useState(!observe);\n\n useOnIntersect(targetRef, observe, (entry) => {\n setIsIntersecting(entry.isIntersecting);\n\n if (callback) {\n callback(entry);\n }\n });\n\n return isIntersecting;\n}\n","import type { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nconst useKeyboardListNavigation = (\n elementRef: RefObject<HTMLElement>,\n isOpen: boolean,\n onSelectWithEnter?: (index: number) => void,\n itemSelector?: string,\n noCaptureFocus?: boolean,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n\n const element = elementRef.current;\n if (isOpen && element && !noCaptureFocus) {\n element.tabIndex = -1;\n element.focus();\n }\n }, [elementRef, isOpen, noCaptureFocus]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<any>) => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n if (e.keyCode === 13 && onSelectWithEnter) {\n onSelectWithEnter(focusedIndex);\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(itemSelector ? element.querySelectorAll(itemSelector) : 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 }, [elementRef, onSelectWithEnter, itemSelector, focusedIndex]);\n\n return handleKeyDown;\n};\n\nexport default useKeyboardListNavigation;\n","import * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nconst useLang = (): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\n\nexport default useLang;\n","import { useEffect } from '../lib/teact/teact';\n\nimport { ApiMediaFormat } from '../api/types';\n\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nconst useMedia = (\n mediaHash: string | false | undefined,\n noLoad = false,\n mediaFormat = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!noLoad && mediaHash && !mediaData) {\n const startedAt = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat).then(() => {\n const spentTime = Date.now() - startedAt;\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, delay]);\n\n return mediaData;\n};\n\nexport default useMedia;\n","import useShowTransition from './useShowTransition';\n\nexport default function useMediaTransition(mediaData?: any) {\n const isMediaReady = Boolean(mediaData);\n const { transitionClassNames } = useShowTransition(isMediaReady, undefined, isMediaReady, 'slow');\n\n return transitionClassNames;\n}\n","import { useEffect } from '../lib/teact/teact';\n\nimport type { BundleModules, Bundles } from '../util/moduleLoader';\nimport { getModuleFromMemory, loadModule, addLoadListener } from '../util/moduleLoader';\n\nimport useForceUpdate from './useForceUpdate';\n\nconst useModuleLoader = <B extends Bundles, M extends BundleModules<B>>(\n bundleName: B, moduleName: M, noLoad = false, autoUpdate = false,\n) => {\n const module = getModuleFromMemory(bundleName, moduleName);\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!autoUpdate) {\n return undefined;\n }\n\n return addLoadListener(forceUpdate);\n }, [autoUpdate, forceUpdate]);\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\nexport default useModuleLoader;\n","import usePrevious from './usePrevious';\n\nconst useOnChange = <T extends readonly any[]>(cb: (args: T | readonly []) => void, dependencies: T) => {\n const prevDeps = usePrevious<T>(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n cb(prevDeps || []);\n }\n};\n\nexport default useOnChange;\n","import { useRef } from '../lib/teact/teact';\n\nfunction usePrevious<T extends any>(next: T): T | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined: true): Exclude<T, undefined> | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined?: boolean): Exclude<T, undefined> | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined?: boolean) {\n const ref = useRef<T>();\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 { useRef, useState } from '../lib/teact/teact';\nimport buildClassName from '../util/buildClassName';\n\nconst CLOSE_DURATION = 350;\n\nconst useShowTransition = (\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<number>();\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 const exec = () => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n };\n\n if (noCloseTransition) {\n exec();\n } else {\n closeTimeoutRef.current = window.setTimeout(exec, CLOSE_DURATION);\n }\n }\n }\n\n // `noCloseTransition`, when set to true, should remove the open class immediately\n const shouldHaveOpenClassName = hasOpenClassName && !(noCloseTransition && !isOpen);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n shouldHaveOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n hasShownClass: shouldRender,\n hasOpenClass: shouldHaveOpenClassName,\n };\n};\n\nexport default useShowTransition;\n","import { useLayoutEffect, useMemo, useState } from '../lib/teact/teact';\n\nimport type { ApiMessage, ApiSticker } from '../api/types';\n\nimport { DEBUG } from '../config';\nimport { isWebpSupported } from '../util/environment';\nimport { EMPTY_IMAGE_DATA_URI, webpToPngBase64 } from '../util/webpToPng';\nimport { getMessageMediaThumbDataUri } from '../global/helpers';\nimport { selectTheme } from '../global/selectors';\nimport { getGlobal } from '../global';\n\nexport default function useThumbnail(media?: ApiMessage | ApiSticker) {\n const isMessage = media && 'content' in media;\n const thumbDataUri = isMessage ? getMessageMediaThumbDataUri(media) : media?.thumbnail?.dataUri;\n const sticker = isMessage ? media.content?.sticker : media;\n const shouldDecodeThumbnail = thumbDataUri && sticker && !isWebpSupported() && thumbDataUri.includes('image/webp');\n const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI);\n const id = media?.id;\n\n useLayoutEffect(() => {\n if (!shouldDecodeThumbnail) {\n return;\n }\n\n webpToPngBase64(`b64-${id}`, thumbDataUri!)\n .then(setThumbnailDecoded)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n }, [id, shouldDecodeThumbnail, thumbDataUri]);\n\n // TODO Find a way to update thumbnail on theme change\n const theme = selectTheme(getGlobal());\n\n const dataUri = useMemo(() => {\n const uri = shouldDecodeThumbnail ? thumbnailDecoded : thumbDataUri;\n if (!uri || theme !== 'dark') return uri;\n\n return uri.replace('<svg', '<svg fill=\"white\"');\n }, [shouldDecodeThumbnail, thumbDataUri, thumbnailDecoded, theme]);\n\n return dataUri;\n}\n","import type { 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<HTMLElement>,\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","import { useEffect, useState } from '../lib/teact/teact';\nimport type { ApiDimensions } from '../api/types';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\nimport useDebouncedCallback from './useDebouncedCallback';\n\nconst THROTTLE = 250;\n\nconst useWindowSize = () => {\n const [size, setSize] = useState<ApiDimensions>(windowSize.get());\n const [isResizing, setIsResizing] = useState(false);\n const setIsResizingDebounced = useDebouncedCallback(setIsResizing, [], THROTTLE, true);\n\n useEffect(() => {\n const throttledSetIsResizing = throttle(() => {\n setIsResizing(true);\n }, THROTTLE, true);\n\n const throttledSetSize = throttle(() => {\n setSize(windowSize.get());\n setIsResizingDebounced(false);\n }, THROTTLE, false);\n\n const handleResize = () => {\n throttledSetIsResizing();\n throttledSetSize();\n };\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, [setIsResizingDebounced]);\n\n return { ...size, isResizing };\n};\n\nexport default useWindowSize;\n","import { DEBUG } from '../../config';\n\ntype Handler = (e: Event) => void;\ntype DelegationRegistry = Map<HTMLElement, Handler>;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave', 'load']);\n\nconst documentEventCounters: Record<string, number> = {};\nconst delegationRegistryByEventType: Record<string, DelegationRegistry> = {};\nconst delegatedEventTypesByElement = new Map<HTMLElement, Set<string>>();\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventType = resolveEventType(propName, element);\n if (canUseEventDelegation(eventType, element, asCapture)) {\n addDelegatedListener(eventType, element, handler);\n } else {\n element.addEventListener(eventType, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventType = resolveEventType(propName, element);\n if (canUseEventDelegation(eventType, element, asCapture)) {\n removeDelegatedListener(eventType, element);\n } else {\n element.removeEventListener(eventType, handler, asCapture);\n }\n}\n\nfunction resolveEventType(propName: string, element: HTMLElement) {\n const eventType = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').toLowerCase();\n\n if (eventType === '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 (eventType === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventType === 'focus') {\n return 'focusin';\n }\n\n if (eventType === 'blur') {\n return 'focusout';\n }\n\n return eventType;\n}\n\nfunction canUseEventDelegation(realEventType: string, element: HTMLElement, asCapture: boolean) {\n return (\n !asCapture\n && !NON_BUBBLEABLE_EVENTS.has(realEventType)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventType: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventType]) {\n documentEventCounters[eventType] = 0;\n document.addEventListener(eventType, handleEvent);\n }\n\n resolveDelegationRegistry(eventType).set(element, handler);\n resolveDelegatedEventTypes(element).add(eventType);\n documentEventCounters[eventType]++;\n}\n\nfunction removeDelegatedListener(eventType: string, element: HTMLElement) {\n documentEventCounters[eventType]--;\n if (!documentEventCounters[eventType]) {\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(eventType, handleEvent);\n }\n\n delegationRegistryByEventType[eventType].delete(element);\n delegatedEventTypesByElement.get(element)!.delete(eventType);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventTypes = delegatedEventTypesByElement.get(element);\n if (!eventTypes) {\n return;\n }\n\n eventTypes.forEach((eventType) => removeDelegatedListener(eventType, element));\n delegatedEventTypesByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistryByEventType[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 resolveDelegationRegistry(eventType: string) {\n if (!delegationRegistryByEventType[eventType]) {\n delegationRegistryByEventType[eventType] = new Map();\n }\n\n return delegationRegistryByEventType[eventType];\n}\n\nfunction resolveDelegatedEventTypes(element: HTMLElement) {\n const existing = delegatedEventTypesByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set<string>();\n delegatedEventTypesByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n const documentListenersCount = Object.keys(documentEventCounters).length;\n const delegatedHandlersCount1 = Object.values(documentEventCounters)\n .reduce((acc, counter) => acc + counter, 0);\n const delegationRegistriesCount = Object.keys(delegationRegistryByEventType).length;\n const delegatedHandlersCount2 = Object.values(delegationRegistryByEventType)\n .reduce((acc, delegationRegistry) => acc + delegationRegistry.size, 0);\n const delegationElementsCount = delegatedEventTypesByElement.size;\n const delegatedEventTypesCount = Array.from(delegatedEventTypesByElement.values())\n .reduce((acc, eventTypes) => acc + eventTypes.size, 0);\n\n // eslint-disable-next-line no-console\n console.warn('DELEGATED EVENTS STATS', {\n delegatedHandlersCount1,\n delegatedHandlersCount2,\n delegatedEventTypesCount,\n delegationRegistriesCount,\n delegationElementsCount,\n documentListenersCount,\n });\n });\n}\n","import type {\n VirtualElement,\n VirtualElementComponent,\n VirtualElementTag,\n VirtualElementParent,\n VirtualElementChildren,\n VirtualElementReal,\n VirtualElementFragment,\n} from './teact';\nimport {\n hasElementChanged,\n isComponentElement,\n isTagElement,\n isParentElement,\n isTextElement,\n isEmptyElement,\n mountComponent,\n renderComponent,\n unmountComponent,\n isFragmentElement,\n} from './teact';\nimport generateIdFor from '../../util/generateIdFor';\nimport { DEBUG } from '../../config';\nimport { addEventListener, removeAllDelegatedListeners, removeEventListener } from './dom-events';\nimport { unique } from '../../util/iteratees';\n\ntype VirtualDomHead = {\n children: [VirtualElement] | [];\n};\n\nconst FILTERED_ATTRIBUTES = new Set(['key', 'ref', 'teactFastList', 'teactOrderKey']);\nconst HTML_ATTRIBUTES = new Set(['dir', 'role', 'form']);\nconst CONTROLLABLE_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record<string, VirtualDomHead> = {};\n// eslint-disable-next-line @typescript-eslint/naming-convention\nlet DEBUG_virtualTreeSize = 1;\n\nfunction render($element: VirtualElement | undefined, parentEl: HTMLElement) {\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 const $newElement = renderWithVirtual(parentEl, $head.children[0], $element, $head, 0);\n $head.children = $newElement ? [$newElement] : [];\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<T extends VirtualElement | undefined>(\n parentEl: HTMLElement,\n $current: VirtualElement | undefined,\n $new: T,\n $parent: VirtualElementParent | VirtualDomHead,\n index: number,\n options: {\n skipComponentUpdate?: boolean;\n nextSibling?: ChildNode;\n fragment?: DocumentFragment;\n } = {},\n): T {\n const { skipComponentUpdate, fragment } = options;\n let { nextSibling } = options;\n\n const isCurrentComponent = $current && isComponentElement($current);\n const isNewComponent = $new && isComponentElement($new);\n const $newAsReal = $new as VirtualElementReal;\n\n const isCurrentFragment = $current && !isCurrentComponent && isFragmentElement($current);\n const isNewFragment = $new && !isNewComponent && isFragmentElement($new);\n\n if (\n !skipComponentUpdate\n && isCurrentComponent && isNewComponent\n && !hasElementChanged($current!, $new!)\n ) {\n $new = updateComponent($current, $new as VirtualElementComponent) as typeof $new;\n }\n\n // Parent element may have changed, so we need to update the listener closure.\n if (!skipComponentUpdate && isNewComponent && ($new as VirtualElementComponent).componentInstance.isMounted) {\n setupComponentUpdateListener(parentEl, $new as VirtualElementComponent, $parent, index);\n }\n\n if ($current === $new) {\n return $new;\n }\n\n if (DEBUG && $new) {\n const newTarget = 'target' in $new && $new.target;\n if (newTarget && (!$current || ('target' in $current && newTarget !== $current.target))) {\n throw new Error('[Teact] Cached virtual element was moved within tree');\n }\n }\n\n if (!$current && $new) {\n if (isNewComponent || isNewFragment) {\n if (isNewComponent) {\n $new = initComponent(parentEl, $new as VirtualElementComponent, $parent, index) as typeof $new;\n }\n\n mountChildren(parentEl, $new as VirtualElementComponent | VirtualElementFragment, { nextSibling, fragment });\n } else {\n const node = createNode($newAsReal);\n $newAsReal.target = node;\n insertBefore(fragment || parentEl, node, nextSibling);\n }\n } else if ($current && !$new) {\n remount(parentEl, $current, undefined);\n } else if ($current && $new) {\n if (hasElementChanged($current, $new)) {\n if (!nextSibling) {\n nextSibling = getNextSibling($current);\n }\n\n if (isNewComponent || isNewFragment) {\n if (isNewComponent) {\n $new = initComponent(parentEl, $new as VirtualElementComponent, $parent, index) as typeof $new;\n }\n\n remount(parentEl, $current, undefined);\n mountChildren(parentEl, $new as VirtualElementComponent | VirtualElementFragment, { nextSibling, fragment });\n } else {\n const node = createNode($newAsReal);\n $newAsReal.target = node;\n remount(parentEl, $current, node, nextSibling);\n }\n } else {\n const isComponent = isCurrentComponent && isNewComponent;\n const isFragment = isCurrentFragment && isNewFragment;\n\n if (isComponent || isFragment) {\n ($new as VirtualElementComponent | VirtualElementFragment).children = renderChildren(\n $current,\n $new as VirtualElementComponent | VirtualElementFragment,\n parentEl,\n nextSibling,\n );\n } else {\n const $currentAsReal = $current as VirtualElementReal;\n const currentTarget = $currentAsReal.target!;\n\n $newAsReal.target = currentTarget;\n $currentAsReal.target = undefined; // Help GC\n\n const isTag = isTagElement($current);\n if (isTag) {\n const $newAsTag = $new as VirtualElementTag;\n\n $newAsTag.props.ref = $current.props.ref;\n\n if (nextSibling) {\n insertBefore(parentEl, currentTarget, nextSibling);\n }\n\n updateAttributes($current, $newAsTag, currentTarget as HTMLElement);\n\n $newAsTag.children = renderChildren(\n $current,\n $newAsTag,\n currentTarget as HTMLElement,\n );\n }\n }\n }\n }\n\n return $new;\n}\n\nfunction initComponent(\n parentEl: HTMLElement,\n $element: VirtualElementComponent,\n $parent: VirtualElementParent | VirtualDomHead,\n index: number,\n) {\n const { componentInstance } = $element;\n\n if (!componentInstance.isMounted) {\n $element = mountComponent(componentInstance);\n setupComponentUpdateListener(parentEl, $element, $parent, index);\n\n const $firstChild = $element.children[0];\n if (isComponentElement($firstChild)) {\n $element.children = [initComponent(parentEl, $firstChild, $element, 0)];\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 parentEl: HTMLElement,\n $element: VirtualElementComponent,\n $parent: VirtualElementParent | VirtualDomHead,\n index: number,\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 );\n };\n}\n\nfunction mountChildren(\n parentEl: HTMLElement,\n $element: VirtualElementComponent | VirtualElementFragment,\n options: {\n nextSibling?: ChildNode;\n fragment?: DocumentFragment;\n },\n) {\n $element.children = $element.children.map(($child, i) => {\n return renderWithVirtual(parentEl, undefined, $child, $element, i, options);\n });\n}\n\nfunction unmountChildren(parentEl: HTMLElement, $element: VirtualElementComponent | VirtualElementFragment) {\n $element.children.forEach(($child) => {\n renderWithVirtual(parentEl, $child, undefined, $element, -1);\n });\n}\n\nfunction createNode($element: VirtualElementReal): Node {\n if (isEmptyElement($element)) {\n return document.createTextNode('');\n }\n\n if (isTextElement($element)) {\n return document.createTextNode($element.value);\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 processControlled(tag, props);\n\n Object.entries(props).forEach(([key, value]) => {\n if (props[key] !== undefined) {\n setAttribute(element, key, value);\n }\n });\n\n processUncontrolledOnMount(element, props);\n\n $element.children = children.map(($child, i) => (\n renderWithVirtual(element, undefined, $child, $element, i)\n ));\n\n return element;\n}\n\nfunction remount(\n parentEl: HTMLElement,\n $current: VirtualElement,\n node: Node | undefined,\n componentNextSibling?: ChildNode,\n) {\n const isComponent = isComponentElement($current);\n const isFragment = !isComponent && isFragmentElement($current);\n\n if (isComponent || isFragment) {\n if (isComponent) {\n unmountComponent($current.componentInstance);\n }\n\n unmountChildren(parentEl, $current);\n\n if (node) {\n insertBefore(parentEl, node, componentNextSibling);\n }\n } else {\n if (node) {\n parentEl.replaceChild(node, $current.target!);\n } else {\n parentEl.removeChild($current.target!);\n }\n\n unmountRealTree($current);\n }\n}\n\nexport function unmountRealTree($element: VirtualElement) {\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else {\n if (isTagElement($element)) {\n if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n\n if ($element.props.ref?.current === $element.target) {\n $element.props.ref.current = undefined;\n }\n }\n }\n\n if ($element.target) {\n $element.target = undefined; // Help GC\n }\n\n if (!isParentElement($element)) {\n return;\n }\n }\n\n $element.children.forEach(unmountRealTree);\n}\n\nfunction insertBefore(parentEl: HTMLElement | DocumentFragment, node: Node, nextSibling?: ChildNode) {\n if (nextSibling) {\n parentEl.insertBefore(node, nextSibling);\n } else {\n parentEl.appendChild(node);\n }\n}\n\nfunction getNextSibling($current: VirtualElement): ChildNode | undefined {\n if (isComponentElement($current) || isFragmentElement($current)) {\n const lastChild = $current.children[$current.children.length - 1];\n return getNextSibling(lastChild);\n }\n\n const target = $current.target!;\n const { nextSibling } = target;\n return nextSibling || undefined;\n}\n\nfunction renderChildren(\n $current: VirtualElementParent, $new: VirtualElementParent, currentEl: HTMLElement, nextSibling?: ChildNode,\n) {\n if (DEBUG) {\n DEBUG_checkKeyUniqueness($new.children);\n }\n\n if (('props' in $new) && $new.props.teactFastList) {\n return renderFastListChildren($current, $new, currentEl);\n }\n\n const currentChildrenLength = $current.children.length;\n const newChildrenLength = $new.children.length;\n const maxLength = Math.max(currentChildrenLength, newChildrenLength);\n const newChildren = [];\n\n const fragment = newChildrenLength > currentChildrenLength ? document.createDocumentFragment() : undefined;\n const lastCurrentChild = $current.children[currentChildrenLength - 1];\n const fragmentNextSibling = nextSibling || (\n newChildrenLength > currentChildrenLength && lastCurrentChild ? getNextSibling(lastCurrentChild) : undefined\n );\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 >= currentChildrenLength ? { fragment } : { nextSibling },\n );\n\n if ($newChild) {\n newChildren.push($newChild);\n }\n }\n\n if (fragment) {\n insertBefore(currentEl, fragment, fragmentNextSibling);\n }\n\n return newChildren;\n}\n\n// This function allows to prepend/append a bunch of new DOM nodes to the top/bottom of preserved ones.\n// It also allows to selectively move particular preserved nodes within their DOM list.\nfunction renderFastListChildren($current: VirtualElementParent, $new: VirtualElementParent, currentEl: HTMLElement) {\n const newKeys = new Set(\n $new.children.map(($newChild) => {\n const key = 'props' in $newChild ? $newChild.props.key : undefined;\n\n if (DEBUG && isParentElement($newChild)) {\n // eslint-disable-next-line no-null/no-null\n if (key === undefined || key === null) {\n // eslint-disable-next-line no-console\n console.warn('Missing `key` in `teactFastList`');\n }\n\n if (isFragmentElement($newChild)) {\n throw new Error('[Teact] Fragment can not be child of container with `teactFastList`');\n }\n }\n\n return key;\n }),\n );\n\n // Build a collection of old children that also remain in the new list\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 // eslint-disable-next-line no-null/no-null\n const isKeyPresent = key !== undefined && key !== null;\n\n // First we process removed children\n if (isKeyPresent && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!isKeyPresent) {\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 // Otherwise, we just remove it\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 orderKey: 'props' in $currentChild ? $currentChild.props.teactOrderKey : undefined,\n };\n return acc;\n }, {} as Record<string, { $element: VirtualElement; index: number; orderKey?: number }>);\n\n let newChildren: VirtualElement[] = [];\n\n let fragmentElements: 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 if (!fragmentElements) {\n fragmentElements = [];\n fragmentIndex = i;\n }\n\n fragmentElements.push($newChild);\n return;\n }\n\n // This prepends new children to the top\n if (fragmentElements) {\n newChildren = newChildren.concat(renderFragment(fragmentElements, fragmentIndex!, currentEl, $new));\n fragmentElements = undefined;\n fragmentIndex = undefined;\n }\n\n // Now we check if a preserved node was moved within preserved list\n const newOrderKey = 'props' in $newChild ? $newChild.props.teactOrderKey : undefined;\n // That is indicated by a changed `teactOrderKey` value\n const shouldMoveNode = (\n currentChildInfo.index !== currentPreservedIndex && currentChildInfo.orderKey !== newOrderKey\n );\n const isMovingDown = shouldMoveNode && currentPreservedIndex > currentChildInfo.index;\n\n if (!shouldMoveNode || isMovingDown) {\n currentPreservedIndex++;\n }\n\n newChildren.push(\n renderWithVirtual(currentEl, currentChildInfo.$element, $newChild, $new, i, {\n // `+ 1` is needed because before moving down the node still takes place above\n nextSibling: shouldMoveNode ? currentEl.childNodes[isMovingDown ? i + 1 : i] : undefined,\n }),\n );\n });\n\n // This appends new children to the bottom\n if (fragmentElements) {\n newChildren = newChildren.concat(renderFragment(fragmentElements, fragmentIndex!, currentEl, $new));\n }\n\n return newChildren;\n}\n\nfunction renderFragment(\n elements: VirtualElement[], fragmentIndex: number, parentEl: HTMLElement, $parent: VirtualElementParent,\n) {\n const nextSibling = parentEl.childNodes[fragmentIndex];\n\n if (elements.length === 1) {\n return [renderWithVirtual(parentEl, undefined, elements[0], $parent, fragmentIndex, { nextSibling })];\n }\n\n const fragment = document.createDocumentFragment();\n const newChildren = elements.map(($element, i) => (\n renderWithVirtual(parentEl, undefined, $element, $parent, fragmentIndex + i, { fragment })\n ));\n\n insertBefore(parentEl, fragment, nextSibling);\n\n return newChildren;\n}\n\nfunction processControlled(tag: string, props: AnyLiteral) {\n // TODO Remove after tests\n if (!props.teactExperimentControlled) {\n return;\n }\n\n const isValueControlled = props.value !== undefined;\n const isCheckedControlled = props.checked !== undefined;\n const isControlled = (isValueControlled || isCheckedControlled) && CONTROLLABLE_TAGS.includes(tag.toUpperCase());\n if (!isControlled) {\n return;\n }\n\n const {\n value, checked, onInput, onChange,\n } = props;\n\n props.onChange = undefined;\n props.onInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n onInput?.(e);\n onChange?.(e);\n\n if (value !== undefined) {\n e.currentTarget.value = value;\n }\n\n if (checked !== undefined) {\n e.currentTarget.checked = checked;\n }\n };\n}\n\nfunction processUncontrolledOnMount(element: HTMLElement, props: AnyLiteral) {\n if (!CONTROLLABLE_TAGS.includes(element.tagName)) {\n return;\n }\n\n if (props.defaultValue) {\n setAttribute(element, 'value', props.defaultValue);\n }\n\n if (props.defaultChecked) {\n setAttribute(element, 'checked', props.defaultChecked);\n }\n}\n\nfunction updateAttributes($current: VirtualElementTag, $new: VirtualElementTag, element: HTMLElement) {\n processControlled(element.tagName, $new.props);\n\n const currentEntries = Object.entries($current.props);\n const newEntries = Object.entries($new.props);\n\n currentEntries.forEach(([key, currentValue]) => {\n const newValue = $new.props[key];\n\n if (\n currentValue !== undefined\n && (\n newValue === undefined\n || (currentValue !== newValue && key.startsWith('on'))\n )\n ) {\n removeAttribute(element, key, currentValue);\n }\n });\n\n newEntries.forEach(([key, newValue]) => {\n const currentValue = $current.props[key];\n\n if (newValue !== undefined && newValue !== currentValue) {\n setAttribute(element, key, newValue);\n }\n });\n}\n\nfunction setAttribute(element: HTMLElement, key: string, value: any) {\n // An optimization attempt\n if (key === 'className') {\n element.className = value;\n // An optimization attempt\n } else if (key === 'value') {\n if ((element as HTMLInputElement).value !== value) {\n (element as HTMLInputElement).value = value;\n }\n } else if (key === 'style') {\n element.style.cssText = value;\n } else if (key === 'dangerouslySetInnerHTML') {\n // eslint-disable-next-line no-underscore-dangle\n element.innerHTML = value.__html;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || key.startsWith('aria-') || HTML_ATTRIBUTES.has(key)) {\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 === 'dangerouslySetInnerHTML') {\n element.innerHTML = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || key.startsWith('aria-') || HTML_ATTRIBUTES.has(key)) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction DEBUG_addToVirtualTreeSize($current: VirtualElementParent | VirtualDomHead) {\n DEBUG_virtualTreeSize += $current.children.length;\n\n $current.children.forEach(($child) => {\n if (isParentElement($child)) {\n DEBUG_addToVirtualTreeSize($child);\n }\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction DEBUG_checkKeyUniqueness(children: VirtualElementChildren) {\n const firstChild = children[0];\n if (firstChild && 'props' in firstChild && firstChild.props.key !== undefined) {\n const keys = children.reduce((acc: any[], child) => {\n if ('props' in child && child.props.key) {\n acc.push(child.props.key);\n }\n\n return acc;\n }, []);\n\n if (keys.length !== unique(keys).length) {\n throw new Error('[Teact] Children keys are not unique');\n }\n }\n}\n\nconst TeactDOM = { render };\nexport default TeactDOM;\n","import type { ReactElement } from 'react';\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, fastRafPrimary, onTickEnd, onTickEndPrimary, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { orderBy } from '../../util/iteratees';\nimport { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\n\nexport type Props = AnyLiteral;\nexport type FC<P extends Props = any> = (props: P) => any;\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type FC_withDebug = FC & {\n DEBUG_contentComponentName?: string;\n};\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n Fragment,\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 interface VirtualElementFragment {\n type: VirtualElementTypesEnum.Fragment;\n target?: Node;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter<T> = (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<any>;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: readonly any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n value: any;\n dependencies: any[];\n }[];\n };\n refs: {\n cursor: number;\n byCursor: {\n current: any;\n }[];\n };\n };\n prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement =\n VirtualElementEmpty\n | VirtualElementText\n | VirtualElementTag\n | VirtualElementComponent\n | VirtualElementFragment;\nexport type VirtualElementParent =\n VirtualElementTag\n | VirtualElementComponent\n | VirtualElementFragment;\nexport type VirtualElementChildren = VirtualElement[];\nexport type VirtualElementReal = Exclude<VirtualElement, VirtualElementComponent | VirtualElementFragment>;\n\n// Compatibility with JSX types\nexport type TeactNode =\n ReactElement\n | string\n | number\n | boolean\n | TeactNode[];\n\nconst Fragment = Symbol('Fragment');\n\nconst DEBUG_RENDER_THRESHOLD = 7;\nconst DEBUG_EFFECT_THRESHOLD = 7;\nconst DEBUG_SILENT_RENDERS_FOR = new Set(['TeactMemoWrapper', 'TeactNContainer', 'Button', 'ListItem', 'MenuItem']);\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 isFragmentElement($element: VirtualElement): $element is VirtualElementFragment {\n return $element.type === VirtualElementTypesEnum.Fragment;\n}\n\nexport function isParentElement($element: VirtualElement): $element is VirtualElementParent {\n return isTagElement($element) || isComponentElement($element) || isFragmentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualElementParent | VirtualElementChildren {\n children = children.flat();\n\n if (source === Fragment) {\n return buildFragmentElement(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 buildFragmentElement(children: any[]): VirtualElementFragment {\n return {\n type: VirtualElementTypesEnum.Fragment,\n children: dropEmptyTail(children, true).map(buildChildElement),\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 refs: {\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 return {\n type: VirtualElementTypesEnum.Component,\n componentInstance,\n props: componentInstance.props,\n children: dropEmptyTail(children, true).map(buildChildElement),\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[], noEmpty = false) {\n let i = children.length - 1;\n\n for (; i >= 0; i--) {\n if (!isEmptyPlaceholder(children[i])) {\n break;\n }\n }\n\n if (i === children.length - 1) {\n return children;\n }\n\n if (i === -1 && noEmpty) {\n return children.slice(0, 1);\n }\n\n return children.slice(0, i + 1);\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 (isParentElement(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\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.warn('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 componentInstance.hooks.refs.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n // eslint-disable-next-line @typescript-eslint/naming-convention\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 (!DEBUG_SILENT_RENDERS_FOR.has(componentName)) {\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 duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_RENDER_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(duration)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(duration);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err: any) {\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 children = Array.isArray(newRenderedValue) ? newRenderedValue : [newRenderedValue];\n componentInstance.$element = buildComponentElement(componentInstance, children);\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 mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nexport function unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.effects.byCursor.forEach((effect) => {\n if (effect.cleanup) {\n try {\n effect.cleanup();\n } catch (err: any) {\n handleError(err);\n } finally {\n effect.cleanup = undefined;\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We need to remove all references to DOM objects. We also clean all other references, just in case\nfunction helpGc(componentInstance: ComponentInstance) {\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = undefined;\n hook.effect = undefined as any;\n hook.dependencies = undefined;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = undefined;\n hook.nextValue = undefined;\n hook.setter = undefined as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.value = undefined as any;\n hook.dependencies = undefined as any;\n });\n\n componentInstance.hooks.refs.byCursor.forEach((hook) => {\n hook.current = undefined as any;\n });\n\n componentInstance.hooks = undefined as any;\n componentInstance.$element = undefined as any;\n componentInstance.renderedValue = undefined;\n componentInstance.Component = undefined as any;\n componentInstance.props = undefined as any;\n componentInstance.forceUpdate = undefined;\n componentInstance.onUpdate = undefined;\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 useState<T>(initial?: T, debugKey?: string): [T, StateHookSetter<T>] {\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 if (componentInstance.name !== 'TeactNContainer') {\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 debugKey\n ? `State update for ${debugKey}, next value: `\n : `State update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\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 primarySchedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: readonly any[],\n debugKey?: string,\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n function execCleanup() {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (!cleanup) {\n return;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n cleanup();\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_EFFECT_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Teact] Slow cleanup at effect cursor #${cursor}: ${componentName}, ${Math.round(duration)} ms`,\n );\n }\n }\n } catch (err: any) {\n handleError(err);\n } finally {\n byCursor[cursor].cleanup = undefined;\n }\n }\n\n function exec() {\n if (!componentInstance.isMounted) {\n return;\n }\n\n execCleanup();\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n const result = effect();\n if (typeof result === 'function') {\n byCursor[cursor].cleanup = result;\n }\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_EFFECT_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow effect at cursor #${cursor}: ${componentName}, ${Math.round(duration)} ms`);\n }\n }\n }\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n if (debugKey) {\n const causedBy = dependencies.reduce((res, newValue, i) => {\n const prevValue = byCursor[cursor].dependencies![i];\n if (newValue !== prevValue) {\n res.push(`${i}: ${prevValue} => ${newValue}`);\n }\n\n return res;\n }, []);\n\n // eslint-disable-next-line no-console\n console.log(`[Teact] Effect \"${debugKey}\" caused by dependencies.`, causedBy.join(', '));\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n } else {\n if (debugKey) {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Effect \"${debugKey}\" caused by missing dependencies.`);\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor]?.cleanup,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: readonly any[], debugKey?: string) {\n return useLayoutEffectBase(fastRaf, fastRafPrimary, effect, dependencies, debugKey);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: readonly any[], debugKey?: string) {\n return useLayoutEffectBase(onTickEnd, onTickEndPrimary, effect, dependencies, debugKey);\n}\n\nexport function useMemo<T extends any>(resolver: () => T, dependencies: any[], debugKey?: string): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { value } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.useMemo] ${renderingInstance.name} (${debugKey}): Update is caused by:`,\n byCursor[cursor]\n ? getUnequalProps(dependencies, byCursor[cursor].dependencies).join(', ')\n : '[first render]',\n );\n }\n\n value = resolver();\n }\n\n byCursor[cursor] = {\n value,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return value;\n}\n\nexport function useCallback<F extends AnyFunction>(newCallback: F, dependencies: any[], debugKey?: string): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies, debugKey);\n}\n\nexport function useRef<T>(initial: T): { current: T };\nexport function useRef<T>(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef<T>(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef<T>(initial?: T | null) {\n const { cursor, byCursor } = renderingInstance.hooks.refs;\n if (!byCursor[cursor]) {\n byCursor[cursor] = {\n current: initial,\n };\n }\n\n renderingInstance.hooks.refs.cursor++;\n\n return byCursor[cursor];\n}\n\nexport function memo<T extends FC>(Component: T, debugKey?: string) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => createElement(Component, props), Object.values(props), debugKey);\n } as T;\n}\n\nexport default {\n createElement,\n Fragment,\n};\n","import type { FC, FC_withDebug, Props } from './teact';\nimport React, { useEffect, useState } from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { fastRaf, throttleWithTickEnd } from '../../util/schedulers';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport { handleError } from '../../util/handleError';\nimport { isHeavyAnimating } from '../../hooks/useHeavyAnimationCheck';\n\nexport default React;\n\ntype GlobalState =\n AnyLiteral\n & { DEBUG_capturedId?: number };\ntype ActionNames = string;\ntype ActionPayload = any;\n\ninterface ActionOptions {\n forceOnHeavyAnimation?: boolean;\n // Workaround for iOS gesture history navigation\n forceSyncOnIOs?: boolean;\n}\n\ntype Actions = Record<ActionNames, (payload?: ActionPayload, options?: ActionOptions) => void>;\n\ntype ActionHandler = (\n global: GlobalState,\n actions: Actions,\n payload: any,\n) => GlobalState | void | Promise<void>;\n\ntype MapStateToProps<OwnProps = undefined> = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral);\n\nlet currentGlobal = {} as GlobalState;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nlet DEBUG_currentCapturedId: number | undefined;\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst DEBUG_releaseCapturedIdThrottled = throttleWithTickEnd(() => {\n DEBUG_currentCapturedId = undefined;\n});\n\nconst actionHandlers: Record<string, ActionHandler[]> = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as Actions;\nconst containers = new Map<string, {\n mapStateToProps: MapStateToProps<any>;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nconst runCallbacksThrottled = throttleWithTickEnd(runCallbacks);\n\nfunction runCallbacks(forceOnHeavyAnimation = false) {\n if (!forceOnHeavyAnimation && isHeavyAnimating()) {\n fastRaf(runCallbacksThrottled);\n return;\n }\n\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nexport function setGlobal(newGlobal?: GlobalState, options?: ActionOptions) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n if (DEBUG) {\n if (newGlobal.DEBUG_capturedId && newGlobal.DEBUG_capturedId !== DEBUG_currentCapturedId) {\n throw new Error('[TeactN.setGlobal] Attempt to set an outdated global');\n }\n\n DEBUG_currentCapturedId = undefined;\n }\n\n currentGlobal = newGlobal;\n if (options?.forceSyncOnIOs) {\n runCallbacks(true);\n } else {\n runCallbacksThrottled(options?.forceOnHeavyAnimation);\n }\n }\n}\n\nexport function getGlobal() {\n if (DEBUG) {\n DEBUG_currentCapturedId = Math.random();\n currentGlobal = {\n ...currentGlobal,\n DEBUG_capturedId: DEBUG_currentCapturedId,\n };\n DEBUG_releaseCapturedIdThrottled();\n }\n\n return currentGlobal;\n}\n\nexport function getActions() {\n return actions;\n}\n\nlet actionQueue: NoneToVoidFunction[] = [];\n\nfunction handleAction(name: string, payload?: ActionPayload, options?: ActionOptions) {\n actionQueue.push(() => {\n actionHandlers[name]?.forEach((handler) => {\n const response = handler(DEBUG ? getGlobal() : currentGlobal, actions, payload);\n if (!response || typeof response.then === 'function') {\n return;\n }\n\n setGlobal(response as GlobalState, options);\n });\n });\n\n if (actionQueue.length === 1) {\n try {\n while (actionQueue.length) {\n actionQueue[0]();\n actionQueue.shift();\n }\n } finally {\n actionQueue = [];\n }\n }\n}\n\nfunction updateContainers() {\n // eslint-disable-next-line @typescript-eslint/naming-convention\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, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = mapStateToProps(currentGlobal, ownProps);\n } catch (err: any) {\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 addActionHandler(name: ActionNames, handler: ActionHandler) {\n if (!actionHandlers[name]) {\n actionHandlers[name] = [];\n\n actions[name] = (payload?: ActionPayload, options?: ActionOptions) => {\n handleAction(name, payload, options);\n };\n }\n\n actionHandlers[name].push(handler);\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<OwnProps>(\n mapStateToProps: MapStateToProps<OwnProps> = () => ({}),\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 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 = mapStateToProps(currentGlobal, props);\n } catch (err: any) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <Component {...container.mappedProps} {...props} />;\n };\n };\n}\n\nexport function typify<ProjectGlobalState, ActionPayloads, NonTypedActionNames extends string = never>() {\n type NonTypedActionPayloads = {\n [ActionName in NonTypedActionNames]: ActionPayload;\n };\n\n type ProjectActionTypes =\n ActionPayloads\n & NonTypedActionPayloads;\n\n type ProjectActionNames = keyof ProjectActionTypes;\n\n type ProjectActions = {\n [ActionName in ProjectActionNames]: (\n payload?: ProjectActionTypes[ActionName],\n options?: ActionOptions,\n ) => void;\n };\n\n type ActionHandlers = {\n [ActionName in keyof ProjectActionTypes]: (\n global: ProjectGlobalState,\n actions: ProjectActions,\n payload: ProjectActionTypes[ActionName],\n ) => ProjectGlobalState | void | Promise<void>;\n };\n\n return {\n getGlobal: getGlobal as () => ProjectGlobalState,\n setGlobal: setGlobal as (state: ProjectGlobalState, options?: ActionOptions) => void,\n getActions: getActions as () => ProjectActions,\n addActionHandler: addActionHandler as <ActionName extends ProjectActionNames>(\n name: ActionName,\n handler: ActionHandlers[ActionName],\n ) => void,\n withGlobal: withGlobal as <OwnProps>(\n mapStateToProps: ((global: ProjectGlobalState, ownProps: OwnProps) => AnyLiteral),\n ) => (Component: FC) => FC<OwnProps>,\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.warn(\n 'GLOBAL CONTAINERS',\n orderBy(\n Array.from(containers.values())\n .map(({ DEBUG_componentName, DEBUG_updates }) => ({ DEBUG_componentName, DEBUG_updates })),\n 'DEBUG_updates',\n 'desc',\n ),\n );\n });\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version f8312f3 12.03.2022\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 /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\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\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\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\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\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\\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|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f|\\u2764\\ufe0f\\u200d\\ud83d\\udd25|\\u2764\\ufe0f\\u200d\\ud83e\\ude79|\\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|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\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\\udec3-\\udec5\\udef0-\\udef6]|[\\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-\\udc8e\\udc90\\udc92-\\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\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import type { TeactNode } from '../lib/teact/teact';\nimport type {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm,\n ApiChatInviteImporter,\n ApiExportedInvite,\n ApiLanguage, ApiMessage, ApiShippingAddress, ApiStickerSet, ApiWebDocument,\n} from '../api/types';\n\nexport type TextPart = TeactNode;\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 type ThemeKey = 'light' | 'dark';\nexport type AnimationLevel = 0 | 1 | 2;\n\nexport interface IThemeSettings {\n background?: string;\n backgroundColor?: string;\n patternColor?: string;\n isBlurred?: boolean;\n}\n\nexport type NotifySettings = {\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n hasWebNotifications: boolean;\n hasPushNotifications: boolean;\n notificationSoundVolume: number;\n};\n\nexport type LangCode = (\n 'en' | 'ar' | 'be' | 'ca' | 'nl' | 'fr' | 'de' | 'id' | 'it' | 'ko' | 'ms' | 'fa' | 'pl' | 'pt-br' | 'ru' | 'es'\n | 'tr' | 'uk' | 'uz'\n);\n\nexport type TimeFormat = '24h' | '12h';\n\nexport interface ISettings extends NotifySettings, Record<string, any> {\n theme: ThemeKey;\n shouldUseSystemTheme: boolean;\n messageTextSize: number;\n animationLevel: AnimationLevel;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n canAutoLoadPhotoFromContacts: boolean;\n canAutoLoadPhotoInPrivateChats: boolean;\n canAutoLoadPhotoInGroups: boolean;\n canAutoLoadPhotoInChannels: boolean;\n canAutoLoadVideoFromContacts: boolean;\n canAutoLoadVideoInPrivateChats: boolean;\n canAutoLoadVideoInGroups: boolean;\n canAutoLoadVideoInChannels: boolean;\n canAutoLoadFileFromContacts: boolean;\n canAutoLoadFileInPrivateChats: boolean;\n canAutoLoadFileInGroups: boolean;\n canAutoLoadFileInChannels: boolean;\n autoLoadFileMaxSizeMb: number;\n canAutoPlayGifs: boolean;\n canAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n languages?: ApiLanguage[];\n language: LangCode;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n timeFormat: TimeFormat;\n wasTimeFormatSetManually: boolean;\n isConnectionStatusMinimized: boolean;\n shouldArchiveAndMuteNewNonContact?: boolean;\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: string[];\n allowChatIds: string[];\n blockUserIds: string[];\n blockChatIds: string[];\n}\n\nexport interface InputPrivacyContact {\n id: string;\n accessHash?: string;\n}\n\nexport interface InputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: InputPrivacyContact[];\n allowedChats?: InputPrivacyContact[];\n blockedUsers?: InputPrivacyContact[];\n blockedChats?: InputPrivacyContact[];\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 photo?: ApiWebDocument;\n text?: string;\n title?: string;\n}\n\nexport enum SettingsScreens {\n Main,\n EditProfile,\n Notifications,\n DataStorage,\n Language,\n ActiveSessions,\n General,\n GeneralChatBackground,\n GeneralChatBackgroundColor,\n Privacy,\n PrivacyPhoneNumber,\n PrivacyLastSeen,\n PrivacyProfilePhoto,\n PrivacyPhoneCall,\n PrivacyPhoneP2P,\n PrivacyForwarding,\n PrivacyVoiceMessages,\n PrivacyGroupChats,\n PrivacyPhoneNumberAllowedContacts,\n PrivacyPhoneNumberDeniedContacts,\n PrivacyLastSeenAllowedContacts,\n PrivacyLastSeenDeniedContacts,\n PrivacyProfilePhotoAllowedContacts,\n PrivacyProfilePhotoDeniedContacts,\n PrivacyPhoneCallAllowedContacts,\n PrivacyPhoneCallDeniedContacts,\n PrivacyPhoneP2PAllowedContacts,\n PrivacyPhoneP2PDeniedContacts,\n PrivacyForwardingAllowedContacts,\n PrivacyForwardingDeniedContacts,\n PrivacyVoiceMessagesAllowedContacts,\n PrivacyVoiceMessagesDeniedContacts,\n PrivacyGroupChatsAllowedContacts,\n PrivacyGroupChatsDeniedContacts,\n PrivacyBlockedUsers,\n Folders,\n FoldersCreateFolder,\n FoldersEditFolder,\n FoldersEditFolderFromChatList,\n FoldersIncludedChats,\n FoldersIncludedChatsFromChatList,\n FoldersExcludedChats,\n FoldersExcludedChatsFromChatList,\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 ActiveWebsites,\n PasscodeDisabled,\n PasscodeNewPasscode,\n PasscodeNewPasscodeConfirm,\n PasscodeEnabled,\n PasscodeChangePasscodeCurrent,\n PasscodeChangePasscodeNew,\n PasscodeChangePasscodeConfirm,\n PasscodeTurnOff,\n PasscodeCongratulations,\n Experimental,\n Stickers,\n QuickReaction,\n CustomEmoji,\n}\n\nexport type StickerSetOrRecent = Pick<ApiStickerSet, (\n 'id' | 'title' | 'count' | 'stickers' | 'hasThumbnail' | 'isLottie' | 'isVideos' | 'isEmoji' | 'installedDate'\n)>;\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 Search,\n Management,\n Statistics,\n MessageStatistics,\n StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n SettingsAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum AudioOrigin {\n Inline,\n SharedMedia,\n Search,\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 interface ManagementState {\n isActive: boolean;\n nextScreen?: ManagementScreens;\n isUsernameAvailable?: boolean;\n error?: string;\n invites?: ApiExportedInvite[];\n revokedInvites?: ApiExportedInvite[];\n editingInvite?: ApiExportedInvite;\n inviteInfo?: {\n invite: ApiExportedInvite;\n importers?: ApiChatInviteImporter[];\n requesters?: ApiChatInviteImporter[];\n };\n}\n\nexport enum NewChatMembersProgress {\n Closed,\n InProgress,\n Loading,\n}\n\nexport type ProfileTabType = 'members' | 'commonChats' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio' | 'voice';\nexport type ApiPrivacyKey = 'phoneNumber' | 'lastSeen' | 'profilePhoto' | 'voiceMessages' |\n'forwards' | 'chatInvite' | 'phoneCall' | 'phoneP2P';\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 ConfirmPayment,\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 ChannelRemovedUsers,\n GroupUserPermissionsCreate,\n GroupUserPermissions,\n ChatAdministrators,\n GroupRecentActions,\n ChatAdminRights,\n ChatNewAdminRights,\n GroupMembers,\n GroupAddAdmins,\n Invites,\n EditInvite,\n Reactions,\n InviteInfo,\n JoinRequests,\n}\n\nexport type ManagementType = 'user' | 'group' | 'channel';\n\nexport type NotifyException = {\n isMuted: boolean;\n isSilent?: boolean;\n shouldShowPreviews?: boolean;\n};\n\nexport type EmojiKeywords = {\n isLoading?: boolean;\n version: number;\n keywords: Record<string, string[]>;\n};\n\nexport type InlineBotSettings = {\n id: string;\n help?: string;\n query?: string;\n offset?: string;\n canLoadMore?: boolean;\n results?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n isGallery?: boolean;\n switchPm?: ApiBotInlineSwitchPm;\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 if (!instance!.isCancelled && tick()) {\n fastRaf(() => {\n animateSingle(tick, instance);\n });\n }\n}\n\nexport function animate(tick: Function) {\n if (tick()) {\n fastRaf(() => {\n animate(tick);\n });\n }\n}\n\nexport type TimingFn = (t: number) => number;\n\nexport type AnimateNumberProps = {\n to: number | number[];\n from: number | number[];\n duration: number;\n onUpdate: (value: any) => void;\n timing?: TimingFn;\n onEnd?: () => void;\n};\n\nexport const timingFunctions = {\n linear: (t: number) => t,\n easeIn: (t: number) => t ** 1.675,\n easeOut: (t: number) => -1 * t ** 1.675,\n easeInOut: (t: number) => 0.5 * (Math.sin((t - 0.5) * Math.PI) + 1),\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t ** 3,\n easeOutCubic: (t: number) => (--t) * t * t + 1,\n easeInOutCubic: (t: number) => (t < 0.5 ? 4 * t ** 3 : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1),\n easeInQuart: (t: number) => t ** 4,\n easeOutQuart: (t: number) => 1 - (--t) * t ** 3,\n easeInOutQuart: (t: number) => (t < 0.5 ? 8 * t ** 4 : 1 - 8 * (--t) * t ** 3),\n easeInQuint: (t: number) => t ** 5,\n easeOutQuint: (t: number) => 1 + (--t) * t ** 4,\n easeInOutQuint: (t: number) => (t < 0.5 ? 16 * t ** 5 : 1 + 16 * (--t) * t ** 4),\n};\n\nexport function animateNumber({\n timing = timingFunctions.linear,\n onUpdate,\n duration,\n onEnd,\n from,\n to,\n}: AnimateNumberProps) {\n const t0 = Date.now();\n let canceled = false;\n\n animate(() => {\n if (canceled) return false;\n const t1 = Date.now();\n let t = (t1 - t0) / duration;\n if (t > 1) t = 1;\n const progress = timing(t);\n if (typeof from === 'number' && typeof to === 'number') {\n onUpdate(from + ((to - from) * progress));\n } else if (Array.isArray(from) && Array.isArray(to)) {\n const result = from.map((f, i) => f + ((to[i] - f) * progress));\n onUpdate(result);\n }\n if (t === 1 && onEnd) onEnd();\n return t < 1;\n });\n\n return () => {\n canceled = true;\n if (onEnd) onEnd();\n };\n}\n","import { DEBUG } from '../config';\n\nexport function updateAppBadge(unreadCount: number) {\n if (typeof window.navigator.setAppBadge !== 'function') {\n return;\n }\n\n window.navigator.setAppBadge(unreadCount).catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\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.reduce((res, prop) => {\n if (currentProps[prop] !== newProps[prop]) {\n res.push(`${prop}: ${currentProps[prop]} => ${newProps[prop]}`);\n }\n\n return res;\n }, [] as string[]);\n}\n","type Parts = (string | false | undefined)[];\ntype PartsWithGlobals = (string | false | undefined | string[])[];\ntype ClassNameBuilder =\n ((elementName: string, ...modifiers: PartsWithGlobals) => string)\n & Record<string, string>;\n\nexport default function buildClassName(...parts: Parts) {\n return parts.filter(Boolean).join(' ');\n}\n\nexport function createClassNameBuilder(componentName: string) {\n return ((elementName: string, ...modifiers: PartsWithGlobals) => {\n const baseName = elementName === '&' ? componentName : `${componentName}__${elementName}`;\n\n return modifiers.reduce<string[]>((acc, modifier) => {\n if (modifier) {\n // A bit hacky way to pass global class names\n if (Array.isArray(modifier)) {\n acc.push(...modifier);\n } else {\n acc.push(`${baseName}--${modifier}`);\n }\n }\n\n return acc;\n }, [baseName]).join(' ');\n }) as ClassNameBuilder;\n}\n","type Parts = (string | false | undefined)[];\n\nexport default function buildStyle(...parts: Parts) {\n return parts.filter(Boolean).join(';');\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n ArrayBuffer,\n}\n\nexport async function fetch(\n cacheName: string, key: string, type: Type, isHtmlAllowed = false,\n) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n const contentType = response.headers.get('Content-Type');\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n // Ignore deprecated data-uri avatars\n if (key.startsWith('avatar') && contentType && contentType.startsWith('text')) {\n return undefined;\n }\n\n const blob = await response.blob();\n const shouldRecreate = !blob.type || (!isHtmlAllowed && blob.type.includes('html'));\n // iOS Safari fails to preserve `type` in cache\n let resolvedType = blob.type || contentType;\n\n if (!(shouldRecreate && resolvedType)) {\n return blob;\n }\n\n // Prevent HTML-in-video attacks (for files that were cached before fix)\n if (!isHtmlAllowed) {\n resolvedType = resolvedType.replace(/html/gi, '');\n }\n\n return new Blob([blob], { type: resolvedType });\n }\n case Type.Json:\n return await response.json();\n case Type.ArrayBuffer:\n return await response.arrayBuffer();\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 | ArrayBuffer | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const cacheData = typeof data === 'string' || data instanceof Blob || data instanceof ArrayBuffer\n ? data\n : JSON.stringify(data);\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\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 remove(cacheName: string, key: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n const cache = await cacheApi.open(cacheName);\n return await cache.delete(key);\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","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 function hasCallbacks() {\n return Boolean(callbacks.length);\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n hasCallbacks,\n };\n}\n\nexport type CallbackManager = ReturnType<typeof createCallbackManager>;\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onLeft' | 'onRight'\n| 'onTab';\ntype Handler = (e: KeyboardEvent) => void;\ntype CaptureOptions = Partial<Record<HandlerName, Handler>>;\n\nconst keyToHandlerName: Record<string, HandlerName> = {\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<HandlerName, Handler[]> = {\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<HandlerName>).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<HandlerName>).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 { DEBUG } from '../config';\n\nexport const CLIPBOARD_ITEM_SUPPORTED = window.navigator.clipboard && window.ClipboardItem;\n\nconst textCopyEl = document.createElement('textarea');\ntextCopyEl.setAttribute('readonly', '');\ntextCopyEl.tabIndex = -1;\ntextCopyEl.className = 'visually-hidden';\n\nexport const copyTextToClipboard = (str: string): void => {\n textCopyEl.value = str;\n document.body.appendChild(textCopyEl);\n const selection = document.getSelection();\n\n if (selection) {\n // Store previous selection\n const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0);\n textCopyEl.select();\n document.execCommand('copy');\n // Restore the original selection\n if (rangeToRestore) {\n selection.removeAllRanges();\n selection.addRange(rangeToRestore);\n }\n }\n\n document.body.removeChild(textCopyEl);\n};\n\nexport const copyImageToClipboard = (imageUrl?: string) => {\n if (!imageUrl) return;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = new Image();\n imageEl.onload = (e: Event) => {\n if (ctx && e.currentTarget) {\n const img = e.currentTarget as HTMLImageElement;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n canvas.toBlob(copyBlobToClipboard, 'image/png', 1);\n }\n };\n\n imageEl.src = imageUrl;\n};\n\nasync function copyBlobToClipboard(pngBlob: Blob | null) {\n if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) {\n return;\n }\n\n try {\n await window.navigator.clipboard.write?.([\n new ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","// Sometimes event is fired earlier than animation completes\nconst ANIMATION_END_DELAY = 50;\n\nexport function waitForTransitionEnd(node: Node, handler: NoneToVoidFunction, propertyName?: string) {\n waitForEndEvent('transitionend', node, handler, propertyName);\n}\n\nexport function waitForAnimationEnd(node: Node, handler: NoneToVoidFunction, animationName?: string) {\n waitForEndEvent('animationend', node, handler, animationName);\n}\n\nfunction waitForEndEvent(\n eventType: 'transitionend' | 'animationend',\n node: Node,\n handler: NoneToVoidFunction,\n detailedName?: string,\n) {\n let isHandled = false;\n\n node.addEventListener(eventType, function handleAnimationEnd(e: TransitionEvent | AnimationEvent) {\n if (isHandled || e.target !== e.currentTarget) {\n return;\n }\n\n if (detailedName && (\n (e instanceof TransitionEvent && e.propertyName === detailedName)\n || (e instanceof AnimationEvent && e.animationName === detailedName)\n )) {\n return;\n }\n\n isHandled = true;\n\n node.removeEventListener(eventType, handleAnimationEnd as EventListener);\n\n setTimeout(() => {\n handler();\n }, ANIMATION_END_DELAY);\n } as EventListener);\n}\n","import type { LangFn } from '../hooks/useLang';\nimport withCache from './withCache';\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 MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\n\nexport function isToday(date: Date) {\n return getDayStartAt(new Date()) === getDayStartAt(date);\n}\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\n// @optimization `toLocaleTimeString` is avoided because of bad performance\nexport function formatTime(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const timeFormat = lang.timeFormat || '24h';\n\n let hours = date.getHours();\n let marker = '';\n if (timeFormat === '12h') {\n marker = hours >= 12 ? ' PM' : ' AM';\n hours = hours > 12 ? hours % 12 : hours;\n }\n\n return `${String(hours).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}${marker}`;\n}\n\nexport function formatPastTimeShort(lang: LangFn, 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(lang, date);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return lang(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const noYear = date.getFullYear() === today.getFullYear();\n\n return formatDateToString(date, lang.code, noYear);\n}\n\nexport function formatFullDate(lang: LangFn, datetime: number | Date) {\n return formatDateToString(datetime, lang.code, false, 'numeric');\n}\n\nexport function formatMonthAndYear(lang: LangFn, date: Date, isShort = false) {\n return formatDateToString(date, lang.code, false, isShort ? 'short' : 'long', true);\n}\n\nexport function formatCountdown(\n lang: LangFn,\n msLeft: number,\n) {\n const days = Math.floor(msLeft / MILLISECONDS_IN_DAY);\n if (msLeft < 0) {\n return 0;\n } else if (days < 1) {\n return formatMediaDuration(msLeft / 1000);\n } else if (days < 7) {\n return lang('Days', days);\n } else if (days < 30) {\n return lang('Weeks', Math.floor(days / 7));\n } else if (days < 365) {\n return lang('Months', Math.floor(days / 30));\n } else {\n return lang('Years', Math.floor(days / 365));\n }\n}\n\nexport function formatCountdownShort(lang: LangFn, msLeft: number) {\n if (msLeft < 60 * 1000) {\n return Math.ceil(msLeft / 1000);\n } else if (msLeft < 60 * 60 * 1000) {\n return Math.ceil(msLeft / (60 * 1000));\n } else if (msLeft < MILLISECONDS_IN_DAY) {\n return lang('MessageTimer.ShortHours', Math.ceil(msLeft / (60 * 60 * 1000)));\n } else {\n return lang('MessageTimer.ShortDays', Math.ceil(msLeft / MILLISECONDS_IN_DAY));\n }\n}\n\nexport function formatLastUpdated(lang: LangFn, currentTime: number, lastUpdated = currentTime) {\n const seconds = currentTime - lastUpdated;\n if (seconds < 60) {\n return lang('LiveLocationUpdated.JustNow');\n } else if (seconds < 60 * 60) {\n return lang('LiveLocationUpdated.MinutesAgo', Math.floor(seconds / 60));\n } else {\n return lang('LiveLocationUpdated.TodayAt', formatTime(lang, lastUpdated));\n }\n}\n\ntype DurationType = 'Seconds' | 'Minutes' | 'Hours' | 'Days' | 'Weeks';\n\nexport function formatTimeDuration(lang: LangFn, duration: number, showLast = 2) {\n if (!duration) {\n return undefined;\n }\n\n const durationRecords: { duration: number; type: DurationType }[] = [];\n const labels = [\n { multiplier: 1, type: 'Seconds' },\n { multiplier: 60, type: 'Minutes' },\n { multiplier: 60, type: 'Hours' },\n { multiplier: 24, type: 'Days' },\n { multiplier: 7, type: 'Weeks' },\n ] as Array<{ multiplier: number; type: DurationType }>;\n let t = 1;\n labels.forEach((label, idx) => {\n t *= label.multiplier;\n\n if (duration < t) {\n return;\n }\n\n const modulus = labels[idx === (labels.length - 1) ? idx : idx + 1].multiplier!;\n durationRecords.push({\n duration: Math.floor((duration / t) % modulus),\n type: label.type,\n });\n });\n\n const out = durationRecords.slice(-showLast).reverse();\n for (let i = out.length - 1; i >= 0; --i) {\n if (out[i].duration === 0) {\n out.splice(i, 1);\n }\n }\n\n // TODO In arabic we don't use \",\" as delimiter rather we use \"and\" each time\n return out.map((l) => lang(l.type, l.duration, 'i')).join(', ');\n}\n\nexport function formatHumanDate(\n lang: LangFn,\n datetime: number | Date,\n isShort = false,\n noWeekdays = false,\n isUpperFirst?: boolean,\n) {\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 (isUpperFirst || !isShort ? upperFirst : lowerFirst)(lang('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(lang('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 const weekDayString = isShort ? lang(`Weekday.Short${weekDay}`) : lang(`Weekday.${weekDay}`);\n\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(weekDayString);\n }\n }\n\n const noYear = date.getFullYear() === today.getFullYear();\n const formattedDate = formatDateToString(date, lang.code, noYear, isShort ? 'short' : 'long');\n\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(formattedDate);\n}\n\nexport function formatMediaDateTime(\n lang: LangFn,\n datetime: number | Date,\n isUpperFirst?: boolean,\n) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(lang, date, true, undefined, isUpperFirst)}, ${formatTime(lang, date)}`;\n}\n\nexport function formatMediaDuration(duration: number, maxValue?: 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 const maxHours = maxValue ? Math.floor(maxValue / 3600) : 0;\n const maxMinutes = maxValue ? Math.floor((maxValue % 3600) / 60) : 0;\n let string = '';\n if (hours > 0 || maxHours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else if (maxMinutes >= 10) {\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\nconst formatDayToStringWithCache = withCache((\n dayStartAt: number,\n locale: string,\n noYear?: boolean,\n monthFormat: 'short' | 'long' | 'numeric' = 'short',\n noDay?: boolean,\n) => {\n return new Date(dayStartAt).toLocaleString(\n locale,\n {\n year: noYear ? undefined : 'numeric',\n month: monthFormat,\n day: noDay ? undefined : 'numeric',\n },\n );\n});\n\nexport function formatDateToString(\n datetime: Date | number,\n locale = 'en-US',\n noYear = false,\n monthFormat: 'short' | 'long' | 'numeric' = 'short',\n noDay = false,\n) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const dayStartAt = getDayStartAt(date);\n\n return formatDayToStringWithCache(dayStartAt, locale, noYear, monthFormat, noDay);\n}\n\nexport function formatDateTimeToString(datetime: Date | number, locale = 'en-US') {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: '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 + MILLISECONDS_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 EMOJI_REGEX, { removeVS16s } from '../lib/twemojiRegex';\nimport withCache from './withCache';\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\nconst ISO_FLAGS_OFFSET = 127397;\n\nexport type EmojiRawData = typeof import('emoji-data-ios/emoji-data.json');\nexport type EmojiModule = { default: EmojiRawData };\n\nexport type EmojiData = {\n categories: Array<EmojiCategory>;\n emojis: Record<string, Emoji>;\n};\n\n// Non-standard variations of emojis, used on some devices\nconst EMOJI_EXCEPTIONS: [string | RegExp, string][] = [\n [/\\u{1f3f3}\\u200d\\u{1f308}/gu, '\\u{1f3f3}\\ufe0f\\u200d\\u{1f308}'], // 🏳‍🌈\n [/\\u{1f3f3}\\u200d\\u26a7\\ufe0f/gu, '\\u{1f3f3}\\ufe0f\\u200d\\u26a7\\ufe0f'], // 🏳️‍⚧️\n [/\\u{1f937}\\u200d\\u2642[^\\ufe0f]/gu, '\\u{1f937}\\u200d\\u2642\\ufe0f'], // 🤷‍♂️\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 const LOADED_EMOJIS = new Set<string>();\n\nexport function handleEmojiLoad(event: React.SyntheticEvent<HTMLImageElement>) {\n event.currentTarget.classList.add('open');\n LOADED_EMOJIS.add(event.currentTarget.dataset.path!);\n}\n\nexport function fixNonStandardEmoji(text: string) {\n // Non-standard sequences typically parsed as separate emojis, so no need to fix text without any\n if (!text.match(EMOJI_REGEX)) return text;\n // eslint-disable-next-line no-restricted-syntax\n for (const [regex, replacement] of EMOJI_EXCEPTIONS) {\n text = text.replace(regex, replacement);\n }\n\n return text;\n}\n\nexport function nativeToUnified(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\nfunction nativeToUnifiedExtended(emoji: string) {\n return nativeToUnified(removeVS16s(emoji));\n}\n\nexport const nativeToUnifiedExtendedWithCache = withCache(nativeToUnifiedExtended);\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\nexport function isoToEmoji(iso: string) {\n const code = iso.toUpperCase();\n\n if (!/^[A-Z]{2}$/.test(code)) return iso;\n const codePoints = [...code].map((c) => c.codePointAt(0)! + ISO_FLAGS_OFFSET);\n return String.fromCodePoint(...codePoints);\n}\n","export function ensureProtocol(url?: string) {\n if (!url) {\n return undefined;\n }\n\n // HTTP was chosen by default as a fix for https://bugs.telegram.org/c/10712.\n // It is also the default protocol in the official TDesktop client.\n return url.includes('://') ? url : `http://${url}`;\n}\n","let isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise<boolean> {\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","import type { ThemeKey } from '../types';\n\nlet systemThemeCache: ThemeKey = (\n window.matchMedia?.('(prefers-color-scheme: dark)').matches\n) ? 'dark' : 'light';\n\nexport function getSystemTheme() {\n return systemThemeCache;\n}\n\nfunction handleSystemThemeChange(e: MediaQueryListEventMap['change']) {\n systemThemeCache = e.matches ? 'dark' : 'light';\n}\n\nconst mql = window.matchMedia('(prefers-color-scheme: dark)');\nif (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n} else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n IS_TEST,\n SUPPORTED_VIDEO_CONTENT_TYPES,\n VIDEO_MOV_TYPE,\n CONTENT_TYPES_WITH_PREVIEW,\n PRODUCTION_HOSTNAME,\n} from '../config';\n\nexport * from './environmentWebp';\n\nexport * from './environmentSystemTheme';\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: 'macOS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'macOS';\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 IS_PRODUCTION_HOST = window.location.host === PRODUCTION_HOSTNAME;\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'macOS';\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);\nexport const IS_PWA = (\n window.matchMedia('(display-mode: standalone)').matches\n || (window.navigator as any).standalone\n || document.referrer.includes('android-app://')\n);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_SINGLE_COLUMN_LAYOUT = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\n// Special layout, 1 column while chat opened, 2 columns while collapsed\nexport const IS_TABLET_COLUMN_LAYOUT = !IS_SINGLE_COLUMN_LAYOUT && (\n window.innerWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = Boolean(\n window.navigator.mediaDevices && 'getUserMedia' in window.navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n ),\n);\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS) && isLastEmojiVersionSupported();\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'));\nexport const IS_CANVAS_FILTER_SUPPORTED = (\n !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {})\n);\nexport const IS_REQUEST_FULLSCREEN_SUPPORTED = 'requestFullscreen' in document.createElement('div');\nexport const ARE_CALLS_SUPPORTED = !navigator.userAgent.includes('Firefox');\nexport const LAYERS_ANIMATION_NAME = IS_ANDROID ? 'slide-fade' : IS_IOS ? 'slide-layers' : 'push-slide';\n\nconst TEST_VIDEO = document.createElement('video');\n// `canPlayType(VIDEO_MOV_TYPE)` returns false negative at least for macOS Chrome and iOS Safari\nexport const IS_MOV_SUPPORTED = Boolean(\n TEST_VIDEO.canPlayType(VIDEO_MOV_TYPE).replace('no', '') || IS_IOS || IS_MAC_OS,\n);\n\nif (IS_MOV_SUPPORTED) {\n SUPPORTED_VIDEO_CONTENT_TYPES.add(VIDEO_MOV_TYPE);\n CONTENT_TYPES_WITH_PREVIEW.add(VIDEO_MOV_TYPE);\n}\n\nexport const IS_WEBM_SUPPORTED = Boolean(TEST_VIDEO.canPlayType('video/webm; codecs=\"vp9\"').replace('no', ''))\n && !(IS_MAC_OS && IS_SAFARI); // Safari on MacOS has some issues with WebM\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\nexport const IS_OPFS_SUPPORTED = Boolean(navigator.storage?.getDirectory);\nif (IS_OPFS_SUPPORTED) {\n // Clear old contents\n (async () => {\n try {\n const directory = await navigator.storage.getDirectory();\n await directory.removeEntry('downloads', { recursive: true });\n } catch {\n // Ignore\n }\n })();\n}\n\nexport const IS_BACKDROP_BLUR_SUPPORTED = !IS_TEST && (\n CSS.supports('backdrop-filter: blur()') || CSS.supports('-webkit-backdrop-filter: blur()')\n);\nexport const IS_COMPACT_MENU = !IS_TOUCH_ENV;\nexport const IS_SCROLL_PATCH_NEEDED = !IS_MAC_OS && !IS_IOS && !IS_ANDROID;\nexport const IS_INSTALL_PROMPT_SUPPORTED = 'onbeforeinstallprompt' in window;\n\n// Smaller area reduces scroll jumps caused by `patchChromiumScroll`\nexport const MESSAGE_LIST_SENSITIVE_AREA = IS_SCROLL_PATCH_NEEDED ? 300 : 750;\n\nexport const MAX_BUFFER_SIZE = (IS_ANDROID || IS_IOS ? 512 : 2000) * 1024 ** 2; // 512 OR 2000 MB\n\n// TODO Turn on later as `!IS_IOS && !IS_ANDROID`\nexport const VIDEO_AVATARS_DISABLED = true;\n\nfunction isLastEmojiVersionSupported() {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji-test-element');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = '🫱🏻'; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = '❤️'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\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<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent<FileReader>) => {\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<HTMLImageElement> {\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<HTMLVideoElement> {\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<string | undefined> {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise<undefined>,\n new Promise<string | undefined>((resolve, reject) => {\n video.onseeked = () => {\n if (!video.videoWidth || !video.videoHeight) {\n resolve(undefined);\n }\n\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","import { addCallback } from '../lib/teact/teactn';\nimport { addActionHandler, getGlobal } from '../global';\n\nimport type { GlobalState } from '../global/types';\nimport type { NotifyException, NotifySettings } from '../types';\nimport type { ApiChat, ApiChatFolder, ApiUser } from '../api/types';\n\nimport {\n ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, DEBUG, SERVICE_NOTIFICATIONS_USER_ID,\n} from '../config';\nimport { selectNotifySettings, selectNotifyExceptions } from '../global/selectors';\nimport { selectIsChatMuted } from '../global/helpers';\nimport { onIdle, throttle } from './schedulers';\nimport { areSortedArraysEqual, unique } from './iteratees';\nimport arePropsShallowEqual from './arePropsShallowEqual';\nimport type { CallbackManager } from './callbacks';\nimport { createCallbackManager } from './callbacks';\n\ninterface FolderSummary {\n id: number;\n listIds?: Set<string>;\n orderedPinnedIds?: string[];\n contacts?: true;\n nonContacts?: true;\n groups?: true;\n channels?: true;\n bots?: true;\n excludeMuted?: true;\n excludeRead?: true;\n excludeArchived?: true;\n excludedChatIds?: Set<string>;\n includedChatIds?: Set<string>;\n pinnedChatIds?: Set<string>;\n}\n\ninterface ChatSummary {\n id: string;\n type: ApiChat['type'];\n isListed: boolean;\n isArchived: boolean;\n isMuted: boolean;\n isUnread: boolean;\n unreadCount?: number;\n unreadMentionsCount?: number;\n order: number;\n isUserBot?: boolean;\n isUserContact?: boolean;\n}\n\nconst UPDATE_THROTTLE = 500;\nconst DEBUG_DURATION_LIMIT = 6;\n\nconst initials = buildInitials();\n\nlet prevGlobal: {\n allFolderListIds?: GlobalState['chats']['listIds']['active'];\n allFolderPinnedIds?: GlobalState['chats']['orderedPinnedIds']['active'];\n archivedFolderListIds?: GlobalState['chats']['listIds']['archived'];\n archivedFolderPinnedIds?: GlobalState['chats']['orderedPinnedIds']['archived'];\n isAllFolderFullyLoaded?: boolean;\n isArchivedFolderFullyLoaded?: boolean;\n chatsById: Record<string, ApiChat>;\n foldersById: Record<string, ApiChatFolder>;\n usersById: Record<string, ApiUser>;\n notifySettings: NotifySettings;\n notifyExceptions?: Record<number, NotifyException>;\n} = initials.prevGlobal;\n\nlet prepared: {\n folderSummariesById: Record<string, FolderSummary>;\n chatSummariesById: Map<string, ChatSummary>;\n folderIdsByChatId: Record<string, number[]>;\n chatIdsByFolderId: Record<number, Set<string> | undefined>;\n isOrderedListJustPatched: Record<number, boolean | undefined>;\n} = initials.prepared;\n\nlet results: {\n orderedIdsByFolderId: Record<string, string[] | undefined>;\n pinnedCountByFolderId: Record<string, number | undefined>; // Also watched by `callbacks.orderedIdsByFolderId`\n chatsCountByFolderId: Record<string, number | undefined>;\n unreadCountersByFolderId: Record<string, {\n chatsCount: number;\n notificationsCount: number;\n } | undefined>;\n} = initials.results;\n\nlet callbacks: {\n orderedIdsByFolderId: Record<number, CallbackManager>;\n chatsCountByFolderId: CallbackManager;\n unreadCountersByFolderId: CallbackManager;\n} = initials.callbacks;\n\nconst updateFolderManagerThrottled = throttle(() => {\n onIdle(() => {\n updateFolderManager(getGlobal());\n });\n}, UPDATE_THROTTLE);\n\nlet inited = false;\n\n/* Getters */\n\nexport function init() {\n inited = true;\n\n addCallback(updateFolderManagerThrottled);\n addActionHandler('reset', reset);\n\n updateFolderManager(getGlobal());\n}\n\nexport function getOrderedIds(folderId: number) {\n if (!inited) init();\n\n return results.orderedIdsByFolderId[folderId];\n}\n\nexport function getPinnedChatsCount(folderId: number) {\n if (!inited) init();\n\n return results.pinnedCountByFolderId[folderId] || 0;\n}\n\nexport function getChatsCount() {\n if (!inited) init();\n\n return results.chatsCountByFolderId;\n}\n\nexport function getUnreadCounters() {\n if (!inited) init();\n\n return results.unreadCountersByFolderId;\n}\n\nexport function getAllNotificationsCount() {\n return getUnreadCounters()[ALL_FOLDER_ID]?.notificationsCount || 0;\n}\n\nexport function getOrderKey(chatId: string) {\n return prepared.chatSummariesById.get(chatId)!.order;\n}\n\n/* Callback managers */\n\nexport function addOrderedIdsCallback(folderId: number, callback: (orderedIds: string[]) => void) {\n if (!callbacks.orderedIdsByFolderId[folderId]) {\n callbacks.orderedIdsByFolderId[folderId] = createCallbackManager();\n }\n\n return callbacks.orderedIdsByFolderId[folderId].addCallback(callback);\n}\n\nexport function addChatsCountCallback(callback: (chatsCount: typeof results.chatsCountByFolderId) => void) {\n return callbacks.chatsCountByFolderId.addCallback(callback);\n}\n\nexport function addUnreadCountersCallback(callback: (unreadCounters: typeof results.unreadCountersByFolderId) => void) {\n return callbacks.unreadCountersByFolderId.addCallback(callback);\n}\n\n/* Global update handlers */\n\nfunction updateFolderManager(global: GlobalState) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startedAt: number;\n if (DEBUG) {\n DEBUG_startedAt = performance.now();\n }\n\n const isAllFolderChanged = Boolean(\n global.chats.listIds.active\n && isMainFolderChanged(ALL_FOLDER_ID, global.chats.listIds.active, global.chats.orderedPinnedIds.active),\n );\n const isArchivedFolderChanged = Boolean(\n global.chats.listIds.archived\n && isMainFolderChanged(ARCHIVED_FOLDER_ID, global.chats.listIds.archived, global.chats.orderedPinnedIds.archived),\n );\n const isAllFullyLoadedChanged = global.chats.isFullyLoaded.active !== prevGlobal.isAllFolderFullyLoaded;\n const isArchivedFullyLoadedChanged = global.chats.isFullyLoaded.archived !== prevGlobal.isArchivedFolderFullyLoaded;\n\n const areFoldersChanged = global.chatFolders.byId !== prevGlobal.foldersById;\n const areChatsChanged = global.chats.byId !== prevGlobal.chatsById;\n const areUsersChanged = global.users.byId !== prevGlobal.usersById;\n const areNotifySettingsChanged = selectNotifySettings(global) !== prevGlobal.notifySettings;\n const areNotifyExceptionsChanged = selectNotifyExceptions(global) !== prevGlobal.notifyExceptions;\n\n let affectedFolderIds: number[] = [];\n\n if (isAllFullyLoadedChanged || isArchivedFullyLoadedChanged) {\n affectedFolderIds = affectedFolderIds.concat(\n updateFullyLoaded(global, isArchivedFullyLoadedChanged),\n );\n }\n\n if (!(\n isAllFolderChanged || isArchivedFolderChanged || areFoldersChanged\n || areChatsChanged || areUsersChanged || areNotifySettingsChanged || areNotifyExceptionsChanged\n )\n ) {\n if (affectedFolderIds.length) {\n updateResults(affectedFolderIds);\n }\n\n return;\n }\n\n const prevAllFolderListIds = prevGlobal.allFolderListIds;\n const prevArchivedFolderListIds = prevGlobal.archivedFolderListIds;\n\n updateFolders(global, isAllFolderChanged, isArchivedFolderChanged, areFoldersChanged);\n\n affectedFolderIds = affectedFolderIds.concat(updateChats(\n global,\n areFoldersChanged || isAllFolderChanged || isArchivedFolderChanged,\n areNotifySettingsChanged,\n areNotifyExceptionsChanged,\n prevAllFolderListIds,\n prevArchivedFolderListIds,\n ));\n\n updateResults(unique(affectedFolderIds));\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startedAt!;\n if (duration > DEBUG_DURATION_LIMIT) {\n // eslint-disable-next-line no-console\n console.warn(`Slow \\`updateFolderManager\\`: ${Math.round(duration)} ms`);\n }\n }\n}\n\nfunction isMainFolderChanged(folderId: number, newListIds?: string[], newPinnedIds?: string[]) {\n const currentListIds = folderId === ALL_FOLDER_ID\n ? prevGlobal.allFolderListIds\n : prevGlobal.archivedFolderListIds;\n const currentPinnedIds = folderId === ALL_FOLDER_ID\n ? prevGlobal.allFolderPinnedIds\n : prevGlobal.archivedFolderPinnedIds;\n\n return currentListIds !== newListIds || currentPinnedIds !== newPinnedIds;\n}\n\nfunction updateFullyLoaded(\n global: GlobalState,\n isArchivedFullyLoadedChanged = false,\n) {\n let affectedFolderIds = [];\n\n if (isArchivedFullyLoadedChanged) {\n affectedFolderIds.push(ARCHIVED_FOLDER_ID);\n }\n\n const isAllFolderFullyLoaded = global.chats.isFullyLoaded.active;\n const isArchivedFolderFullyLoaded = global.chats.isFullyLoaded.archived;\n\n if (isAllFolderFullyLoaded && isArchivedFolderFullyLoaded) {\n const emptyFolderIds = Object.keys(prepared.folderSummariesById)\n .filter((folderId) => !results.orderedIdsByFolderId[folderId])\n .map(Number);\n\n affectedFolderIds = affectedFolderIds.concat(emptyFolderIds);\n }\n\n prevGlobal.isAllFolderFullyLoaded = isAllFolderFullyLoaded;\n prevGlobal.isArchivedFolderFullyLoaded = isArchivedFolderFullyLoaded;\n\n return affectedFolderIds;\n}\n\nfunction updateFolders(\n global: GlobalState, isAllFolderChanged: boolean, isArchivedFolderChanged: boolean, areFoldersChanged: boolean,\n) {\n const changedFolders = [];\n\n if (isAllFolderChanged) {\n const newListIds = global.chats.listIds.active!;\n const newPinnedIds = global.chats.orderedPinnedIds.active;\n\n prepared.folderSummariesById[ALL_FOLDER_ID] = buildFolderSummaryFromMainList(\n ALL_FOLDER_ID, newListIds, newPinnedIds,\n );\n\n prevGlobal.allFolderListIds = newListIds;\n prevGlobal.allFolderPinnedIds = newPinnedIds;\n\n changedFolders.push(ALL_FOLDER_ID);\n }\n\n if (isArchivedFolderChanged) {\n const newListIds = global.chats.listIds.archived!;\n const newPinnedIds = global.chats.orderedPinnedIds.archived;\n\n prepared.folderSummariesById[ARCHIVED_FOLDER_ID] = buildFolderSummaryFromMainList(\n ARCHIVED_FOLDER_ID, newListIds, newPinnedIds,\n );\n\n prevGlobal.archivedFolderListIds = newListIds;\n prevGlobal.archivedFolderPinnedIds = newPinnedIds;\n\n changedFolders.push(ARCHIVED_FOLDER_ID);\n }\n\n if (areFoldersChanged) {\n const newFoldersById = global.chatFolders.byId;\n\n Object.values(newFoldersById).forEach((folder) => {\n if (folder === prevGlobal.foldersById[folder.id]) {\n return;\n }\n\n prepared.folderSummariesById[folder.id] = buildFolderSummary(folder);\n\n changedFolders.push(folder.id);\n });\n\n prevGlobal.foldersById = newFoldersById;\n }\n\n return changedFolders;\n}\n\nfunction buildFolderSummaryFromMainList(\n folderId: number, listIds: string[], orderedPinnedIds?: string[],\n): FolderSummary {\n return {\n id: folderId,\n listIds: new Set(listIds),\n orderedPinnedIds,\n pinnedChatIds: new Set(orderedPinnedIds),\n };\n}\n\nfunction buildFolderSummary(folder: ApiChatFolder): FolderSummary {\n return {\n ...folder,\n orderedPinnedIds: folder.pinnedChatIds,\n excludedChatIds: folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined,\n includedChatIds: folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined,\n pinnedChatIds: folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined,\n };\n}\n\nfunction updateChats(\n global: GlobalState,\n areFoldersChanged: boolean,\n areNotifySettingsChanged: boolean,\n areNotifyExceptionsChanged: boolean,\n prevAllFolderListIds?: string[],\n prevArchivedFolderListIds?: string[],\n) {\n const newChatsById = global.chats.byId;\n const newUsersById = global.users.byId;\n const newNotifySettings = selectNotifySettings(global);\n const newNotifyExceptions = selectNotifyExceptions(global);\n const folderSummaries = Object.values(prepared.folderSummariesById);\n const affectedFolderIds = new Set<number>();\n\n const newAllFolderListIds = global.chats.listIds.active;\n const newArchivedFolderListIds = global.chats.listIds.archived;\n let allIds = [...newAllFolderListIds || [], ...newArchivedFolderListIds || []];\n if (newAllFolderListIds !== prevAllFolderListIds || newArchivedFolderListIds !== prevArchivedFolderListIds) {\n allIds = unique(allIds.concat(prevAllFolderListIds || [], prevArchivedFolderListIds || []));\n }\n\n allIds.forEach((chatId) => {\n const chat = newChatsById[chatId];\n\n if (\n !areFoldersChanged\n && !areNotifySettingsChanged\n && !areNotifyExceptionsChanged\n && chat === prevGlobal.chatsById[chatId]\n && newUsersById[chatId] === prevGlobal.usersById[chatId]\n ) {\n return;\n }\n\n let newFolderIds: number[];\n if (chat) {\n const currentSummary = prepared.chatSummariesById.get(chatId);\n const newSummary = buildChatSummary(chat, newNotifySettings, newNotifyExceptions, newUsersById[chatId]);\n if (!areFoldersChanged && currentSummary && arePropsShallowEqual(newSummary, currentSummary)) {\n return;\n }\n\n prepared.chatSummariesById.set(chatId, newSummary);\n\n newFolderIds = buildChatFolderIds(newSummary, folderSummaries);\n newFolderIds.forEach((folderId) => {\n affectedFolderIds.add(folderId);\n });\n } else {\n prepared.chatSummariesById.delete(chatId);\n newFolderIds = [];\n }\n\n const currentFolderIds = prepared.folderIdsByChatId[chatId] || [];\n if (areSortedArraysEqual(newFolderIds, currentFolderIds)) {\n return;\n }\n\n const deletedFolderIds = updateListsForChat(chatId, currentFolderIds, newFolderIds);\n deletedFolderIds.forEach((folderId) => {\n affectedFolderIds.add(folderId);\n });\n });\n\n prevGlobal.chatsById = newChatsById;\n prevGlobal.usersById = newUsersById;\n prevGlobal.notifySettings = newNotifySettings;\n prevGlobal.notifyExceptions = newNotifyExceptions;\n\n return Array.from(affectedFolderIds);\n}\n\nfunction buildChatSummary(\n chat: ApiChat,\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n user?: ApiUser,\n): ChatSummary {\n const {\n id, type, lastMessage, isRestricted, isNotJoined, migratedTo, folderId,\n unreadCount, unreadMentionsCount, hasUnreadMark,\n joinDate, draftDate,\n } = chat;\n\n const userInfo = type === 'chatTypePrivate' && user;\n const shouldHideServiceChat = chat.id === SERVICE_NOTIFICATIONS_USER_ID && (\n !chat.lastMessage || chat.lastMessage.content.action?.type === 'historyClear'\n );\n\n return {\n id,\n type,\n isListed: Boolean(!isRestricted && !isNotJoined && !migratedTo && !shouldHideServiceChat),\n isArchived: folderId === ARCHIVED_FOLDER_ID,\n isMuted: selectIsChatMuted(chat, notifySettings, notifyExceptions),\n isUnread: Boolean(unreadCount || unreadMentionsCount || hasUnreadMark),\n unreadCount,\n unreadMentionsCount,\n order: Math.max(joinDate || 0, draftDate || 0, lastMessage?.date || 0),\n isUserBot: userInfo ? userInfo.type === 'userTypeBot' : undefined,\n isUserContact: userInfo ? userInfo.isContact : undefined,\n };\n}\n\nfunction buildChatFolderIds(chatSummary: ChatSummary, folderSummaries: FolderSummary[]) {\n return folderSummaries.reduce<number[]>((acc, folderSummary) => {\n if (isChatInFolder(chatSummary, folderSummary)) {\n acc.push(folderSummary.id);\n }\n\n return acc;\n }, []).sort();\n}\n\nfunction isChatInFolder(\n chatSummary: ChatSummary,\n folderSummary: FolderSummary,\n) {\n if (!chatSummary.isListed) {\n return false;\n }\n\n const { id: chatId, type } = chatSummary;\n\n if (folderSummary.listIds) {\n if (\n (chatSummary.isArchived && folderSummary.id === ALL_FOLDER_ID)\n || (!chatSummary.isArchived && folderSummary.id === ARCHIVED_FOLDER_ID)\n ) {\n return false;\n }\n\n return folderSummary.listIds.has(chatId);\n }\n\n if (folderSummary.excludedChatIds?.has(chatId)) {\n return false;\n }\n\n if (folderSummary.includedChatIds?.has(chatId)) {\n return true;\n }\n\n if (folderSummary.pinnedChatIds?.has(chatId)) {\n return true;\n }\n\n if (folderSummary.excludeArchived && chatSummary.isArchived) {\n return false;\n }\n\n if (folderSummary.excludeRead && !chatSummary.isUnread) {\n return false;\n }\n\n if (folderSummary.excludeMuted && chatSummary.isMuted && !chatSummary.unreadMentionsCount) {\n return false;\n }\n\n if (type === 'chatTypePrivate') {\n if (chatSummary.isUserBot) {\n if (folderSummary.bots) {\n return true;\n }\n } else {\n if (folderSummary.contacts && chatSummary.isUserContact) {\n return true;\n }\n\n if (folderSummary.nonContacts && !chatSummary.isUserContact) {\n return true;\n }\n }\n } else if (type === 'chatTypeChannel') {\n return Boolean(folderSummary.channels);\n } else if (type === 'chatTypeBasicGroup' || type === 'chatTypeSuperGroup') {\n return Boolean(folderSummary.groups);\n }\n\n return false;\n}\n\nfunction updateListsForChat(chatId: string, currentFolderIds: number[], newFolderIds: number[]) {\n const currentFolderIdsSet = new Set(currentFolderIds);\n const newFolderIdsSet = new Set(newFolderIds);\n const deletedFolderIds: number[] = [];\n\n unique([...currentFolderIds, ...newFolderIds]).forEach((folderId) => {\n let currentFolderOrderedIds = results.orderedIdsByFolderId[folderId];\n\n if (currentFolderIdsSet.has(folderId) && !newFolderIdsSet.has(folderId)) {\n prepared.chatIdsByFolderId[folderId]!.delete(chatId);\n\n deletedFolderIds.push(folderId);\n\n if (currentFolderOrderedIds) {\n currentFolderOrderedIds = currentFolderOrderedIds.filter((id) => id !== chatId);\n prepared.isOrderedListJustPatched[folderId] = true;\n }\n } else if (!currentFolderIdsSet.has(folderId) && newFolderIdsSet.has(folderId)) {\n if (!prepared.chatIdsByFolderId[folderId]) {\n prepared.chatIdsByFolderId[folderId] = new Set();\n }\n\n prepared.chatIdsByFolderId[folderId]!.add(chatId);\n\n if (currentFolderOrderedIds) {\n currentFolderOrderedIds.push(chatId);\n prepared.isOrderedListJustPatched[folderId] = true;\n }\n }\n\n results.orderedIdsByFolderId[folderId] = currentFolderOrderedIds;\n });\n\n prepared.folderIdsByChatId[chatId] = newFolderIds;\n\n return deletedFolderIds;\n}\n\nfunction updateResults(affectedFolderIds: number[]) {\n let wasUnreadCountersChanged = false;\n let wasChatsCountChanged = false;\n\n Array.from(affectedFolderIds).forEach((folderId) => {\n const { pinnedCount: newPinnedCount, orderedIds: newOrderedIds } = buildFolderOrderedIds(folderId);\n // When signed out\n if (!newOrderedIds) {\n return;\n }\n\n const currentOrderedIds = results.orderedIdsByFolderId[folderId];\n const currentPinnedCount = results.pinnedCountByFolderId[folderId];\n const areOrderedIdsChanged = (\n !currentOrderedIds\n || currentPinnedCount === undefined || currentPinnedCount !== newPinnedCount\n || prepared.isOrderedListJustPatched[folderId]\n || !areSortedArraysEqual(newOrderedIds, currentOrderedIds)\n );\n if (areOrderedIdsChanged) {\n prepared.isOrderedListJustPatched[folderId] = false;\n results.orderedIdsByFolderId[folderId] = newOrderedIds;\n results.pinnedCountByFolderId[folderId] = newPinnedCount;\n callbacks.orderedIdsByFolderId[folderId]?.runCallbacks(newOrderedIds);\n }\n\n const currentChatsCount = results.chatsCountByFolderId[folderId];\n const newChatsCount = newOrderedIds.length;\n if (!wasChatsCountChanged) {\n wasChatsCountChanged = currentChatsCount !== newChatsCount;\n }\n results.chatsCountByFolderId[folderId] = newChatsCount;\n\n const currentUnreadCounters = results.unreadCountersByFolderId[folderId];\n const newUnreadCounters = buildFolderUnreadCounters(folderId);\n if (!wasUnreadCountersChanged) {\n wasUnreadCountersChanged = (\n !currentUnreadCounters || !arePropsShallowEqual(newUnreadCounters, currentUnreadCounters)\n );\n }\n results.unreadCountersByFolderId[folderId] = newUnreadCounters;\n });\n\n if (wasChatsCountChanged) {\n // We need to update the entire object as it will be returned from a hook\n const newValue = { ...results.chatsCountByFolderId };\n results.chatsCountByFolderId = newValue;\n callbacks.chatsCountByFolderId.runCallbacks(newValue);\n }\n\n if (wasUnreadCountersChanged) {\n // We need to update the entire object as it will be returned from a hook\n const newValue = { ...results.unreadCountersByFolderId };\n results.unreadCountersByFolderId = newValue;\n callbacks.unreadCountersByFolderId.runCallbacks(newValue);\n }\n}\n\nfunction buildFolderOrderedIds(folderId: number) {\n const folderSummary = prepared.folderSummariesById[folderId];\n if (!folderSummary) {\n return {};\n }\n\n const { orderedPinnedIds, pinnedChatIds } = folderSummary;\n const {\n chatSummariesById,\n chatIdsByFolderId: { [folderId]: chatIds },\n } = prepared;\n const {\n orderedIdsByFolderId: { [folderId]: prevOrderedIds },\n } = results;\n\n const sortedPinnedIds = chatIds ? orderedPinnedIds?.filter((id) => chatIds.has(id)) : orderedPinnedIds;\n const allListIds = prevOrderedIds || (chatIds && Array.from(chatIds)) || [];\n const notPinnedIds = pinnedChatIds ? allListIds.filter((id) => !pinnedChatIds.has(id)) : allListIds;\n const sortedNotPinnedIds = notPinnedIds.sort((chatId1: string, chatId2: string) => {\n return chatSummariesById.get(chatId2)!.order - chatSummariesById.get(chatId1)!.order;\n });\n\n return {\n pinnedCount: sortedPinnedIds?.length || 0,\n orderedIds: [\n ...(sortedPinnedIds || []),\n ...sortedNotPinnedIds,\n ],\n };\n}\n\nfunction buildFolderUnreadCounters(folderId: number) {\n const {\n chatSummariesById,\n } = prepared;\n const {\n orderedIdsByFolderId: { [folderId]: orderedIds },\n } = results;\n\n return orderedIds!.reduce((newUnreadCounters, chatId) => {\n const chatSummary = chatSummariesById.get(chatId);\n if (!chatSummary) {\n return newUnreadCounters;\n }\n\n if (chatSummary.isUnread) {\n newUnreadCounters.chatsCount++;\n\n if (chatSummary.unreadMentionsCount) {\n newUnreadCounters.notificationsCount += chatSummary.unreadMentionsCount;\n }\n\n if (!chatSummary.isMuted) {\n if (chatSummary.unreadCount) {\n newUnreadCounters.notificationsCount += chatSummary.unreadCount;\n } else if (!chatSummary.unreadMentionsCount) {\n newUnreadCounters.notificationsCount += 1; // Manually marked unread\n }\n }\n }\n\n return newUnreadCounters;\n }, {\n chatsCount: 0,\n notificationsCount: 0,\n });\n}\n\nfunction buildInitials() {\n return {\n prevGlobal: {\n foldersById: {},\n chatsById: {},\n usersById: {},\n notifySettings: {} as NotifySettings,\n notifyExceptions: {},\n },\n\n prepared: {\n folderSummariesById: {},\n chatSummariesById: new Map(),\n folderIdsByChatId: {},\n chatIdsByFolderId: {},\n isOrderedListJustPatched: {},\n },\n\n results: {\n orderedIdsByFolderId: {},\n pinnedCountByFolderId: {},\n chatsCountByFolderId: {},\n unreadCountersByFolderId: {},\n },\n\n callbacks: {\n orderedIdsByFolderId: {},\n chatsCountByFolderId: createCallbackManager(),\n unreadCountersByFolderId: createCallbackManager(),\n },\n };\n}\n\nfunction reset() {\n const newInitials = buildInitials();\n\n prevGlobal = newInitials.prevGlobal;\n prepared = newInitials.prepared;\n results = newInitials.results;\n callbacks = newInitials.callbacks;\n}\n","// Used before applying CSS transition\nexport default function forceReflow(element: HTMLElement) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n element.offsetWidth;\n}\n","import type { LangCode } from '../types';\n\nexport function formatCurrency(totalPrice: number, currency: string, locale: LangCode = 'en') {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(totalPrice / 10 ** getCurrencyExp(currency));\n}\n\nfunction getCurrencyExp(currency: string) {\n if (currency === 'CLF') {\n return 4;\n }\n if (['BHD', 'IQD', 'JOD', 'KWD', 'LYD', 'OMR', 'TND'].includes(currency)) {\n return 3;\n }\n if ([\n 'BIF', 'BYR', 'CLP', 'CVE', 'DJF', 'GNF', 'ISK', 'JPY', 'KMF', 'KRW', 'MGA', 'PYG', 'RWF', 'UGX', 'UYI',\n 'VND', 'VUV', 'XAF', 'XOF', 'XPF',\n ].includes(currency)) {\n return 0;\n }\n if (currency === 'MRO') {\n return 1;\n }\n return 2;\n}\n","const generateIdFor = (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\nexport default generateIdFor;\n","import type { ApiError, ApiFieldError } from '../api/types';\n\nimport { DEBUG } from '../config';\n\nconst READABLE_ERROR_MESSAGES: Record<string, string> = {\n CHAT_RESTRICTED: 'You can\\'t send messages in this chat, you were restricted',\n CHAT_SEND_POLL_FORBIDDEN: 'You can\\'t create polls in this chat',\n CHAT_SEND_STICKERS_FORBIDDEN: 'You can\\'t send stickers in this chat',\n CHAT_SEND_GIFS_FORBIDDEN: 'You can\\'t send gifs in this chat',\n CHAT_SEND_MEDIA_FORBIDDEN: 'You can\\'t send media in this chat',\n CHAT_LINK_EXISTS: 'The chat is public, you can\\'t hide the history to new users',\n // eslint-disable-next-line max-len\n SLOWMODE_WAIT_X: 'Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.',\n USER_BANNED_IN_CHANNEL: 'You\\'re banned from sending messages in supergroups / channels',\n USER_IS_BLOCKED: 'You were blocked by this user',\n YOU_BLOCKED_USER: 'You blocked this user',\n IMAGE_PROCESS_FAILED: 'Failure while processing image',\n MEDIA_EMPTY: 'The provided media object is invalid',\n MEDIA_INVALID: 'Media invalid',\n PHOTO_EXT_INVALID: 'The extension of the photo is invalid',\n PHOTO_INVALID_DIMENSIONS: 'The photo dimensions are invalid',\n PHOTO_SAVE_FILE_INVALID: 'Internal issues, try again later',\n // eslint-disable-next-line max-len\n MESSAGE_DELETE_FORBIDDEN: 'You can\\'t delete one of the messages you tried to delete, most likely because it is a service message.',\n MESSAGE_POLL_CLOSED: 'Poll closed',\n MESSAGE_EDIT_TIME_EXPIRED: 'You can\\'t edit this message anymore.',\n PINNED_DIALOGS_TOO_MUCH: 'Sorry, you can only pin 5 chats to the top',\n CHANNEL_PRIVATE: 'This channel is private',\n MEDIA_CAPTION_TOO_LONG: 'The provided caption is too long',\n ADDRESS_STREET_LINE1_INVALID: 'The address you provided is not valid',\n ADDRESS_STREET_LINE2_INVALID: 'The address you provided is not valid',\n ADDRESS_CITY_INVALID: 'The city you provided is not valid',\n ADDRESS_COUNTRY_INVALID: 'The country you provided is not valid',\n ADDRESS_POSTCODE_INVALID: 'The postcode you provided is not valid',\n ADDRESS_STATE_INVALID: 'The state you provided is not valid',\n REQ_INFO_NAME_INVALID: 'The name you provided is not valid',\n REQ_INFO_PHONE_INVALID: 'The phone you provided is not valid',\n REQ_INFO_EMAIL_INVALID: 'The email you provided is not valid',\n // TODO Bring back after fixing the weird bug\n // CHANNEL_INVALID: 'An error occurred. Please try again later',\n LINK_NOT_MODIFIED: 'This discussion is already linked to the channel',\n MESSAGE_TOO_LONG: 'Message is too long',\n\n // Non-API errors\n // eslint-disable-next-line max-len\n SERVICE_WORKER_DISABLED: 'Service Worker is disabled. Streaming media may not be supported. Try reloading the page without holding <Shift> key',\n // eslint-disable-next-line max-len\n MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided message is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.',\n // eslint-disable-next-line max-len\n FRESH_RESET_AUTHORISATION_FORBIDDEN: 'You cant logout other sessions if less than 24 hours have passed since you logged on the current session',\n\n BOTS_TOO_MUCH: 'There are too many bots in this chat/channel',\n BOT_GROUPS_BLOCKED: 'This bot can\\'t be added to groups',\n USERS_TOO_MUCH: 'The maximum number of users has been exceeded',\n USER_CHANNELS_TOO_MUCH: 'One of the users you tried to add is already in too many channels/supergroups',\n USER_KICKED: 'This user was kicked from this supergroup/channel',\n USER_NOT_MUTUAL_CONTACT: 'The provided user is not a mutual contact',\n USER_PRIVACY_RESTRICTED: 'The user\\'s privacy settings do not allow you to do this',\n INVITE_HASH_EMPTY: 'The invite hash is empty',\n INVITE_HASH_EXPIRED: 'The invite link has expired',\n INVITE_HASH_INVALID: 'The invite hash is invalid',\n CHANNELS_TOO_MUCH: 'You have joined too many channels/supergroups',\n USER_ALREADY_PARTICIPANT: 'You already in the group',\n SCHEDULE_DATE_INVALID: 'Invalid schedule date provided',\n WALLPAPER_DIMENSIONS_INVALID: 'The wallpaper dimensions are invalid, please select another file',\n ADMINS_TOO_MUCH: 'There are too many admins',\n ADMIN_RANK_EMOJI_NOT_ALLOWED: 'An admin rank cannot contain emojis',\n ADMIN_RANK_INVALID: 'The specified admin rank is invalid',\n FRESH_CHANGE_ADMINS_FORBIDDEN: 'You were just elected admin, you can\\'t add or modify other admins yet',\n INPUT_USER_DEACTIVATED: 'The specified user was deleted',\n BOT_PRECHECKOUT_TIMEOUT: 'The request for payment has expired',\n};\n\nif (DEBUG) {\n READABLE_ERROR_MESSAGES.CHAT_WRITE_FORBIDDEN = 'You can\\'t write in this chat';\n READABLE_ERROR_MESSAGES.CHAT_ADMIN_REQUIRED = 'You must be an admin in this chat to do this';\n}\n\nexport const SHIPPING_ERRORS: Record<string, ApiFieldError> = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n message: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n message: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n message: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n message: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n message: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n message: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n message: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n message: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n message: 'Incorrect email',\n },\n};\n\nconst FINAL_PAYMENT_ERRORS = new Set([\n 'BOT_PRECHECKOUT_FAILED',\n 'PAYMENT_FAILED',\n]);\n\nexport default function getReadableErrorText(error: ApiError) {\n const { message, isSlowMode, textParams } = error;\n // Currently, Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs\n if (isSlowMode) {\n const extraPartIndex = message.indexOf(' (caused by');\n return extraPartIndex > 0 ? message.substring(0, extraPartIndex) : message;\n }\n let errorMessage = READABLE_ERROR_MESSAGES[message];\n if (errorMessage && textParams) {\n errorMessage = Object.keys(textParams).reduce((acc, current) => {\n return acc.replace(current, textParams[current]);\n }, errorMessage as string);\n }\n return errorMessage;\n}\n\nexport function getShippingError(error: ApiError): ApiFieldError | undefined {\n return SHIPPING_ERRORS[error.message];\n}\n\nexport function shouldClosePaymentModal(error: ApiError): boolean {\n return FINAL_PAYMENT_ERRORS.has(error.message);\n}\n","import { DEBUG_ALERT_MSG } 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;\n\nfunction handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) {\n // https://stackoverflow.com/questions/49384120/resizeobserver-loop-limit-exceeded\n if (e instanceof ErrorEvent && e.message === 'ResizeObserver loop limit exceeded') {\n return;\n }\n\n e.preventDefault();\n\n handleError(e instanceof ErrorEvent ? (e.error || e.message) : 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 (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err?.message) || err}\\n${err?.stack}`);\n }\n}\n","import { getActions } from '../global';\n\nlet promptInstall: () => Promise<void>;\n\nexport function setupBeforeInstallPrompt() {\n window.addEventListener('beforeinstallprompt', (e: any) => {\n promptInstall = async () => {\n e.prompt();\n const userChoice = await e.userChoice;\n const isInstalled = userChoice.outcome === 'accepted';\n\n if (!isInstalled) return;\n getActions().setInstallPrompt({ canInstall: false });\n };\n getActions().setInstallPrompt({ canInstall: true });\n });\n}\n\nexport function getPromptInstall() {\n return promptInstall;\n}\n","type CollectionByKey<Member> = Record<number | string, Member>;\n\ntype OrderDirection =\n 'asc'\n | 'desc';\n\ninterface OrderCallback<T> {\n (member: T): any;\n}\n\nexport function buildCollectionByKey<T extends AnyLiteral>(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey<T>, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues<R extends any, M extends any>(\n byKey: CollectionByKey<M>,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey<M>) => R,\n): CollectionByKey<R> {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey<R>, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick<T, K extends keyof T>(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick<T, K>);\n}\n\nexport function pickTruthy<T, K extends keyof T>(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<T, K>);\n}\n\nexport function omit<T, K extends keyof T>(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<Exclude<keyof T, K>>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy<T>(\n collection: T[],\n orderRule: (keyof T) | OrderCallback<T> | ((keyof T) | OrderCallback<T>)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n function compareValues(a: T, b: T, currentOrderRule: (keyof T) | OrderCallback<T>, isAsc: boolean) {\n const aValue = (typeof currentOrderRule === 'function' ? currentOrderRule(a) : a[currentOrderRule]) || 0;\n const bValue = (typeof currentOrderRule === 'function' ? currentOrderRule(b) : b[currentOrderRule]) || 0;\n\n return isAsc ? aValue - bValue : bValue - aValue;\n }\n\n if (Array.isArray(orderRule)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderRule1, orderRule2] = orderRule;\n const isAsc1 = mode1 === 'asc';\n const isAsc2 = mode2 === 'asc';\n\n return collection.sort((a, b) => {\n return compareValues(a, b, orderRule1, isAsc1) || compareValues(a, b, orderRule2, isAsc2);\n });\n }\n\n const isAsc = mode === 'asc';\n return collection.sort((a, b) => {\n return compareValues(a, b, orderRule, isAsc);\n });\n}\n\nexport function unique<T extends any>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function uniqueByField<T extends any>(array: T[], field: keyof T): T[] {\n return [...new Map(array.map((item) => [item[field], item])).values()];\n}\n\nexport function compact<T extends any>(array: T[]) {\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<T>(array: T[], set: Set<T>): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split<T extends any>(array: T[], chunkSize: number) {\n const result: T[][] = [];\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<T>(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\nexport function findLast<T>(array: Array<T>, 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 { getGlobal } from '../global';\n\nimport type { ApiLangPack, ApiLangString } from '../api/types';\nimport type { LangCode, TimeFormat } from '../types';\n\nimport {\n DEFAULT_LANG_CODE, DEFAULT_LANG_PACK, LANG_CACHE_NAME, LANG_PACKS,\n} from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { formatInteger } from './textFormat';\n\ninterface LangFn {\n (key: string, value?: any, format?: 'i'): any;\n\n isRtl?: boolean;\n code?: LangCode;\n langName?: string;\n timeFormat?: TimeFormat;\n}\n\nconst SUBSTITUTION_REGEX = /%\\d?\\$?[sdf@]/g;\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\n// Some rules edited from https://github.com/eemeli/make-plural/blob/master/packages/plurals/cardinals.js\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 be: (n: number) => {\n const s = String(n).split('.'); const t0 = Number(s[0]) === n; const n10 = t0 && Number(s[0].slice(-1)); const n100 = t0 && Number(s[0].slice(-2));\n return n10 === 1 && n100 !== 11 ? 2\n : (n10 >= 2 && n10 <= 4) && (n100 < 12 || n100 > 14) ? 4\n : (t0 && n10 === 0) || (n10 >= 5 && n10 <= 9) || (n100 >= 11 && n100 <= 14) ? 5\n : 6;\n },\n ca: (n: number) => (n !== 1 ? 6 : 2),\n cs: (n: number) => {\n const s = String(n).split('.'); const i = Number(s[0]); const v0 = !s[1];\n return n === 1 && v0 ? 2 : (i >= 2 && i <= 4) && v0 ? 4 : !v0 ? 5 : 6;\n },\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 fi: (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 hr: (n: number) => {\n const s = String(n).split('.'); const i = s[0]; const f = s[1] || ''; const v0 = !s[1]; const i10 = Number(i.slice(-1));\n const i100 = Number(i.slice(-2)); const f10 = Number(f.slice(-1)); const f100 = Number(f.slice(-2));\n return (v0 && i10 === 1 && i100 !== 11) || (f10 === 1 && f100 !== 11) ? 2\n : (v0 && (i10 >= 2 && i10 <= 4) && (i100 < 12 || i100 > 14)) || ((f10 >= 2 && f10 <= 4) && (f100 < 12 || f100 > 14)) ? 4\n : 6;\n },\n hu: (n: number) => (n > 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nb: (n: number) => (n > 1 ? 6 : 2),\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 sk: (n: number) => {\n const s = String(n).split('.'); const i = Number(s[0]); const v0 = !s[1];\n return n === 1 && v0 ? 2 : (i >= 2 && i <= 4) && v0 ? 4 : !v0 ? 5 : 6;\n },\n sr: (n: number) => {\n const s = String(n).split('.'); const i = s[0]; const f = s[1] || ''; const v0 = !s[1]; const i10 = Number(i.slice(-1));\n const i100 = Number(i.slice(-2)); const f10 = Number(f.slice(-1)); const f100 = Number(f.slice(-2));\n return (v0 && i10 === 1 && i100 !== 11) || (f10 === 1 && f100 !== 11) ? 2\n : (v0 && (i10 >= 2 && i10 <= 4) && (i100 < 12 || i100 > 14)) || ((f10 >= 2 && f10 <= 4) && (f100 < 12 || f100 > 14)) ? 4\n : 6;\n },\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<string, string>();\n\nlet langPack: ApiLangPack | undefined;\nlet fallbackLangPack: ApiLangPack | undefined;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\nlet currentTimeFormat: TimeFormat | undefined;\n\nexport const getTranslation: LangFn = (key: string, value?: any, format?: 'i') => {\n if (value !== undefined) {\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n const cached = cache.get(`${key}_${cacheValue}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack && !fallbackLangPack) {\n return key;\n }\n\n const langString = (langPack?.[key]) || (fallbackLangPack?.[key]);\n if (!langString) {\n if (!fallbackLangPack) {\n void importFallbackLangPack();\n }\n\n return key;\n }\n\n return processTranslation(langString, key, value, format);\n};\n\nexport async function getTranslationForLangString(langCode: string, key: string) {\n let translateString: ApiLangString | undefined = await cacheApi.fetch(\n LANG_CACHE_NAME,\n `${DEFAULT_LANG_PACK}_${langCode}_${key}`,\n cacheApi.Type.Json,\n );\n\n if (!translateString) {\n translateString = await fetchRemoteString(DEFAULT_LANG_PACK, langCode, key);\n }\n\n return processTranslation(translateString, key);\n}\n\nexport async function setLanguage(langCode: LangCode, callback?: NoneToVoidFunction, withFallback = false) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n let newLangPack = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (!newLangPack) {\n if (withFallback) {\n await importFallbackLangPack();\n }\n\n newLangPack = await fetchRemote(langCode);\n if (!newLangPack) {\n return;\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n const { languages, timeFormat } = getGlobal().settings.byKey;\n const langInfo = languages?.find((l) => l.langCode === langCode);\n getTranslation.isRtl = Boolean(langInfo?.rtl);\n getTranslation.code = langCode;\n getTranslation.langName = langInfo?.nativeName;\n getTranslation.timeFormat = timeFormat;\n\n if (callback) {\n callback();\n }\n\n runCallbacks();\n}\n\nexport function setTimeFormat(timeFormat: TimeFormat) {\n if (timeFormat && timeFormat === currentTimeFormat) {\n return;\n }\n\n currentTimeFormat = timeFormat;\n getTranslation.timeFormat = timeFormat;\n\n runCallbacks();\n}\n\nasync function importFallbackLangPack() {\n if (fallbackLangPack) {\n return;\n }\n\n fallbackLangPack = (await import('./fallbackLangPack')).default;\n runCallbacks();\n}\n\nasync function fetchRemote(langCode: string): Promise<ApiLangPack | undefined> {\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\nasync function fetchRemoteString(\n remoteLangPack: typeof LANG_PACKS[number], langCode: string, key: string,\n): Promise<ApiLangString | undefined> {\n const remote = await callApi('fetchLangStrings', {\n langPack: remoteLangPack,\n langCode,\n keys: [key],\n });\n\n if (remote?.length) {\n await cacheApi.save(LANG_CACHE_NAME, `${remoteLangPack}_${langCode}_${key}`, remote[0]);\n\n return remote[0];\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const langCode = currentLangCode || DEFAULT_LANG_CODE;\n const optionIndex = PLURAL_RULES[langCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[langCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n value = Array.isArray(value) ? value : [value];\n const translationSlices = template.split(SUBSTITUTION_REGEX);\n const initialValue = translationSlices.shift();\n\n return translationSlices.reduce((result, str, index) => {\n return `${result}${String(value[index] ?? '')}${str}`;\n }, initialValue || '');\n}\n\nfunction processTranslation(langString: ApiLangString | undefined, key: string, value?: any, format?: 'i') {\n const preferredPluralOption = typeof value === 'number' ? getPluralOption(value) : 'value';\n const template = langString ? (\n langString[preferredPluralOption] || langString.otherValue || langString.value\n ) : undefined;\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 const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n cache.set(`${key}_${cacheValue}_${format}`, result);\n return result;\n }\n\n return template;\n}\n","export const clamp = (num: number, min: number, max: number) => (Math.min(max, Math.max(min, num)));\nexport const isBetween = (num: number, min: number, max: number) => (num >= min && num <= max);\nexport const round = (num: number, decimals: number = 0) => Math.round(num * 10 ** decimals) / 10 ** decimals;\nexport const lerp = (start: number, end: number, interpolationRatio: number) => {\n return (1 - interpolationRatio) * start + interpolationRatio * end;\n};\n","const SAMPLE_RATE = 48000;\nconst BIT_DEPTH = 16;\n\nexport async function oggToWav(opusData: Blob): Promise<Blob> {\n const arrayBuffer = await new Response(opusData).arrayBuffer();\n\n return new Promise((resolve) => {\n const typedArray = new Uint8Array(arrayBuffer);\n\n let decoderWorker: Worker | undefined = new Worker(\n new URL('opus-recorder/dist/decoderWorker.min.js', import.meta.url),\n );\n let wavWorker: Worker | undefined = new Worker(new URL('opus-recorder/dist/waveWorker.min.js', import.meta.url));\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 type {\n ApiOnProgress,\n ApiParsedMedia,\n ApiPreparedMedia,\n} from '../api/types';\nimport {\n ApiMediaFormat,\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 {\n IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported,\n} from './environment';\nimport { oggToWav } from './oggToWav';\nimport { webpToPng } from './webpToPng';\n\nconst asCacheApiType = {\n [ApiMediaFormat.BlobUrl]: cacheApi.Type.Blob,\n [ApiMediaFormat.Text]: cacheApi.Type.Text,\n [ApiMediaFormat.DownloadUrl]: undefined,\n [ApiMediaFormat.Progressive]: undefined,\n [ApiMediaFormat.Stream]: undefined,\n};\n\nconst PROGRESSIVE_URL_PREFIX = './progressive/';\nconst URL_DOWNLOAD_PREFIX = './download/';\n\nconst memoryCache = new Map<string, ApiPreparedMedia>();\nconst fetchPromises = new Map<string, Promise<ApiPreparedMedia | undefined>>();\nconst progressCallbacks = new Map<string, Map<string, ApiOnProgress>>();\nconst cancellableCallbacks = new Map<string, ApiOnProgress>();\n\nexport function fetch<T extends ApiMediaFormat>(\n url: string,\n mediaFormat: T,\n isHtmlAllowed = false,\n onProgress?: ApiOnProgress,\n callbackUniqueId?: string,\n): Promise<ApiPreparedMedia> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, isHtmlAllowed, onProgress, callbackUniqueId)\n ) as Promise<ApiPreparedMedia>;\n }\n\n if (mediaFormat === ApiMediaFormat.DownloadUrl) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getDownloadUrl(url)\n : fetch(url, ApiMediaFormat.BlobUrl, isHtmlAllowed, onProgress, callbackUniqueId)\n ) as Promise<ApiPreparedMedia>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, isHtmlAllowed)\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 progressCallbacks.delete(url);\n cancellableCallbacks.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n if (onProgress && callbackUniqueId) {\n let activeCallbacks = progressCallbacks.get(url);\n if (!activeCallbacks) {\n activeCallbacks = new Map<string, ApiOnProgress>();\n progressCallbacks.set(url, activeCallbacks);\n }\n activeCallbacks.set(callbackUniqueId, onProgress);\n }\n\n return fetchPromises.get(url) as Promise<ApiPreparedMedia>;\n}\n\nexport function getFromMemory(url: string) {\n return memoryCache.get(url) as ApiPreparedMedia;\n}\n\nexport function cancelProgress(progressCallback: ApiOnProgress) {\n progressCallbacks.forEach((map, url) => {\n map.forEach((callback) => {\n if (callback === progressCallback) {\n const parentCallback = cancellableCallbacks.get(url);\n if (!parentCallback) return;\n\n cancelApiProgress(parentCallback);\n cancellableCallbacks.delete(url);\n progressCallbacks.delete(url);\n }\n });\n });\n}\n\nexport function removeCallback(url: string, callbackUniqueId: string) {\n const callbacks = progressCallbacks.get(url);\n if (!callbacks) return;\n callbacks.delete(callbackUniqueId);\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\nfunction getDownloadUrl(url: string) {\n return Promise.resolve(`${URL_DOWNLOAD_PREFIX}${url}`);\n}\n\nasync function fetchFromCacheOrRemote(\n url: string, mediaFormat: ApiMediaFormat, isHtmlAllowed: boolean,\n) {\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]!, isHtmlAllowed);\n\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 const onProgress = makeOnProgress(url, mediaSource, sourceBuffer);\n cancellableCallbacks.set(url, onProgress);\n\n void callApi('downloadMedia', { url, mediaFormat }, onProgress);\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const onProgress = makeOnProgress(url);\n cancellableCallbacks.set(url, onProgress);\n\n const remote = await callApi('downloadMedia', { url, mediaFormat, isHtmlAllowed }, onProgress);\n if (!remote) {\n throw new Error(`Failed to fetch media ${url}`);\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 = media.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 makeOnProgress(url: string, mediaSource?: MediaSource, sourceBuffer?: SourceBuffer) {\n const onProgress: ApiOnProgress = (progress: number, arrayBuffer: ArrayBuffer) => {\n progressCallbacks.get(url)?.forEach((callback) => {\n callback(progress);\n if (callback.isCanceled) onProgress.isCanceled = true;\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 return onProgress;\n}\n\nfunction prepareMedia(mediaData: Exclude<ApiParsedMedia, ArrayBuffer>): 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","export const MEMO_EMPTY_ARRAY = [];\n","import { DEBUG } from '../config';\nimport { createCallbackManager } from './callbacks';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra,\n Calls,\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 [Bundles.Calls]: typeof import('../bundles/calls');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise<ImportedBundles[K]>\n};\n\nexport type BundleModules<B extends keyof ImportedBundles> = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial<BundlePromises> = {};\nconst MEMORY_CACHE: Partial<ImportedBundles> = {};\n\nconst { addCallback, runCallbacks } = createCallbackManager();\n\nexport async function loadModule<B extends Bundles, M extends BundleModules<B>>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import(/* webpackChunkName: \"BundleAuth\" */ '../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(/* webpackChunkName: \"BundleMain\" */ '../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import(/* webpackChunkName: \"BundleExtra\" */ '../bundles/extra');\n break;\n case Bundles.Calls:\n LOAD_PROMISES[Bundles.Calls] = import(/* webpackChunkName: \"BundleCalls\" */ '../bundles/calls');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise<ImportedBundles[B]>).then(runCallbacks);\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<B extends Bundles, M extends BundleModules<B>>(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\nexport const addLoadListener = addCallback;\n","import { callApi } from '../api/gramjs';\nimport type {\n ApiChat, ApiMessage, ApiPhoneCall, ApiUser, ApiUserReaction,\n} from '../api/types';\nimport { ApiMediaFormat } from '../api/types';\nimport { renderActionMessageText } from '../components/common/helpers/renderActionMessageText';\nimport { APP_NAME, DEBUG, IS_TEST } from '../config';\nimport { getActions, getGlobal, setGlobal } from '../global';\nimport {\n getChatAvatarHash,\n getChatTitle,\n getMessageAction,\n getMessageRecentReaction,\n getMessageSenderName,\n getMessageSummaryText,\n getPrivateChatUserId, getUserFullName,\n isActionMessage,\n isChatChannel,\n selectIsChatMuted,\n selectShouldShowMessagePreview,\n} from '../global/helpers';\nimport { addNotifyExceptions, replaceSettings } from '../global/reducers';\nimport {\n selectChatMessage,\n selectCurrentMessageList,\n selectNotifyExceptions,\n selectNotifySettings,\n selectUser,\n} from '../global/selectors';\nimport { IS_SERVICE_WORKER_SUPPORTED, IS_TOUCH_ENV } from './environment';\nimport { getTranslation } from './langProvider';\nimport * as mediaLoader from './mediaLoader';\nimport { debounce } from './schedulers';\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// Notification id is removed from soundPlayed cache after 3 seconds\nconst soundPlayedDelay = 3 * 1000;\nconst soundPlayedIds = new Set<string>();\n\nexport async function playNotifySound(id?: string, volume?: number) {\n if (id !== undefined && soundPlayedIds.has(id)) return;\n const { notificationSoundVolume } = selectNotifySettings(getGlobal());\n const currentVolume = volume ? volume / 10 : notificationSoundVolume / 10;\n if (currentVolume === 0) return;\n\n const audio = new Audio('./notification.mp3');\n audio.volume = currentVolume;\n audio.setAttribute('mozaudiochannel', 'notification');\n if (id !== undefined) {\n audio.addEventListener('ended', () => {\n soundPlayedIds.add(id);\n }, { once: true });\n\n setTimeout(() => {\n soundPlayedIds.delete(id);\n }, soundPlayedDelay);\n }\n\n try {\n await audio.play();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Unable to play notification sound');\n }\n }\n}\n\nexport const playNotifySoundDebounced = debounce(playNotifySound, 1000, true, false);\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 = getActions();\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\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// Indicates if notification settings are loaded from the api\nlet areSettingsLoaded = false;\n\n// Load notification settings from the api\nasync function loadNotificationSettings() {\n if (areSettingsLoaded) return selectNotifySettings(getGlobal());\n const [resultSettings, resultExceptions] = await Promise.all([\n callApi('fetchNotificationSettings', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n callApi('fetchNotificationExceptions', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n ]);\n if (!resultSettings) return selectNotifySettings(getGlobal());\n\n let global = replaceSettings(getGlobal(), resultSettings);\n if (resultExceptions) {\n global = addNotifyExceptions(global, resultExceptions);\n }\n setGlobal(global);\n areSettingsLoaded = true;\n return selectNotifySettings(global);\n}\n\nexport async function subscribe() {\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 getActions()\n .setDeviceToken(deviceToken);\n } catch (error: any) {\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) {\n if (!areSettingsLoaded) return false;\n const global = getGlobal();\n const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n if (isMuted || chat.isNotJoined || !chat.isListed) {\n return false;\n }\n // On touch devices show notifications when chat is not active\n if (IS_TOUCH_ENV) {\n const {\n chatId,\n type,\n } = selectCurrentMessageList(global) || {};\n return !(chatId === chat.id && type === 'thread');\n }\n // On desktop show notifications when window is not focused\n return !document.hasFocus();\n}\n\nfunction getNotificationContent(chat: ApiChat, message: ApiMessage, reaction?: ApiUserReaction) {\n const global = getGlobal();\n const {\n replyToMessageId,\n } = message;\n let {\n senderId,\n } = message;\n if (reaction) senderId = reaction.userId;\n\n const { isScreenLocked } = global.passcode;\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 targetUserIds: actionTargetUserIds,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n\n const actionTargetUsers = actionTargetUserIds\n ? actionTargetUserIds.map((userId) => selectUser(global, userId))\n .filter<ApiUser>(Boolean as any)\n : undefined;\n const privateChatUserId = getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n\n let body: string;\n if (\n !isScreenLocked\n && selectShouldShowMessagePreview(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n ) {\n if (isActionMessage(message)) {\n const isChat = chat && (isChatChannel(chat) || message.senderId === message.chatId);\n\n body = renderActionMessageText(\n getTranslation,\n message,\n !isChat ? messageSender : undefined,\n isChat ? chat : undefined,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlainText: true },\n ) as string;\n } else {\n const senderName = getMessageSenderName(getTranslation, chat.id, messageSender);\n const summary = getMessageSummaryText(getTranslation, message, false, 60, false);\n\n body = senderName ? `${senderName}: ${summary}` : summary;\n }\n } else {\n body = 'New message';\n }\n\n return {\n title: isScreenLocked ? APP_NAME : getChatTitle(getTranslation, chat, privateChatUser),\n body,\n };\n}\n\nasync function getAvatar(chat: ApiChat | ApiUser) {\n const imageHash = getChatAvatarHash(chat);\n if (!imageHash) return undefined;\n let mediaData = mediaLoader.getFromMemory(imageHash);\n if (!mediaData) {\n await mediaLoader.fetch(imageHash, ApiMediaFormat.BlobUrl);\n mediaData = mediaLoader.getFromMemory(imageHash);\n }\n return mediaData;\n}\n\nexport async function notifyAboutCall({\n call, user,\n}: {\n call: ApiPhoneCall; user: ApiUser;\n}) {\n const { hasWebNotifications } = await loadNotificationSettings();\n if (document.hasFocus() || !hasWebNotifications) return;\n const areNotificationsSupported = checkIfNotificationsSupported();\n if (!areNotificationsSupported) return;\n\n const icon = await getAvatar(user);\n\n const options: NotificationOptions = {\n body: getUserFullName(user),\n icon,\n badge: icon,\n tag: `call_${call.id}`,\n };\n\n if ('vibrate' in navigator) {\n options.vibrate = [200, 100, 200];\n }\n\n const notification = new Notification(getTranslation('VoipIncoming'), options);\n\n notification.onclick = () => {\n notification.close();\n if (window.focus) {\n window.focus();\n }\n };\n}\n\nexport async function notifyAboutMessage({\n chat,\n message,\n isReaction = false,\n}: { chat: ApiChat; message: Partial<ApiMessage>; isReaction?: boolean }) {\n const { hasWebNotifications } = await loadNotificationSettings();\n if (!checkIfShouldNotify(chat)) return;\n const areNotificationsSupported = checkIfNotificationsSupported();\n if (!hasWebNotifications || !areNotificationsSupported) {\n // Do not play notification sound for reactions if web notifications are disabled\n if (isReaction) return;\n // Only play sound if web notifications are disabled\n playNotifySoundDebounced(String(message.id) || chat.id);\n return;\n }\n if (!areNotificationsSupported) return;\n\n if (!message.id) return;\n\n const activeReaction = getMessageRecentReaction(message);\n // Do not notify about reactions on messages that are not outgoing\n if (isReaction && !activeReaction) return;\n\n const icon = await getAvatar(chat);\n\n const {\n title,\n body,\n } = getNotificationContent(chat, message as ApiMessage, activeReaction);\n\n if (checkIfPushSupported()) {\n if (navigator.serviceWorker?.controller) {\n // notify service worker about new message notification\n navigator.serviceWorker.controller.postMessage({\n type: 'showMessageNotification',\n payload: {\n title,\n body,\n icon,\n chatId: chat.id,\n messageId: message.id,\n shouldReplaceHistory: true,\n reaction: activeReaction?.reaction,\n },\n });\n }\n } else {\n const dispatch = getActions();\n const options: NotificationOptions = {\n body,\n icon,\n badge: icon,\n tag: String(message.id),\n };\n\n if ('vibrate' in navigator) {\n options.vibrate = [200, 100, 200];\n }\n\n const notification = new Notification(title, options);\n\n notification.onclick = () => {\n notification.close();\n dispatch.focusMessage({\n chatId: chat.id,\n messageId: message.id,\n shouldReplaceHistory: true,\n });\n if (window.focus) {\n window.focus();\n }\n };\n\n // Play sound when notification is displayed\n notification.onshow = () => {\n // TODO Remove when reaction badges are implemented\n if (isReaction) return;\n playNotifySoundDebounced(String(message.id) || chat.id);\n };\n }\n}\n\nexport function closeMessageNotifications(payload: { chatId: string; lastReadInboxMessageId?: number }) {\n if (IS_TEST || !navigator.serviceWorker?.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'closeMessageNotifications',\n payload,\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 * as cacheApi from './cacheApi';\nimport { PASSCODE_CACHE_NAME } from '../config';\n\nconst IV_LENGTH = 12;\nconst SALT = 'harder better faster stronger';\n\nlet currentPasscodeHash: ArrayBuffer | undefined;\n\nexport async function setupPasscode(passcode: string) {\n currentPasscodeHash = await sha256(passcode);\n}\n\nexport async function encryptSession(sessionJson?: string, globalJson?: string) {\n if (!currentPasscodeHash) {\n throw new Error('[api/passcode] Missing current passcode');\n }\n\n await Promise.all([\n (async () => {\n if (!sessionJson) return;\n\n const sessionEncrypted = await aesEncrypt(sessionJson, currentPasscodeHash);\n await store('sessionEncrypted', sessionEncrypted);\n })(),\n (async () => {\n if (!globalJson) return;\n\n const globalEncrypted = await aesEncrypt(globalJson, currentPasscodeHash);\n await store('globalEncrypted', globalEncrypted);\n })(),\n ]);\n}\n\nexport async function decryptSession(passcode: string) {\n const passcodeHash = await sha256(passcode);\n\n const [sessionEncrypted, globalEncrypted] = await Promise.all([\n load('sessionEncrypted'),\n load('globalEncrypted'),\n ]);\n\n if (!sessionEncrypted || !globalEncrypted) {\n throw new Error('[api/passcode] Missing required stored fields');\n }\n\n const [sessionJson, globalJson] = await Promise.all([\n aesDecrypt(sessionEncrypted, passcodeHash),\n aesDecrypt(globalEncrypted, passcodeHash),\n ]);\n\n currentPasscodeHash = passcodeHash;\n\n return { sessionJson, globalJson };\n}\n\nexport function forgetPasscode() {\n currentPasscodeHash = undefined;\n}\n\nexport function clearEncryptedSession() {\n forgetPasscode();\n return cacheApi.clear(PASSCODE_CACHE_NAME);\n}\n\nfunction sha256(plaintext: string) {\n return crypto.subtle.digest('SHA-256', new TextEncoder().encode(`${plaintext}${SALT}`));\n}\n\nasync function store(key: string, value: ArrayBuffer) {\n await cacheApi.save(PASSCODE_CACHE_NAME, key, value);\n}\n\nfunction load(key: string) {\n return cacheApi.fetch(PASSCODE_CACHE_NAME, key, cacheApi.Type.ArrayBuffer);\n}\n\nasync function aesEncrypt(plaintext: string, pwHash: ArrayBuffer) {\n const iv = crypto.getRandomValues(new Uint8Array(IV_LENGTH));\n const alg = { name: 'AES-GCM', iv };\n const key = await crypto.subtle.importKey('raw', pwHash, alg, false, ['encrypt']);\n const ptUint8 = new TextEncoder().encode(plaintext);\n const ctBuffer = await crypto.subtle.encrypt(alg, key, ptUint8);\n const ct = new Uint8Array(ctBuffer);\n const result = new Uint8Array(IV_LENGTH + ct.length);\n result.set(iv, 0);\n result.set(ct, IV_LENGTH);\n return result.buffer;\n}\n\nasync function aesDecrypt(data: ArrayBuffer, pwHash: ArrayBuffer) {\n const dataArray = new Uint8Array(data);\n const iv = dataArray.slice(0, IV_LENGTH);\n const alg = { name: 'AES-GCM', iv };\n const key = await crypto.subtle.importKey('raw', pwHash, alg, false, ['decrypt']);\n const ct = dataArray.slice(IV_LENGTH);\n const plainBuffer = await crypto.subtle.decrypt(alg, key, ct);\n\n return new TextDecoder().decode(plainBuffer);\n}\n","import type { ApiCountryCode } from '../api/types';\n\nconst PATTERN_PLACEHOLDER = 'X';\nconst DEFAULT_PATTERN = 'XXX XXX XXX XXX';\n\nexport function getCountryCodesByIso(phoneCodeList: ApiCountryCode[], iso: string) {\n return phoneCodeList.filter((country) => country.iso2 === iso);\n}\n\nexport function getCountryFromPhoneNumber(phoneCodeList: ApiCountryCode[], input = '') {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (phoneNumber.startsWith('+')) {\n phoneNumber = phoneNumber.substr(1);\n }\n\n const possibleCountries = phoneCodeList\n .filter((country) => phoneNumber.startsWith(country.countryCode));\n const codesWithPrefix: { code: string; country: ApiCountryCode }[] = possibleCountries\n .map((country) => (country.prefixes || ['']).map((prefix) => {\n return {\n code: `${country.countryCode}${prefix}`,\n country,\n };\n }))\n .flat();\n\n const bestMatches = codesWithPrefix\n .filter(({ code }) => phoneNumber.startsWith(code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return bestMatches[bestMatches.length - 1]?.country;\n}\n\nexport function formatPhoneNumber(input: string, country?: ApiCountryCode) {\n if (!input) {\n return '';\n }\n\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.countryCode.length);\n } else if (input.startsWith('+')) {\n return input;\n }\n const pattern = getBestPattern(phoneNumber, country?.patterns);\n\n const result: string[] = []; // Result character array\n let j = 0; // Position inside pattern\n for (let i = 0; i < phoneNumber.length; i++) {\n while (pattern[j] !== PATTERN_PLACEHOLDER && j < pattern.length) {\n result.push(pattern[j]);\n if (pattern[j] === phoneNumber[i]) { // If pattern contains digits, move input position too\n i++;\n if (i === phoneNumber.length) break; // But don't overdo it, or it will insert full pattern unexpectedly\n }\n j++;\n }\n\n result.push(phoneNumber[i]); // For placeholder characters, setting current input digit\n j++;\n }\n\n return result.join('');\n}\n\nfunction getBestPattern(numberWithoutCode: string, patterns?: string[]) {\n if (!patterns || patterns.length === 0) return DEFAULT_PATTERN;\n if (patterns.length === 1) return patterns[0];\n\n const defaultPattern = patterns.find((pattern) => pattern.startsWith(PATTERN_PLACEHOLDER)) || DEFAULT_PATTERN;\n\n const bestMatches = patterns.filter((pattern) => {\n const stripped = pattern.replace(/[^\\dX]+/g, '');\n if (stripped.startsWith(PATTERN_PLACEHOLDER)) return false; // Don't consider default number format here\n for (let i = 0; i < numberWithoutCode.length; i++) {\n if (i > stripped.length - 1 || (stripped[i] !== PATTERN_PLACEHOLDER && stripped[i] !== numberWithoutCode[i])) {\n return false;\n }\n }\n return true;\n });\n\n // Playing it safe: if not sure, use default for that region\n return bestMatches.length === 1 ? bestMatches[0] : defaultPattern;\n}\n\nexport function formatPhoneNumberWithCode(phoneCodeList: ApiCountryCode[], phoneNumber: string) {\n if (!phoneNumber) {\n return '';\n }\n\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(phoneCodeList, numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `+${country.countryCode} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n","import type { MessageListType } from '../global/types';\nimport { MAIN_THREAD_ID } from '../api/types';\nimport { LOCATION_HASH } from '../hooks/useHistoryBack';\n\nexport const createMessageHash = (chatId: string, type: string, threadId: number): string => (\n chatId.toString()\n + (type !== 'thread' ? `_${type}`\n : (threadId !== -1 ? `_${threadId}` : ''))\n);\n\nexport function parseLocationHash() {\n if (!LOCATION_HASH) return undefined;\n\n const [chatId, typeOrThreadId] = LOCATION_HASH.replace(/^#/, '').split('_');\n if (!chatId?.match(/^-?\\d+$/)) return undefined;\n\n const isType = ['thread', 'pinned', 'scheduled'].includes(typeOrThreadId);\n\n return {\n chatId,\n type: Boolean(typeOrThreadId) && isType ? (typeOrThreadId as MessageListType) : 'thread',\n threadId: Boolean(typeOrThreadId) && !isType ? Number(typeOrThreadId) : MAIN_THREAD_ID,\n };\n}\n","import { DEBUG } from '../config';\n\nconst safePlay = (mediaEl: HTMLMediaElement) => {\n mediaEl.play().catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err, mediaEl);\n }\n });\n};\n\nexport default safePlay;\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd;\n\nexport function debounce<F extends AnyToVoidFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters<F>) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle<F extends AnyToVoidFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\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 fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(fastRafPrimary, fn);\n}\n\nexport function throttleWithTickEnd<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWith<F extends AnyToVoidFunction>(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n fn(...args);\n });\n }\n };\n}\n\nexport function onIdle(cb: NoneToVoidFunction, timeout?: number) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb, { timeout });\n } else {\n onTickEnd(cb);\n }\n}\n\nexport const pause = (ms: number) => new Promise<void>((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise<void>((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 fastRafPrimary(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet onTickEndCallbacks: NoneToVoidFunction[] | undefined;\nlet onTickEndPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onTickEnd(callback: NoneToVoidFunction, isPrimary = false) {\n if (!onTickEndCallbacks) {\n onTickEndCallbacks = isPrimary ? [] : [callback];\n onTickEndPrimaryCallbacks = isPrimary ? [callback] : [];\n\n Promise.resolve().then(() => {\n const currentCallbacks = onTickEndCallbacks!;\n const currentPrimaryCallbacks = onTickEndPrimaryCallbacks!;\n onTickEndCallbacks = undefined;\n onTickEndPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n onTickEndPrimaryCallbacks!.push(callback);\n } else {\n onTickEndCallbacks.push(callback);\n }\n}\n\nexport function onTickEndPrimary(callback: NoneToVoidFunction) {\n onTickEnd(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","let RE_NOT_LETTER: RegExp;\n\ntry {\n RE_NOT_LETTER = /[^\\p{L}\\p{M}]+/ui;\n} catch (e) {\n // Support for older versions of firefox\n RE_NOT_LETTER = /[^\\wа-яё]+/i;\n}\n\nexport default function searchWords(haystack: string, needle: string | string[]) {\n if (!haystack || !needle) {\n return false;\n }\n\n const needleWords = typeof needle === 'string' ? needle.toLowerCase().split(RE_NOT_LETTER) : needle;\n const haystackLower = haystack.toLowerCase();\n\n // @optimization\n if (needleWords.length === 1 && !haystackLower.includes(needleWords[0])) {\n return false;\n }\n\n let haystackWords: string[];\n\n return needleWords.every((needleWord) => {\n if (!haystackLower.includes(needleWord)) {\n return false;\n }\n\n if (!haystackWords) {\n haystackWords = haystackLower.split(RE_NOT_LETTER);\n }\n\n return haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord));\n });\n}\n\nexport function prepareSearchWordsForNeedle(needle: string) {\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return (haystack: string) => searchWords(haystack, needleWords);\n}\n","export const getServerTime = (serverTimeOffset: number) => {\n return Math.floor(Date.now() / 1000) + serverTimeOffset;\n};\n","import safariFix from 'safari-14-idb-fix';\n\nfunction promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const dbp = safariFix().then(() => {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n return promisifyRequest(request);\n });\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import * as idb from 'idb-keyval';\n\nimport type { ApiSessionData } from '../api/types';\n\nimport {\n DEBUG, GLOBAL_STATE_CACHE_KEY, LEGACY_SESSION_KEY, SESSION_USER_KEY,\n} from '../config';\nimport * as cacheApi from './cacheApi';\n\nconst DC_IDS = [1, 2, 3, 4, 5];\n\nexport function hasStoredSession(withLegacy = false) {\n if (withLegacy && localStorage.getItem(LEGACY_SESSION_KEY)) {\n return true;\n }\n\n if (checkSessionLocked()) {\n return true;\n }\n\n const userAuthJson = localStorage.getItem(SESSION_USER_KEY);\n if (!userAuthJson) {\n return false;\n }\n\n try {\n const userAuth = JSON.parse(userAuthJson);\n return Boolean(userAuth && userAuth.id && userAuth.dcID);\n } catch (err) {\n // Do nothing.\n return false;\n }\n}\n\nexport function storeSession(sessionData: ApiSessionData, currentUserId?: string) {\n const { mainDcId, keys, hashes } = sessionData;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify({ dcID: mainDcId, id: currentUserId }));\n localStorage.setItem('dc', String(mainDcId));\n Object.keys(keys).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_auth_key`, JSON.stringify(keys[dcId]));\n });\n\n if (hashes) {\n Object.keys(hashes).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_hash`, JSON.stringify(hashes[dcId]));\n });\n }\n}\n\nexport function clearStoredSession() {\n [\n SESSION_USER_KEY,\n 'dc',\n ...DC_IDS.map((dcId) => `dc${dcId}_auth_key`),\n ...DC_IDS.map((dcId) => `dc${dcId}_hash`),\n ...DC_IDS.map((dcId) => `dc${dcId}_server_salt`),\n ].forEach((key) => {\n localStorage.removeItem(key);\n });\n}\n\nexport function loadStoredSession(): ApiSessionData | undefined {\n if (!hasStoredSession()) {\n return undefined;\n }\n\n const userAuth = JSON.parse(localStorage.getItem(SESSION_USER_KEY)!);\n if (!userAuth) {\n return undefined;\n }\n const mainDcId = Number(userAuth.dcID);\n const keys: Record<number, string> = {};\n const hashes: Record<number, string> = {};\n\n DC_IDS.forEach((dcId) => {\n try {\n const key = localStorage.getItem(`dc${dcId}_auth_key`);\n if (key) {\n keys[dcId] = JSON.parse(key);\n }\n\n const hash = localStorage.getItem(`dc${dcId}_hash`);\n if (hash) {\n hashes[dcId] = JSON.parse(hash);\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load stored session', err);\n }\n // Do nothing.\n }\n });\n\n if (!Object.keys(keys).length) return undefined;\n\n return {\n mainDcId,\n keys,\n hashes,\n };\n}\n\nexport async function importLegacySession() {\n const sessionId = localStorage.getItem(LEGACY_SESSION_KEY);\n if (!sessionId) return;\n\n const sessionJson = await idb.get(`GramJs:${sessionId}`);\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData;\n storeSession(sessionData);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load legacy session', err);\n }\n // Do nothing.\n }\n}\n\n// Remove previously created IndexedDB and cache API sessions\nexport async function clearLegacySessions() {\n localStorage.removeItem(LEGACY_SESSION_KEY);\n\n const idbKeys = await idb.keys();\n\n await Promise.all<Promise<any>>([\n cacheApi.clear('GramJs'),\n ...idbKeys\n .filter((k) => typeof k === 'string' && k.startsWith('GramJs:GramJs-session-'))\n .map((k) => idb.del(k)),\n ]);\n}\n\nexport function importTestSession() {\n const sessionJson = process.env.TEST_SESSION!;\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData & { userId: string };\n storeSession(sessionData, sessionData.userId);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load test session', err);\n }\n // Do nothing.\n }\n}\n\nfunction checkSessionLocked() {\n const stateFromCache = JSON.parse(localStorage.getItem(GLOBAL_STATE_CACHE_KEY) || '{}');\n\n return Boolean(stateFromCache?.passcode?.isScreenLocked);\n}\n","import type { ISettings } from '../types';\n\nimport { animateSingle } from './animation';\nimport { fastRaf } from './schedulers';\n\nimport themeColors from '../styles/themes.json';\nimport { lerp } from './math';\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;\nconst RGB_VARIABLES = new Set([\n '--color-primary-shade',\n '--color-text-secondary',\n]);\n\nconst colors = (Object.keys(themeColors) as Array<keyof typeof themeColors>).map((property) => ({\n property,\n colors: [hexToRgb(themeColors[property][0]), hexToRgb(themeColors[property][1])],\n}));\n\nconst switchTheme = (theme: ISettings['theme'], withAnimation: boolean) => {\n const themeClassName = `theme-${theme}`;\n if (document.documentElement.classList.contains(themeClassName)) {\n return;\n }\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(themeClassName);\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 fastRaf(() => {\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 });\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 if (RGB_VARIABLES.has(property)) {\n document.documentElement.style.setProperty(`${property}-rgb`, `${r},${g},${b}`);\n }\n });\n}\n\nexport default switchTheme;\n","import type { LangFn } from '../hooks/useLang';\nimport EMOJI_REGEX from '../lib/twemojiRegex';\nimport { fixNonStandardEmoji } from './emoji';\nimport withCache from './withCache';\n\nexport 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 const getFirstLetters = withCache((phrase: string, count = 2) => {\n return phrase\n .replace(/[.,!@#$%^&*()_+=\\-`~[\\]/\\\\{}:\"|<>?]+/gi, '')\n .trim()\n .split(/\\s+/)\n .slice(0, count)\n .map((word: string) => {\n if (!word.length) return '';\n word = fixNonStandardEmoji(word);\n const emojis = word.match(EMOJI_REGEX);\n if (emojis && word.startsWith(emojis[0])) {\n return emojis[0];\n }\n return word.match(/./u)![0].toUpperCase();\n })\n .join('');\n});\n\nconst FILE_SIZE_UNITS = ['B', 'KB', 'MB', 'GB'];\nexport function formatFileSize(lang: LangFn, bytes: number, decimals = 1): string {\n if (bytes === 0) {\n return lang('FileSize.B', 0);\n }\n\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = (bytes / (k ** i)).toFixed(Math.max(decimals, 0));\n\n return lang(`FileSize.${FILE_SIZE_UNITS[i]}`, value);\n}\n","export default function trimText<T extends string | undefined>(text: T, length?: number) {\n if (!text || !length || text.length <= length) {\n return text;\n }\n\n return `${text.substring(0, length)}...`;\n}\n","import { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\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<Blob | undefined> {\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, dataUri: string): Promise<string> {\n if (isWebpSupported() || dataUri.substr(0, 15) !== 'data:image/webp') {\n return dataUri;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(dataUri));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${dataUri}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new Worker(new URL('../lib/webp/webp_wasm.worker.js', import.meta.url)) as IWebpWorker;\n worker.wasmReady = false;\n worker.onmessage = handleLibWebpMessage;\n }\n}\n\nfunction createPng({ result, width, height }: TEncodedImage): Promise<Blob | undefined> {\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<TEncodedImage> {\n return new Promise((resolve) => {\n if (!worker.requests) {\n worker.requests = new Map();\n }\n\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import { APP_VERSION, DEBUG, IS_MOCKED_CLIENT } from '../config';\nimport { getGlobal } from '../global';\nimport { hasStoredSession } from './sessions';\n\nconst WEBSYNC_URLS = [\n 't.me',\n 'telegram.me',\n].map((domain) => `//${domain}/_websync_?`);\nconst WEBSYNC_VERSION = `${APP_VERSION} Z`;\nconst WEBSYNC_KEY = 'tgme_sync';\nconst WEBSYNC_TIMEOUT = 86400;\n\nconst getTs = () => {\n return Math.floor(Number(new Date()) / 1000);\n};\n\nconst saveSync = (authed: boolean) => {\n const ts = getTs();\n localStorage.setItem(WEBSYNC_KEY, JSON.stringify({\n canRedirect: authed,\n ts,\n }));\n};\n\nlet lastTimeout: NodeJS.Timeout | undefined;\n\nexport const forceWebsync = (authed: boolean) => {\n if (IS_MOCKED_CLIENT) return undefined;\n const currentTs = getTs();\n\n const { canRedirect, ts } = JSON.parse(localStorage.getItem(WEBSYNC_KEY) || '{}');\n\n if (canRedirect !== authed || ts + WEBSYNC_TIMEOUT <= currentTs) {\n return Promise.all(WEBSYNC_URLS.map((url) => {\n return new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n\n const removeElement = () => Boolean(document.body.removeChild(script));\n\n script.src = url + new URLSearchParams({\n authed: Number(authed).toString(),\n version: WEBSYNC_VERSION,\n });\n\n document.body.appendChild(script);\n\n script.onload = () => {\n saveSync(authed);\n removeElement();\n if (lastTimeout) {\n clearTimeout(lastTimeout);\n lastTimeout = undefined;\n }\n startWebsync();\n resolve();\n };\n\n script.onerror = () => {\n removeElement();\n reject();\n };\n });\n }));\n } else {\n return Promise.resolve();\n }\n};\n\nexport function startWebsync() {\n if (DEBUG) {\n return;\n }\n\n if (lastTimeout !== undefined) return;\n const currentTs = getTs();\n\n const { ts } = JSON.parse(localStorage.getItem(WEBSYNC_KEY) || '{}');\n\n const timeout = WEBSYNC_TIMEOUT - (currentTs - ts);\n\n lastTimeout = setTimeout(() => {\n const { authState } = getGlobal();\n\n const authed = authState === 'authorizationStateReady' || hasStoredSession(true);\n forceWebsync(authed);\n }, Math.max(0, timeout * 1000));\n}\n\nexport function clearWebsync() {\n localStorage.removeItem(WEBSYNC_KEY);\n}\n","import { throttle } from './schedulers';\nimport {\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT } from './environment';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nconst IS_LANDSCAPE = IS_SINGLE_COLUMN_LAYOUT && isLandscape();\n\nconst initialHeight = window.innerHeight;\nlet currentWindowSize = updateSizes();\nlet isRefreshDisabled = false;\n\nfunction disableRefresh() {\n isRefreshDisabled = true;\n}\n\nfunction enableRefresh() {\n isRefreshDisabled = false;\n}\n\nconst handleResize = throttle(() => {\n currentWindowSize = updateSizes();\n\n if (!isRefreshDisabled && (\n isMobileScreen() !== IS_SINGLE_COLUMN_LAYOUT\n || (IS_SINGLE_COLUMN_LAYOUT && IS_LANDSCAPE !== isLandscape())\n )) {\n window.location.reload();\n }\n}, 250, true);\n\nwindow.addEventListener('orientationchange', handleResize);\nif (IS_IOS) {\n window.visualViewport.addEventListener('resize', handleResize);\n} else {\n window.addEventListener('resize', handleResize);\n}\n\nexport function updateSizes(): IDimensions {\n let height: number;\n if (IS_IOS) {\n height = window.visualViewport.height + window.visualViewport.pageTop;\n } else {\n height = window.innerHeight;\n }\n const vh = height * 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\nfunction isMobileScreen() {\n return currentWindowSize.width <= MOBILE_SCREEN_MAX_WIDTH || (\n currentWindowSize.width <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH\n && currentWindowSize.height <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n );\n}\n\nfunction isLandscape() {\n if (IS_IOS) {\n return window.matchMedia('(orientation: landscape)').matches;\n }\n\n // eslint-disable-next-line max-len\n // Source: https://web.archive.org/web/20160509220835/http://blog.abouthalf.com/development/orientation-media-query-challenges-in-android-browsers/\n // Feature is marked as deprecated now, but it is still supported\n // https://developer.mozilla.org/en-US/docs/Web/CSS/@media/device-aspect-ratio#browser_compatibility\n return window.matchMedia('screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)').matches;\n}\n\nconst windowSize = {\n get: () => currentWindowSize,\n getIsKeyboardVisible: () => initialHeight > currentWindowSize.height,\n disableRefresh,\n enableRefresh,\n};\n\nexport default windowSize;\n","const cache = new WeakMap<AnyFunction, Map<string, any>>();\n\nexport default function withCache<T extends AnyFunction>(fn: T) {\n return (...args: Parameters<T>): ReturnType<T> => {\n let fnCache = cache.get(fn);\n const cacheKey = args.map(String).join('_');\n\n if (fnCache) {\n const cached = fnCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n } else {\n fnCache = new Map();\n cache.set(fn, fnCache);\n }\n\n const newValue = fn(...args);\n\n fnCache.set(cacheKey, newValue);\n\n return newValue;\n };\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"67\":\"b87adfdac989dff54cd1\",\"143\":\"e2c1115f073082dddbdf\",\"154\":\"8c2ff697b6d4cafdb776\",\"191\":\"1fa0f260d53e7abfe9ed\",\"209\":\"ca4daa9ff624b3bf5614\",\"212\":\"e663b8258cc54ba69359\",\"244\":\"ae966e72f128eda340fc\",\"256\":\"ff0f01bea01003a78a3c\",\"370\":\"5addeb3fc94386c23602\",\"483\":\"35b0f80df29ece6559a6\",\"625\":\"c4bfccd5c44b3331f5a7\",\"713\":\"894ffda65a82196537e1\",\"730\":\"2e172af489ed6ff0e496\",\"831\":\"f5c222cee9c1b1b68852\",\"905\":\"60ca606f19ffdd6d94a4\",\"958\":\"c56f02be3f4f5db2aedf\",\"1098\":\"4a6d3970af492938a672\",\"1142\":\"59a69270adc0978a6156\",\"1161\":\"9bcab8bec6aedc27da89\",\"1276\":\"07f8a81b011d56580ad6\",\"1360\":\"1a681d99506a88d29942\",\"1402\":\"35efd1623401c0a6ada2\",\"1418\":\"a8ffdf6d23ac65ebfa95\",\"1437\":\"53e04fe5063aee60d350\",\"1514\":\"64267b1f36585be79543\",\"1516\":\"b725c3ae9356f1b835b5\",\"1627\":\"c1c005ef2bed8d1b9561\",\"1641\":\"d99075923e2b8c9e5f72\",\"1699\":\"258d1e759822ec152b75\",\"1752\":\"272d78459ec80c5b3dba\",\"1879\":\"60ac065c7d88c4f46b54\",\"1915\":\"c5b3f01035517153521f\",\"1917\":\"2928ac2003a7061dc059\",\"1933\":\"b2033cfa79d272a8fe62\",\"1954\":\"d569fdd7ba86d9776a5c\",\"1967\":\"3cec93c3a4dcd79e0488\",\"2001\":\"8c68420c13854bbc24fe\",\"2002\":\"8481843cd3d445486865\",\"2054\":\"9c1890f62ccae40eeec2\",\"2098\":\"890557cbbc0c46a9f08f\",\"2137\":\"3af5405dff8273180346\",\"2138\":\"fbfb10a62455b7b043b7\",\"2243\":\"f82c54d3a849d4a487b4\",\"2251\":\"2bf10b1f578543d75e54\",\"2305\":\"c31559f1364c234c62a5\",\"2342\":\"f8d4331788cc89a2b694\",\"2369\":\"d952921438994721f7d0\",\"2390\":\"d7ecc2f228aef9b009e4\",\"2537\":\"94c17bfafc8acf1a9cd2\",\"2690\":\"4d73e3084ae3a2a6f64c\",\"2741\":\"9f3aba6b2cd0b453f9a5\",\"2767\":\"2121cd909c7aa572c7fd\",\"2853\":\"c4ae910d407f42b72912\",\"2892\":\"b8b8cd5c2b1df51e3492\",\"2993\":\"ce167d8ba0fe31fb5f1b\",\"3041\":\"3651667772714402881a\",\"3075\":\"9c2f4f4a3c19eb56b751\",\"3076\":\"a7f6caf93b4b88180a6f\",\"3098\":\"448b2ceaf9f37e849d7e\",\"3108\":\"8f30bf9e3324a376f4ee\",\"3124\":\"076a04e3a1b8d27db111\",\"3147\":\"5a6cc01866d92675c748\",\"3163\":\"6761cefaf572d1748946\",\"3268\":\"7cace4f58c3fac9c74da\",\"3280\":\"c61f120392215be6557a\",\"3288\":\"4a69264995d9f806de13\",\"3309\":\"620314c64d80c35257fc\",\"3311\":\"2ff5c61aa4212045c410\",\"3404\":\"70f366c6fa25f799e549\",\"3408\":\"25202d3ff038f4194bd9\",\"3411\":\"8f5d1095651d61b8f424\",\"3420\":\"3a5367f73895e3c3c1f4\",\"3472\":\"615d222fdc0dcfa591d8\",\"3488\":\"54332bf5929df0077432\",\"3505\":\"58e185c3b757b41576a2\",\"3539\":\"498df8847f9f9d5a0937\",\"3585\":\"3853a59a7d0336a03fde\",\"3588\":\"d6cc0e28e0d962d3157c\",\"3656\":\"279c48ec3d47a9000fa9\",\"3698\":\"3541c155e1b629af7d33\",\"3779\":\"0b77df2f0fdb505d6e71\",\"3800\":\"96da4150cdeeba708556\",\"3848\":\"ee699a3ab25cc6ca726d\",\"3863\":\"d5fde682a12d7aa54672\",\"3866\":\"df9f4de3c91bbda53861\",\"3881\":\"8521d06f92c7b8b273ce\",\"3894\":\"9ec589a8d0b8850ef326\",\"3936\":\"a3325e628347fac10d84\",\"3966\":\"097d0a2dd03e55cf7c46\",\"4037\":\"af37477886b6cfd1194e\",\"4039\":\"bcd470032085a33ee54b\",\"4231\":\"d59a6f0c70fb98d4bcf0\",\"4276\":\"9240959928e16f250f8f\",\"4303\":\"58ff7d91e35a9b3c2756\",\"4314\":\"0d8ed2badacc96e873cb\",\"4334\":\"e493d976600a04c160e4\",\"4408\":\"0fb28033cf23ddbc23a6\",\"4484\":\"ba496a0faf977e32f6ef\",\"4536\":\"acd06cb972eebae2e5e4\",\"4566\":\"5eb1a1b10803fa99c22d\",\"4569\":\"385b6cf4a46b7115c2db\",\"4646\":\"7ebe551cdd0f4b9c9e92\",\"4685\":\"88d39506fe34588ed78d\",\"4686\":\"125b32545c1a0a0d5d3e\",\"4710\":\"0a0b5e901cf0b5d6fd93\",\"4713\":\"5a4b08652c0d22593258\",\"4723\":\"38c6e4a29e0fdfa7afa8\",\"4747\":\"a51da29105f71545b275\",\"4753\":\"17105da93bd7006f8573\",\"4835\":\"0964f1a24a6398e35c12\",\"4838\":\"71c5c5739a3ed2bad3ee\",\"4850\":\"bc9242dc125cb10484bc\",\"4933\":\"c0f777add150aed6dd31\",\"4973\":\"9e1f1935e024e1bf929d\",\"4986\":\"962334f1a027906974fd\",\"5040\":\"99ef443d75bf87559776\",\"5060\":\"7cd173e6b1393947bb3b\",\"5066\":\"d9d0cb326f6f7d743f3a\",\"5099\":\"655521533cb48ebec54c\",\"5119\":\"090f02fee771b8f5e65c\",\"5204\":\"55dc1f02973adc8b29ab\",\"5239\":\"73400cf76a319169f599\",\"5246\":\"32626d81771d640604dd\",\"5281\":\"0b7b900d2540db49ae8f\",\"5297\":\"01b37c1c033b4b7c5732\",\"5309\":\"ba1a5dde297758458683\",\"5344\":\"5c9eaedbce0a63ae3e63\",\"5368\":\"892f890338957f00fc23\",\"5386\":\"9f0180dc5c168ff288bf\",\"5434\":\"249f262bbc62d09db4f0\",\"5474\":\"aedf972792d2c11b7940\",\"5588\":\"56e673e74137435b5023\",\"5603\":\"0302646e1ffabe87d525\",\"5699\":\"78a750acf4e0fff43bde\",\"5745\":\"53fc0ce876a7dce21370\",\"5769\":\"b3dc0ee7170367f52dfe\",\"5855\":\"c34458d02e95d2ec3d71\",\"5930\":\"9dcde09591068799ffc3\",\"5993\":\"7a57e87ff9a577929387\",\"5999\":\"3b1c15d4285915dddc03\",\"6052\":\"ca3c1bee89e20d16318d\",\"6146\":\"e892062054e79d879e6b\",\"6220\":\"4626eab605f1f3f5fae7\",\"6284\":\"412fe22eb5e792b8236b\",\"6297\":\"a40c32123d663a5d397e\",\"6346\":\"3a08cef57225b5dd0723\",\"6401\":\"65204bd5a1f1d34e1fdc\",\"6483\":\"49cb2949d98e5010ceff\",\"6548\":\"6abe878180ff54087f58\",\"6642\":\"765cb88c978f7f6366d8\",\"6688\":\"a5a6ef9c1044e440d8aa\",\"6770\":\"260c086c5e5b2e226e40\",\"6798\":\"a48f1b663374c1fcdf24\",\"6839\":\"7574ee59f6159101b320\",\"6889\":\"94df7712273c4f61ab30\",\"6892\":\"1bf37b40183987140fc9\",\"6931\":\"5d8b023307c7a880a8f1\",\"6941\":\"7a0e1012e31f72681952\",\"6969\":\"d2b2e882f924d7d5e877\",\"6972\":\"45d9b899b7178fdb92c1\",\"7049\":\"6f2636c871a83f167b6e\",\"7052\":\"d8a4a1431f93b64b9a87\",\"7119\":\"03b2ee63b97712464a63\",\"7125\":\"57c858da5d4ff67e8141\",\"7316\":\"2a3dfa1eba460895cf64\",\"7388\":\"7bec01a290d868ba2d42\",\"7501\":\"9f45796679951ac21293\",\"7551\":\"6e574d5a75cf073215df\",\"7556\":\"701477404ee235a07786\",\"7794\":\"5d3eabab5ee771b3e859\",\"7799\":\"690560cf65f3d985dde5\",\"7897\":\"01558917b3d0fc1d388f\",\"7941\":\"7394fb0b394c9ee95fb1\",\"7963\":\"8b010994867f46020df9\",\"8063\":\"627d5ae10e2e502e9e38\",\"8090\":\"9f0fe84299baed437020\",\"8138\":\"9b29a768a035996247bd\",\"8208\":\"9a2d0eeec5f8bb07cdd3\",\"8294\":\"12b38bd567e102c27c8e\",\"8369\":\"c6ae120b122d07384b7d\",\"8401\":\"a8ba266b7a79ef7dfe1d\",\"8422\":\"cfa7884f5b7ee933b6c3\",\"8435\":\"5f667e46d196564970b9\",\"8505\":\"f588195fa145445de93b\",\"8530\":\"a4d7f28c015d01eaf776\",\"8663\":\"3215036b0069a8dcc16e\",\"8688\":\"6cda6506154e2e3e5b90\",\"8709\":\"51c7b7103b230d767ea7\",\"8812\":\"a39ba81372544f20ba3f\",\"8815\":\"fd39d74554c793313d5b\",\"8822\":\"3e199b60162d8b8314aa\",\"8878\":\"a7b117d54d54258e5f26\",\"8913\":\"1773658335e9a4527e40\",\"9071\":\"c587e7d4b0df5f41a587\",\"9125\":\"221d966328061801dce3\",\"9223\":\"b65193470f36938b0d9b\",\"9227\":\"c34f2b1661736507d402\",\"9285\":\"3aedc94598376aee9274\",\"9328\":\"545adb935b7615fd8d16\",\"9338\":\"cf9b08f5551ab6096a70\",\"9375\":\"40298b58e46ff66877d6\",\"9379\":\"5f47d04a09f26df77d30\",\"9400\":\"9f2f9a821c3a64e5473d\",\"9486\":\"66f6169ec02590019bbf\",\"9535\":\"35b32969dfafdbc17a45\",\"9536\":\"52b3efcf5de741667a33\",\"9565\":\"05a813d6f1c60da0196b\",\"9606\":\"f9fa653821fc0f019fad\",\"9623\":\"a319f64448a91c662f4d\",\"9635\":\"01582125f331f7f89adb\",\"9641\":\"8b340949ffd52cb38c60\",\"9657\":\"376f100fba6d94cfca1b\",\"9682\":\"730455c56a4729444e9d\",\"9783\":\"6fb3455cb9b01926cb10\",\"9822\":\"ec3817f08021427f5550\",\"9954\":\"836adcc6b64f2d9ed43a\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"3041\":\"BundleAuth\",\"3779\":\"BundleExtra\",\"5769\":\"BundleMain\",\"9954\":\"BundleCalls\"}[chunkId] || chunkId) + \".\" + {\"3041\":\"3651667772714402881a\",\"3472\":\"615d222fdc0dcfa591d8\",\"3779\":\"0b77df2f0fdb505d6e71\",\"5769\":\"b3dc0ee7170367f52dfe\",\"8688\":\"6cda6506154e2e3e5b90\",\"8878\":\"a7b117d54d54258e5f26\",\"9954\":\"836adcc6b64f2d9ed43a\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\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\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktelegram_t\"] = self[\"webpackChunktelegram_t\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","import { DEBUG, DEBUG_MORE, IS_TEST } from '../config';\nimport { getActions } from '../global';\nimport { IS_ANDROID, IS_IOS, IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady, playNotifySoundDebounced } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record<string, any>;\n};\n\nfunction handleWorkerMessage(e: MessageEvent) {\n const action: WorkerAction = e.data;\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log('[SW] Message from worker', action);\n }\n if (!action.type) return;\n const dispatch = getActions();\n const payload = action.payload;\n switch (action.type) {\n case 'focusMessage':\n if (dispatch.focusMessage) {\n dispatch.focusMessage(payload);\n }\n break;\n case 'playNotificationSound':\n playNotifySoundDebounced(action.payload.id);\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 if (!navigator.serviceWorker.controller) {\n const registrations = await navigator.serviceWorker.getRegistrations();\n if (registrations.length) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Hard reload detected, re-enabling Service Worker');\n }\n await Promise.all(registrations.map((r) => r.unregister()));\n }\n }\n\n await navigator.serviceWorker.register(new URL('../serviceWorker.ts', import.meta.url));\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\n if (!IS_IOS && !IS_ANDROID && !IS_TEST) {\n getActions().showDialog({ data: { message: 'SERVICE_WORKER_DISABLED', hasErrorKey: true } });\n }\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 { addActionHandler } from './index';\n\nimport { INITIAL_STATE } from './initialState';\nimport { IS_MOCKED_CLIENT } from '../config';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\nimport { updatePasscodeSettings } from './reducers';\nimport { clearStoredSession } from '../util/sessions';\n\ninitCache();\n\naddActionHandler('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n let global = loadCache(initial) || initial;\n if (IS_MOCKED_CLIENT) global.authState = 'authorizationStateReady';\n\n const { hasPasscode, isScreenLocked } = global.passcode;\n if (hasPasscode && !isScreenLocked) {\n global = updatePasscodeSettings(global, {\n isScreenLocked: true,\n });\n\n clearStoredSession();\n }\n\n return global;\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","import * as langProvider from '../util/langProvider';\nimport { useState } from '../lib/teact/teact';\n\nconst useLangString = (langCode: string | undefined, key: string): string | undefined => {\n const [translation, setTranslation] = useState<string>();\n\n if (langCode) {\n langProvider\n .getTranslationForLangString(langCode, key)\n .then(setTranslation);\n }\n\n return translation;\n};\n\nexport default useLangString;\n","import type { LangCode } from '../../../types';\n\nexport function getSuggestedLanguage() {\n let suggestedLanguage = navigator.language;\n\n if (suggestedLanguage && suggestedLanguage !== 'pt-br') {\n suggestedLanguage = suggestedLanguage.substr(0, 2);\n }\n\n return suggestedLanguage as LangCode;\n}\n","import type { FC } from '../../lib/teact/teact';\nimport React, {\n useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../global';\n\nimport type { ApiCountryCode } from '../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { isoToEmoji } from '../../util/emoji';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\n\ntype StateProps = {\n phoneCodeList: ApiCountryCode[];\n};\n\ntype OwnProps = {\n id: string;\n value?: ApiCountryCode;\n isLoading?: boolean;\n onChange: (value: ApiCountryCode) => void;\n};\n\nconst MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY;\nconst SELECT_TIMEOUT = 50;\n\nconst CountryCodeInput: FC<OwnProps & StateProps> = ({\n id,\n value,\n isLoading,\n onChange,\n phoneCodeList,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n\n const [filter, setFilter] = useState<string | undefined>();\n const [filteredList, setFilteredList] = useState<ApiCountryCode[]>([]);\n\n const updateFilter = useCallback((filterValue?: string) => {\n setFilter(filterValue);\n setFilteredList(getFilteredList(phoneCodeList, filterValue));\n }, [phoneCodeList]);\n\n useOnChange(([prevPhoneCodeList]) => {\n if (prevPhoneCodeList?.length === 0 && phoneCodeList.length > 0) {\n updateFilter(filter);\n }\n }, [phoneCodeList, updateFilter]);\n\n const handleChange = useCallback((country: ApiCountryCode) => {\n onChange(country);\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange, updateFilter]);\n\n const handleInput = useCallback((e: React.FormEvent<HTMLInputElement>) => {\n updateFilter(e.currentTarget.value);\n }, [updateFilter]);\n\n const handleInputKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\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, updateFilter, value]);\n\n const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = useCallback(({ 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 handleCodeInput = (e: React.FormEvent<HTMLInputElement>) => {\n handleInput(e);\n handleTrigger();\n };\n\n const inputValue = filter ?? (value?.name || value?.defaultName || '');\n\n return (\n <div className={buildClassName('input-group', value && 'touched')}>\n <input\n ref={inputRef}\n className={buildClassName('form-control', isOpen && 'focus')}\n type=\"text\"\n id={id}\n value={inputValue}\n autoComplete=\"off\"\n onClick={handleTrigger}\n onFocus={handleTrigger}\n onInput={handleCodeInput}\n onKeyDown={handleInputKeyDown}\n />\n <label>{lang('Login.SelectCountry.Title')}</label>\n {isLoading ? (\n <Spinner color=\"black\" />\n ) : (\n <i onClick={handleTrigger} className={buildClassName('css-icon-down', isOpen && 'open')} />\n )}\n </div>\n );\n }, [filter, handleInput, handleInputKeyDown, id, isLoading, lang, value]);\n\n return (\n <DropdownMenu\n className=\"CountryCodeInput\"\n trigger={CodeInput}\n >\n {filteredList\n .map((country: ApiCountryCode) => (\n <MenuItem\n key={`${country.iso2}-${country.countryCode}`}\n className={value && country.iso2 === value.iso2 ? 'selected' : ''}\n // eslint-disable-next-line react/jsx-no-bind\n onClick={() => handleChange(country)}\n >\n <span className=\"country-flag\">{renderText(isoToEmoji(country.iso2), ['hq_emoji'])}</span>\n <span className=\"country-name\">{country.name || country.defaultName}</span>\n <span className=\"country-code\">+{country.countryCode}</span>\n </MenuItem>\n ))}\n {!filteredList.length && (\n <MenuItem\n key=\"no-results\"\n className=\"no-results\"\n disabled\n >\n <span>{lang('lng_country_none')}</span>\n </MenuItem>\n )}\n </DropdownMenu>\n );\n};\n\nfunction getFilteredList(countryList: ApiCountryCode[], filter = ''): ApiCountryCode[] {\n if (!filter.length) {\n return countryList;\n }\n\n const searchWords = prepareSearchWordsForNeedle(filter);\n\n return countryList.filter((country) => (\n searchWords(country.defaultName) || (country.name && searchWords(country.name))\n ));\n}\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { countryList: { phoneCodes: phoneCodeList } } = global;\n return {\n phoneCodeList,\n };\n },\n)(CountryCodeInput));\n","import type { ChangeEvent } from 'react';\n\nimport monkeyPath from '../../assets/monkey.svg';\n\nimport type { FC } from '../../lib/teact/teact';\nimport React, {\n memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport type { GlobalState } from '../../global/types';\nimport type { LangCode } from '../../types';\nimport type { ApiCountryCode } from '../../api/types';\n\nimport { IS_SAFARI, IS_TOUCH_ENV } from '../../util/environment';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport { pick } from '../../util/iteratees';\nimport { formatPhoneNumber, getCountryCodesByIso, getCountryFromPhoneNumber } from '../../util/phoneNumber';\nimport { setLanguage } from '../../util/langProvider';\nimport useLang from '../../hooks/useLang';\nimport useFlag from '../../hooks/useFlag';\nimport useLangString from '../../hooks/useLangString';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\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<GlobalState, (\n 'connectionState' | 'authState' |\n 'authPhoneNumber' | 'authIsLoading' |\n 'authIsLoadingQrCode' | 'authError' |\n 'authRememberMe' | 'authNearestCountry'\n)> & {\n language?: LangCode;\n phoneCodeList: ApiCountryCode[];\n};\n\nconst MIN_NUMBER_LENGTH = 7;\n\nlet isPreloadInitiated = false;\n\nconst AuthPhoneNumber: FC<StateProps> = ({\n connectionState,\n authState,\n authPhoneNumber,\n authIsLoading,\n authIsLoadingQrCode,\n authError,\n authRememberMe,\n authNearestCountry,\n phoneCodeList,\n language,\n}) => {\n const {\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n loadCountryList,\n clearAuthError,\n goToAuthQrCode,\n setSettingOption,\n } = getActions();\n\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestedLanguage = getSuggestedLanguage();\n\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [country, setCountry] = useState<ApiCountryCode | undefined>();\n const [phoneNumber, setPhoneNumber] = useState<string | undefined>();\n const [isTouched, setIsTouched] = useState(false);\n const [lastSelection, setLastSelection] = useState<[number, number] | undefined>();\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n const fullNumber = country ? `+${country.countryCode} ${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 (connectionState === 'connectionStateReady') {\n loadCountryList({ langCode: language });\n }\n }, [connectionState, language, loadCountryList]);\n\n useEffect(() => {\n if (authNearestCountry && phoneCodeList && !country && !isTouched) {\n setCountry(getCountryCodesByIso(phoneCodeList, authNearestCountry)[0]);\n }\n }, [country, authNearestCountry, isTouched, phoneCodeList]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n if (!newFullNumber.length) {\n setPhoneNumber('');\n }\n\n const suggestedCountry = phoneCodeList && getCountryFromPhoneNumber(phoneCodeList, newFullNumber);\n\n // Any phone numbers should be allowed, in some cases ignoring formatting\n const selectedCountry = !country\n || (suggestedCountry && suggestedCountry.iso2 !== country.iso2)\n || (!suggestedCountry && newFullNumber.length)\n ? suggestedCountry\n : country;\n\n if (!country || !selectedCountry || (selectedCountry && selectedCountry.iso2 !== country.iso2)) {\n setCountry(selectedCountry);\n }\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [phoneCodeList, country]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n void setLanguage(suggestedLanguage, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\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 isJustPastedRef = useRef(false);\n const handlePaste = useCallback(() => {\n isJustPastedRef.current = true;\n requestAnimationFrame(() => {\n isJustPastedRef.current = false;\n });\n }, []);\n\n const handleCountryChange = useCallback((value: ApiCountryCode) => {\n setCountry(value);\n setPhoneNumber('');\n }, []);\n\n const handlePhoneNumberChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\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 void 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\n const shouldFixSafariAutoComplete = (\n IS_SAFARI && country && fullNumber !== undefined\n && value.length - fullNumber.length > 1 && !isJustPastedRef.current\n );\n parseFullNumber(shouldFixSafariAutoComplete ? `${country!.countryCode} ${value}` : value);\n }, [authError, clearAuthError, country, fullNumber, parseFullNumber]);\n\n const handleKeepSessionChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setAuthRememberMe(e.target.checked);\n }, [setAuthRememberMe]);\n\n function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\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 <div id=\"auth-phone-number-form\" className=\"custom-scroll\">\n <div className=\"auth-form\">\n <div id=\"logo\" />\n <h1>Telegram</h1>\n <p className=\"note\">{lang('StartText')}</p>\n <form action=\"\" onSubmit={handleSubmit}>\n <CountryCodeInput\n id=\"sign-in-phone-code\"\n value={country}\n isLoading={!authNearestCountry && !country}\n onChange={handleCountryChange}\n />\n <InputText\n ref={inputRef}\n id=\"sign-in-phone-number\"\n label={lang('Login.PhonePlaceholder')}\n value={fullNumber}\n error={authError && lang(authError)}\n inputMode=\"tel\"\n onChange={handlePhoneNumberChange}\n onPaste={IS_SAFARI ? handlePaste : undefined}\n />\n <Checkbox\n id=\"sign-in-keep-session\"\n label=\"Keep me signed in\"\n checked={Boolean(authRememberMe)}\n onChange={handleKeepSessionChange}\n />\n {canSubmit && (\n isAuthReady ? (\n <Button type=\"submit\" ripple isLoading={authIsLoading}>{lang('Login.Next')}</Button>\n ) : (\n <Loading />\n )\n )}\n {isAuthReady && (\n <Button isText ripple isLoading={authIsLoadingQrCode} onClick={goToAuthQrCode}>\n {lang('Login.QR.Login')}\n </Button>\n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n <Button isText isLoading={isLoading} onClick={handleLangChange}>{continueText}</Button>\n )}\n </form>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: { byKey: { language } },\n countryList: { phoneCodes: phoneCodeList },\n } = global;\n\n return {\n ...pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n language,\n phoneCodeList,\n };\n },\n)(AuthPhoneNumber));\n","import type { FC } from '../../lib/teact/teact';\nimport React, { 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 ? <AuthCode /> : <Loading />;\n};\n\nexport default memo(AuthCodeAsync);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { 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 ? <AuthPassword /> : <Loading />;\n};\n\nexport default memo(AuthPasswordAsync);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { 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 ? <AuthRegister /> : <Loading />;\n};\n\nexport default memo(AuthRegisterAsync);\n","import React, {\n useEffect, useRef, memo, useCallback,\n} from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport type { FC } from '../../lib/teact/teact';\nimport type { GlobalState } from '../../global/types';\nimport type { LangCode } from '../../types';\n\nimport { DEFAULT_LANG_CODE } from '../../config';\nimport { LOCAL_TGS_URLS } from '../common/helpers/animatedAssets';\nimport { setLanguage } from '../../util/langProvider';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\n\nimport useLangString from '../../hooks/useLangString';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\nimport useMediaTransition from '../../hooks/useMediaTransition';\nimport useAsync from '../../hooks/useAsync';\n\nimport Loading from '../ui/Loading';\nimport Button from '../ui/Button';\nimport AnimatedIcon from '../common/AnimatedIcon';\n\nimport blankUrl from '../../assets/blank.png';\n\ntype StateProps =\n Pick<GlobalState, 'connectionState' | 'authState' | 'authQrCode'>\n & { language?: LangCode };\n\nconst DATA_PREFIX = 'tg://login?token=';\nconst QR_SIZE = 280;\nconst QR_PLANE_SIZE = 54;\n\nlet qrCodeStylingPromise: Promise<typeof import('qr-code-styling')>;\n\nfunction ensureQrCodeStyling() {\n if (!qrCodeStylingPromise) {\n qrCodeStylingPromise = import('qr-code-styling');\n }\n return qrCodeStylingPromise;\n}\n\nconst AuthCode: FC<StateProps> = ({\n connectionState,\n authState,\n authQrCode,\n language,\n}) => {\n const {\n returnToAuthPhoneNumber,\n setSettingOption,\n } = getActions();\n\n const suggestedLanguage = getSuggestedLanguage();\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef<HTMLDivElement>(null);\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n const [isQrMounted, markQrMounted, unmarkQrMounted] = useFlag();\n\n const { result: qrCode } = useAsync(async () => {\n const QrCodeStyling = (await ensureQrCodeStyling()).default;\n return new QrCodeStyling({\n width: QR_SIZE,\n height: QR_SIZE,\n image: blankUrl,\n margin: 10,\n type: 'svg',\n dotsOptions: {\n type: 'rounded',\n },\n cornersSquareOptions: {\n type: 'extra-rounded',\n },\n imageOptions: {\n imageSize: 0.4,\n margin: 8,\n },\n qrOptions: {\n errorCorrectionLevel: 'M',\n },\n });\n }, []);\n\n const transitionClassNames = useMediaTransition(isQrMounted);\n\n useEffect(() => {\n if (!authQrCode || !qrCode) {\n return () => {\n unmarkQrMounted();\n };\n }\n\n if (connectionState !== 'connectionStateReady') {\n return undefined;\n }\n\n const container = qrCodeRef.current!;\n const data = `${DATA_PREFIX}${authQrCode.token}`;\n\n qrCode.update({\n data,\n });\n\n if (!isQrMounted) {\n qrCode.append(container);\n markQrMounted();\n }\n return undefined;\n }, [connectionState, authQrCode, isQrMounted, markQrMounted, unmarkQrMounted, qrCode]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady') {\n void setLanguage(DEFAULT_LANG_CODE);\n }\n }, [connectionState]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n void setLanguage(suggestedLanguage, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n const isAuthReady = authState === 'authorizationStateWaitQrCode';\n\n return (\n <div id=\"auth-qr-form\" className=\"custom-scroll\">\n <div className=\"auth-form qr\">\n <div className=\"qr-outer\">\n <div\n className={buildClassName('qr-inner', transitionClassNames)}\n key=\"qr-inner\"\n >\n <div\n key=\"qr-container\"\n className=\"qr-container\"\n ref={qrCodeRef}\n style={`width: ${QR_SIZE}px; height: ${QR_SIZE}px`}\n />\n <AnimatedIcon\n tgsUrl={LOCAL_TGS_URLS.QrPlane}\n size={QR_PLANE_SIZE}\n className=\"qr-plane\"\n nonInteractive\n noLoop={false}\n />\n </div>\n {!isQrMounted && <div className=\"qr-loading\"><Loading /></div>}\n </div>\n <h1>{lang('Login.QR.Title')}</h1>\n <ol>\n <li><span>{lang('Login.QR.Help1')}</span></li>\n <li><span>{renderText(lang('Login.QR2.Help2'), ['simple_markdown'])}</span></li>\n <li><span>{lang('Login.QR.Help3')}</span></li>\n </ol>\n {isAuthReady && (\n <Button isText onClick={returnToAuthPhoneNumber}>{lang('Login.QR.Cancel')}</Button>\n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n <Button isText isLoading={isLoading} onClick={handleLangChange}>{continueText}</Button>\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n connectionState, authState, authQrCode, settings: { byKey: { language } },\n } = global;\n\n return {\n connectionState,\n authState,\n authQrCode,\n language,\n };\n },\n)(AuthCode));\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useEffect, memo } from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport type { GlobalState } from '../../global/types';\n\nimport '../../global/actions/initial';\nimport { pick } from '../../util/iteratees';\nimport { PLATFORM_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport Transition from '../ui/Transition';\nimport AuthPhoneNumber from './AuthPhoneNumber';\nimport AuthCode from './AuthCode.async';\nimport AuthPassword from './AuthPassword.async';\nimport AuthRegister from './AuthRegister.async';\nimport AuthQrCode from './AuthQrCode';\n\nimport './Auth.scss';\n\ntype OwnProps = {\n isActive: boolean;\n};\n\ntype StateProps = Pick<GlobalState, 'authState'>;\n\nconst Auth: FC<OwnProps & StateProps> = ({\n isActive, authState,\n}) => {\n const {\n reset, initApi, returnToAuthPhoneNumber, goToAuthQrCode,\n } = getActions();\n\n useEffect(() => {\n if (isActive) {\n reset();\n initApi();\n }\n }, [isActive, reset, initApi]);\n\n const isMobile = PLATFORM_ENV === 'iOS' || PLATFORM_ENV === 'Android';\n\n const handleChangeAuthorizationMethod = () => {\n if (!isMobile) {\n goToAuthQrCode();\n } else {\n returnToAuthPhoneNumber();\n }\n };\n\n useHistoryBack({\n isActive: (!isMobile && authState === 'authorizationStateWaitPhoneNumber')\n || (isMobile && authState === 'authorizationStateWaitQrCode'),\n onBack: handleChangeAuthorizationMethod,\n });\n\n // Prevent refresh when rotating device\n useEffect(() => {\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, []);\n\n // For animation purposes\n const renderingAuthState = useCurrentOrPrev(\n authState !== 'authorizationStateReady' ? authState : undefined,\n true,\n );\n\n function getScreen() {\n switch (renderingAuthState) {\n case 'authorizationStateWaitCode':\n return <AuthCode />;\n case 'authorizationStateWaitPassword':\n return <AuthPassword />;\n case 'authorizationStateWaitRegistration':\n return <AuthRegister />;\n case 'authorizationStateWaitPhoneNumber':\n return <AuthPhoneNumber />;\n case 'authorizationStateWaitQrCode':\n return <AuthQrCode />;\n default:\n return isMobile ? <AuthPhoneNumber /> : <AuthQrCode />;\n }\n }\n\n function getActiveKey() {\n switch (renderingAuthState) {\n case 'authorizationStateWaitCode':\n return 0;\n case 'authorizationStateWaitPassword':\n return 1;\n case 'authorizationStateWaitRegistration':\n return 2;\n case 'authorizationStateWaitPhoneNumber':\n return 3;\n case 'authorizationStateWaitQrCode':\n return 4;\n default:\n return isMobile ? 3 : 4;\n }\n }\n\n return (\n <Transition activeKey={getActiveKey()} name=\"fade\" className=\"Auth\">\n {getScreen()}\n </Transition>\n );\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => pick(global, ['authState']),\n)(Auth));\n","import type { FC } from '../../lib/teact/teact';\nimport React, { 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 ? <Main /> : undefined;\n};\n\nexport default memo(MainAsync);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport type { OwnProps } from './LockScreen';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst LockScreenAsync: FC<OwnProps> = (props) => {\n const { isLocked } = props;\n const LockScreen = useModuleLoader(Bundles.Main, 'LockScreen', !isLocked);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return LockScreen ? <LockScreen {...props} /> : undefined;\n};\n\nexport default memo(LockScreenAsync);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } 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 = useCallback(() => {\n window.location.reload();\n }, []);\n\n return (\n <div id=\"AppInactive\">\n <div className=\"content\">\n <img src={appInactivePath} alt=\"\" />\n <h3 className=\"title\">Such error, many tabs</h3>\n <div className=\"description\">\n Telegram supports only one active tab with the app.\n <br />\n Please reload this page to continue using this tab or close it.\n </div>\n <div className=\"actions\">\n <Button isText ripple onClick={handleReload}>\n Reload app\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default AppInactive;\n","// extracted by mini-css-extract-plugin\nexport default {\"bg\":\"KD2TsjdEc_LBLsR_ReWT\",\"mask\":\"dDIGwEoHlINzvf7LzGwy\",\"main\":\"jxcLmQWl6IklxyLBcFsv\",\"left\":\"s_eiw3FJDNGVyMHHEr_w\",\"middle\":\"v5WSHYkqrlK9GvmSI1zN\",\"right\":\"BlQSOI0qSg9HDzgQGwdw\",\"blank\":\"J5QD898gcautir6pK9xA\"};","import React, { useEffect } from '../../lib/teact/teact';\nimport { getActions, getGlobal, withGlobal } from '../../global';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport type { GlobalState } from '../../global/types';\nimport type { ThemeKey } from '../../types';\nimport type { FC } from '../../lib/teact/teact';\n\nimport { getChatAvatarHash } from '../../global/helpers/chats'; // Direct import for better module splitting\nimport { selectIsRightColumnShown, selectTheme, selectIsCurrentUserPremium } from '../../global/selectors';\nimport { DARK_THEME_BG_COLOR, LIGHT_THEME_BG_COLOR } from '../../config';\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 buildClassName from '../../util/buildClassName';\n\nimport styles from './UiLoader.module.scss';\n\nimport telegramLogoPath from '../../assets/telegram-logo.svg';\nimport reactionThumbsPath from '../../assets/reaction-thumbs.png';\nimport premiumReactionThumbsPath from '../../assets/reaction-thumbs-premium.png';\nimport lockPreviewPath from '../../assets/lock.png';\nimport monkeyPath from '../../assets/monkey.svg';\n\nexport type UiLoaderPage =\n 'main'\n | 'lock'\n | 'inactive'\n | 'authCode'\n | 'authPassword'\n | 'authPhoneNumber'\n | 'authQrCode';\n\ntype OwnProps = {\n page?: UiLoaderPage;\n children: React.ReactNode;\n};\n\ntype StateProps = Pick<GlobalState, 'uiReadyState' | 'shouldSkipHistoryAnimations'> & {\n isRightColumnShown?: boolean;\n leftColumnWidth?: number;\n theme: ThemeKey;\n isCurrentUserPremium?: boolean;\n};\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.BlobUrl);\n }));\n}\n\nconst preloadTasks = {\n main: (isCurrentUserPremium: boolean) => Promise.all([\n loadModule(Bundles.Main, 'Main')\n .then(preloadFonts),\n preloadAvatars(),\n preloadImage(isCurrentUserPremium ? premiumReactionThumbsPath : reactionThumbsPath),\n ]),\n authPhoneNumber: () => Promise.all([\n preloadFonts(),\n preloadImage(telegramLogoPath),\n ]),\n authCode: () => preloadImage(monkeyPath),\n authPassword: () => preloadImage(monkeyPath),\n authQrCode: preloadFonts,\n lock: () => Promise.all([\n preloadFonts(),\n preloadImage(lockPreviewPath),\n ]),\n inactive: () => {\n },\n};\n\nconst UiLoader: FC<OwnProps & StateProps> = ({\n page,\n children,\n isRightColumnShown,\n shouldSkipHistoryAnimations,\n leftColumnWidth,\n theme,\n isCurrentUserPremium,\n}) => {\n const { setIsUiReady } = getActions();\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 const safePreload = async () => {\n try {\n await preloadTasks[page!](isCurrentUserPremium!);\n } catch (err) {\n // Do nothing\n }\n };\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n page ? safePreload() : Promise.resolve(),\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 <div\n id=\"UiLoader\"\n className={styles.bg}\n style={`--theme-background-color: ${theme === 'dark' ? DARK_THEME_BG_COLOR : LIGHT_THEME_BG_COLOR}`}\n >\n {children}\n {shouldRenderMask && !shouldSkipHistoryAnimations && Boolean(page) && (\n <div className={buildClassName(styles.mask, transitionClassNames)}>\n {page === 'main' ? (\n <div className={styles.main}>\n <div\n className={styles.left}\n style={leftColumnWidth ? `width: ${leftColumnWidth}px` : undefined}\n />\n <div className={buildClassName(styles.middle, styles.bg)} />\n {isRightColumnShown && <div className={styles.right} />}\n </div>\n ) : (page === 'inactive' || page === 'lock') ? (\n <div className={buildClassName(styles.blank, styles.bg)} />\n ) : (\n <div className={styles.blank} />\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default withGlobal<OwnProps>(\n (global): StateProps => {\n const theme = selectTheme(global);\n\n return {\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n uiReadyState: global.uiReadyState,\n isRightColumnShown: selectIsRightColumnShown(global),\n leftColumnWidth: global.leftColumnWidth,\n theme,\n isCurrentUserPremium: selectIsCurrentUserPremium(global),\n };\n },\n)(UiLoader);\n","import type { FC } from './lib/teact/teact';\nimport React, { useEffect } from './lib/teact/teact';\nimport { getActions, withGlobal } from './global';\n\nimport type { GlobalState } from './global/types';\nimport type { UiLoaderPage } from './components/common/UiLoader';\n\nimport { INACTIVE_MARKER, PAGE_TITLE } from './config';\nimport { PLATFORM_ENV } from './util/environment';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport { hasStoredSession } from './util/sessions';\nimport buildClassName from './util/buildClassName';\nimport useFlag from './hooks/useFlag';\nimport usePrevious from './hooks/usePrevious';\n\nimport Auth from './components/auth/Auth';\nimport Main from './components/main/Main.async';\nimport LockScreen from './components/main/LockScreen.async';\nimport AppInactive from './components/main/AppInactive';\nimport Transition from './components/ui/Transition';\nimport UiLoader from './components/common/UiLoader';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = {\n authState: GlobalState['authState'];\n isScreenLocked?: boolean;\n hasPasscode?: boolean;\n};\n\nenum AppScreens {\n auth,\n lock,\n main,\n inactive,\n}\n\nconst App: FC<StateProps> = ({\n authState,\n isScreenLocked,\n hasPasscode,\n}) => {\n const { disconnect } = getActions();\n\n const [isInactive, markInactive] = useFlag(false);\n const isMobile = PLATFORM_ENV === 'iOS' || PLATFORM_ENV === 'Android';\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 // Prevent drop on elements that do not accept it\n useEffect(() => {\n const body = document.body;\n const handleDrag = (e: DragEvent) => {\n e.preventDefault();\n if (!e.dataTransfer) return;\n if (!(e.target as HTMLElement).dataset.dropzone) {\n e.dataTransfer.dropEffect = 'none';\n } else {\n e.dataTransfer.dropEffect = 'copy';\n }\n };\n const handleDrop = (e: DragEvent) => {\n e.preventDefault();\n };\n body.addEventListener('drop', handleDrop);\n body.addEventListener('dragover', handleDrag);\n body.addEventListener('dragenter', handleDrag);\n\n return () => {\n body.removeEventListener('drop', handleDrop);\n body.removeEventListener('dragover', handleDrag);\n body.removeEventListener('dragenter', handleDrag);\n };\n }, []);\n\n // return <Test />;\n\n let activeKey: number;\n let page: UiLoaderPage | undefined;\n\n if (isInactive) {\n activeKey = AppScreens.inactive;\n } else if (isScreenLocked) {\n page = 'lock';\n activeKey = AppScreens.lock;\n } else if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n page = 'authPhoneNumber';\n activeKey = AppScreens.auth;\n break;\n case 'authorizationStateWaitCode':\n page = 'authCode';\n activeKey = AppScreens.auth;\n break;\n case 'authorizationStateWaitPassword':\n page = 'authPassword';\n activeKey = AppScreens.auth;\n break;\n case 'authorizationStateWaitRegistration':\n activeKey = AppScreens.auth;\n break;\n case 'authorizationStateWaitQrCode':\n page = 'authQrCode';\n activeKey = AppScreens.auth;\n break;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n page = 'main';\n activeKey = AppScreens.main;\n break;\n }\n } else if (hasStoredSession(true)) {\n page = 'main';\n activeKey = AppScreens.main;\n } else if (hasPasscode) {\n activeKey = AppScreens.lock;\n } else {\n page = isMobile ? 'authPhoneNumber' : 'authQrCode';\n activeKey = AppScreens.auth;\n }\n\n const prevActiveKey = usePrevious(activeKey);\n\n // eslint-disable-next-line consistent-return\n function renderContent(isActive: boolean) {\n switch (activeKey) {\n case AppScreens.auth:\n return <Auth isActive={isActive} />;\n case AppScreens.main:\n return <Main />;\n case AppScreens.lock:\n return <LockScreen isLocked={isScreenLocked} />;\n case AppScreens.inactive:\n return <AppInactive />;\n }\n }\n\n return (\n <UiLoader key=\"Loader\" page={page}>\n <Transition\n name=\"fade\"\n activeKey={activeKey}\n shouldCleanup\n className={buildClassName(\n 'full-height',\n (activeKey === AppScreens.auth || prevActiveKey === AppScreens.auth) && 'is-auth',\n )}\n >\n {renderContent}\n </Transition>\n </UiLoader>\n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n authState: global.authState,\n isScreenLocked: global.passcode?.isScreenLocked,\n hasPasscode: global.passcode?.hasPasscode,\n };\n },\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React from './lib/teact/teact';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport { getActions, getGlobal } from './global';\nimport updateWebmanifest from './util/updateWebmanifest';\nimport { setupBeforeInstallPrompt } from './util/installPrompt';\nimport { IS_INSTALL_PROMPT_SUPPORTED } from './util/environment';\nimport './global/init';\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\nif (IS_INSTALL_PROMPT_SUPPORTED) {\n setupBeforeInstallPrompt();\n}\ngetActions().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nupdateWebmanifest();\n\nTeactDOM.render(\n <App />,\n document.getElementById('root')!,\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.warn('GLOBAL STATE', getGlobal());\n });\n}\n","// Original idea was found here\n// https://medium.com/@alshakero/how-to-setup-your-web-app-manifest-dynamically-using-javascript-f7fbee899a61\n\nimport { DEBUG } from '../config';\nimport { IS_MAC_OS } from './environment';\n\nexport default function updateWebmanifest() {\n if (!IS_MAC_OS) {\n return;\n }\n\n const manifest = document.getElementById('the-manifest-placeholder');\n if (!manifest) {\n return;\n }\n\n const url = `site_apple${DEBUG ? '_dev' : ''}.webmanifest`;\n manifest.setAttribute('href', url);\n}\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","loadStylesheet","installedCssChunks","worker","requestStates","Map","requestStatesByCallback","initApi","onUpdate","initialArgs","DEBUG","console","log","Worker","URL","addEventListener","data","type","update","requestState","get","messageId","error","reject","resolve","response","callback","callbackArgs","Error","message","subscribeToWorker","platform","window","ensureWorkerPing","setTimeout","makeRequest","args","callApi","fnName","warn","promise","name","err","cancelApiProgress","progressCallback","isCanceled","postMessage","generateIdFor","payload","Promise","Object","assign","withCallback","pop","set","catch","finally","delete","startedAt","Date","now","async","isResolved","race","pause","then","undefined","location","reload","ApiMediaFormat","ApiMessageEntityTypes","MAIN_THREAD_ID","MESSAGE_DELETED","DEFAULT_SIZE","loadedAnimationUrls","Set","memo","props","size","play","noLoop","className","noTransition","nonInteractive","onLoad","onClick","otherProps","tgsUrl","key","isAnimationLoaded","markAnimationLoaded","useFlag","has","transitionClassNames","useMediaTransition","handleLoad","useCallback","add","playKey","setPlayKey","useState","String","Math","random","handleClick","buildClassName","lottiePromise","RLottie","ensureLottie","default","ref","style","playSegment","speed","quality","isLowPriority","color","forceOnHeavyAnimation","onEnded","containerRef","useRef","animation","setAnimation","wasPlaying","isFrozen","isFirstRender","playRef","current","playSegmentRef","useEffect","exec","newAnimation","setSpeed","fastRaf","setColor","destroy","playAnimation","shouldRestart","pauseAnimation","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","changeData","useHeavyAnimationCheck","useBackgroundMode","buildStyle","base","maxint","adapt","delta","numpoints","firsttime","k","floor","decode","input","preserveCase","output","case_flags","input_length","length","n","out","i","bias","basic","j","ic","oldi","w","digit","t","len","lastIndexOf","charCodeAt","RangeError","push","cp","splice","fromCharCode","toUpperCase","value","join","utf16","getDomain","url","href","ensureProtocol","decodedHref","decodeURI","replace","match","domain","domain_array","split","s","slice","convertPunycode","text","children","isRtl","openUrl","getActions","content","isSafe","e","preventDefault","shouldSkipModal","classNames","title","target","rel","dir","LOCAL_TGS_URLS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","Lock","CameraFlip","HandFilled","HandOutline","Speaker","VoiceAllowTalk","VoiceMini","VoiceMuted","VoiceOutlined","Peach","Eggplant","Cumshot","JoinRequest","Invite","QrPlane","Congratulations","Experimental","getFileSizeString","bytes","ONE_GIGABYTE","toFixed","ONE_MEGABYTE","getDocumentExtension","document","fileName","mimeType","getFileExtension","indexOf","getColorFromExtension","extension","getDocumentHasPreview","Boolean","previewBlobUrl","thumbnail","RE_EMOJI_ONLY","RegExp","twemojiRegex","DETECT_UP_TO","emojiCount","sender","openChat","id","Link","focusMessage","handleMessageClick","chatId","groupCall","joinGroupCall","accessHash","MAX_LENGTH","NBSP","renderActionMessageText","lang","actionOriginUser","actionOriginChat","targetUsers","targetMessage","targetChatId","options","action","translationValues","amount","currency","call","score","noLinks","asPlainText","asTextWithSpoilers","translationKey","processed","unprocessed","includes","processPlaceholder","formatCurrency","code","renderUserContent","renderChatContent","toString","map","user","filter","renderMessageContent","renderProductContent","renderMigratedContent","forEach","part","renderText","trim","renderGroupCallContent","invoice","getMessageSummaryText","messageSummary","renderMessageSummary","trimText","getUserFullName","chat","getChatTitle","placeholder","replaceValue","placeholderPosition","substring","Array","isArray","index","renderMessageText","highlight","shouldRenderHqEmoji","isSimple","truncateLength","isProtected","observeIntersection","entities","contentNotSupportedText","getMessageText","renderTextWithEntities","noEmoji","TRUNCATED_SUMMARY_LENGTH","hasSpoilers","some","hasCustomEmoji","emoji","getMessageSummaryEmoji","emojiWithSpace","description","getMessageSummaryDescription","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","filters","params","compact","reduce","escapeHtml","EMOJI_REGEX","replaceEmojis","addLineBreaks","addHighlight","addLinks","replaceSimpleMarkdown","textParts","divEl","createElement","result","innerText","innerHTML","IS_EMOJI_SUPPORTED","parts","fixNonStandardEmoji","emojis","emojiResult","nativeToUnifiedExtendedWithCache","src","isLoaded","LOADED_EMOJIS","alt","handleEmojiLoad","splittenParts","line","source","trimmedLine","trimLeft","indentLength","repeat","lowerCaseText","toLowerCase","queryPosition","nextSymbol","newParts","RE_LINK","RE_LINK_TEMPLATE","RE_MENTION_TEMPLATE","links","nextLink","shift","lastIndex","startsWith","username","endsWith","entityResult","entity","areLinesWrapping","element","lines","lineHeight","getComputedStyle","lineHeightParsed","parseFloat","clientHeight","actionsByMessageId","createClassNameBuilder","contentRef","isRevealed","reveal","conceal","stopPropagation","actions","contentLength","readingMs","round","timeoutMs","max","min","LOAD_QUEUE","RENDER_HISTORY","loadFromQueue","throttle","loadCustomEmojis","ids","clear","updateLastRendered","updateLastRenderedCustomEmojis","reverse","handlers","prevGlobal","addCallback","global","customEmojis","byId","handler","documentId","customEmoji","setCustomEmoji","getGlobal","handleGlobalChange","useCustomEmoji","mediaHash","mediaData","useMedia","thumbDataUri","useThumbnail","isIntersecting","useIsIntersecting","isVideo","video","querySelector","paused","safePlay","useMemo","IS_WEBM_SUPPORTED","isLottie","playsInline","muted","autoPlay","loop","AnimatedSticker","noCopy","onWordWrapToggle","showNotification","windowSize","useWindowSize","useLang","isWordWrap","setIsWordWrap","withWordWrapButton","setWithWordWrapButton","checkWordWrap","isWrap","parentElement","handleCopy","copyTextToClipboard","handleWordWrapClick","contentClass","overlayClass","wrapClass","setWordWrap","handleWordWrapToggle","wrap","blockClass","language","highlighted","useAsync","lib","shouldRenderAsHtml","renderMessagePart","deleteLineBreakAfterPre","organizedEntities","organizedEntityIndexes","organizedEntity","organizeEntity","organizedIndexes","organizedIndex","organizeEntities","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","nestedEntities","offset","textBefore","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","trimEnd","renderedContent","userId","getLinkUrl","processEntityAsHtml","entityText","renderNestedMessagePart","CustomEmoji","handleBotCommandClick","handleHashtagClick","handleCodeClick","role","tabIndex","MentionLink","SafeLink","processEntity","textAfter","arrayIndex","getTextWithEntitiesAsHtml","formattedText","c","concat","parsedEntity","isChanged","sendBotCommand","command","currentTarget","setLocalTextSearchQuery","query","searchTextMessagesLocal","getTranslation","preventMessageInputBlur","withBubbling","IS_IOS","activeElement","EDITABLE_INPUT_ID","preventMessageInputBlurWithBubbling","withGlobal","userOrChat","selectUser","openChatByUsername","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","backgroundImage","pill","fluid","isText","isLoading","isShiny","withPremiumGradient","ariaLabel","ariaControls","hasPopup","download","disabled","allowDisabledClick","ripple","faded","noPreventDefault","shouldStopPropagation","elementRef","isClicked","setIsClicked","fullClassName","handleMouseDown","label","subLabel","checked","blocking","onChange","onCheck","handleChange","event","labelClassName","trigger","positionX","positionY","footer","forceOpen","onOpen","onClose","menuRef","dropdownRef","isOpen","setIsOpen","handleClose","onKeyDown","menu","keyCode","focusedElement","elementChildren","from","focus","onTrigger","autoClose","shouldSkipTransition","success","readOnly","autoComplete","inputMode","maxLength","teactExperimentControlled","onInput","onKeyPress","onBlur","onPaste","labelText","htmlFor","isPrimary","backgroundColor","bubbleStyle","ariaLabelledBy","transformOriginX","transformOriginY","noCloseOnBackdrop","noCompact","onCloseAnimationEnd","backdropContainerRef","useShowTransition","captureEscKeyListener","useHistoryBack","isActive","onBack","shouldBeReplaced","useEffectWithPrevDeps","prevIsOpen","dispatchHeavyAnimationEvent","handleKeyDown","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","transformOriginYStyle","transformOriginXStyle","IS_COMPACT_MENU","IS_BACKDROP_BLUR_SUPPORTED","icon","customIcon","destructive","withWrap","origin","IS_TEST","ripples","setRipples","cleanUpDebounced","debounce","button","container","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","requestAnimationFrame","activeKey","direction","renderCount","shouldRestoreHeight","shouldCleanup","cleanupExceptionKey","onStart","onStop","animationLevel","settings","byKey","currentKeyRef","rendersRef","prevActiveKey","usePrevious","forceUpdate","useForceUpdate","activeKeyChanged","useLayoutEffect","cleanup","preservedRender","childElements","transition","transform","classList","childNodes","isBackwards","keys","Number","prevActiveIndex","activeIndex","toSlide","fromSlide","ANIMATION_LEVEL_MIN","remove","dispatchHeavyAnimationStop","forceReflow","waitForTransitionEnd","height","performSlideOptimized","toggle","node","HTMLElement","onAnimationEnd","watchedNode","firstChild","waitForAnimationEnd","flexBasis","renders","contents","fill","render","teactOrderKey","teactFastList","APP_NAME","APP_VERSION","process","RELEASE_DATETIME","PRODUCTION_HOSTNAME","DEBUG_MORE","IS_MOCKED_CLIENT","IS_BETA","BETA_CHANGELOG_URL","DEBUG_ALERT_MSG","PAGE_TITLE","INACTIVE_MARKER","DEBUG_PAYMENT_SMART_GLOCAL","SESSION_USER_KEY","LEGACY_SESSION_KEY","PASSCODE_CACHE_NAME","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT","GLOBAL_STATE_CACHE_CUSTOM_EMOJI_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","AUTODOWNLOAD_FILESIZE_MB_LIMITS","isBigScreen","innerHeight","MIN_PASSWORD_LENGTH","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","DEFAULT_VOLUME","DEFAULT_PLAYBACK_RATE","PLAYBACK_RATE_FOR_AUDIO_MIN_DURATION","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","SEND_MESSAGE_ACTION_INTERVAL","EDITABLE_INPUT_MODAL_ID","EDITABLE_INPUT_CSS_SELECTOR","CUSTOM_APPENDIX_ATTRIBUTE","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","MAX_SCREEN_WIDTH_FOR_EXPAND_PINNED_MESSAGES","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_MIN_ID","TMP_CHAT_ID","ANIMATION_END_DELAY","FAST_SMOOTH_MAX_DISTANCE","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","LOCK_SCREEN_ANIMATION_DURATION_MS","STICKER_SIZE_INLINE_DESKTOP_FACTOR","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_AUTH","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_PICKER","EMOJI_SIZE_PICKER","STICKER_SIZE_GENERAL_SETTINGS","STICKER_SIZE_PICKER_HEADER","STICKER_SIZE_SEARCH","STICKER_SIZE_MODAL","EMOJI_SIZE_MODAL","STICKER_SIZE_TWO_FA","STICKER_SIZE_PASSCODE","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","STICKER_SIZE_INLINE_BOT_RESULT","STICKER_SIZE_JOIN_REQUESTS","STICKER_SIZE_INVITES","RECENT_SYMBOL_SET_ID","FAVORITE_SYMBOL_SET_ID","CHAT_STICKER_SET_ID","PREMIUM_STICKER_SET_ID","BASE_EMOJI_KEYWORD_LANG","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","VIDEO_MOV_TYPE","SUPPORTED_IMAGE_CONTENT_TYPES","SUPPORTED_VIDEO_CONTENT_TYPES","SUPPORTED_AUDIO_CONTENT_TYPES","CONTENT_TYPES_WITH_PREVIEW","CONTENT_NOT_SUPPORTED","RE_TG_LINK","RE_TME_LINK","RE_TELEGRAM_LINK","TME_LINK_PREFIX","COUNTRIES_WITH_12H_TIME_FORMAT","API_CHAT_TYPES","SERVICE_NOTIFICATIONS_USER_ID","REPLIES_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","DEFAULT_LANG_CODE","DEFAULT_LANG_PACK","LANG_PACKS","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DEFAULT_PATTERN_COLOR","DARK_THEME_PATTERN_COLOR","MAX_UPLOAD_FILEPART_SIZE","GROUP_CALL_VOLUME_MULTIPLIER","GROUP_CALL_DEFAULT_VOLUME","GROUP_CALL_THUMB_VIDEO_DISABLED","DEFAULT_LIMITS","uploadMaxFileparts","stickersFaved","savedGifs","dialogFiltersChats","dialogFilters","dialogFolderPinned","captionLength","channels","channelsPublic","aboutLength","addActionHandler","importLegacySession","clearLegacySessions","apiUpdate","userAgent","navigator","PLATFORM_ENV","sessionData","loadStoredSession","isTest","search","isMovSupported","IS_MOV_SUPPORTED","isWebmSupported","maxBufferSize","MAX_BUFFER_SIZE","phoneNumber","authIsLoading","authError","password","file","firstName","lastName","authIsLoadingQrCode","passcode","isScreenLocked","storeSession","currentUserId","clearStoredSession","_global","hangUp","leaveGroupCall","unsubscribe","forceWebsync","reset","forceInitApi","clearEncryptedSession","cacheApi","langCachePrefix","langCacheVersion","updateAppBadge","init","connectionState","authNearestCountry","setGlobal","deviceToken","subscribedAt","sessionJson","JSON","stringify","globalJson","serializeGlobal","encryptSession","forgetPasscode","updatePasscodeSettings","invalidAttemptsCount","clearGlobalForLockScreen","buildInputPrivacyRules","visibility","allowedIds","deniedIds","users","usersById","chats","chatsById","rules","collectUsers","isUserId","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","photo","bio","about","profileEdit","progress","ProfileEditProgress","currentUser","updateUser","fullInfo","isUsernameAvailable","loadedWallpapers","wallpapers","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","wallpaper","firstWallpaper","withLocalMedia","addUsers","buildCollectionByKey","updateChats","blocked","blockedIds","totalCount","contactId","addBlockedContact","removeBlockedContact","serverTimeOffset","addNotifyExceptions","replaceSettings","peerType","isSilent","shouldShowPreviews","updateNotifySettings","hasPushNotifications","hasWebNotifications","subscribe","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","phoneCallSettings","phoneP2PSettings","voiceMessagesSettings","all","privacy","lastSeen","profilePhoto","forwards","chatInvite","phoneCall","phoneP2P","voiceMessages","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","isSensitiveEnabled","langCode","countryList","timeFormat","setSettingOption","setTimeFormat","wasTimeFormatSetManually","nearestCountryCode","appConfig","globalSettings","shouldArchiveAndMuteNewNonContact","selectNotifySettings","setLanguage","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","onUpdateAuthorizationState","onUpdateAuthorizationError","isOnAuth","signOut","onUpdateConnectionState","authRememberMe","isEmpty","mainDcId","saveSession","onUpdateSession","onUpdateServerTimeOffset","sessionUserAuth","localStorage","getItem","userAuth","parse","setItem","updateSessionUserId","onUpdateCurrentUser","paymentShippingError","getShippingError","addPaymentError","shouldClosePaymentModal","closePaymentModal","showDialog","handleSystemThemeChange","currentThemeMatch","documentElement","currentTheme","nextTheme","selectTheme","switchTheme","mql","matchMedia","addListener","subscribeToSystemThemeChange","messageTextSize","theme","setProperty","setAttribute","body","IS_TOUCH_ENV","startWebsync","IS_ANDROID","IS_MAC_OS","IS_SAFARI","canInstall","uiReadyState","authPhoneNumber","shouldSkipHistoryAnimations","forceSyncOnIOs","replaceThemeSettings","nextScreen","updateCacheThrottled","onIdle","updateCache","unsubscribeFromBeforeUnload","isCaching","initCache","setupCaching","removeItem","clearCaching","loadCache","initialState","cache","time","json","cached","timeEnd","migrateCache","newState","parsedMessageList","IS_SINGLE_COLUMN_LAYOUT","parseLocationHash","messages","messageLists","readCache","hasPasscode","hasStoredSession","onBeforeUnload","removeCallback","removeEventListener","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayVideos","shouldAutoPlayGifs","rest","canAutoLoadPhotoFromContacts","canAutoLoadVideoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadVideoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadVideoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoInChannels","canAutoPlayVideos","canAutoPlayGifs","themes","chatFolders","stickers","greeting","premium","activeDownloads","byChatId","serviceNotifications","audioPlayer","volume","playbackRate","mediaViewer","groupCalls","statusesById","sponsoredByChatId","activeReactions","pollModal","attachMenu","bots","trustedBotIds","activeSessions","byHash","orderedHashes","activeWebSessions","transcriptions","limits","added","lastRendered","premiumSet","light","lightTheme","patternColor","notification","isHidden","isDeleted","isHeavyAnimating","forceUpdateCache","noEncrypt","serializedGlobal","serializedGlobalClean","reducedGlobal","INITIAL_STATE","pick","isMuted","reduceCustomEmojis","isChatInfoShown","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","globalSearch","recentlyFoundChatIds","reduceSettings","reduceChatFolders","reduceGroupCalls","availableReactions","reduceAvailableReactions","isCallPanelVisible","idsToSave","innerWidth","currentChatId","selectCurrentMessageList","visibleUserIds","selectVisibleUsers","unique","topPeers","userIds","getOrderedIds","contactList","currentChat","selectCurrentChat","isFullyLoaded","threadId","mainThread","threadsById","viewportIds","notifyExceptions","activeChatFolder","activeGroupCallId","r","FOREVER_BANNED_DATE","VERIFIED_PRIORITY_BASE","PINNED_PRIORITY_BASE","entityId","isChatGroup","isChatBasicGroup","isChatSuperGroup","isChatChannel","isCommonBoxChat","isChatWithRepliesBot","getChatTypeString","getPrivateChatUserId","isSelf","getChatDescription","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","getVideoAvatarMediaHash","isChatSummaryOnly","lastMessage","isChatAdmin","adminRights","getHasAdminRight","isUserRightBanned","currentUserBannedRights","defaultBannedRights","getCanPostInChat","isRestricted","isForbidden","migratedTo","isNotJoined","isCreator","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","untilDate","formatDateToString","formatTime","getChatSlowModeOptions","slowMode","isChatArchived","folderId","selectIsChatMuted","notifySettings","hasPrivateChatsNotifications","hasBroadcastNotifications","hasGroupNotifications","selectShouldShowMessagePreview","hasPrivateChatsMessagePreview","hasBroadcastMessagePreview","hasGroupMessagePreview","getCanDeleteChat","getFolderDescriptionText","folder","chatsCount","emoticon","pinnedChatIds","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","excludeRead","values","groups","contacts","nonContacts","getMessageSenderName","getUserFirstOrLastName","sortChatIds","chatIds","shouldPrioritizeVerified","priorityIds","orderBy","priority","date","isVerified","filterChatsByName","searchWords","prepareSearchWordsForNeedle","getMessageHtmlId","getMessageKey","previousLocalId","msgId","buildMessageKey","isServiceNotificationMessage","parseMessageKey","getMessageOriginalId","sticker","audio","voice","poll","webPage","contact","game","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","firstTextUrl","find","firstUrl","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","isAnonymousOwnMessage","senderId","getSenderTitle","getSendingState","sendingState","isMessageLocal","isHistoryClearMessage","getMessageContentFilename","isWebpSupported","baseFilename","IS_OPUS_SUPPORTED","areReactionsEmpty","reactions","results","l","count","isGeoLiveExpired","timestamp","period","getMessageSingleInlineButton","inlineButtons","getMessageRecentReaction","recentReactions","checkIfHasUnreadReactions","isUnread","SPOILER_CHARS","noReactions","isExtended","getMessageTextWithSpoilers","transcription","transcriptionId","getMessageTranscription","textWithoutTranscription","accText","spoiler","generateBrailleSpoiler","groupedId","reaction","truncatedText","summary","isGif","getMessageAudioCaption","question","performer","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","isMessageDocumentPhoto","mediaType","isMessageDocumentVideo","getMessageInvoice","getMessageLocation","getMessageWebPage","getMessageWebPagePhoto","getMessageWebPageVideo","getMessageMediaThumbDataUri","media","getMessageMediaThumbnail","dataUri","getDocumentMediaHash","buildStaticMapHash","geo","width","zoom","scale","long","lat","accuracyRadius","getMessageMediaHash","webPagePhoto","webPageVideo","messageVideo","messagePhoto","mediaId","hasMessageLocalBlobUrl","getVideoOrAudioBaseHash","getAudioHasCover","getWebDocumentHash","webDocument","getGamePreviewPhotoHash","getGamePreviewVideoHash","IS_PROGRESSIVE_SUPPORTED","thumbnailSizes","getMessageMediaFormat","fullVideo","IS_OPFS_SUPPORTED","getMessageFileName","getMessageFileSize","blobUrl","getChatMediaMessageIds","listedIds","isFromSharedMedia","getMessageContentIds","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","getMediaTransferState","isLoadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","STRIPE_ERRORS","missing_payment_information","field","invalid_number","number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","getBotCoverMediaHash","USER_COLOR_KEYS","isDeletedUser","formatPhoneNumber","getUserStatus","userStatus","wasOnline","getTime","wasOnlineDate","diff","today","setHours","yesterday","setDate","getDate","formatFullDate","isUserOnline","isUserBot","getCanAddContact","isContact","sortUserIds","userStatusesById","getServerTime","expires","filterUsersByName","savedMessagesLang","getUserIdDividend","abs","getUserColorKey","peer","typed","typify","isLeftColumnShown","newChatMembersProgress","NewChatMembersProgress","isUpdateAvailable","phoneCodes","general","listIds","orderedPinnedIds","scheduledMessages","fileUploads","byMessageLocalId","recentEmojis","recentCustomEmojis","setsById","recent","favorite","featured","setIds","forEmoji","emojiKeywords","gifs","saved","inlineBots","byUsername","userSearch","localTextSearch","byChatThreadKey","localMediaSearch","management","topInlineBots","forwardMessages","pollResults","payment","notifications","dialogs","shouldUseSystemTheme","messageSendKeyCombo","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","autoLoadFileMaxSizeMb","notificationSoundVolume","shouldSuggestStickers","shouldLoopStickers","isConnectionStatusMinimized","isBlurred","dark","twoFaSettings","shouldShowContextMenuHint","statistics","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","noOmitUnreadReactionCount","updatedChat","getUpdatedChat","updatedById","acc","addChats","isUpdated","addedById","isMin","shouldOmitMinInfo","omit","photos","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalChatCount","leaveChat","leftChatId","selectChatListType","listId","addChatMembers","membersToAdd","currentMembers","members","newMemberIds","m","updatedMembers","currentIds","updatedIds","areSortedArraysEqual","updateStickerSets","category","hash","sets","resultIds","updatedSets","stickerSet","existing","regularSetIds","isEmoji","addedEmojiSetIds","flat","updateStickerSet","stickerSetId","currentStickerSet","isCustomEmoji","addedSets","installedDate","customEmojiById","updateGifSearch","isNew","nextOffset","currentResults","newResults","gif","replaceAnimatedEmojis","animatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","selectStickersForEmoji","uniqueIds","rebuildStickersForEmoji","replaceUsers","updateContactList","updatedUsers","contactUserIds","newContactUserIds","userUpdate","updatedUser","getUpdatedUser","updateUsers","deleteContact","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","updateUserSearchFetchingStatus","fetchingStatus","updateUserBlockedState","isBlocked","replaceUserStatuses","addUserStatuses","newKeys","closeNewContactDialog","newContact","getComplexKey","updateGlobalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","every","newId","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","prototype","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","chatThreadKey","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","sort","a","b","updateManagementProgress","updateManagement","newSettings","notifyException","exceptionData","addNotifyException","updateTwoFaSettings","clearPasscodeSettings","updateShippingOptions","shippingOptions","setRequestInfoId","requestId","setPaymentStep","step","setInvoiceInfo","isRecurring","recurringTermsUrl","invoiceContent","setStripeCardInfo","cardInfo","stripeCredentials","setSmartGlocalCardInfo","smartGlocalCredentials","setPaymentForm","form","setConfirmPaymentUrl","confirmPaymentUrl","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","updateStatistics","updateMessageStatistics","currentMessage","updateStatisticsGraph","updateCurrentMessageList","shouldReplaceHistory","newMessageLists","last","replaceChatMessages","updateMessageStore","updateThread","threadUpdate","replaceThreadParam","paramName","newValue","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","selectChatMessages","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","selectScheduledMessages","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","pickTruthy","isLinkedChannelPost","threadInfo","selectThreadInfo","selectListedIds","outlyingIds","selectOutlyingIds","selectViewportIds","pinnedIds","selectPinnedIds","newMessageCount","messagesCount","currentMessageList","canDeleteCurrentThread","currentThreadId","fromChatId","fromMessageId","originalPost","selectChatMessage","deleteChatScheduledMessages","scheduledIds","selectScheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","updateScheduledMessages","updateFocusedMessage","noHighlight","isResizingContainer","focusedMessage","updateSponsoredMessage","updateFocusDirection","enterMessageSelectMode","selectedMessages","toggleMessageSelection","messageListType","childMessageIds","withShift","oldSelectedMessages","selectMessageIdsByGroupId","selectedMessageIds","newMessageIds","newSelectedMessageIds","selectCurrentMessageIds","prevIndex","currentIndex","to","exitMessageSelectMode","updateThreadUnreadFromForwardedMessage","originMessage","lastMessageId","isDeleting","channelPostId","threadInfoOld","selectChat","selectChatUser","selectIsChatWithSelf","selectIsChatWithBot","selectSupportChat","isSupport","selectChatOnlineCount","onlineCount","selectChatBot","selectIsTrustedBot","botId","bot","selectChatType","selectBot","selectIsChatBotNotStarted","messageInfo","selectAreActiveChatsLoaded","active","selectIsChatListed","targetList","list","selectChatFolder","selectIsChatPinned","archived","chatFoldersById","selectChatByUsername","usernameLowered","selectIsServiceChatReady","selectSendAs","sendAsId","selectRequestedText","requestedDraft","filterChatIdsByType","selectCurrentStickerSearch","selectCurrentGifSearch","selectStickerSet","shortName","stickersForEmoji","packs","cleanEmoji","selectIsSetPremium","isFree","selectAnimatedEmoji","cleanedEmoji","selectAnimatedEmojiEffect","animatedEmojiEffects","selectAnimatedEmojiSound","emojiSounds","selectLocalAnimatedEmoji","selectLocalAnimatedEmojiEffect","selectLocalAnimatedEmojiEffectByName","selectThreadParam","thread","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingDraft","selectEditingScheduledId","selectEditingScheduledDraft","selectDraft","selectNoWebPage","selectFirstMessageId","selectReplyStack","selectThreadOriginChat","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","selectIsMessageInCurrentMessageList","selectIsViewportNewest","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","selectIsMessageFocused","focusedId","selectIsMessageUnread","lastReadOutboxMessageId","selectOutgoingStatus","isScheduledList","selectSender","selectReplySender","isForwarded","senderUserId","hiddenUserName","selectForwardedSender","isChannelPost","selectAllowedMessageActions","isPrivate","isChatWithSelf","isBasicGroup","isSuperGroup","isChannel","isLocal","isServiceNotification","isOwn","isAction","isMessageEditable","viaBotId","canReply","hasPinPermission","canPin","canUnpin","pinnedMessageIds","canDelete","canReport","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","canDownload","canSaveGif","canRevote","closed","quiz","isChosen","canClosePoll","noOptions","ability","selectCanDeleteSelectedMessages","messageActions","selectCanReportSelectedMessages","selectCanDownloadSelectedMessages","selectIsDownloading","activeInChat","selectActiveDownloadIds","selectUploadProgress","selectRealLastReadId","lastReadInboxMessageId","Infinity","selectFirstUnreadId","lastReadId","lastReadServiceNotificationId","findAfterLastReadId","isFromScheduled","found","selectIsForwardModalOpen","isModalShown","selectCommonBoxChatId","fromLastMessage","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","findLast","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectCanAutoLoadMedia","isPhoto","isFile","canAutoLoadMedia","canAutoLoadMediaFromContacts","canAutoLoadMediaInPrivateChats","canAutoLoadMediaInGroups","canAutoLoadMediaInChannels","isMediaFromContact","selectIsUserOrChatContact","selectCanAutoPlayMedia","asGif","selectShouldLoopStickers","selectLastServiceNotification","maxId","selectIsMessageProtected","selectHasProtectedMessage","selectSponsoredMessage","expiresAt","selectDefaultReaction","defaultReaction","isInactive","enabledReactions","selectShouldSchedule","selectCanScheduleUntilOnline","chatBot","selectUserStatus","selectMessageCustomEmojiSets","selectCustomEmojis","documents","doc","stickerSetInfo","selectForwardsContainVoiceMessages","selectCurrentTextSearch","currentSearch","selectCurrentMediaSearch","selectStatistics","selectManagement","selectCurrentManagementType","selectIsMediaViewerOpen","avatarOwnerId","selectRightColumnContentKey","selectIsPollResultsOpen","RightColumnContent","currentManagement","selectCurrentManagement","isStatisticsShown","currentMessageId","selectIsMessageStatisticsShown","canViewStatistics","selectIsStatisticsShown","selectIsRightColumnShown","getSystemTheme","selectCurrentGlobalSearchQuery","selectPaymentInputInvoice","inputInvoice","selectPaymentFormId","formId","selectPaymentRequestId","selectProviderPublishableKey","nativeParams","publishableKey","selectProviderPublicToken","publicToken","selectStripeCredentials","selectSmartGlocalCredentials","selectNotifyExceptions","selectIsUserBlocked","selectIsCurrentUserPremium","isPremium","selectIsPremiumPurchaseBlocked","isPremiumPurchaseBlocked","selectUserByPhoneNumber","phoneNumberCleaned","fn","deps","defaultValue","setIsLoading","setError","setResult","wasCancelled","res","hasFocus","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","prev","useDebouncedCallback","ms","noFirst","noLast","fnMemo","cb","dependencies","debugKey","prevDeps","initial","setValue","setTrue","setFalse","setTrigger","ANIMATION_START_EVENT","ANIMATION_END_EVENT","timeout","isAnimating","onEnd","clearTimeout","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","isDisabled","LOCATION_HASH","PATH_BASE","pathname","historyUniqueSessionId","historyState","historyCursor","isAlteringHistory","deferredHistoryOperations","deferredPopstateOperations","isSafariGestureAnimation","handleTouchEnd","applyDeferredHistoryOperations","goOperations","op","stateOperations","goCount","history","go","processStateOperations","deferHistoryOperation","historyOperation","resetHistory","back","replaceState","cleanupClosed","alreadyClosedCount","countClosed","isClosed","cleanupTrashedState","disableHistoryAnimations","indexRef","wasReplaced","processBack","useOnChange","shouldReplace","previousRecord","markReplaced","pushState","TEST_getHistoryState","TEST_getHistoryCursor","touches","pageX","state","previousUniqueSessionId","useIntersectionObserver","rootCallback","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","controllerRef","rootCallbackRef","freezeFlagsRef","onUnfreezeRef","freeze","unfreeze","observer","disconnect","callbacks","observe","targetCallback","entriesAccumulator","observerCallbackSync","entries","entry","scheduler","observerCallback","IntersectionObserver","root","rootMargin","initController","controller","unobserve","useOnIntersect","targetRef","setIsIntersecting","onSelectWithEnter","itemSelector","noCaptureFocus","focusedIndex","setFocusedIndex","querySelectorAll","newIndex","item","langProvider","noLoad","mediaFormat","cacheBuster","delay","mediaLoader","spentTime","isMediaReady","bundleName","moduleName","autoUpdate","module","getModuleFromMemory","addLoadListener","loadModule","d","next","onCloseTransitionEnd","noOpenTransition","noCloseTransition","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","shouldHaveOpenClassName","isClosing","shouldRender","hasShownClass","hasOpenClass","isMessage","shouldDecodeThumbnail","thumbnailDecoded","setThumbnailDecoded","EMPTY_IMAGE_DATA_URI","webpToPngBase64","uri","handleEvent","contains","setSize","isResizing","setIsResizing","setIsResizingDebounced","throttledSetIsResizing","throttledSetSize","handleResize","NON_BUBBLEABLE_EVENTS","documentEventCounters","delegationRegistryByEventType","delegatedEventTypesByElement","resolveEventType","propName","eventType","tagName","canUseEventDelegation","realEventType","asCapture","addDelegatedListener","resolveDelegationRegistry","newSet","resolveDelegatedEventTypes","removeDelegatedListener","realEvent","events","furtherCallsPrevented","Proxy","p","Reflect","parentNode","documentListenersCount","delegatedHandlersCount1","counter","delegationRegistriesCount","delegatedHandlersCount2","delegationRegistry","delegationElementsCount","delegatedEventTypesCount","eventTypes","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","CONTROLLABLE_TAGS","MAPPED_ATTRIBUTES","headsByElement","renderWithVirtual","parentEl","$current","$new","$parent","skipComponentUpdate","fragment","nextSibling","isCurrentComponent","isComponentElement","isNewComponent","$newAsReal","isCurrentFragment","isFragmentElement","isNewFragment","hasElementChanged","updateComponent","componentInstance","isMounted","setupComponentUpdateListener","newTarget","initComponent","mountChildren","createNode","insertBefore","remount","getNextSibling","isFragment","renderChildren","$currentAsReal","isTagElement","$newAsTag","updateAttributes","$element","mountComponent","$firstChild","renderComponent","$child","isEmptyElement","createTextNode","isTextElement","tag","processControlled","defaultChecked","processUncontrolledOnMount","componentNextSibling","isComponent","unmountComponent","unmountChildren","replaceChild","removeChild","unmountRealTree","removeAllDelegatedListeners","isParentElement","appendChild","currentEl","child","DEBUG_checkKeyUniqueness","$newChild","currentRemainingIndex","remainingByKey","$currentChild","isKeyPresent","newChildKey","orderKey","fragmentElements","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","renderFragment","newOrderKey","shouldMoveNode","isMovingDown","renderFastListChildren","currentChildrenLength","newChildrenLength","createDocumentFragment","lastCurrentChild","fragmentNextSibling","elements","isValueControlled","isCheckedControlled","currentEntries","newEntries","currentValue","cssText","removeAttribute","__html","headId","getAttribute","$head","$newElement","VirtualElementTypesEnum","Fragment","Symbol","DEBUG_SILENT_RENDERS_FOR","renderingInstance","Empty","Text","Tag","Component","buildFragmentElement","createComponentInstance","buildTagElement","dropEmptyTail","buildChildElement","parsedChildren","hooks","cursor","byCursor","effects","memos","refs","buildComponentElement","noEmpty","isEmptyPlaceholder","DEBUG_components","newRenderedValue","DEBUG_startAt","componentName","renderTimes","performance","handleError","renderedValue","$old","effect","hook","nextValue","setter","helpGc","prepareComponentForFrame","prepareForFrame","throttleWithPrimaryRaf","throttleWithRaf","forceUpdateComponent","currentElement","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","primarySchedulerFn","execCleanup","dependency","causedBy","prevValue","fastRafPrimary","onTickEnd","onTickEndPrimary","resolver","getUnequalProps","newCallback","DEBUG_currentCapturedId","currentGlobal","DEBUG_releaseCapturedIdThrottled","throttleWithTickEnd","actionHandlers","containers","mapStateToProps","ownProps","mappedProps","newMappedProps","isNaN","DEBUG_componentName","arePropsShallowEqual","areMappedPropsChanged","DEBUG_updates","updateTime","runCallbacksThrottled","runCallbacks","newGlobal","DEBUG_capturedId","actionQueue","handleAction","TeactNContainer","vs16RegExp","zeroWidthJoiner","removeVS16s","rawEmoji","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","AudioOrigin","ChatCreationProgress","ManagementProgress","ProfileState","PaymentStep","ManagementScreens","currentInstance","animateSingle","tick","instance","isCancelled","animate","timingFunctions","linear","easeIn","easeOut","easeInOut","sin","PI","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","animateNumber","timing","t0","canceled","f","unreadCount","setAppBadge","currentProps","newProps","currentKeys","currentKeysLength","prop","elementName","baseName","modifiers","modifier","self","caches","Type","fetch","cacheName","isHtmlAllowed","request","Request","open","headers","Blob","blob","shouldRecreate","resolvedType","Json","ArrayBuffer","arrayBuffer","save","cacheData","Response","put","createCallbackManager","hasCallbacks","captureKeyboardListener","onEsc","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","findIndex","releaseKeyboardListener","keyHandlers","CLIPBOARD_ITEM_SUPPORTED","clipboard","ClipboardItem","textCopyEl","str","selection","getSelection","rangeToRestore","rangeCount","getRangeAt","select","execCommand","removeAllRanges","addRange","copyImageToClipboard","imageUrl","canvas","ctx","getContext","imageEl","Image","onload","img","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","propertyName","waitForEndEvent","animationName","detailedName","isHandled","TransitionEvent","AnimationEvent","WEEKDAYS_FULL","MONTHS_FULL_LOWERCASE","month","MILLISECONDS_IN_DAY","isToday","getDayStartAt","getDayStart","datetime","toYearMonth","getFullYear","getMonth","toIsoString","hours","getHours","marker","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","noYear","formatMonthAndYear","isShort","formatCountdown","msLeft","days","formatMediaDuration","formatCountdownShort","ceil","formatLastUpdated","currentTime","lastUpdated","seconds","formatTimeDuration","showLast","durationRecords","labels","multiplier","idx","modulus","formatHumanDate","noWeekdays","isUpperFirst","upperFirst","lowerFirst","weekAhead","weekDay","formattedDate","formatMediaDateTime","maxValue","minutes","maxHours","maxMinutes","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDayToStringWithCache","withCache","dayStartAt","locale","monthFormat","noDay","toLocaleString","year","day","formatDateTimeToString","hour","minute","second","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","monthIndex","timestampPlusDay","EXCLUDE_EMOJIS","EMOJI_EXCEPTIONS","unifiedToNative","unified","codePoints","parseInt","fromCodePoint","dataset","path","regex","replacement","pairs","nativeToUnified","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","isoToEmoji","iso","test","codePointAt","isWebpSupportedCache","webp","handleLoadOrError","onerror","hasWebp","systemThemeCache","matches","IS_PRODUCTION_HOST","host","os","getPlatform","IS_PWA","standalone","referrer","IS_TABLET_COLUMN_LAYOUT","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","inlineEl","newEmojiWidth","legacyEmojiWidth","isLastEmojiVersionSupported","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","IS_REQUEST_FULLSCREEN_SUPPORTED","ARE_CALLS_SUPPORTED","LAYERS_ANIMATION_NAME","TEST_VIDEO","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","storage","getDirectory","directory","removeEntry","recursive","CSS","supports","IS_SCROLL_PATCH_NEEDED","IS_INSTALL_PROMPT_SUPPORTED","MESSAGE_LIST_SENSITIVE_AREA","VIDEO_AVATARS_DISABLED","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","File","lastModified","preloadImage","preloadVideo","onloadedmetadata","createPosterForVideo","onseeked","videoWidth","videoHeight","toDataURL","fetchBlob","imgToCanvas","constructor","fileBits","super","this","initials","buildInitials","prepared","updateFolderManagerThrottled","updateFolderManager","inited","orderedIdsByFolderId","getPinnedChatsCount","pinnedCountByFolderId","getChatsCount","chatsCountByFolderId","getUnreadCounters","unreadCountersByFolderId","getAllNotificationsCount","notificationsCount","getOrderKey","chatSummariesById","order","addOrderedIdsCallback","addChatsCountCallback","addUnreadCountersCallback","DEBUG_startedAt","isAllFolderChanged","isMainFolderChanged","isArchivedFolderChanged","isAllFullyLoadedChanged","isAllFolderFullyLoaded","isArchivedFullyLoadedChanged","isArchivedFolderFullyLoaded","areFoldersChanged","foldersById","areChatsChanged","areUsersChanged","areNotifySettingsChanged","areNotifyExceptionsChanged","affectedFolderIds","emptyFolderIds","folderSummariesById","updateFullyLoaded","updateResults","prevAllFolderListIds","allFolderListIds","prevArchivedFolderListIds","archivedFolderListIds","changedFolders","newListIds","newPinnedIds","buildFolderSummaryFromMainList","allFolderPinnedIds","archivedFolderPinnedIds","newFoldersById","buildFolderSummary","updateFolders","newChatsById","newUsersById","newNotifySettings","newNotifyExceptions","folderSummaries","newAllFolderListIds","newArchivedFolderListIds","allIds","newFolderIds","currentSummary","newSummary","unreadMentionsCount","hasUnreadMark","joinDate","draftDate","userInfo","shouldHideServiceChat","isListed","isArchived","isUserContact","buildChatSummary","chatSummary","folderSummary","isChatInFolder","buildChatFolderIds","currentFolderIds","folderIdsByChatId","deletedFolderIds","currentFolderIdsSet","newFolderIdsSet","currentFolderOrderedIds","chatIdsByFolderId","isOrderedListJustPatched","updateListsForChat","currentPinnedIds","wasUnreadCountersChanged","wasChatsCountChanged","pinnedCount","newPinnedCount","orderedIds","newOrderedIds","prevOrderedIds","sortedPinnedIds","allListIds","sortedNotPinnedIds","chatId1","chatId2","buildFolderOrderedIds","currentOrderedIds","currentPinnedCount","currentChatsCount","newChatsCount","currentUnreadCounters","newUnreadCounters","buildFolderUnreadCounters","newInitials","totalPrice","Intl","NumberFormat","format","getCurrencyExp","store","hasOwnProperty","READABLE_ERROR_MESSAGES","CHAT_RESTRICTED","CHAT_SEND_POLL_FORBIDDEN","CHAT_SEND_STICKERS_FORBIDDEN","CHAT_SEND_GIFS_FORBIDDEN","CHAT_SEND_MEDIA_FORBIDDEN","CHAT_LINK_EXISTS","SLOWMODE_WAIT_X","USER_BANNED_IN_CHANNEL","USER_IS_BLOCKED","YOU_BLOCKED_USER","IMAGE_PROCESS_FAILED","MEDIA_EMPTY","MEDIA_INVALID","PHOTO_EXT_INVALID","PHOTO_INVALID_DIMENSIONS","PHOTO_SAVE_FILE_INVALID","MESSAGE_DELETE_FORBIDDEN","MESSAGE_POLL_CLOSED","MESSAGE_EDIT_TIME_EXPIRED","PINNED_DIALOGS_TOO_MUCH","CHANNEL_PRIVATE","MEDIA_CAPTION_TOO_LONG","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","LINK_NOT_MODIFIED","MESSAGE_TOO_LONG","SERVICE_WORKER_DISABLED","MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS","FRESH_RESET_AUTHORISATION_FORBIDDEN","BOTS_TOO_MUCH","BOT_GROUPS_BLOCKED","USERS_TOO_MUCH","USER_CHANNELS_TOO_MUCH","USER_KICKED","USER_NOT_MUTUAL_CONTACT","USER_PRIVACY_RESTRICTED","INVITE_HASH_EMPTY","INVITE_HASH_EXPIRED","INVITE_HASH_INVALID","CHANNELS_TOO_MUCH","USER_ALREADY_PARTICIPANT","SCHEDULE_DATE_INVALID","WALLPAPER_DIMENSIONS_INVALID","ADMINS_TOO_MUCH","ADMIN_RANK_EMOJI_NOT_ALLOWED","ADMIN_RANK_INVALID","FRESH_CHANGE_ADMINS_FORBIDDEN","INPUT_USER_DEACTIVATED","BOT_PRECHECKOUT_TIMEOUT","CHAT_WRITE_FORBIDDEN","CHAT_ADMIN_REQUIRED","SHIPPING_ERRORS","FINAL_PAYMENT_ERRORS","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","handleErrorEvent","ErrorEvent","reason","alert","promptInstall","setupBeforeInstallPrompt","prompt","userChoice","outcome","setInstallPrompt","getPromptInstall","collection","member","mapValues","newByKey","object","stringKeys","orderRule","mode","compareValues","currentOrderRule","isAsc","aValue","bValue","mode1","mode2","orderRule1","orderRule2","isAsc1","isAsc2","array","uniqueByField","array1","array2","areSortedArraysIntersecting","findIntersectionWithSet","chunkSize","cloneDeep","predicate","SUBSTITUTION_REGEX","PLURAL_OPTIONS","PLURAL_RULES","en","ar","be","n10","n100","ca","cs","v0","de","es","fa","fi","fr","it","hr","i10","i100","f10","f100","hu","ko","nb","nl","pl","ru","sk","sr","tr","uk","uz","langPack","fallbackLangPack","currentLangCode","currentTimeFormat","cacheValue","langString","processTranslation","importFallbackLangPack","getTranslationForLangString","translateString","remoteLangPack","remote","fetchRemoteString","withFallback","newLangPack","fetchRemote","langInfo","rtl","langName","nativeName","sourceLangPacks","preferredPluralOption","optionIndex","getPluralOption","template","otherValue","translationSlices","initialValue","processTemplate","formatInteger","clamp","num","isBetween","decimals","lerp","start","end","interpolationRatio","SAMPLE_RATE","oggToWav","opusData","typedArray","decoderWorker","wavWorker","onmessage","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","memoryCache","fetchPromises","progressCallbacks","cancellableCallbacks","onProgress","callbackUniqueId","getProgressive","getDownloadUrl","fetchFromCacheOrRemote","activeCallbacks","getFromMemory","cancelProgress","parentCallback","progressiveUrl","mediaPng","webpToPng","prepareMedia","mediaSource","MediaSource","streamUrl","sourceBuffer","addSourceBuffer","makeOnProgress","revokeObjectURL","endOfStream","appendBuffer","serviceWorker","fullSize","Bundles","LOAD_PROMISES","MEMORY_CACHE","Auth","Main","Extra","Calls","bundle","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","checkIfNotificationsSupported","soundPlayedIds","playNotifySound","currentVolume","once","playNotifySoundDebounced","requestPermission","unsubscribeFromPush","dispatch","deleteDeviceToken","serviceWorkerRegistration","ready","pushManager","getSubscription","areSettingsLoaded","loadNotificationSettings","resultSettings","resultExceptions","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","getAvatar","imageHash","notifyAboutCall","badge","vibrate","onclick","close","notifyAboutMessage","isReaction","checkIfShouldNotify","areNotificationsSupported","activeReaction","messageSender","messageAction","actionTargetMessage","targetUserIds","actionTargetUserIds","actionTargetChatId","actionTargetUsers","privateChatUserId","privateChatUser","isChat","senderName","getNotificationContent","onshow","closeMessageNotifications","notifyClientReady","currentPasscodeHash","setupPasscode","sha256","sessionEncrypted","aesEncrypt","globalEncrypted","decryptSession","passcodeHash","load","aesDecrypt","plaintext","crypto","subtle","digest","TextEncoder","encode","pwHash","iv","getRandomValues","alg","importKey","ptUint8","ctBuffer","encrypt","ct","dataArray","plainBuffer","decrypt","TextDecoder","PATTERN_PLACEHOLDER","DEFAULT_PATTERN","getCountryCodesByIso","phoneCodeList","country","iso2","getCountryFromPhoneNumber","possibleCountries","countryCode","codesWithPrefix","prefixes","prefix","bestMatches","pattern","numberWithoutCode","patterns","defaultPattern","stripped","getBestPattern","formatPhoneNumberWithCode","numberWithPlus","createMessageHash","typeOrThreadId","isType","mediaEl","waitingTimeout","shouldRunFirst","shouldRunLast","interval","isPending","_args","setInterval","clearInterval","throttleWith","waiting","requestIdleCallback","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","onTickEndCallbacks","onTickEndPrimaryCallbacks","beforeUnloadCallbacks","currentCallbacks","currentPrimaryCallbacks","isLast","unshift","RE_NOT_LETTER","haystack","needle","needleWords","haystackLower","haystackWords","needleWord","haystackWord","promisifyRequest","oncomplete","onsuccess","onabort","defaultGetStoreFunc","defaultGetStore","dbName","storeName","dbp","userAgentData","indexedDB","databases","tryIdb","intervalId","onupgradeneeded","createObjectStore","txMode","db","transaction","objectStore","createStore","DC_IDS","withLegacy","checkSessionLocked","userAuthJson","dcID","hashes","dcId","sessionId","customStore","idb","idbKeys","getAllKeys","items","openCursor","continue","eachCursor","stateFromCache","isInitialized","HEX_COLOR_REGEX","RGB_VARIABLES","colors","themeColors","property","hexToRgb","hex","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","withAnimation","themeClassName","isDarkTheme","shouldAnimate","startAt","themeColorTag","formatFixedNumber","formatIntegerCompact","views","getFirstLetters","phrase","word","FILE_SIZE_UNITS","formatFileSize","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","createPng","handleLibWebpMessage","WEBSYNC_URLS","WEBSYNC_VERSION","WEBSYNC_KEY","getTs","lastTimeout","authed","currentTs","canRedirect","ts","script","removeElement","URLSearchParams","version","saveSync","clearWebsync","IS_LANDSCAPE","isLandscape","initialHeight","currentWindowSize","updateSizes","isRefreshDisabled","visualViewport","pageTop","vh","getIsKeyboardVisible","disableRefresh","enableRefresh","WeakMap","fnCache","cacheKey","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","__webpack_modules__","getter","__esModule","getPrototypeOf","obj","ns","create","def","getOwnPropertyNames","definition","o","defineProperty","enumerable","chunkId","promises","u","miniCssF","globalThis","Function","done","needAttach","scripts","getElementsByTagName","charset","nc","onScriptComplete","doneFns","bind","head","toStringTag","scriptUrl","importScripts","currentScript","fullhref","existingLinkTags","dataHref","existingStyleTags","findStylesheet","linkTag","errorType","realHref","createStylesheet","miniCss","baseURI","installedChunks","installedChunkData","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","handleWorkerMessage","registrations","getRegistrations","unregister","register","hasErrorKey","STORAGE_KEY","tabKey","SITE_FONTS","preloadFonts","font","fonts","translation","setTranslation","getSuggestedLanguage","suggestedLanguage","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","defaultName","getFilteredList","prevPhoneCodeList","handleInput","handleInputKeyDown","CodeInput","handleTrigger","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","Spinner","DropdownMenu","MenuItem","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","loadCountryList","clearAuthError","goToAuthQrCode","continueText","useLangString","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","markIsLoading","unmarkIsLoading","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","handleLangChange","setSelectionRange","isJustPastedRef","handlePaste","handleCountryChange","handlePhoneNumberChange","monkeyPath","selectionStart","selectionEnd","shouldFixSafariAutoComplete","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Button","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","qrCodeStylingPromise","returnToAuthPhoneNumber","qrCodeRef","isQrMounted","markQrMounted","unmarkQrMounted","QrCodeStyling","blankUrl","dotsOptions","cornersSquareOptions","imageOptions","imageSize","qrOptions","errorCorrectionLevel","token","append","AnimatedIcon","isMobile","renderingAuthState","Transition","getActiveKey","AuthQrCode","getScreen","isLocked","LockScreen","handleReload","appInactivePath","preloadAvatars","preloadTasks","main","isCurrentUserPremium","premiumReactionThumbsPath","reactionThumbsPath","telegramLogoPath","authCode","authPassword","lock","lockPreviewPath","inactive","isRightColumnShown","leftColumnWidth","setIsUiReady","isReady","markReady","shouldRenderMask","safePreload","styles","AppScreens","markInactive","handleDrag","dataTransfer","dropzone","dropEffect","handleDrop","auth","renderContent","manifest","updateWebmanifest","TeactDOM"],"sourceRoot":""}