{"version":3,"file":"main.f2043db1df6d2dbc91cc.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/appleMx.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/installPrompt.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/string/parseUriParams.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/environment/installPrompt.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/dom/loadScript.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","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 = \"tweb:\";\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\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};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {LiteModeKey} from '../helpers/liteMode';\nimport type {AppMediaPlaybackController} from '../components/appMediaPlaybackController';\nimport type {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport type {AutoDownloadSettings, BaseTheme, NotifyPeer, PeerNotifySettings, Theme, ThemeSettings, WallPaper} from '../layer';\nimport type DialogsStorage from '../lib/storages/dialogs';\nimport type FiltersStorage from '../lib/storages/filters';\nimport type {AuthState, Modify} from '../types';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport App from './app';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\n// ! DEPRECATED\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type AppTheme = Modify\n}>;\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\n filtersArr?: FiltersStorage['filtersArr'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n recentCustomEmoji: DocId[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled?: boolean, // ! DEPRECATED\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay?: { // ! DEPRECATED\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: 'all' | 'installed' | 'none',\n dynamicPackOrder: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: AppTheme[],\n theme: AppTheme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23',\n liteMode: {[key in LiteModeKey]: boolean}\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\n// const BACKGROUND_DAY_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n// highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n// intensity: 0,\n// id: '1'\n// };\n\n// const BACKGROUND_NIGHT_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#0f0f0f',\n// highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n// intensity: 0,\n// id: '-1'\n// };\n\nexport const DEFAULT_THEME: Theme = {\n _: 'theme',\n access_hash: '',\n id: '',\n settings: [{\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeClassic'},\n accent_color: 0x3390ec,\n message_colors: [0x4fae4e],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: 50,\n background_color: 0xdbddbb,\n second_background_color: 0x6ba587,\n third_background_color: 0xd5d88d,\n fourth_background_color: 0x88b884\n }\n }\n }, {\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeNight'},\n accent_color: 0x8774E1,\n message_colors: [0x8774E1],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true,\n dark: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: -50,\n background_color: 0xfec496,\n second_background_color: 0xdd6cb9,\n third_background_color: 0x962fbf,\n fourth_background_color: 0x4f5bd5\n }\n }\n }],\n slug: '',\n title: '',\n emoticon: '🏠',\n pFlags: {default: true}\n};\n\nconst makeDefaultAppTheme = (\n name: AppTheme['name'],\n baseTheme: BaseTheme['_'],\n highlightningColor: string\n): AppTheme => {\n return {\n ...DEFAULT_THEME,\n name,\n settings: {\n ...DEFAULT_THEME.settings.find((s) => s.base_theme._ === baseTheme),\n highlightningColor\n }\n };\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n recentCustomEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n stickers: {\n suggest: 'all',\n dynamicPackOrder: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [\n makeDefaultAppTheme('day', 'baseThemeClassic', 'hsla(86.4, 43.846153%, 45.117647%, .4)'),\n makeDefaultAppTheme('night', 'baseThemeNight', 'hsla(299.142857, 44.166666%, 37.470588%, .4)')\n ],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat(),\n liteMode: {\n all: false,\n animations: false,\n chat: false,\n chat_background: false,\n chat_spoilers: false,\n effects: false,\n effects_premiumstickers: false,\n effects_reactions: false,\n effects_emoji: false,\n emoji: false,\n emoji_messages: false,\n emoji_panel: false,\n gif: false,\n stickers: false,\n stickers_chat: false,\n stickers_panel: false,\n video: false\n }\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","let IS_APPLE_MX = false;\n\ntry {\n // Awesome detect from https://stackoverflow.com/a/65412357\n const ctx = document.createElement('canvas').getContext('webgl');\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\n IS_APPLE_MX = true;\n }\n} catch(err) {\n\n}\n\nexport default IS_APPLE_MX;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\n\nexport default IS_EMOJI_SUPPORTED;\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","import IS_WEBP_SUPPORTED from './webpSupport';\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","import IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","import Modes from '../config/modes';\n\nconst IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined' && !Modes.noSharedWorker/* && false */;\n\nexport default IS_SHARED_WORKER_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// @ts-ignore\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\nexport default IS_TOUCH_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || navigator.maxTouchPoints > 0) && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from './movSupport';\n\nexport type VIDEO_MIME_TYPE = 'image/gif' | 'video/mp4' | 'video/webm' | 'video/quicktime';\nconst VIDEO_MIME_TYPES_SUPPORTED: Set = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\nexport default IS_WEBM_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WallPaper} from '../layer';\nimport clamp from './number/clamp';\n\nexport type ColorHsla = {\n h: number,\n s: number,\n l: number,\n a: number\n};\n\nexport type ColorRgba = [number, number, number, number];\nexport type ColorRgb = [number, number, number];\n\n/**\n * https://stackoverflow.com/a/54070620/6758968\n * r, g, b in [0, 255]\n * @returns h in [0,360) and s, v in [0,1]\n */\nexport function rgbToHsv(r: number, g: number, b: number): [number, number, number] {\n r /= 255, g /= 255, b /= 255;\n const v = Math.max(r, g, b),\n c = v - Math.min(r, g, b);\n const h = c && ((v === r) ? (g - b ) / c : ((v == g) ? 2 + (b - r) / c : 4 + (r - g) / c));\n return [60 * (h < 0 ? h + 6 : h), v && c / v, v];\n}\n\n/**\n * https://stackoverflow.com/a/54024653/6758968\n * @param h [0, 360]\n * @param s [0, 1]\n * @param v [0, 1]\n * @returns r, g, b in [0, 255]\n */\nexport function hsvToRgb(h: number, s: number, v: number): ColorRgb {\n const f = (n: number, k: number = (n + h / 60) % 6) => Math.round((v - v * s * Math.max(Math.min(k, 4 - k, 1), 0)) * 255);\n return [f(5), f(3), f(1)];\n}\n\n/**\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\n */\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\n r /= 255, g /= 255, b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h: number, s: number;\n const l = (max + min) / 2;\n\n if(max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return {\n h: h * 360,\n s: s * 100,\n l: l * 100,\n a\n };\n}\n\n// * https://stackoverflow.com/a/9493060/6758968\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n *\n * @param {number} h The hue [0, 360]\n * @param {number} s The saturation [0, 1]\n * @param {number} l The lightness [0, 1]\n * @return {Array} The RGB representation [0, 255]\n */\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\n h /= 360, s /= 100, l /= 100;\n let r: number, g: number, b: number;\n\n if(s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return [r, g, b, a].map((v) => Math.round(v * 255)) as ColorRgba;\n}\n\nexport function hslaStringToRgba(hsla: string) {\n const splitted = hsla.slice(5, -1).split(', ');\n const alpha = +splitted.pop();\n const arr = splitted.map((val) => {\n if(val.endsWith('%')) {\n return +val.slice(0, -1);\n }\n\n return +val;\n });\n\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\n}\n\nexport function hexaToRgba(hexa: string) {\n const arr: ColorRgba = [] as any;\n const offset = hexa[0] === '#' ? 1 : 0;\n if(hexa.length === (5 + offset)) {\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\n }\n\n if(hexa.length === (3 + offset)) {\n for(let i = offset; i < hexa.length; ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n } else if(hexa.length === (4 + offset)) {\n for(let i = offset; i < (hexa.length - 1); ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n\n arr.push(parseInt(hexa[hexa.length - 1], 16));\n } else {\n for(let i = offset; i < hexa.length; i += 2) {\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\n }\n }\n\n return arr;\n}\n\nexport function hexToRgb(hex: string) {\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\n}\n\nexport function hexaToHsla(hexa: string) {\n const rgba = hexaToRgba(hexa);\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\n}\n\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\n}\n\nexport function hslaStringToHexa(hsla: string) {\n return rgbaToHexa(hslaStringToRgba(hsla));\n}\n\nexport function hslaStringToHex(hsla: string) {\n return hslaStringToHexa(hsla).slice(0, -2);\n}\n\n/**\n * @param weight [0, 1]\n */\nexport function mixColors(color1: ColorRgb, color2: ColorRgb, weight: number) {\n const out = new Array(3) as ColorRgb;\n for(let i = 0; i < 3; ++i) {\n const v1 = color1[i], v2 = color2[i];\n out[i] = Math.floor(v2 + (v1 - v2) * weight);\n }\n\n return out;\n}\n\nexport function computePerceivedBrightness(color: ColorRgb) {\n return (color[0] * 0.2126 + color[1] * 0.7152 + color[2] * 0.0722) / 255;\n}\n\nexport function getAverageColor(color1: ColorRgb, color2: ColorRgb): ColorRgb {\n return color1.map((v, i) => Math.round((v + color2[i]) / 2)) as ColorRgb;\n}\n\nexport function getAccentColor(baseHsv: number[], baseColor: ColorRgb, elementColor: ColorRgb): ColorRgb {\n const hsvTemp3 = rgbToHsv(...baseColor);\n const hsvTemp4 = rgbToHsv(...elementColor);\n\n const dist = Math.min(1.5 * hsvTemp3[1] / baseHsv[1], 1);\n\n hsvTemp3[0] = Math.min(360, hsvTemp4[0] - hsvTemp3[0] + baseHsv[0]);\n hsvTemp3[1] = Math.min(1, hsvTemp4[1] * baseHsv[1] / hsvTemp3[1]);\n hsvTemp3[2] = Math.min(1, (hsvTemp4[2] / hsvTemp3[2] + dist - 1) * baseHsv[2] / dist);\n if(hsvTemp3[2] < 0.3) {\n return elementColor;\n }\n return hsvToRgb(...hsvTemp3);\n}\n\nexport function changeColorAccent(baseHsv: number[], accentHsv: number[], color: ColorRgb, isDarkTheme: boolean) {\n const colorHsv = rgbToHsv(...color);\n\n const diffH = Math.min(Math.abs(colorHsv[0] - baseHsv[0]), Math.abs(colorHsv[0] - baseHsv[0] - 360));\n if(diffH > 30) {\n return color;\n }\n\n const dist = Math.min(1.5 * colorHsv[1] / baseHsv[1], 1);\n\n colorHsv[0] = Math.min(360, colorHsv[0] + accentHsv[0] - baseHsv[0]);\n colorHsv[1] = Math.min(1, colorHsv[1] * accentHsv[1] / baseHsv[1]);\n colorHsv[2] = Math.min(1, colorHsv[2] * (1 - dist + dist * accentHsv[2] / baseHsv[2]));\n\n let newColor = hsvToRgb(...colorHsv);\n\n const origBrightness = computePerceivedBrightness(color);\n const newBrightness = computePerceivedBrightness(newColor);\n\n // We need to keep colors lighter in dark themes and darker in light themes\n const needRevertBrightness = isDarkTheme ? origBrightness > newBrightness : origBrightness < newBrightness;\n\n if(needRevertBrightness) {\n const amountOfNew = 0.6;\n const fallbackAmount = (1 - amountOfNew) * origBrightness / newBrightness + amountOfNew;\n newColor = changeBrightness(newColor, fallbackAmount);\n }\n\n return newColor;\n}\n\nexport function changeBrightness(color: ColorRgb, amount: number) {\n return color.map((v) => clamp(Math.round(v * amount), 0, 255)) as ColorRgb;\n}\n\nexport function getHexColorFromTelegramColor(color: number) {\n const hex = (color < 0 ? 0xFFFFFF + color : color).toString(16);\n return '#' + (hex.length >= 6 ? hex : '0'.repeat(6 - hex.length) + hex);\n}\n\nexport function getRgbColorFromTelegramColor(color: number) {\n return hexToRgb(getHexColorFromTelegramColor(color));\n}\n\nexport function getColorsFromWallPaper(wallPaper: WallPaper) {\n return wallPaper.settings ? [\n wallPaper.settings.background_color,\n wallPaper.settings.second_background_color,\n wallPaper.settings.third_background_color,\n wallPaper.settings.fourth_background_color\n ].filter(Boolean).map(getHexColorFromTelegramColor).join(',') : '';\n}\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function blurActiveElement() {\n if((document.activeElement as HTMLInputElement)?.blur) {\n (document.activeElement as HTMLInputElement).blur();\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cancelEvent(event?: Event) {\n event ||= window.event;\n if(event) {\n // 'input' event will have cancelable=false, but we still need to preventDefault\n // if(!event.cancelable) {\n // return false;\n // }\n\n // @ts-ignore\n event = event.originalEvent || event;\n\n try {\n if(event.stopPropagation) event.stopPropagation();\n if(event.preventDefault) event.preventDefault();\n event.returnValue = false;\n event.cancelBubble = true;\n } catch(err) {}\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// export function findUpClassName(el: any, className: string): T;\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\n return (el as any).closest('.' + className);\n /* if(el.classList.contains(className)) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.classList.contains(className))\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function fixSafariStickyInput(input: HTMLElement) {\n input.style.transform = 'translateY(-99999px)';\n /* input.style.position = 'fixed';\n input.style.top = '-99999px';\n input.style.left = '0'; */\n input.focus();\n\n // setTimeout(() => {\n doubleRaf().then(() => {\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n /* input.style.position = '';\n input.style.top = ''; */\n input.style.transform = '';\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n\n /* setTimeout(() => {\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\n }, 50); */\n });\n // }, 0);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport findUpClassName from './findUpClassName';\nimport fixSafariStickyInput from './fixSafariStickyInput';\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n const key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n // console.log('touchmove y', touch[key], startY);\n\n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n // const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n // console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n // console.log('touchmove no scrollable', e, touch);\n }\n\n // if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n\n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n\n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n\n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement &&\n document.activeElement.classList.contains('is-sticky-input-bugged') &&\n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","let callback: () => Promise;\nexport default function cacheInstallPrompt() {\n window.addEventListener('beforeinstallprompt', (deferredPrompt: any) => {\n callback = async() => {\n deferredPrompt.prompt();\n const {outcome} = await deferredPrompt.userChoice;\n const installed = outcome === 'accepted';\n if(installed) {\n callback = undefined;\n }\n };\n });\n}\n\nexport function getInstallPrompt() {\n return callback;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../noop';\nimport pause from '../schedulers/pause';\n\nconst texts = ['b', 'б'];\ntype FontType = 'text' | 'icons' | 'monospace';\n\nconst cache: {\n [key: string]: {\n [text: string]: Promise\n }\n} = {};\n\nconst fonts: {[type in FontType]: string} = {\n text: 'Roboto',\n icons: 'tgico',\n monospace: 'Roboto Mono'\n};\n\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\n text: texts,\n icons: undefined,\n monospace: texts\n}): Promise {\n if(!('fonts' in document)) {\n return Promise.resolve();\n }\n\n const promises: Promise[] = [];\n for(const type in types) {\n let _texts = types[type as FontType];\n if(_texts === 'all') {\n _texts = texts;\n }\n\n const font = fonts[type as FontType];\n const weights = type === 'icons' ? [500] : [400, 500];\n for(const weight of weights) {\n const _promises = (_texts || [undefined]).map((text) => {\n const key = [weight, '1rem', font].join(' ');\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\n return promise;\n });\n promises.push(..._promises);\n }\n }\n\n return Promise.race([\n Promise.all(promises).catch(noop),\n pause(1000)\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(html === undefined) {\n elem.replaceChildren();\n } else if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.textContent = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport EventListenerBase from './eventListenerBase';\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\nconst DO_NOT_IDLE = false;\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n\n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n if(DO_NOT_IDLE && value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","export default function clamp(v: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, v));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from './eventListenerBase';\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('change', this.isOverlayActive);\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nexport default overlayCounter;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's schedulers\nimport {NoneToVoidFunction} from '../types';\n\n/*\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n} */\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nexport function fastRaf(callback: NoneToVoidFunction) {\n if(!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\nexport function fastRafConventional(callback: NoneToVoidFunction) {\n if(!fastRafConventionalCallbacks) {\n fastRafConventionalCallbacks = [callback];\n\n requestAnimationFrame(() => {\n processing = true;\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\n fastRafConventionalCallbacks[i]();\n }\n\n fastRafConventionalCallbacks = undefined;\n processing = false;\n });\n } else if(processing) {\n callback();\n } else {\n fastRafConventionalCallbacks.push(callback);\n }\n}\n\nlet rafPromise: Promise;\nexport function fastRafPromise() {\n if(rafPromise) return rafPromise;\n\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\n rafPromise.then(() => {\n rafPromise = undefined;\n });\n\n return rafPromise;\n}\n\nexport function doubleRaf() {\n return new Promise((resolve) => {\n fastRaf(() => {\n fastRaf(resolve);\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function parseUriParams(uri: string, splitted = uri.split('?')) {\n return parseUriParamsLine(splitted?.[1]);\n}\n\nexport function parseUriParamsLine(line: string) {\n const params: any = {};\n if(!line) {\n return params;\n }\n\n line.split('&').forEach((item) => {\n const [key, value = ''] = item.split('=');\n params[key] = decodeURIComponent(value);\n });\n\n return params;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppTheme} from '../config/state';\nimport type {Theme} from '../layer';\nimport type AppBackgroundTab from '../components/sidebarLeft/tabs/background';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport {changeColorAccent, ColorRgb, getAccentColor, getAverageColor, getHexColorFromTelegramColor, getRgbColorFromTelegramColor, hexToRgb, hslaStringToHex, hsvToRgb, mixColors, rgbaToHexa, rgbaToHsla, rgbToHsv} from './color';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\ntype AppColorName = 'primary-color' | 'message-out-primary-color' |\n 'surface-color' | 'danger-color' | 'primary-text-color' |\n 'secondary-text-color' | 'message-out-background-color' |\n 'saved-color';\ntype AppColor = {\n rgb?: boolean,\n light?: boolean,\n lightFilled?: boolean,\n dark?: boolean,\n darkRgb?: boolean,\n darkFilled?: boolean\n};\n\nconst appColorMap: {[name in AppColorName]: AppColor} = {\n 'primary-color': {\n rgb: true,\n light: true,\n lightFilled: true,\n dark: true,\n darkRgb: true\n },\n 'message-out-primary-color': {\n lightFilled: true\n },\n 'surface-color': {\n rgb: true\n },\n 'danger-color': {\n light: true,\n dark: true\n },\n 'primary-text-color': {\n rgb: true\n },\n 'secondary-text-color': {\n light: true,\n lightFilled: true\n },\n 'message-out-background-color': {\n light: true,\n lightFilled: true,\n dark: true,\n darkFilled: true\n },\n 'saved-color': {\n lightFilled: true\n }\n};\n\nconst colorMap: {\n [name in AppTheme['name']]?: {\n [name in AppColorName]?: string\n }\n} = {\n day: {\n 'primary-color': '#3390ec',\n 'message-out-primary-color': '#4fae4e',\n 'surface-color': '#ffffff',\n 'danger-color': '#df3f40',\n 'primary-text-color': '#000000',\n 'secondary-text-color': '#707579',\n 'saved-color': '#359AD4'\n },\n night: {\n 'primary-color': '#8774E1',\n 'message-out-primary-color': '#8774E1',\n 'surface-color': '#212121',\n 'danger-color': '#ff595a',\n 'primary-text-color': '#ffffff',\n 'secondary-text-color': '#aaaaaa',\n 'saved-color': '#8774E1'\n }\n};\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: AppTheme['name'];\n private styleElement: HTMLStyleElement;\n public AppBackgroundTab: typeof AppBackgroundTab;\n\n constructor() {\n rootScope.addEventListener('theme_change', () => {\n this.setTheme();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n // const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n // const newTheme = this.getTheme();\n\n if(rootScope.myId) {\n rootScope.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = this.getTheme();\n if(theme.settings?.highlightningColor) {\n hsla = theme.settings.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n this.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n const theme = this.getTheme();\n this.applyTheme(theme);\n\n let style = this.styleElement;\n if(!style) {\n style = this.styleElement = document.createElement('style');\n document.head.append(style);\n }\n\n const e = document.createElement('div');\n this.applyTheme(rootScope.settings.themes.find((theme) => theme.name === 'night'), e);\n style.textContent = `.night {${e.style.cssText}}`;\n\n this.applyHighlightningColor();\n }\n\n public async switchTheme(name: AppTheme['name']) {\n await rootScope.managers.appStateManager.setByKey('settings.theme', name);\n rootScope.dispatchEvent('theme_change');\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: AppTheme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n\n // theme applier\n private bindColorApplier(options: Pick[0], 'element' | 'isNight'>) {\n const appliedColors: Set = new Set();\n return {\n applyAppColor: (_options: Omit[0], keyof typeof options>) => {\n appliedColors.add(_options.name);\n return this.applyAppColor({..._options, ...options});\n },\n finalize: () => {\n const isNight = options.isNight;\n for(const name in appColorMap) {\n if(!appliedColors.has(name as AppColorName)) {\n this.applyAppColor({\n name: name as AppColorName,\n hex: colorMap[isNight ? 'night' : 'day'][name as AppColorName],\n ...options\n });\n }\n }\n }\n };\n };\n\n private applyAppColor({\n name,\n hex,\n element,\n lightenAlpha = 0.08,\n darkenAlpha = lightenAlpha,\n mixColor,\n isNight\n }: {\n name: AppColorName,\n hex: string,\n element: HTMLElement,\n lightenAlpha?: number\n darkenAlpha?: number,\n mixColor?: ColorRgb,\n isNight?: boolean\n }) {\n const appColor = appColorMap[name];\n const rgb = hexToRgb(hex);\n const hsla = rgbaToHsla(...rgb);\n\n mixColor ??= hexToRgb(colorMap[isNight ? 'night' : 'day']['surface-color']);\n const lightenedRgb = mixColors(rgb, mixColor, lightenAlpha);\n\n const darkenedHsla: typeof hsla = {\n ...hsla,\n l: hsla.l - darkenAlpha * 100\n };\n\n const properties: [string, string][] = [\n [name, hex],\n appColor.rgb && [name + '-rgb', rgb.join(',')],\n appColor.light && ['light-' + name, `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${lightenAlpha})`],\n appColor.lightFilled && ['light-filled-' + name, rgbaToHexa(lightenedRgb)],\n appColor.dark && ['dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`]\n // appColor.darkFilled && ['dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`]\n ];\n\n properties.filter(Boolean).forEach(([name, value]) => {\n element.style.setProperty('--' + name, value);\n });\n }\n\n public async applyNewTheme(theme: Theme) {\n const isNight = this.isNightTheme(theme);\n const currentTheme = this.getTheme();\n const themes = rootScope.settings.themes;\n const themeSettings = theme.settings.find((themeSettings) => themeSettings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic'));\n const newAppTheme: AppTheme = {\n ...theme,\n name: currentTheme.name,\n settings: {\n ...themeSettings,\n highlightningColor: ''\n }\n };\n\n await this.AppBackgroundTab.setBackgroundDocument(themeSettings.wallpaper, newAppTheme.settings);\n themes[themes.indexOf(currentTheme)] = newAppTheme;\n await rootScope.managers.appStateManager.setByKey('settings.themes', rootScope.settings.themes);\n rootScope.dispatchEvent('theme_change');\n }\n\n private isNightTheme(theme: Theme | AppTheme) {\n return (theme as AppTheme).name === 'night' || this.isNight();\n }\n\n public applyTheme(theme: Theme | AppTheme, element = document.documentElement) {\n const isNight = this.isNightTheme(theme);\n const themeSettings = Array.isArray(theme.settings) ?\n theme.settings.find((settings) => settings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic')) :\n theme.settings;\n const baseColors = colorMap[isNight ? 'night' : 'day'];\n\n let hsvTemp1 = rgbToHsv(...hexToRgb(baseColors['primary-color'])); // primary base\n let hsvTemp2 = rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.accent_color)); // new primary\n\n const newAccentRgb = changeColorAccent(\n hsvTemp1,\n hsvTemp2,\n hexToRgb(baseColors['primary-color']),\n !isNight\n );\n const newAccentHex = rgbaToHexa(newAccentRgb);\n\n const {applyAppColor, finalize} = this.bindColorApplier({element, isNight});\n\n applyAppColor({\n name: 'primary-color',\n hex: newAccentHex,\n darkenAlpha: 0.04\n });\n\n applyAppColor({\n name: 'saved-color',\n hex: newAccentHex,\n lightenAlpha: 0.64,\n mixColor: [255, 255, 255]\n });\n\n if(!themeSettings.message_colors?.length) {\n return;\n }\n\n const messageLightenAlpha = isNight ? 0.92 : 0.12;\n const baseMessageColor = hexToRgb(baseColors['message-out-primary-color']);\n hsvTemp1 = rgbToHsv(...baseMessageColor);\n const baseMessageOutBackgroundColor = mixColors(baseMessageColor, hexToRgb(baseColors['surface-color']), messageLightenAlpha);\n\n const firstColor = getRgbColorFromTelegramColor(themeSettings.message_colors[0]);\n\n let myMessagesAccent = firstColor;\n if(themeSettings.message_colors.length > 1) {\n // const w = getAccentColor(hsvTemp1, baseMessageOutBackgroundColor, myMessagesAccent);\n\n themeSettings.message_colors.slice(1).forEach((nextColor) => {\n myMessagesAccent = getAverageColor(myMessagesAccent, getRgbColorFromTelegramColor(nextColor));\n });\n\n myMessagesAccent = getAccentColor(hsvTemp1, baseMessageOutBackgroundColor, myMessagesAccent);\n\n // console.log('www', rgbaToHexa(w), rgbaToHexa(myMessagesAccent));\n }\n\n const o = myMessagesAccent;\n hsvTemp2 = rgbToHsv(...o);\n\n // const c = changeColorAccent(\n // hsvTemp1,\n // hsvTemp2,\n // baseMessageOutBackgroundColor\n // );\n\n // console.log(o, c, rgbaToHexa(o), rgbaToHexa(c));\n\n const accentColor2 = themeSettings.outbox_accent_color !== undefined && rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.outbox_accent_color));\n\n const newMessageOutBackgroundColor = mixColors(myMessagesAccent, hexToRgb(baseColors['surface-color']), messageLightenAlpha);\n\n applyAppColor({\n name: 'message-out-background-color',\n hex: rgbaToHexa(newMessageOutBackgroundColor),\n lightenAlpha: messageLightenAlpha\n });\n\n applyAppColor({\n name: 'message-out-primary-color',\n hex: isNight ? '#ffffff' : rgbaToHexa(accentColor2 ? hsvToRgb(...accentColor2) : myMessagesAccent),\n mixColor: newMessageOutBackgroundColor\n });\n\n // if(accentColor2) {\n // console.log(rgbaToHexa(myMessagesAccent), rgbaToHexa(hsvToRgb(...accentColor2)));\n // }\n\n finalize();\n }\n}\n\nconst themeController = new ThemeController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.themeController = themeController);\nexport default themeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n let url = args[0] + '';\n if(url.indexOf('blob:') !== 0) {\n url += location.search;\n }\n\n return new target(url);\n }\n };\n\n [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean).forEach((w) => {\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","const IS_INSTALL_PROMPT_SUPPORTED = 'onbeforeinstallprompt' in window;\nexport default IS_INSTALL_PROMPT_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport cancelEvent from './helpers/dom/cancelEvent';\nimport {IS_STICKY_INPUT_BUGGED} from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport {IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\nimport {parseUriParamsLine} from './helpers/string/parseUriParams';\nimport Modes from './config/modes';\nimport {AuthState} from './types';\nimport {IS_BETA} from './config/debug';\nimport IS_INSTALL_PROMPT_SUPPORTED from './environment/installPrompt';\nimport cacheInstallPrompt from './helpers/dom/installPrompt';\n// import appNavigationController from './components/appNavigationController';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n // polyfill for replaceChildren\n if((Node as any).prototype.replaceChildren === undefined) {\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\n this.textContent = '';\n // while(this.lastChild) {\n // this.removeChild(this.lastChild);\n // }\n if(nodes) {\n this.append(...nodes);\n }\n }\n }\n\n rootScope.managers = getProxiedManagers();\n\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\n manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n // const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n // console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n setWorkerProxy;\n\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\n // import('./lib/polyfill'),\n // import('./environment/touchSupport'),\n // import('./environment/userAgent'),\n // import('./lib/rootScope'),\n // import('./lib/appManagers/appStateManager'),\n // import('./lib/langPack'),\n // import('./helpers/peerIdPolyfill'),\n // // import('./helpers/cacheFunctionPolyfill')\n // ]);\n\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.isOverlayActive;\n setVH();\n\n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n\n let tabId: number;\n (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n\n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n if(IS_EMOJI_SUPPORTED) {\n document.documentElement.classList.add('native-emoji');\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === 'IMG') {\n e.preventDefault();\n return false;\n }\n });\n\n // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n\n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n // force losing focus on input blur\n // focusin and focusout are not working on mobile\n\n const onInResize = () => {\n hasFocus = true;\n window.addEventListener('resize', onOutResize, {once: true});\n };\n\n const onOutResize = () => {\n hasFocus = false;\n blurActiveElement();\n };\n\n let hasFocus = false;\n document.addEventListener('touchend', (e) => {\n const input = (e.target as HTMLElement).closest('[contenteditable=\"true\"], input');\n if(!input) {\n return;\n }\n\n if(document.activeElement !== input && !hasFocus) {\n console.log('input click', e, document.activeElement, input, input.matches(':focus'));\n window.addEventListener('resize', onInResize, {once: true});\n }\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n if(IS_INSTALL_PROMPT_SUPPORTED) {\n cacheInstallPrompt();\n }\n\n const perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n\n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\n rootScope.premium = isPremium;\n });\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n if(langPack.lang_code === 'ar' && IS_BETA && false) {\n document.body.classList.add('is-rtl');\n document.documentElement.dir = 'rtl';\n document.documentElement.lang = langPack.lang_code;\n I18n.setRTL(true);\n } else {\n document.documentElement.dir = 'ltr';\n }\n\n let authState = stateResult.state.authState;\n\n const hash = location.hash;\n const splitted = hash.split('?');\n const params = parseUriParamsLine(splitted[1] ?? splitted[0].slice(1));\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\n const data: AuthState.signImport['data'] = {\n token: params.tgWebAuthToken,\n dcId: +params.tgWebAuthDcId,\n userId: params.tgWebAuthUserId.toUserId(),\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\n tgAddr: params.tgaddr\n };\n\n if(data.isTest !== Modes.test) {\n const urlSearchParams = new URLSearchParams(location.search);\n if(+params.tgWebAuthTest) {\n urlSearchParams.set('test', '1');\n } else {\n urlSearchParams.delete('test');\n }\n\n location.search = urlSearchParams.toString();\n return;\n }\n\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\n\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\n }\n\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n\n }\n\n let pagePromise: Promise;\n // langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn':\n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr':\n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n case 'authStateSignImport':\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\n break;\n }\n // });\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ?\n Promise.race([\n pause(1000),\n document.fonts.ready\n ]) :\n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n }\n});\n","export default function toggleAttributePolyfill() {\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n\n if(this.hasAttribute(name)) {\n if(force) return true;\n\n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n\n this.setAttribute(name, '');\n return true;\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport class AppRuntimeManager {\n public reload() {\n try {\n location.reload();\n } catch(e) {};\n\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\n // chrome.runtime.reload();\n // }\n }\n\n public close() {\n try {\n window.close();\n } catch(e) {}\n }\n\n /**\n * Better to call from event\n */\n public focus() {\n // // @ts-ignore\n // if(window.navigator.mozApps && document.hidden) {\n // // Get app instance and launch it to bring app to foreground\n // // @ts-ignore\n // window.navigator.mozApps.getSelf().onsuccess = function() {\n // this.result.launch();\n // };\n // } else {\n // // @ts-ignore\n // if(window.chrome && chrome.app && chrome.app.window) {\n // // @ts-ignore\n // chrome.app.window.current().focus();\n // }\n\n window.focus();\n // }\n }\n}\n\nconst appRuntimeManager = new AppRuntimeManager();\nexport default appRuntimeManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type createManagers from './createManagers';\nimport {ModifyFunctionsToAsync} from '../../types';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport noop from '../../helpers/noop';\nimport dT from '../../helpers/dT';\nimport DEBUG from '../../config/debug';\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// const byManager = stats[manager] ??= {};\n// const byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\n// sentCount = 0;\n// stats = {};\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {\n // appProfileManager: new Set(['getProfile', 'getProfileByPeerId'])\n};\nif(DEBUG) {\n (window as any).DEBUG_MANAGER_REQUESTS = DEBUG_MANAGER_REQUESTS;\n}\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n if(DEBUG) {\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\n console.warn('manager request', name, p, args, ack);\n }\n }\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\ntype ProxiedManagers = {\n [name in keyof T]?: ModifyFunctionsToAsync;\n} & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n};\n\nfunction createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n}\n\nlet proxied: ProxiedManagers;\nexport default function getProxiedManagers() {\n if(proxied) {\n return proxied;\n }\n\n proxied = createProxyProxy({}, false);\n proxied.acknowledged = createProxyProxy({}, true);\n return proxied;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'delete: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'save: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n if(!entryName) {\n return undefined;\n }\n\n entryName = [].concat(entryName);\n } else if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.get(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'get: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(/\\s/)[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(/\\s/)[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n if(typeof(a) !== 'string') {\n a.textContent = ''; // reset content\n }\n }\n\n const formatted = superFormatter(text, args, indexHolder) as any;\n if(typeof(a) === 'string') {\n out.push(...formatted);\n } else {\n a.append(...formatted);\n out.push(a);\n }\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n const arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n return arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","import IS_CALL_SUPPORTED from './callSupport';\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\nimport IS_MOV_SUPPORTED from './movSupport';\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\nimport IS_TOUCH_SUPPORTED from './touchSupport';\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\nimport IS_WEBM_SUPPORTED from './webmSupport';\nimport IS_WEBP_SUPPORTED from './webpSupport';\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\nimport * as userAgent from './userAgent';\nimport IS_OPUS_SUPPORTED from './opusSupport';\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\nimport IS_APPLE_MX from './appleMx';\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_APPLE_MX,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBM_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../../config/app';\nimport DEBUG from '../../../../config/debug';\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT, Background, AppTheme} from '../../../../config/state';\nimport compareVersion from '../../../../helpers/compareVersion';\nimport copy from '../../../../helpers/object/copy';\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\nimport {UserAuth} from '../../../mtproto/mtproto_config';\nimport rootScope from '../../../rootScope';\nimport stateStorage from '../../../stateStorage';\nimport sessionStorage from '../../../sessionStorage';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport {StoragesResults} from '../storages/loadStorages';\nimport {logger} from '../../../logger';\nimport {WallPaper} from '../../../../layer';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n// const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime',\n 'stateCreatedTime',\n 'maxSeenMsgId',\n 'filtersArr'\n];\n\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER');\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth')\n )\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n\n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n\n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: State = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const sessionBuild = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map((key) => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n const obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n\n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ?\n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} :\n auth); // * support old version\n }\n\n const resetStorages: Set = new Set();\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n\n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n\n state = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: {[k in keyof StoragesResults]: number} = {\n chats: 1,\n dialogs: 1,\n users: 1\n };\n for(const key in r) {\n resetStorages.add(key as keyof StoragesResults);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\n // s.length = 0;\n // }\n });\n };\n\n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n\n // state = this.state = new Proxy(state, getHandler());\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n const SKIP_VALIDATING_PATHS: Set = new Set([\n 'settings.themes'\n ]);\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n }, undefined, SKIP_VALIDATING_PATHS);\n\n let newVersion: string, oldVersion: string;\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(/* compareVersion(state.version, '0.8.7') === -1 || state.build < 179 || */state.build < 217) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.pinnedOrders = copy(STATE_INIT.pinnedOrders);\n state.filtersArr = copy(STATE_INIT.filtersArr);\n\n resetStorages.add('dialogs');\n }\n\n if(compareVersion(state.version, '1.7.1') === -1) {\n let migrated = false;\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n migrated = true;\n state.settings.theme = copy(STATE_INIT.settings.theme);\n state.settings.themes = copy(STATE_INIT.settings.themes);\n } else if(compareVersion(state.version, '1.7.1') === -1) { // * migrate backgrounds (January 25th, 2023; to version 1.7.1)\n migrated = true;\n const oldThemes = state.settings.themes as any as Array<{\n name: AppTheme['name'],\n background: Background\n }>;\n\n state.settings.themes = copy(STATE_INIT.settings.themes);\n\n try {\n oldThemes.forEach((oldTheme) => {\n const oldBackground = oldTheme.background;\n if(!oldBackground) {\n return;\n }\n\n const newTheme = state.settings.themes.find((t) => t.name === oldTheme.name);\n newTheme.settings.highlightningColor = oldBackground.highlightningColor;\n\n const getColorFromHex = (hex: string) => hex && parseInt(hex.slice(1), 16);\n\n const colors = (oldBackground.color || '').split(',').map(getColorFromHex);\n\n if(oldBackground.color && !oldBackground.slug) {\n newTheme.settings.wallpaper = {\n _: 'wallPaperNoFile',\n id: 0,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n } else {\n const wallPaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n id: 0,\n access_hash: 0,\n slug: oldBackground.slug,\n document: {} as any,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n\n const wallPaperSettings = wallPaper.settings;\n newTheme.settings.wallpaper = wallPaper;\n if(oldBackground.slug && !oldBackground.color) {\n wallPaperSettings.pFlags.blur = oldBackground.blur || undefined;\n } else if(oldBackground.intensity) {\n wallPaperSettings.intensity = oldBackground.intensity;\n wallPaper.pFlags.pattern = true;\n wallPaper.pFlags.dark = oldBackground.intensity < 0 || undefined;\n }\n }\n\n if(colors.length) {\n const wallPaperSettings = newTheme.settings.wallpaper.settings;\n wallPaperSettings.background_color = colors[0];\n wallPaperSettings.second_background_color = colors[1];\n wallPaperSettings.third_background_color = colors[2];\n wallPaperSettings.fourth_background_color = colors[3];\n }\n });\n } catch(err) {\n console.error('migrating themes error', err);\n }\n }\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n\n if(state.build < 309) {\n state.settings.liteMode.animations = !state.settings.animationsEnabled;\n state.settings.liteMode.video = !state.settings.autoPlay.videos;\n state.settings.liteMode.gif = !state.settings.autoPlay.gifs;\n }\n\n if(state.build < 312 && typeof(state.settings.stickers.suggest) === 'boolean') {\n state.settings.stickers.suggest = state.settings.stickers.suggest ? 'all' : 'none';\n }\n\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n\n // return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport {CryptoMethods} from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport App from '../../config/app';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T,\n key?: K,\n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public share: ShareData;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n constructor() {\n super();\n\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n // //console.log('socketProxy', socketTask, id);\n\n // if(socketTask.type === 'send') {\n // const socket = this.sockets.get(id);\n // socket.send(socketTask.payload);\n // } else if(socketTask.type === 'close') { // will remove from map in onClose\n // const socket = this.sockets.get(id);\n // socket.close();\n // } else if(socketTask.type === 'setup') {\n // const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n\n // const onOpen = () => {\n // //console.log('socketProxy onOpen');\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'open',\n // id\n // }\n // });\n // };\n // const onClose = () => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'close',\n // id\n // }\n // });\n\n // socket.removeEventListener('open', onOpen);\n // socket.removeEventListener('close', onClose);\n // socket.removeEventListener('message', onMessage);\n // this.sockets.delete(id);\n // };\n // const onMessage = (buffer: ArrayBuffer) => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'message',\n // id,\n // payload: buffer\n // }\n // });\n // };\n\n // socket.addEventListener('open', onOpen);\n // socket.addEventListener('close', onClose);\n // socket.addEventListener('message', onMessage);\n // this.sockets.set(id, socket);\n // }\n // });\n\n rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map((cacheName) => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onLoad = () => {\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n clearTimeout(timeout);\n iframe.remove();\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onLoad);\n promise.resolve();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onLoad);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0);\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onLoad, 1e3);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url),\n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n\n // ! doubtful fix for hard refresh\n if(registration.active && !navigator.serviceWorker.controller) {\n return registration.unregister().then(() => {\n window.location.reload();\n });\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n \n \n \n }, (err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n },\n\n share: (payload) => {\n this.log('will try to share something');\n this.share = payload;\n }\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = `\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${pre}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${text}`;\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n const url = args[0] + location.search;\n return {url};\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport idleController from '../../helpers/idleController';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport apiManagerProxy from './mtprotoworker';\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000;\nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n\n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId,\n idle,\n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceId ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\n }\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport Modes from '../../config/modes';\nimport loadScript from '../../helpers/dom/loadScript';\nimport tsNow from '../../helpers/tsNow';\nimport sessionStorage from '../sessionStorage';\n\nexport class TelegramMeWebManager {\n private disabled = /* false && */(Modes.test || !App.domains.includes(location.hostname));\n\n public setAuthorized(canRedirect: boolean) {\n if(this.disabled) {\n return;\n }\n\n return sessionStorage.get('tgme_sync').then((curValue) => {\n const ts = tsNow(true);\n if(\n canRedirect &&\n curValue?.canRedirect === canRedirect &&\n (curValue.ts + 86400) > ts\n ) {\n return;\n }\n\n sessionStorage.set({\n tgme_sync: {\n canRedirect,\n ts\n }\n });\n\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\n const urls = [\n '//telegram.me/' + path,\n '//t.me/' + path\n ];\n\n const promises = urls.map((url) => {\n return loadScript(url).then((script) => {\n script.remove();\n });\n });\n\n return Promise.all(promises);\n });\n }\n}\n\nconst telegramMeWebManager = new TelegramMeWebManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\nexport default telegramMeWebManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function loadScript(url: string) {\n const script = document.createElement('script');\n const promise = new Promise((resolve) => {\n script.onload = script.onerror = () => {\n resolve(script);\n };\n });\n script.src = url;\n document.body.appendChild(script);\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {PushNotificationObject} from '../serviceWorker/push';\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {logger} from '../logger';\nimport apiManagerProxy from './mtprotoworker';\nimport I18n, {LangPackKey} from '../langPack';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport copy from '../../helpers/object/copy';\nimport singleInstance from './singleInstance';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\n\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\n\nexport type PushSubscriptionNotify = {\n tokenType: number,\n tokenValue: string\n};\n\nconst PING_PUSH_INTERVAL = 10000;\n\nexport class WebPushApiManager extends EventListenerBase<{\n push_notification_click: (n: PushNotificationObject) => void,\n push_init: (n: PushSubscriptionNotify) => void,\n push_subscribe: (n: PushSubscriptionNotify) => void,\n push_unsubscribe: (n: PushSubscriptionNotify) => void\n}> {\n public isAvailable = true;\n private isPushEnabled = false;\n private localNotificationsAvailable = true;\n private started = false;\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\n private isAliveTO: any;\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n private userVisibleOnly = this.isFirefox ? false : true;\n private log = logger('PM');\n\n constructor() {\n super(false);\n\n if(!('PushManager' in window) ||\n !('Notification' in window) ||\n !('serviceWorker' in navigator)) {\n this.log.warn('Push messaging is not supported.');\n this.isAvailable = false;\n this.localNotificationsAvailable = false;\n }\n\n if(this.isAvailable && Notification.permission === 'denied') {\n this.log.warn('The user has blocked notifications.');\n }\n }\n\n public start() {\n if(!this.started) {\n this.started = true;\n this.getSubscription();\n this.setUpServiceWorkerChannel();\n }\n }\n\n public setLocalNotificationsDisabled() {\n this.localNotificationsAvailable = false;\n }\n\n public getSubscription() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = !!subscription;\n this.pushSubscriptionNotify('init', subscription);\n }).catch((err) => {\n this.log.error('Error during getSubscription()', err);\n });\n });\n }\n\n public subscribe = () => {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\n // The subscription was successful\n this.isPushEnabled = true;\n this.pushSubscriptionNotify('subscribe', subscription);\n }).catch((e) => {\n if(Notification.permission === 'denied') {\n this.log('Permission for Notifications was denied');\n } else {\n this.log('Unable to subscribe to push.', e);\n if(!this.userVisibleOnly) {\n this.userVisibleOnly = true;\n setTimeout(this.subscribe, 0);\n }\n }\n });\n });\n }\n\n public unsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = false;\n\n if(subscription) {\n this.pushSubscriptionNotify('unsubscribe', subscription);\n\n setTimeout(() => {\n subscription.unsubscribe().then((successful) => {\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }, 3000);\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public forceUnsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.log.warn('force unsubscribe', subscription);\n if(subscription) {\n subscription.unsubscribe().then((successful) => {\n this.log.warn('force unsubscribe successful', successful);\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public isAliveNotify = () => {\n if(!this.isAvailable || singleInstance.deactivatedReason) {\n return;\n }\n\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\n\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\n const ACTIONS_LANG_MAP: Record = {\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\n push_message_nopreview: 'PushNotification.Message.NoPreview'\n };\n\n for(const action in ACTIONS_LANG_MAP) {\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\n localNotifications: this.localNotificationsAvailable,\n lang: lang,\n settings: this.settings\n });\n\n this.isAliveTO = setTimeout(this.isAliveNotify, PING_PUSH_INTERVAL);\n }\n\n public setSettings(newSettings: WebPushApiManager['settings']) {\n this.settings = copy(newSettings);\n clearTimeout(this.isAliveTO);\n this.isAliveNotify();\n }\n\n public hidePushNotifications() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\n }\n\n public setUpServiceWorkerChannel() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\n if(singleInstance.deactivatedReason) {\n appRuntimeManager.reload();\n return;\n }\n\n this.dispatchEvent('push_notification_click', payload);\n });\n\n navigator.serviceWorker.ready.then(this.isAliveNotify);\n }\n\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\n if(subscription) {\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\n if(!subscriptionObj ||\n !subscriptionObj.endpoint ||\n !subscriptionObj.keys ||\n !subscriptionObj.keys.p256dh ||\n !subscriptionObj.keys.auth) {\n this.log.warn('Invalid push subscription', subscriptionObj);\n this.unsubscribe();\n this.isAvailable = false;\n this.pushSubscriptionNotify(event);\n return;\n }\n\n this.log.warn('Push', event, subscriptionObj);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\n tokenType: 10,\n tokenValue: JSON.stringify(subscriptionObj)\n });\n } else {\n this.log.warn('Push', event, false);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\n }\n }\n\n public ignorePushByMid(peerId: PeerId, mid: number) {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('shownNotification', peerId + '_' + getServerMessageId(mid));\n }\n}\n\nconst webPushApiManager = new WebPushApiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\nexport default webPushApiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport IS_OPUS_SUPPORTED from '../environment/opusSupport';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {Modify} from '../types';\nimport {logger, LogTypes} from './logger';\nimport apiManagerProxy from './mtproto/mtprotoworker';\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\n\ntype Result = {\n bytes: Uint8Array,\n waveform?: Uint8Array\n};\n\ntype Task = {\n pages: Uint8Array,\n withWaveform: boolean,\n waveform?: Uint8Array,\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\n timeout: number\n};\n\nexport interface ConvertOpusTask extends Modify {\n type: 'convertOpus'\n}\n\nexport class OpusDecodeController {\n private worker: Worker;\n private wavWorker: Worker;\n private sampleRate = 48000;\n private tasks: Array = [];\n private keepAlive = false;\n private log = logger('OPUS', LogTypes.Error);\n\n public isPlaySupported() {\n return IS_OPUS_SUPPORTED;\n }\n\n public loadWavWorker() {\n if(this.wavWorker) return;\n\n this.wavWorker = new Worker('waveWorker.min.js');\n this.wavWorker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[WAV] got message:', data);\n if(data && data.page) {\n const bytes = data.page;\n this.onTaskEnd(this.tasks.shift(), bytes);\n }\n });\n }\n\n public loadWorker() {\n if(this.worker) return;\n\n this.worker = new Worker('decoderWorker.min.js');\n this.worker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[DECODER] got message', data);\n if(data.type === 'done') {\n // this.log('[DECODER] send done to wav');\n this.wavWorker.postMessage({command: 'done'});\n\n if(data.waveform) {\n this.tasks[0].waveform = data.waveform;\n }\n } else { // e.data contains decoded buffers as float32 values\n // this.log('[DECODER] send encode to wav');\n this.wavWorker.postMessage({\n command: 'encode',\n buffers: e.data\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\n }\n });\n }\n\n public setKeepAlive(keepAlive: boolean) {\n this.keepAlive = keepAlive;\n if(this.keepAlive) {\n this.loadWorker();\n this.loadWavWorker();\n } else if(!this.tasks.length) {\n this.terminateWorkers();\n }\n }\n\n public onTaskEnd(task: Task, result?: Uint8Array) {\n if(!result) {\n task.callback.reject('timeout');\n } else {\n clearTimeout(task.timeout);\n task.callback.resolve({bytes: result, waveform: task.waveform});\n }\n\n if(this.tasks.length) {\n this.executeNewTask(this.tasks[0]);\n }\n\n this.terminateWorkers();\n }\n\n public terminateWorkers(kill = false) {\n if((this.keepAlive || this.tasks.length) && !kill) return;\n\n if(this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n\n if(this.wavWorker) {\n this.wavWorker.terminate();\n this.wavWorker = null;\n }\n }\n\n public executeNewTask(task: Task) {\n this.worker.postMessage({\n command: 'init',\n decoderSampleRate: this.sampleRate,\n outputBufferSampleRate: this.sampleRate\n });\n\n this.wavWorker.postMessage({\n command: 'init',\n wavBitDepth: 16,\n wavSampleRate: this.sampleRate\n });\n\n // console.log('sending command to worker:', task);\n // setTimeout(() => {\n this.log('[DECODER] send decode');\n this.worker.postMessage({\n command: 'decode',\n pages: task.pages,\n waveform: task.withWaveform\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\n // }, 1e3);\n\n task.timeout = window.setTimeout(() => {\n this.log.error('decode timeout'/* , task */);\n\n this.terminateWorkers(true);\n if(this.tasks.length) {\n this.loadWorker();\n this.loadWavWorker();\n }\n\n this.onTaskEnd(this.tasks.shift());\n }, 10e3);\n }\n\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\n return new Promise((resolve, reject) => {\n const task = {\n pages,\n withWaveform,\n callback: {resolve, reject},\n timeout: 0\n };\n\n this.loadWorker();\n this.loadWavWorker();\n\n if(this.tasks.push(task) === 1) {\n this.executeNewTask(task);\n }\n });\n }\n\n public async decode(typedArray: Uint8Array, withWaveform = false) {\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\n });\n }\n}\n\nconst opusDecodeController = new OpusDecodeController();\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\nexport default opusDecodeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const TIMESTAMP_REG_EXP = '(?:\\\\s|^)((?:\\\\d{1,2}:)?(?:[0-5]?[0-9]):(?:[0-5][0-9]))(?:\\\\s|$)';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP + '|' + TIMESTAMP_REG_EXP + '', 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const MARKDOWN_ENTITIES_TYPES = new Set(Object.values(MARKDOWN_ENTITIES));\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nexport const PASS_SINGLE_CONFLICTING_ENTITIES = new Set(PASS_CONFLICTING_ENTITIES);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1] as any;\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n 'chat_participant': Update.updateChannelParticipant,\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'message_transcribed': {peerId: PeerId, mid: number, text: string, pending?: boolean},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'stickers_order': {type: 'masks' | 'emojis' | 'stickers', order: Long[]},\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n this.dispatchEventSingle('premium_toggle', isPremium);\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {WorkerTaskVoidTemplate} from '../../types';\n\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\n type: 'convertWebp',\n payload: {\n fileName: string,\n bytes: Uint8Array\n }\n};\n\nexport class WebpWorkerController {\n private worker: Worker;\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\n\n private init() {\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\n this.worker.addEventListener('message', (e) => {\n const task = e.data as ConvertWebPTask;\n const payload = task.payload;\n\n const promise = this.convertPromises[payload.fileName];\n if(promise) {\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\n delete this.convertPromises[payload.fileName];\n }\n });\n }\n\n private postMessage(data: ConvertWebPTask) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.worker.postMessage(data);\n }\n\n public convert(fileName: string, bytes: Uint8Array) {\n if(this.convertPromises.hasOwnProperty(fileName)) {\n return this.convertPromises[fileName];\n }\n\n const convertPromise = deferredPromise();\n\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\n\n return this.convertPromises[fileName] = convertPromise;\n }\n}\n\nconst webpWorkerController = new WebpWorkerController();\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\nexport default webpWorkerController;\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 \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"93d2f33af815eb0455aa\",\"53\":\"40d79ab9d14e8d83cf01\",\"61\":\"1d9d1c1804ddef811ae0\",\"63\":\"7ac6657334217aaadb5b\",\"77\":\"b8cf11d2b5dca36479ca\",\"104\":\"2ce072b250d3677d1571\",\"147\":\"40d5eeb3e14bc4686ebc\",\"231\":\"f4d1bfe6ff7f14577f96\",\"297\":\"1bdbe4d3952a46b0e184\",\"301\":\"95838a8203f23dd1ce8f\",\"339\":\"12bdbede82465e666965\",\"392\":\"6ce981ebdcbba9b6fd04\",\"436\":\"9e54c5e9f3feccf9d736\",\"437\":\"37bcbe9db9cbb8d8a753\",\"442\":\"54c010363ba1cdea7bce\",\"508\":\"108437b214c507c44cb2\",\"589\":\"b0045a30f964b72ba240\",\"630\":\"f8f57a1c721e03c3f699\",\"641\":\"527b52a7a5052f57e455\",\"642\":\"be93122d1116ecdc9322\",\"670\":\"b6087986ef46df86e5e8\",\"678\":\"30655ba40dd5e29892dd\",\"709\":\"c5451446b3485d2557e8\",\"776\":\"444edaecf4b03894ef8e\",\"781\":\"c527d73f348ae695f21a\",\"783\":\"949e247466ad3ebe82d6\",\"810\":\"aad7a584f7c8c739c66e\",\"813\":\"315ffd640c7d6013a536\"}[chunkId] + \".chunk.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 undefined;\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;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","__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__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\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\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [85,110], () => (__webpack_require__(2938)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","IS_BETA","DEBUG","MOUNT_CLASS_TO","window","self","STATE_VERSION","BUILD","DEFAULT_THEME","_","access_hash","id","settings","pFlags","base_theme","accent_color","message_colors","wallpaper","default","pattern","document","undefined","slug","intensity","background_color","second_background_color","third_background_color","fourth_background_color","dark","title","emoticon","makeDefaultAppTheme","name","baseTheme","highlightningColor","find","s","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","recentCustomEmoji","topPeersCache","recentSearch","version","build","authState","IS_MOBILE","hiddenPinnedMessages","messagesTextSize","distanceUnit","sendShortcut","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","stickers","suggest","dynamicPackOrder","loop","emoji","big","themes","theme","notifications","sound","timeFormat","toLocaleString","match","liteMode","all","animations","chat","chat_background","chat_spoilers","effects","effects_premiumstickers","effects_reactions","effects_emoji","emoji_messages","emoji_panel","gif","stickers_chat","stickers_panel","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","createElement","getContext","extension","getExtension","renderer","getParameter","UNMASKED_RENDERER_WEBGL","getSupportedExtensions","indexOf","err","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbToHsv","r","g","b","v","Math","max","c","min","h","hsvToRgb","f","n","k","rgbaToHsla","a","l","d","hslaToRgba","hue2rgb","p","q","t","map","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","mixColors","color1","color2","weight","out","Array","v1","v2","floor","computePerceivedBrightness","color","getAverageColor","getAccentColor","baseHsv","baseColor","elementColor","hsvTemp3","hsvTemp4","dist","changeColorAccent","accentHsv","isDarkTheme","colorHsv","abs","newColor","origBrightness","newBrightness","amountOfNew","amount","changeBrightness","getHexColorFromTelegramColor","repeat","getRgbColorFromTelegramColor","getColorsFromWallPaper","wallPaper","filter","Boolean","compareVersion","s1","s2","blurActiveElement","activeElement","blur","cancelEvent","event","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","callback","cacheInstallPrompt","deferredPrompt","prompt","outcome","userChoice","getInstallPrompt","texts","cache","fonts","text","icons","monospace","loadFonts","types","Promise","resolve","promises","type","_texts","font","weights","_promises","load","race","catch","setInnerHTML","elem","html","setDirection","replaceChildren","textContent","setAttribute","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","clamp","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","parseUriParams","uri","parseUriParamsLine","line","params","item","decodeURIComponent","appColorMap","rgb","light","lightFilled","darkRgb","darkFilled","colorMap","day","night","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","applyTheme","styleElement","append","cssText","switchTheme","bindColorApplier","options","appliedColors","applyAppColor","_options","finalize","has","element","lightenAlpha","darkenAlpha","mixColor","appColor","lightenedRgb","darkenedHsla","applyNewTheme","isNightTheme","currentTheme","themeSettings","newAppTheme","AppBackgroundTab","setBackgroundDocument","isArray","baseColors","hsvTemp1","hsvTemp2","newAccentRgb","newAccentHex","messageLightenAlpha","baseMessageColor","baseMessageOutBackgroundColor","myMessagesAccent","nextColor","accentColor2","outbox_accent_color","newMessageOutBackgroundColor","workerHandler","construct","args","url","location","Worker","SharedWorker","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","Node","nodes","rootScope","getProxiedManagers","getElementById","href","singleInstance","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","onInResize","hasFocus","onOutResize","console","log","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","promise","opacity","state","isPremium","appVersion","lang_code","dir","hash","tgWebAuthToken","data","token","dcId","tgWebAuthDcId","userId","tgWebAuthUserId","toUserId","isTest","tgWebAuthTest","tgAddr","tgaddr","urlSearchParams","URLSearchParams","set","delete","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","DEBUG_MANAGER_REQUESTS","createProxyProxy","proxied","ack","get","receiver","method","warn","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","entryName","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","setLangCode","langCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","web","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","weakMap","update","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","formatted","arg","pushNextArgument","plain","str","select","Map","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","property","IntlElement","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","TOPIC_COLORS","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","SKIP_VALIDATING_PATHS","validateInitObject","missingKey","migrated","oldThemes","oldTheme","oldBackground","background","newTheme","colors","wallPaperSettings","animationsEnabled","autoPlay","videos","gifs","k_build","ApiManagerProxy","onMirrorTask","payload","hasOwnProperty","mirrors","mirror","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","pingServiceWorkerWithIframe","pingServiceWorkerPromise","iframe","hidden","onLoad","remove","src","random","body","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","hello","resendLockTask","share","originals","originalUrl","createWorker","attachWorkerToPort","cryptoMessagePort","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tsNow","tgme_sync","path","encodeURIComponent","script","onload","appendChild","loadScript","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","ignorePushByMid","peerId","mid","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","postMessage","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","task","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PASS_SINGLE_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","wrapUrl","unsafe","tgMeMatch","telescoPeMatch","tgMatch","u","prefix","fullPath","RootScope","myId","connectionStatus","premium","isNew","dispatchEventSingle","status","getConnectionStatus","getPremium","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","chunkId","reduce","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","baseURI","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}