mirror of
https://github.com/danog/telegram-tt.git
synced 2024-11-29 20:29:12 +01:00
1 line
992 KiB
Plaintext
1 line
992 KiB
Plaintext
{"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 can’t 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":""} |