tweb/public/main.85ca1b655a5282e63dcd.b...

1 line
496 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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

{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/rootScope.ts","webpack:///./src/config/debug.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/helpers/object/copy.ts","webpack:///./src/lib/logger.ts","webpack:///./src/config/app.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/lib/langPack.ts","webpack:///./src/helpers/string/capitalizeFirstLetter.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/mtprotoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/config/modes.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/lib/stateStorage.ts","webpack:///./src/lib/idb.ts","webpack:///./src/lib/storage.ts","webpack:///./src/helpers/context.ts","webpack:///./src/environment/touchSupport.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/helpers/object/safeAssign.ts","webpack:///./src/helpers/object/isObject.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/random.ts","webpack:///./src/helpers/schedulers/throttle.ts","webpack:///./src/environment/emojiSupport.ts","webpack:///./src/helpers/compareVersion.ts","webpack:///./src/lib/appManagers/appRuntimeManager.ts","webpack:///./src/config/emoji.ts","webpack:///./src/vendor/emoji/regex.ts","webpack:///./src/config/tld.ts","webpack:///./src/lib/richtextprocessor.ts","webpack:///./src/vendor/emoji/index.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/helpers/string/encodeEntities.ts","webpack:///./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack:///./src/helpers/dom/fixSafariStickyInput.ts","webpack:///./src/helpers/dom/cancelEvent.ts","webpack:///./src/helpers/dom/findUpClassName.ts","webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/helpers/getTimeFormat.ts","webpack:///./src/helpers/object/setDeepProperty.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/helpers/date.ts","webpack:///./src/helpers/dom/blurActiveElement.ts","webpack:///./src/helpers/array/findAndSplice.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/object/deepEqual.ts","webpack:///./src/helpers/dom/loadFonts.ts","webpack:///./src/helpers/tsNow.ts","webpack:///./src/helpers/restrictions.ts","webpack:///./src/helpers/object/getDeepProperty.ts","webpack:///./src/environment/webpSupport.ts","webpack:///./src/helpers/blob/blobConstruct.ts","webpack:///./src/helpers/blob/blobSafeMimeType.ts","webpack:///./src/lib/mtproto/telegramMeWebManager.ts","webpack:///./src/helpers/object/validateInitObject.ts","webpack:///./src/lib/mtproto/singleInstance.ts","webpack:///./src/lib/mtproto/webPushApiManager.ts","webpack:///./src/helpers/bytes/bufferConcats.ts","webpack:///./src/lib/webp/webp.worker.ts","webpack:///./src/lib/webp/webpWorkerController.ts","webpack:///./src/helpers/setWorkerProxy.ts","webpack:///./src/helpers/peerIdPolyfill.ts","webpack:///./src/lib/polyfill.ts","webpack:///./src/index.ts","webpack:///./src/helpers/dom/toggleAttributePolyfill.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","9","jsonpScriptSrc","__webpack_require__","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","error","Error","script","loadScript","src","retries","onScriptComplete","document","createElement","charset","timeout","nc","setAttribute","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","cacheBust","Date","now","retryScript","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice","s","RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","addEventListener","peerId","body","classList","toggle","id","myId","status","_themeColorElem","querySelector","color","themeColor","isNight","themeColorElem","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","colorScheme","documentElement","setThemeColor","isOverlayActive","getTheme","settings","theme","themes","find","rootScope","DEBUG","debug","MOUNT_CLASS_TO","self","USER_AGENT","navigator","userAgent","IS_APPLE","search","IS_ANDROID","toLowerCase","indexOf","IS_APPLE_MOBILE","test","vendor","platform","maxTouchPoints","MSStream","IS_SAFARI","match","IS_FIREFOX","IS_MOBILE_SAFARI","IS_MOBILE","copy","obj","getTime","Array","isArray","map","el","clonedObj","constructor","prop","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","_logTimer","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","split","splitted","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","args","forEach","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","App","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","keys","delete","enabled","set","clear","taskId","tasks","STORAGES","storage","result","task","payload","apply","proxy","sessionStorage","appStorage","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lastRequestedLangCode","then","lang","langSign","countries","strings","formatLocalStrings","default","saveLangPack","_","from_version","lang_code","local","loadLangPack","langCode","requestedServerLanguage","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","concat","string","appVersion","stateStorage","applyLangPack","Intl","PluralRules","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","from","querySelectorAll","element","instance","weakMap","update","superFormatter","input","indexHolder","out","lastIndex","replace","p1","p2","p3","p4","offset","append","idx","text","url","a","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","textContent","arg","pushNextArgument","plain","str","select","item","Node","join","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","invokeApi","_Intl","assign","WeakMap","IntlElementBase","options","add","IntlElement","safeAssign","formatted","dataset","deepEqual","json","DateTimeFormat","hours","getHours","getMinutes","charAt","toUpperCase","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","arr","isLast","useLast","joined","Worker_fn","Worker","dcId","logSuffix","handleOpen","handleError","close","handleClose","removeListeners","handleMessage","byteLength","send","ws","logTypes","connect","removeEventListener","WebSocket","binaryType","apiManagerProxy","performTaskWorker","afterMessageIdTemp","awaiting","pending","updatesProcessor","hashes","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","isSWRegistered","sockets","taskListeners","taskListenersSW","postMessagesWaiting","onWorkerMessage","isObject","callback","progress","finalizeTask","singleInstance","start","registerServiceWorker","addTaskListener","toggleStorage","race","telegramMeWebManager","setAuthorized","pause","webPushApiManager","forceUnsubscribe","cacheName","caches","appRuntimeManager","reload","webpWorkerController","postMessage","socketTask","socket","onOpen","onClose","onMessage","buffer","storageTask","res","language","performTaskWorkerVoid","forceReconnectTimeout","registerWorker","getConfig","worker","serviceWorker","register","scope","registration","installing","waiting","active","onServiceWorkerFail","warn","releasePending","controller","addServiceWorkerTaskListener","responseTask","uploadFile","postSWMessage","originalPayload","isWebpSupported","onWorkerFirstMessage","once","deferred","taskName","createTask","performTaskWorkerNew","params","prepareTempMessageId","messageId","queryJSON","cached","invokeApiSingleProcess","processResult","includes","q","processError","cacheKey","oldPromise","size","override","fulfilled","cacheSeconds","timestamp","verify","queueId","userAuth","dcID","toPeerId","user","setUserAuth","dc_id","fileName","getConfigPromise","overwrite","appConfig","getAppConfigPromise","ignore_restriction_reasons","Modes","http","ssl","multipleConnections","asServiceWorker","transport","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","addNotifyListener","catch","cancel","db","storeName","storageIsAvailable","openDatabase","preserve","onclose","createNew","openDbPromise","indexedDB","open","finished","onsuccess","calledNew","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","entryName","getObjectStore","objectStore","put","blob","Blob","blobConstruct","save","perf","performance","oncomplete","results","requests","getAll","noop","getPromises","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","throttle","values","deleteThrottled","getThrottled","getFromCache","canUseStorage","setToCache","names","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","clients","matchAll","includeUncontrolled","listener","notifyWorker","notifySomeone","IS_TOUCH_SUPPORTED","DocumentTouch","EventListenerBase","reuseResults","_constructor","listenerResults","pop","collectResults","findIndex","_dispatchEvent","ms","fromObject","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","arrays","8","Uint8Array","16","Uint16Array","32","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","IS_EMOJI_SUPPORTED","compareVersion","v1","v2","s1","s2","focus","EmojiVersions","Emoji","alphaCharsRegExp","urlAlphanumericRegExpPart","urlRegExp","urlProtocolRegExpPart","urlAnyProtocolRegExp","RegExp","fullRegExp","emailRegExp","markdownRegExp","siteHashtags","Telegram","Twitter","Instagram","markdownEntities","passConflictingEntities","RichTextProcessor","getEmojiUnified","emojiCode","unified","parseEntities","raw","entities","matchIndex","rawOffset","protocol","tld","substr","balanced","checkBrackets","unicode","unsafe","findConflictingEntity","currentEntities","newEntity","currentEntity","has","mergeEntities","newEntities","filtered","filter","sortEntities","entity","nextEntity","PHONE_NUMBER_REG_EXP","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","isSOH","user_id","toUserId","newText","splice","combineSameEntities","diff","Math","max","CAN_COMBINE_ENTITIES","nextEntityIdx","_i","sort","b","setBlankToAnchor","anchor","rel","wrapRichText","fragment","createDocumentFragment","nasty","usedLength","passEntities","contextSite","contextExternal","textLength","lastElement","lastEntity","startOffset","endOffset","endPartOffset","min","fullEntityText","partText","usedText","noTextFormat","wrappingDraft","fontWeight","fontStyle","styleName","cssText","fontFamily","className","noLinks","bot","atPos","command","fromBot","encodeEntities","encodeURIComponent","isSupported","masked","wrapped","currentContext","electronHelpers","contextUrl","hashtag","follow","username","before","spoilerAfter","spoiler","after","container","parentElement","voodoo","urlLength","urlOpenBrackets","urlCloseBrackets","chars","charsLength","char","charCodeAt","wrapEmojiText","isDraft","tgMeMatch","telescoPeMatch","tgMatch","fullPath","path","getEmojiEntityFromEmoji","emoji","fixEmoji","end","wrapDraftText","messageEntityTextUrl","messageEntityMentionName","wrapPlainText","noEncoding","noLinebreaks","matchUrl","matchEmail","getAbbreviation","onlyFirst","first","isUsernameValid","wrapSingleEmoji","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","previous","toString","getEmojiToneIndex","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","prev","curr","fromCodePoint","parseInt","ctx","IS_STICKY_INPUT_BUGGED","startY","capture","passive","onTouchMove","touch","touches","scrollable","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","round","preventDefault","lastFocusOutTimeStamp","timeStamp","touchStart","activeElement","blur","fixSafariStickyInputFocusing","fixSafariStickyInput","transform","cancelEvent","originalEvent","stopPropagation","returnValue","cancelBubble","findUpClassName","closest","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","recentEmoji","topPeersCache","recentSearch","authState","hiddenPinnedMessages","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","big","background","slug","highlightningColor","intensity","notifications","sound","toLocaleString","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","ALL_KEYS","REFRESH_KEYS","neededPeers","singlePeerMap","storages","users","chats","dialogs","storagesResults","loadSavedState","requestPeerSingle","loaded","time","storagesKeys","storagesPromises","state","pushToState","auth","shiftedWebKAuth","state_id","nightTheme","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","validateInitObject","missingKey","migrated","newTheme","timeEnd","getDeepProperty","setDeepProperty","direct","setKeyValueToStorage","limit","keepPeerSingle","keepPeerIdSingle","requestPeer","existsPeerId","appStateManager","fastRafCallbacks","fastRaf","requestAnimationFrame","currentCallbacks","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","months","days","ONE_DAY","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","formatDateAccordingToTodayNew","today","year","day","month","weekday","formatFullSentTimeRaw","timeEl","formatTime","dateEl","capitalize","textTransform","formatFullSentTime","getFullDate","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","setFullYear","minDate","maxDate","title","dayOfWeek","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","blurActiveElement","findAndSplice","x","ok","tx","every","texts","fonts","icons","monospace","loadFonts","types","_texts","font","weights","weight","_promises","load","tsNow","seconds","platforms","ignore","getRestrictionReason","reasons","reason","isRestricted","ignoreRestrictionReasons","IS_WEBP_SUPPORTED","toDataURL","startsWith","blobParts","mimeType","safeMimeType","blobSafeMimeType","bb","BlobBuilder","blobPart","getBlob","TelegramMeWebManager","disabled","canRedirect","curValue","ts","tgme_sync","remove","initObject","currentObject","onReplace","previousKey","clearInstance","masterInstance","deactivateInstance","deactivateTimeout","checkInstance","newInstance","instanceID","curInstance","xt_instance","startAll","initial","stopAll","started","reset","WebPushApiManager","isAvailable","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","ready","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","unsubscribe","successful","newSettings","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","bufferConcats","tmp","lastLength","ArrayBuffer","convertPromises","bytes","init","convertPromise","setWorkerProxy","workerProxy","Proxy","construct","toChatId","isChat","isPeerId","Number","abs","onFinally","Element","toggleAttribute","force","hasAttribute","removeAttribute","w","visualViewport","lastVH","setViewportVH","setVH","vh","height","innerHeight","setProperty","toggleResizeMode","tabId","wasTabId","tagName","langPromise","getState","fadeInWhenFontsReady","elem","opacity","setThemeListener","getElementById","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","mount","sentCode","authCode"],"mappings":"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c,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE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","file":"main.85ca1b655a5282e63dcd.bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t9: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"10\":\"npm.qr-code-styling\"}[chunkId]||chunkId) + \".\" + {\"0\":\"32932e6b1ccf767530d6\",\"1\":\"a451f0e324b6f1ae635f\",\"2\":\"c6719cf29f278d18da90\",\"3\":\"fd4a457d3edbe045f3c5\",\"4\":\"73d6f3573b27676bc073\",\"5\":\"44ee5fc0c0956efac27b\",\"6\":\"f77fd13ca8dced461af7\",\"7\":\"5f548bb1b833747ed1cb\",\"8\":\"f44261a125fd436f2604\",\"10\":\"8a5c1af00a34aad13da9\",\"11\":\"cf26eb898030414134cb\",\"12\":\"e359dd53060d4015fdd7\",\"13\":\"a125878dbc205a62574c\",\"14\":\"e9b9c7ff17c0914d18bc\",\"15\":\"24491ae227713b8f77c1\",\"16\":\"0918f0072a790bb43766\",\"17\":\"a2e053ec4aa9ce260242\",\"18\":\"19abbab9479978924d76\",\"19\":\"f7182b122a15cfe83c25\",\"20\":\"6096df8f14772978d7c3\",\"21\":\"01da4c39b75c80344eb7\",\"22\":\"0a628e2d4248ba9d2bc6\",\"23\":\"6be0d0c4a28ca0d0952b\",\"24\":\"3dbb6c36f540f3e15be0\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tfunction loadScript(src, retries) {\n \t\t\t\t var script = document.createElement('script');\n \t\t\t\t var retryAttempt = 999999 - retries + 1;\n \t\t\t\t var retryAttemptString = '&retry-attempt=' + retryAttempt;\n \t\t\t\t var onScriptComplete;\n\n \t\t\t\t script.charset = 'utf-8';\n \t\t\t\t script.timeout = 120;\n \t\t\t\t if (__webpack_require__.nc) {\n \t\t\t\t script.setAttribute('nonce', __webpack_require__.nc);\n \t\t\t\t }\n \t\t\t\t script.src = src;\n\n \t\t\t\t onScriptComplete = function(event) {\n \t\t\t\t // avoid mem leaks in IE.\n \t\t\t\t script.onerror = script.onload = null;\n \t\t\t\t clearTimeout(timeout);\n \t\t\t\t var chunk = installedChunks[chunkId];\n \t\t\t\t if (chunk !== 0) {\n \t\t\t\t if (chunk) {\n \t\t\t\t if (retries === 0) {\n \t\t\t\t var errorType =\n \t\t\t\t event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t var realSrc = event && event.target && event.target.src;\n \t\t\t\t error.message =\n \t\t\t\t 'Loading chunk ' +\n \t\t\t\t chunkId +\n \t\t\t\t ' failed after 999999 retries.\\n(' +\n \t\t\t\t errorType +\n \t\t\t\t ': ' +\n \t\t\t\t realSrc +\n \t\t\t\t ')';\n \t\t\t\t error.name = 'ChunkLoadError';\n \t\t\t\t error.type = errorType;\n \t\t\t\t error.request = realSrc;\n \t\t\t\t chunk[1](error);\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t } else {\n \t\t\t\t setTimeout(function() {\n \t\t\t\t var cacheBust = (function() {\n \t\t\t\t return Date.now();\n \t\t\t\t })();\n \t\t\t\t +retryAttemptString;\n \t\t\t\t var retryScript = loadScript(\n \t\t\t\t jsonpScriptSrc(chunkId) + '?' + cacheBust,\n \t\t\t\t retries - 1\n \t\t\t\t );\n \t\t\t\t document.head.appendChild(retryScript);\n \t\t\t\t }, 0);\n \t\t\t\t }\n \t\t\t\t } else {\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t }\n \t\t\t\t }\n \t\t\t\t };\n \t\t\t\t var timeout = setTimeout(function() {\n \t\t\t\t onScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t }, 120000);\n \t\t\t\t script.onerror = script.onload = onScriptComplete;\n \t\t\t\t return script;\n \t\t\t\t}\n\n \t\t\t\tvar script = loadScript(jsonpScriptSrc(chunkId), 999999);\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonp\"] = this[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 56);\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, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap, MessageReactions, ReactionCount } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type { AppMediaPlaybackController } from \"../components/appMediaPlaybackController\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\nimport type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\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, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\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': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set<number>},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\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': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': ReturnType<AppMediaPlaybackController['getPlayingDetails']>,\n 'media_pause': void,\n 'media_playback_params': ReturnType<AppMediaPlaybackController['getPlaybackParams']>,\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\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},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': 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<NotifyPeer['_'], 'notifyPeer'>, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: CallInstance},\n 'call_accepting': CallInstance, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n 'call_incompatible': UserId,\n\n 'quick_reaction': string,\n\n 'missed_reactions_element': {message: Message.message, changedResults: ReactionCount[]},\n\n 'service_notification': Update.updateServiceNotification\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial<Config.config> = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n 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(this.myId) {\n this.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 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 }\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('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\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 */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */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;\r\n","export default function copy<T>(obj: T): T {\n //in case of premitives\n if(obj === null || typeof(obj) !== \"object\") {\n return obj;\n }\n \n //date objects should be \n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n \n //handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\n return clonedArr;\n }\n \n //lastly, handle objects\n // @ts-ignore\n let clonedObj = new obj.constructor();\n for(var prop in obj){\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\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 DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '<anonymous>';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.4.0',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage<Storage extends Record<string, any>> {\r\n private prefix = '';\r\n private cache: Partial<Storage> = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get<T extends keyof Storage>(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial<Storage>, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial<Storage> = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController<Storage extends Record<string, any>> {\r\n private static STORAGES: LocalStorageController<any>[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage<Storage>;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy<T>(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise<T>((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get<T extends keyof Storage>(key: T, useCache?: boolean) {\r\n return this.proxy<Storage[T]>('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial<Storage>, onlyLocal?: boolean) {\r\n return this.proxy<void>('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy<void>('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy<void>('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy<void>('toggleStorage', enabled);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\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 DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\nimport type lang from \"../lang\";\nimport type langSign from \"../langSign\";\nimport type { State } from \"./appManagers/appStateManager\";\nimport { HelpCountriesList, HelpCountry, LangPackDifference, LangPackString } from \"../layer\";\nimport apiManager from \"./mtproto/mtprotoworker\";\nimport stateStorage from \"./stateStorage\";\nimport App from \"../config/app\";\nimport rootScope from \"./rootScope\";\nimport RichTextProcessor from \"./richtextprocessor\";\nimport { IS_MOBILE } from \"../environment/userAgent\";\nimport deepEqual from \"../helpers/object/deepEqual\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport capitalizeFirstLetter from \"../helpers/string/capitalizeFirstLetter\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.video_in_ok\": \"ChatList.Service.VideoCall.incoming\",\n\t\"messageActionPhoneCall.video_out_ok\": \"ChatList.Service.VideoCall.outgoing\",\n\t\"messageActionPhoneCall.video_missed\": \"ChatList.Service.VideoCall.Missed\",\n\t\"messageActionPhoneCall.video_cancelled\": \"ChatList.Service.VideoCall.Cancelled\",\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.cancelled\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"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\texport const strings: Map<LangPackKey, LangPackString> = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise<LangPackDifference>;\n\texport let lastRequestedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\texport function getCacheLangPack(): Promise<LangPackDifference> {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise<LangPackDifference>,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\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(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[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\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n\t\tlastRequestedLangCode = defaultCode;\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string) {\n\t\trequestedServerLanguage = true;\n\t\treturn Promise.all([\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: App.langPack\n\t\t\t}),\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tapiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise<HelpCountriesList.helpCountriesList>,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string) {\n\t\tlastRequestedLangCode = langCode;\n\t\treturn loadLangPack(langCode).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach(l => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(langPack1.strings);\n\n\t\t\tfor(const string of langPack2.strings) {\n\t\t\t\tstrings.push(string);\n\t\t\t}\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach(country => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== langPack.lang_code) {\n\t\t\trootScope.dispatchEvent('language_change', langPack.lang_code);\n\t\t\tlastAppliedLangCode = langPack.lang_code;\n cachedDateTimeFormats.clear();\n updateAmPm();\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach(element => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType<typeof superFormatter>, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude<FormatterArgument, FormatterArgument[]>[] {\n\t\tlet out: ReturnType<typeof superFormatter> = [];\n\t\tconst regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n let element: HTMLElement;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n element = document.createElement('b');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n\t\t\t\t}\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && RichTextProcessor.matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = RichTextProcessor.wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType<typeof superFormatter>;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType<typeof superFormatter> | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\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\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap<HTMLElement, IntlElementBase<IntlElementBaseOptions>> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n\t};\n\n\tabstract class IntlElementBase<Options extends IntlElementBaseOptions> {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'];\n\t\n\t\tconstructor(options?: Options) {\n\t\t\tthis.element = options?.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\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\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey?: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase<IntlElementOptions> {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\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\t}\n\n const cachedDateTimeFormats: Map<string, Intl.DateTimeFormat> = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n let json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n cachedDateTimeFormats.set(json, dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-' + timeFormat, options));\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate?: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase<IntlDateElementOptions> {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n let 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\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\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\tconst 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\treturn 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\tconst 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","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"mtproto.worker.1991be6aa417d5efa583.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType<typeof logger>;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\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 { LocalStorageProxyTask, LocalStorageProxyTaskResponse } from '../localStorage';\n//import type { LocalStorageProxyDeleteTask, LocalStorageProxySetTask } from '../storage';\nimport type { Awaited, InvokeApiOptions, WorkerTaskVoidTemplate } from '../../types';\nimport type { Config, InputFile, JSONValue, MethodDeclMap, User } from '../../layer';\nimport MTProtoWorker from 'worker-loader!./mtproto.worker';\n//import './mtproto.worker';\nimport CryptoWorkerMethods, { CryptoMethods } from '../crypto/crypto_methods';\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport { ApiFileManager, DownloadOptions } from './apiFileManager';\nimport type { RequestFilePartTask, RequestFilePartTaskResponse, ServiceWorkerTask } from '../serviceWorker/index.service';\nimport { UserAuth } from './mtproto_config';\nimport type { MTMessage } from './networker';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport Socket from './transports/websocket';\nimport singleInstance from './singleInstance';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport AppStorage from '../storage';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport { SocketProxyTask } from './transports/socketProxied';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport { CacheStorageDbName } from '../cacheStorage';\nimport pause from '../../helpers/schedulers/pause';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport type { ApiError } from './apiManager';\nimport { MTAppConfig } from './appConfig';\nimport { ignoreRestrictionReasons } from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\n\ntype Task = {\n taskId: number,\n task: string,\n args: any[]\n};\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport interface ToggleStorageTask extends WorkerTaskVoidTemplate {\n type: 'toggleStorage',\n payload: boolean\n};\n\nexport class ApiManagerProxy extends CryptoWorkerMethods {\n public worker: /* Window */Worker;\n private afterMessageIdTemp = 0;\n\n private taskId = 0;\n private awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskName: string\n }\n } = {} as any;\n private pending: Array<Task> = [];\n\n public updatesProcessor: (obj: any) => void = null;\n\n private log = logger('API-PROXY');\n\n private hashes: {[method: string]: HashOptions} = {};\n\n private apiPromisesSingleProcess: {\n [q: string]: Map<any, Promise<any>>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise<any>\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise<any>,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n private isSWRegistered = true;\n\n private debug = DEBUG /* && false */;\n\n private sockets: Map<number, Socket> = new Map();\n\n private taskListeners: {[taskType: string]: (task: any) => void} = {};\n private taskListenersSW: {[taskType: string]: (task: any) => void} = {};\n\n public onServiceWorkerFail: () => void;\n\n private postMessagesWaiting: any[][] = [];\n\n private getConfigPromise: Promise<Config.config>;\n private getAppConfigPromise: Promise<MTAppConfig>;\n\n constructor() {\n super();\n this.log('constructor');\n\n singleInstance.start();\n\n this.registerServiceWorker();\n\n this.addTaskListener('clear', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n AppStorage.toggleStorage(false), \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 this.addTaskListener('connectionStatusChange', (task: any) => {\n rootScope.dispatchEvent('connection_status_change', task.payload);\n });\n\n this.addTaskListener('convertWebp', (task) => {\n webpWorkerController.postMessage(task);\n });\n\n this.addTaskListener('socketProxy', (task: SocketProxyTask) => {\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 this.addTaskListener('localStorageProxy', (task: LocalStorageProxyTask) => {\n const storageTask = task.payload;\n // @ts-ignore\n sessionStorage[storageTask.type](...storageTask.args).then(res => {\n this.postMessage({\n type: 'localStorageProxy',\n id: task.id,\n payload: res\n } as LocalStorageProxyTaskResponse);\n });\n });\n\n rootScope.addEventListener('language_change', (language) => {\n this.performTaskWorkerVoid('setLanguage', language);\n });\n\n window.addEventListener('online', (event) => {\n this.forceReconnectTimeout();\n });\n\n \n this.registerWorker();\n \n\n setTimeout(() => {\n this.getConfig();\n }, 5000);\n }\n\n public isServiceWorkerOnline() {\n return this.isSWRegistered;\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n \n const worker = navigator.serviceWorker;\n worker.register('./sw.js', {scope: './'}).then(registration => {\n this.log('SW registered', registration);\n this.isSWRegistered = true;\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n //this.postSWMessage = worker.controller.postMessage.bind(worker.controller);\n\n \n \n \n \n }, (err) => {\n this.isSWRegistered = false;\n this.log.error('SW registration failed!', err);\n\n if(this.onServiceWorkerFail) {\n this.onServiceWorkerFail();\n }\n });\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n this.releasePending();\n\n worker.controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n worker.addEventListener('message', (e) => {\n const task: ServiceWorkerTask = e.data;\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListenersSW[task.type];\n if(callback) {\n callback(task);\n }\n });\n\n this.addServiceWorkerTaskListener('requestFilePart', (task: RequestFilePartTask) => {\n const responseTask: RequestFilePartTaskResponse = {\n type: task.type,\n id: task.id\n };\n \n this.performTaskWorker<Awaited<ReturnType<ApiFileManager['requestFilePart']>>>('requestFilePart', ...task.payload)\n .then((uploadFile) => {\n responseTask.payload = uploadFile;\n this.postSWMessage(responseTask);\n }, (err) => {\n responseTask.originalPayload = task.payload;\n responseTask.error = err;\n this.postSWMessage(responseTask);\n });\n });\n\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n public postMessage(...args: any[]) {\n this.postMessagesWaiting.push(args);\n }\n\n public postSWMessage(message: any) {\n if(navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage(message);\n }\n }\n\n private onWorkerFirstMessage(worker: any) {\n if(!this.worker) {\n this.worker = worker;\n this.log('set webWorker');\n\n this.postMessage = this.worker.postMessage.bind(this.worker);\n\n this.postMessagesWaiting.forEach(args => this.postMessage(...args));\n this.postMessagesWaiting.length = 0;\n\n const isWebpSupported = IS_WEBP_SUPPORTED;\n this.log('WebP supported:', isWebpSupported);\n this.postMessage({type: 'webpSupport', payload: isWebpSupported});\n this.postMessage({type: 'userAgent', payload: navigator.userAgent});\n\n this.releasePending();\n }\n }\n\n public addTaskListener(name: keyof ApiManagerProxy['taskListeners'], callback: ApiManagerProxy['taskListeners'][typeof name]) {\n this.taskListeners[name] = callback;\n }\n\n public addServiceWorkerTaskListener(name: keyof ApiManagerProxy['taskListenersSW'], callback: ApiManagerProxy['taskListenersSW'][typeof name]) {\n this.taskListenersSW[name] = callback;\n }\n\n private onWorkerMessage = (e: MessageEvent) => {\n //this.log('got message from worker:', e.data);\n\n const task = e.data;\n\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListeners[task.type];\n if(callback) {\n callback(task);\n return;\n }\n\n if(task.update) {\n if(this.updatesProcessor) {\n this.updatesProcessor(task.update);\n }\n } else if(task.progress) {\n rootScope.dispatchEvent('download_progress', task.progress);\n } else if(task.hasOwnProperty('result') || task.hasOwnProperty('error')) {\n this.finalizeTask(task.taskId, task.result, task.error);\n }\n };\n\n \n private registerWorker() {\n // return;\n\n const worker = new MTProtoWorker();\n // const worker = new Worker(new URL('./mtproto.worker.ts', import.meta.url));\n //const worker = window;\n worker.addEventListener('message', this.onWorkerFirstMessage.bind(this, worker), {once: true});\n worker.addEventListener('message', this.onWorkerMessage);\n\n worker.addEventListener('error', (err) => {\n this.log.error('WORKER ERROR', err);\n });\n }\n \n\n private finalizeTask(taskId: number, result: any, error: any) {\n const deferred = this.awaiting[taskId];\n if(deferred !== undefined) {\n this.debug && this.log.debug('done', deferred.taskName, result, error);\n error ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n }\n }\n\n private createTask(task: string, type: string, args: any[]): any {\n return {\n task,\n taskId: this.taskId++,\n type,\n args,\n };\n }\n\n public performTaskWorkerVoid(taskName: string, ...args: any[]) {\n const task = this.createTask(taskName, undefined, args);\n this.pending.push(task);\n this.releasePending();\n }\n\n public performTaskWorkerNew<T>(taskName: string, type: string, ...args: any[]) {\n this.debug && this.log.debug('start', taskName, args);\n\n return new Promise<T>((resolve, reject) => {\n const task = this.createTask(taskName, type, args);\n this.pending.push(task);\n this.awaiting[task.taskId] = {resolve, reject, taskName: taskName};\n this.releasePending();\n });\n }\n\n public performTaskWorker<T>(task: string, ...args: any[]) {\n return this.performTaskWorkerNew<T>(task, undefined, ...args);\n }\n\n private releasePending() {\n //return;\n\n if(this.postMessage) {\n this.debug && this.log.debug('releasing tasks, length:', this.pending.length);\n this.pending.forEach(pending => {\n this.postMessage(pending);\n });\n \n this.debug && this.log.debug('released tasks');\n this.pending.length = 0;\n }\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n \n public invokeCrypto<Method extends keyof CryptoMethods>(method: Method, ...args: Parameters<CryptoMethods[typeof method]>): Promise<Awaited<ReturnType<CryptoMethods[typeof method]>>> {\n return this.performTaskWorkerNew(method, 'crypto', ...args);\n }\n \n\n public invokeApi<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise<MethodDeclMap[T]['res']> {\n //console.log('will invokeApi:', method, params, options);\n return this.performTaskWorker('invokeApi', method, params, options);\n }\n\n public invokeApiAfter<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise<MethodDeclMap[T]['res']> {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n \n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n //console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable<T extends keyof MethodDeclMap, R>(o: {\n method: T, \n processResult?: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: Omit<MethodDeclMap[T]['req'], 'hash'>, \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise<R> {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n //console.log('will invokeApi:', method, params, options);\n\n const {params, options, method} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n \n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n \n if(!this.hashes[method]) this.hashes[method] = {};\n this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n return o.processResult(result);\n }\n \n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise<MethodDeclMap[T]['res']> {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess<T extends keyof MethodDeclMap, R>(o: {\n method: T, \n processResult: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'], \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise<R> {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n \n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise<R> = originalPromise.then(processResult, processError);\n\n const p = newPromise.finally(() => {\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise<MethodDeclMap[T]['res']> {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = window.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache<T extends keyof MethodDeclMap>(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n \n delete cache[queryJSON];\n }\n } catch(err) {\n this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n /* private computeHash(smth: any[]) {\n smth = smth.slice().sort((a, b) => a.id - b.id);\n //return smth.reduce((hash, v) => (((hash * 0x4F25) & 0x7FFFFFFF) + v.id) & 0x7FFFFFFF, 0);\n return smth.reduce((hash, v) => ((hash * 20261) + 0x80000000 + v.id) % 0x80000000, 0);\n } */\n\n public setBaseDcId(dcId: number) {\n return this.performTaskWorker('setBaseDcId', dcId);\n }\n\n public setQueueId(queueId: number) {\n return this.performTaskWorker('setQueueId', queueId);\n }\n\n public setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n \n rootScope.dispatchEvent('user_auth', userAuth);\n return this.performTaskWorker('setUserAuth', userAuth);\n }\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n public getNetworker(dc_id: number, options?: InvokeApiOptions) {\n return this.performTaskWorker('getNetworker', dc_id, options);\n }\n\n public logOut(): Promise<void> {\n // AppStorage.toggleStorage(false);\n return this.performTaskWorker('logOut');\n }\n\n public cancelDownload(fileName: string) {\n return this.performTaskWorker('cancelDownload', fileName);\n }\n\n public downloadFile(options: DownloadOptions) {\n return this.performTaskWorker<Blob>('downloadFile', options);\n }\n\n public uploadFile(options: {file: Blob | File, fileName: string}) {\n return this.performTaskWorker<InputFile>('uploadFile', options);\n }\n\n public toggleStorage(enabled: boolean) {\n const task: ToggleStorageTask = {type: 'toggleStorage', payload: enabled};\n this.postMessage(task);\n this.postSWMessage(task);\n }\n\n public stopAll() {\n return this.performTaskWorkerVoid('stopAll');\n }\n\n public startAll() {\n return this.performTaskWorkerVoid('startAll');\n }\n\n public forceReconnectTimeout() {\n this.postMessage({type: 'online'});\n }\n\n public forceReconnect() {\n this.postMessage({type: 'forceReconnect'});\n }\n\n public getConfig() {\n if(this.getConfigPromise) return this.getConfigPromise;\n return this.getConfigPromise = this.invokeApi('help.getConfig').then(config => {\n rootScope.config = config;\n return config;\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(rootScope.appConfig && !overwrite) return rootScope.appConfig;\n if(this.getAppConfigPromise && !overwrite) return this.getAppConfigPromise;\n const promise: Promise<MTAppConfig> = this.getAppConfigPromise = this.invokeApi('help.getAppConfig').then((config: MTAppConfig) => {\n if(this.getAppConfigPromise !== promise) {\n return this.getAppConfigPromise;\n }\n \n rootScope.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n return config;\n });\n\n return promise;\n }\n}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type bytesModPow from \"../../helpers/bytes/bytesModPow\";\r\nimport type gzipUncompress from \"../../helpers/gzipUncompress\";\r\nimport type { Awaited } from \"../../types\";\r\nimport type getEmojisFingerprint from \"../calls/helpers/getEmojisFingerprint\";\r\nimport type computeDhKey from \"./computeDhKey\";\r\nimport type generateDh from \"./generateDh\";\r\nimport type computeSRP from \"./srp\";\r\nimport type { aesEncryptSync, aesDecryptSync } from \"./utils/aesIGE\";\r\nimport type factorizeBrentPollardPQ from \"./utils/factorize/BrentPollard\";\r\n// import type factorizeTdlibPQ from \"./utils/factorize/tdlib\";\r\nimport type pbkdf2 from \"./utils/pbkdf2\";\r\nimport type rsaEncrypt from \"./utils/rsa\";\r\nimport type sha1 from \"./utils/sha1\";\r\nimport type sha256 from \"./utils/sha256\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1': typeof sha1,\r\n 'sha256': typeof sha256,\r\n 'pbkdf2': typeof pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': typeof factorizeTdlibPQ,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP,\r\n 'generate-dh': typeof generateDh,\r\n 'compute-dh-key': typeof computeDhKey,\r\n 'get-emojis-fingerprint': typeof getEmojisFingerprint\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker<T>(task: string, ...args: any[]): Promise<T>;\r\n\r\n public invokeCrypto<Method extends keyof CryptoMethods>(\r\n method: Method, \r\n ...args: Parameters<CryptoMethods[typeof method]>\r\n ): Promise<Awaited<ReturnType<CryptoMethods[typeof method]>>> {\r\n return this.performTaskWorker<Awaited<ReturnType<CryptoMethods[typeof method]>>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise<T> extends Promise<T> {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise<T>() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise<T> = new Promise<T>((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise<ReturnType<typeof resolve>>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { ChatSavedPosition } from './appManagers/appImManager';\r\nimport type { State } from './appManagers/appStateManager';\r\nimport type { AppDraftsManager } from './appManagers/appDraftsManager';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport { LangPackDifference } from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nconst stateStorage = new AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE>(DATABASE_STATE, 'session');\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage<T extends Database<any>> {\r\n private static STORAGES: IDBStorage<Database<any>>[] = [];\r\n private openDbPromise: Promise<IDBDatabase>;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType<typeof logger>;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage<Database<any>>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise<void>((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise<IDBDatabase> {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise<IDBDatabase>((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise<void> {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage<T>['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise<Blob> {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise<Blob>((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get<T>(entryName: string[]): Promise<T[]>;\r\n public get<T>(entryName: string): Promise<T>;\r\n public get<T>(entryName: string | string[]): Promise<T> | Promise<T[]> {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore<T>('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore<T>(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise<T>((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll<T>(): Promise<T[]> {\r\n return this.getObjectStore<T[]>('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise<Array<string>> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise<boolean> {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../config/databases\";\r\n//import DATABASE_SESSION from \"../config/databases/session\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n//import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from \"./idb\";\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nexport default class AppStorage<Storage extends Record<string, any>, T extends Database<any>/* Storage extends {[name: string]: any} *//* Storage extends Record<string, any> */> {\r\n private static STORAGES: AppStorage<any, Database<any>>[] = [];\r\n private storage: IDBStorage<T>;//new CacheStorageController('session');\r\n\r\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial<Storage> = {};\r\n private useStorage: boolean;\r\n private savingFreezed: boolean;\r\n\r\n private getPromises: Map<keyof Storage, CancellablePromise<Storage[keyof Storage]>> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set<keyof Storage> = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise<void>();\r\n\r\n private keysToDelete: Set<keyof Storage> = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise<void>();\r\n\r\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage<T>(db, storeName);\r\n\r\n if(AppStorage.STORAGES.length) {\r\n this.useStorage = AppStorage.STORAGES[0].useStorage;\r\n } else {\r\n this.useStorage = true;\r\n }\r\n\r\n this.savingFreezed = false;\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise<void>();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n //console.log('setItem: will set', key/* , value */);\r\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n const values = keys.map(key => this.cache[key]);\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n //console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n //this.useCS = false;\r\n console.error('[AS]: set error:', e, keys/* , value */);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise<void>();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n // const perf = performance.now();\r\n this.storage.get(keys as string[]).then(values => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n\r\n // console.log('[AS]: get time', keys, performance.now() - perf);\r\n }, (error) => {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(error)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n //deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, 16, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache<T extends keyof Storage>(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get<T extends keyof Storage>(key: T, useCache = true): Promise<Storage[T]> {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise<Storage[T]>();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial<Storage>, onlyLocal = false) {\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n \r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(canUseStorage) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return canUseStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public static freezeSaving<T extends Database<any>>(callback: () => any, names: T['stores'][number]['name'][]) {\r\n this.STORAGES.forEach(storage => storage.savingFreezed = true);\r\n try {\r\n callback();\r\n } catch(err) {}\r\n this.STORAGES.forEach(storage => storage.savingFreezed = false);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// @ts-ignore\r\nexport const IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\r\nexport default IS_TOUCH_SUPPORTED;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\nimport findAndSplice from \"./array/findAndSplice\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap<any, Record<any, Set<any>>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record<string, Function>;\r\n// export type EventListenerListeners = Record<string, (...args: any[]) => any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback<T> = (data: T) => \r\n// export default class EventListenerBase<Listeners extends {[name: string]: Function}> {\r\nexport default class EventListenerBase<Listeners extends EventListenerListeners> {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes<Listeners[k]>\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener<T extends keyof Listeners>(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener<T extends keyof Listeners>(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n findAndSplice(this.listeners[name], l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent<T extends keyof Listeners>(name: T, collectResults: boolean, ...args: ArgumentTypes<Listeners[T]>) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array<SuperReturnType<Listeners[typeof name]>> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent<T extends keyof Listeners>(name: T, ...args: ArgumentTypes<Listeners[T]>) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent<L extends EventListenerListeners = Listeners, T extends keyof L = keyof L>(name: T, ...args: ArgumentTypes<L[T]>) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","export default function pause(ms: number) {\r\n return new Promise<void>((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","export default function safeAssign<T>(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","export default function isObject<T extends Record<any, any>>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\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\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyToVoidFunction } from \"../../types\";\r\n\r\nexport default function throttle<F extends AnyToVoidFunction>(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters<F>;\r\n\r\n return (..._args: Parameters<F>) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if (!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\r\n}\r\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\r\n\r\nexport default IS_EMOJI_SUPPORTED;\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport class AppRuntimeManager {\r\n public reload() {\r\n try {\r\n location.reload();\r\n } catch(e) {};\r\n\r\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\r\n // chrome.runtime.reload();\r\n // }\r\n }\r\n\r\n public close() {\r\n try {\r\n window.close();\r\n } catch(e) {}\r\n }\r\n\r\n /**\r\n * Better to call from event\r\n */\r\n public focus() {\r\n // // @ts-ignore\r\n // if(window.navigator.mozApps && document.hidden) {\r\n // // Get app instance and launch it to bring app to foreground\r\n // // @ts-ignore\r\n // window.navigator.mozApps.getSelf().onsuccess = function() {\r\n // this.result.launch();\r\n // };\r\n // } else {\r\n // // @ts-ignore\r\n // if(window.chrome && chrome.app && chrome.app.window) {\r\n // // @ts-ignore\r\n // chrome.app.window.current().focus();\r\n // }\r\n\r\n window.focus();\r\n // }\r\n }\r\n}\r\n\r\nconst appRuntimeManager = new AppRuntimeManager();\r\nexport default appRuntimeManager;\r\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 const EmojiVersions: {[version: string]: {[emoji: string]: number}} = {\"14\":{\"1f6dd\":4867,\"1f6de\":4916,\"1f6df\":4923,\"1f7f0\":62832,\"1f979\":183,\"1f9cc\":1557,\"1fa7b\":61332,\"1fa7c\":61330,\"1faa9\":51093,\"1faaa\":61364,\"1faab\":61189,\"1faac\":51085,\"1fab7\":2651,\"1fab8\":2631,\"1fab9\":2672,\"1faba\":2673,\"1fac3\":1520,\"1fac4\":1521,\"1fac5\":1505,\"1fad7\":3793,\"1fad8\":3707,\"1fad9\":3804,\"1fae0\":111,\"1fae1\":136,\"1fae2\":132,\"1fae3\":133,\"1fae4\":174,\"1fae5\":142,\"1fae6\":1385,\"1fae7\":61353,\"1faf0\":1341,\"1faf1\":1332,\"1faf2\":1333,\"1faf3\":1334,\"1faf4\":1335,\"1faf5\":1351,\"1faf6\":1360,\"1faf1-1f3fb-200d-1faf2-1f3fc\":0,\"1faf1-1f3fb-200d-1faf2-1f3fd\":0,\"1faf1-1f3fb-200d-1faf2-1f3fe\":0,\"1faf1-1f3fb-200d-1faf2-1f3ff\":0,\"1faf1-1f3fc-200d-1faf2-1f3fb\":0,\"1faf1-1f3fc-200d-1faf2-1f3fd\":0,\"1faf1-1f3fc-200d-1faf2-1f3fe\":0,\"1faf1-1f3fc-200d-1faf2-1f3ff\":0,\"1faf1-1f3fd-200d-1faf2-1f3fb\":0,\"1faf1-1f3fd-200d-1faf2-1f3fc\":0,\"1faf1-1f3fd-200d-1faf2-1f3fe\":0,\"1faf1-1f3fd-200d-1faf2-1f3ff\":0,\"1faf1-1f3fe-200d-1faf2-1f3fb\":0,\"1faf1-1f3fe-200d-1faf2-1f3fc\":0,\"1faf1-1f3fe-200d-1faf2-1f3fd\":0,\"1faf1-1f3fe-200d-1faf2-1f3ff\":0,\"1faf1-1f3ff-200d-1faf2-1f3fb\":0,\"1faf1-1f3ff-200d-1faf2-1f3fc\":0,\"1faf1-1f3ff-200d-1faf2-1f3fd\":0,\"1faf1-1f3ff-200d-1faf2-1f3fe\":0,\"1fac3-1f3fb\":0,\"1fac3-1f3fc\":0,\"1fac3-1f3fd\":0,\"1fac3-1f3fe\":0,\"1fac3-1f3ff\":0,\"1fac4-1f3fb\":0,\"1fac4-1f3fc\":0,\"1fac4-1f3fd\":0,\"1fac4-1f3fe\":0,\"1fac4-1f3ff\":0,\"1fac5-1f3fb\":0,\"1fac5-1f3fc\":0,\"1fac5-1f3fd\":0,\"1fac5-1f3fe\":0,\"1fac5-1f3ff\":0,\"1faf0-1f3fb\":0,\"1faf0-1f3fc\":0,\"1faf0-1f3fd\":0,\"1faf0-1f3fe\":0,\"1faf0-1f3ff\":0,\"1faf1-1f3fb\":0,\"1faf1-1f3fc\":0,\"1faf1-1f3fd\":0,\"1faf1-1f3fe\":0,\"1faf1-1f3ff\":0,\"1faf2-1f3fb\":0,\"1faf2-1f3fc\":0,\"1faf2-1f3fd\":0,\"1faf2-1f3fe\":0,\"1faf2-1f3ff\":0,\"1faf3-1f3fb\":0,\"1faf3-1f3fc\":0,\"1faf3-1f3fd\":0,\"1faf3-1f3fe\":0,\"1faf3-1f3ff\":0,\"1faf4-1f3fb\":0,\"1faf4-1f3fc\":0,\"1faf4-1f3fd\":0,\"1faf4-1f3fe\":0,\"1faf4-1f3ff\":0,\"1faf5-1f3fb\":0,\"1faf5-1f3fc\":0,\"1faf5-1f3fd\":0,\"1faf5-1f3fe\":0,\"1faf5-1f3ff\":0,\"1faf6-1f3fb\":0,\"1faf6-1f3fc\":0,\"1faf6-1f3fd\":0,\"1faf6-1f3fe\":0,\"1faf6-1f3ff\":0},\"\":{\"2049\":62835,\"2122\":62863,\"2139\":62888,\"2194\":62764,\"2195\":62763,\"2196\":62762,\"2197\":62756,\"2198\":62758,\"2199\":62760,\"2328\":61194,\"2600\":4990,\"2601\":4998,\"2602\":41013,\"2603\":41018,\"2604\":41020,\"2611\":62851,\"2614\":41014,\"2615\":3781,\"2618\":2667,\"2620\":1106,\"2622\":62753,\"2623\":62754,\"2626\":62783,\"2638\":62780,\"2639\":177,\"2648\":62788,\"2649\":62789,\"2650\":62796,\"2651\":62797,\"2652\":62798,\"2653\":62799,\"2660\":51095,\"2663\":51098,\"2665\":51096,\"2666\":51097,\"2668\":4865,\"2692\":61297,\"2693\":4922,\"2694\":61300,\"2696\":61311,\"2697\":61319,\"2699\":61309,\"2702\":61284,\"2705\":62850,\"2708\":4931,\"2709\":61245,\"2712\":61259,\"2714\":62852,\"2716\":62828,\"2721\":62779,\"2728\":51029,\"2733\":62858,\"2734\":62859,\"2744\":41017,\"2747\":62860,\"2753\":62836,\"2754\":62837,\"2755\":62838,\"2757\":62839,\"2763\":1137,\"2764\":1141,\"2795\":62829,\"2796\":62830,\"2797\":62831,\"2934\":62767,\"2935\":62768,\"3030\":62840,\"3297\":62912,\"3299\":62913,\"0023-20e3\":62864,\"002a-20e3\":62865,\"0030-20e3\":62866,\"0031-20e3\":62867,\"0032-20e3\":62868,\"0033-20e3\":62869,\"0034-20e3\":62870,\"0035-20e3\":62871,\"0036-20e3\":62872,\"0037-20e3\":62873,\"0038-20e3\":62874,\"0039-20e3\":62875,\"00a9\":62861,\"00ae\":62862,\"1f004\":51101,\"1f0cf\":51100,\"1f170\":62882,\"1f171\":62884,\"1f17e\":62893,\"1f17f\":62895,\"1f18e\":62883,\"1f191\":62885,\"1f192\":62886,\"1f193\":62887,\"1f194\":62889,\"1f195\":62891,\"1f196\":62892,\"1f197\":62894,\"1f198\":62896,\"1f199\":62897,\"1f19a\":62898,\"1f1e6-1f1e8\":71594,\"1f1e6-1f1e9\":71595,\"1f1e6-1f1ea\":71596,\"1f1e6-1f1eb\":71597,\"1f1e6-1f1ec\":71598,\"1f1e6-1f1ee\":71599,\"1f1e6-1f1f1\":71600,\"1f1e6-1f1f2\":71601,\"1f1e6-1f1f4\":71602,\"1f1e6-1f1f6\":71603,\"1f1e6-1f1f7\":71604,\"1f1e6-1f1f8\":71605,\"1f1e6-1f1f9\":71606,\"1f1e6-1f1fa\":71607,\"1f1e6-1f1fc\":71608,\"1f1e6-1f1fd\":71609,\"1f1e6-1f1ff\":71610,\"1f1e7-1f1e6\":71611,\"1f1e7-1f1e7\":71612,\"1f1e7-1f1e9\":71613,\"1f1e7-1f1ea\":71614,\"1f1e7-1f1eb\":71615,\"1f1e7-1f1ec\":71616,\"1f1e7-1f1ed\":71617,\"1f1e7-1f1ee\":71618,\"1f1e7-1f1ef\":71619,\"1f1e7-1f1f1\":71620,\"1f1e7-1f1f2\":71621,\"1f1e7-1f1f3\":71622,\"1f1e7-1f1f4\":71623,\"1f1e7-1f1f6\":71624,\"1f1e7-1f1f7\":71625,\"1f1e7-1f1f8\":71626,\"1f1e7-1f1f9\":71627,\"1f1e7-1f1fb\":71628,\"1f1e7-1f1fc\":71629,\"1f1e7-1f1fe\":71630,\"1f1e7-1f1ff\":71631,\"1f1e8-1f1e6\":71632,\"1f1e8-1f1e8\":71633,\"1f1e8-1f1e9\":71634,\"1f1e8-1f1eb\":71635,\"1f1e8-1f1ec\":71636,\"1f1e8-1f1ed\":71637,\"1f1e8-1f1ee\":71638,\"1f1e8-1f1f0\":71639,\"1f1e8-1f1f1\":71640,\"1f1e8-1f1f2\":71641,\"1f1e8-1f1f3\":71642,\"1f1e8-1f1f4\":71643,\"1f1e8-1f1f5\":71644,\"1f1e8-1f1f7\":71645,\"1f1e8-1f1fa\":71646,\"1f1e8-1f1fb\":71647,\"1f1e8-1f1fc\":71648,\"1f1e8-1f1fd\":71649,\"1f1e8-1f1fe\":71650,\"1f1e8-1f1ff\":71651,\"1f1e9-1f1ea\":71652,\"1f1e9-1f1ec\":71653,\"1f1e9-1f1ef\":71654,\"1f1e9-1f1f0\":71655,\"1f1e9-1f1f2\":71656,\"1f1e9-1f1f4\":71657,\"1f1e9-1f1ff\":71658,\"1f1ea-1f1e6\":71659,\"1f1ea-1f1e8\":71660,\"1f1ea-1f1ea\":71661,\"1f1ea-1f1ec\":71662,\"1f1ea-1f1ed\":71663,\"1f1ea-1f1f7\":71664,\"1f1ea-1f1f8\":71665,\"1f1ea-1f1f9\":71666,\"1f1ea-1f1fa\":71667,\"1f1eb-1f1ee\":71668,\"1f1eb-1f1ef\":71669,\"1f1eb-1f1f0\":71670,\"1f1eb-1f1f2\":71671,\"1f1eb-1f1f4\":71672,\"1f1eb-1f1f7\":71673,\"1f1ec-1f1e6\":71674,\"1f1ec-1f1e7\":71675,\"1f1ec-1f1e9\":71676,\"1f1ec-1f1ea\":71677,\"1f1ec-1f1eb\":71678,\"1f1ec-1f1ec\":71679,\"1f1ec-1f1ed\":71680,\"1f1ec-1f1ee\":71681,\"1f1ec-1f1f1\":71682,\"1f1ec-1f1f2\":71683,\"1f1ec-1f1f3\":71684,\"1f1ec-1f1f5\":71685,\"1f1ec-1f1f6\":71686,\"1f1ec-1f1f7\":71687,\"1f1ec-1f1f8\":71688,\"1f1ec-1f1f9\":71689,\"1f1ec-1f1fa\":71690,\"1f1ec-1f1fc\":71691,\"1f1ec-1f1fe\":71692,\"1f1ed-1f1f0\":71693,\"1f1ed-1f1f2\":71694,\"1f1ed-1f1f3\":71695,\"1f1ed-1f1f7\":71696,\"1f1ed-1f1f9\":71697,\"1f1ed-1f1fa\":71698,\"1f1ee-1f1e8\":71699,\"1f1ee-1f1e9\":71700,\"1f1ee-1f1ea\":71701,\"1f1ee-1f1f1\":71702,\"1f1ee-1f1f2\":71703,\"1f1ee-1f1f3\":71704,\"1f1ee-1f1f4\":71705,\"1f1ee-1f1f6\":71706,\"1f1ee-1f1f7\":71707,\"1f1ee-1f1f8\":71708,\"1f1ee-1f1f9\":71709,\"1f1ef-1f1ea\":71710,\"1f1ef-1f1f2\":71711,\"1f1ef-1f1f4\":71712,\"1f1ef-1f1f5\":71713,\"1f1f0-1f1ea\":71714,\"1f1f0-1f1ec\":71715,\"1f1f0-1f1ed\":71716,\"1f1f0-1f1ee\":71717,\"1f1f0-1f1f2\":71718,\"1f1f0-1f1f3\":71719,\"1f1f0-1f1f5\":71720,\"1f1f0-1f1f7\":71721,\"1f1f0-1f1fc\":71722,\"1f1f0-1f1fe\":71723,\"1f1f0-1f1ff\":71724,\"1f1f1-1f1e6\":71725,\"1f1f1-1f1e7\":71726,\"1f1f1-1f1e8\":71727,\"1f1f1-1f1ee\":71728,\"1f1f1-1f1f0\":71729,\"1f1f1-1f1f7\":71730,\"1f1f1-1f1f8\":71731,\"1f1f1-1f1f9\":71732,\"1f1f1-1f1fa\":71733,\"1f1f1-1f1fb\":71734,\"1f1f1-1f1fe\":71735,\"1f1f2-1f1e6\":71736,\"1f1f2-1f1e8\":71737,\"1f1f2-1f1e9\":71738,\"1f1f2-1f1ea\":71739,\"1f1f2-1f1eb\":71740,\"1f1f2-1f1ec\":71741,\"1f1f2-1f1ed\":71742,\"1f1f2-1f1f0\":71743,\"1f1f2-1f1f1\":71744,\"1f1f2-1f1f2\":71745,\"1f1f2-1f1f3\":71746,\"1f1f2-1f1f4\":71747,\"1f1f2-1f1f5\":71748,\"1f1f2-1f1f6\":71749,\"1f1f2-1f1f7\":71750,\"1f1f2-1f1f8\":71751,\"1f1f2-1f1f9\":71752,\"1f1f2-1f1fa\":71753,\"1f1f2-1f1fb\":71754,\"1f1f2-1f1fc\":71755,\"1f1f2-1f1fd\":71756,\"1f1f2-1f1fe\":71757,\"1f1f2-1f1ff\":71758,\"1f1f3-1f1e6\":71759,\"1f1f3-1f1e8\":71760,\"1f1f3-1f1ea\":71761,\"1f1f3-1f1eb\":71762,\"1f1f3-1f1ec\":71763,\"1f1f3-1f1ee\":71764,\"1f1f3-1f1f1\":71765,\"1f1f3-1f1f4\":71766,\"1f1f3-1f1f5\":71767,\"1f1f3-1f1f7\":71768,\"1f1f3-1f1fa\":71769,\"1f1f3-1f1ff\":71770,\"1f1f4-1f1f2\":71771,\"1f1f5-1f1e6\":71772,\"1f1f5-1f1ea\":71773,\"1f1f5-1f1eb\":71774,\"1f1f5-1f1ec\":71775,\"1f1f5-1f1ed\":71776,\"1f1f5-1f1f0\":71777,\"1f1f5-1f1f1\":71778,\"1f1f5-1f1f2\":71779,\"1f1f5-1f1f3\":71780,\"1f1f5-1f1f7\":71781,\"1f1f5-1f1f8\":71782,\"1f1f5-1f1f9\":71783,\"1f1f5-1f1fc\":71784,\"1f1f5-1f1fe\":71785,\"1f1f6-1f1e6\":71786,\"1f1f7-1f1ea\":71787,\"1f1f7-1f1f4\":71788,\"1f1f7-1f1f8\":71789,\"1f1f7-1f1fa\":71790,\"1f1f7-1f1fc\":71791,\"1f1f8-1f1e6\":71792,\"1f1f8-1f1e7\":71793,\"1f1f8-1f1e8\":71794,\"1f1f8-1f1e9\":71795,\"1f1f8-1f1ea\":71796,\"1f1f8-1f1ec\":71797,\"1f1f8-1f1ed\":71798,\"1f1f8-1f1ee\":71799,\"1f1f8-1f1ef\":71800,\"1f1f8-1f1f0\":71801,\"1f1f8-1f1f1\":71802,\"1f1f8-1f1f2\":71803,\"1f1f8-1f1f3\":71804,\"1f1f8-1f1f4\":71805,\"1f1f8-1f1f7\":71806,\"1f1f8-1f1f8\":71807,\"1f1f8-1f1f9\":71808,\"1f1f8-1f1fb\":71809,\"1f1f8-1f1fd\":71810,\"1f1f8-1f1fe\":71811,\"1f1f8-1f1ff\":71812,\"1f1f9-1f1e6\":71813,\"1f1f9-1f1e8\":71814,\"1f1f9-1f1e9\":71815,\"1f1f9-1f1eb\":71816,\"1f1f9-1f1ec\":71817,\"1f1f9-1f1ed\":71818,\"1f1f9-1f1ef\":71819,\"1f1f9-1f1f0\":71820,\"1f1f9-1f1f1\":71821,\"1f1f9-1f1f2\":71822,\"1f1f9-1f1f3\":71823,\"1f1f9-1f1f4\":71824,\"1f1f9-1f1f7\":71825,\"1f1f9-1f1f9\":71826,\"1f1f9-1f1fb\":71827,\"1f1f9-1f1fc\":71828,\"1f1f9-1f1ff\":71829,\"1f1fa-1f1e6\":71830,\"1f1fa-1f1ec\":71831,\"1f1fa-1f1f2\":71832,\"1f1fa-1f1f3\":71833,\"1f1fa-1f1f8\":71834,\"1f1fa-1f1fe\":71835,\"1f1fa-1f1ff\":71836,\"1f1fb-1f1e6\":71837,\"1f1fb-1f1e8\":71838,\"1f1fb-1f1ea\":71839,\"1f1fb-1f1ec\":71840,\"1f1fb-1f1ee\":71841,\"1f1fb-1f1f3\":71842,\"1f1fb-1f1fa\":71843,\"1f1fc-1f1eb\":71844,\"1f1fc-1f1f8\":71845,\"1f1fd-1f1f0\":71846,\"1f1fe-1f1ea\":71847,\"1f1fe-1f1f9\":71848,\"1f1ff-1f1e6\":71849,\"1f1ff-1f1f2\":71850,\"1f1ff-1f1fc\":71851,\"1f201\":62899,\"1f202\":62900,\"1f21a\":62906,\"1f22f\":62903,\"1f232\":62907,\"1f233\":62911,\"1f234\":62910,\"1f235\":62915,\"1f236\":62902,\"1f237\":62901,\"1f238\":62909,\"1f239\":62905,\"1f23a\":62914,\"1f250\":62904,\"1f251\":62908,\"1f300\":41010,\"1f301\":4857,\"1f302\":41012,\"1f303\":4858,\"1f304\":4860,\"1f305\":4861,\"1f306\":4862,\"1f307\":4863,\"1f308\":41011,\"1f309\":4864,\"1f30a\":41023,\"1f30b\":4815,\"1f30c\":4997,\"1f30d\":4806,\"1f30e\":4807,\"1f30f\":4808,\"1f310\":4809,\"1f311\":4977,\"1f312\":4978,\"1f313\":4979,\"1f314\":4980,\"1f315\":4981,\"1f316\":4982,\"1f317\":4983,\"1f318\":4984,\"1f319\":4985,\"1f31a\":4986,\"1f31b\":4987,\"1f31c\":4988,\"1f31d\":4991,\"1f31e\":4992,\"1f31f\":4995,\"1f320\":4996,\"1f321\":4989,\"1f324\":41001,\"1f325\":41002,\"1f326\":41003,\"1f327\":41004,\"1f328\":41005,\"1f329\":41006,\"1f32a\":41007,\"1f32b\":41008,\"1f32c\":41009,\"1f32d\":3725,\"1f32e\":3727,\"1f32f\":3728,\"1f330\":3708,\"1f331\":2659,\"1f332\":2661,\"1f333\":2662,\"1f334\":2663,\"1f335\":2664,\"1f336\":3698,\"1f337\":2658,\"1f338\":2649,\"1f339\":2653,\"1f33a\":2655,\"1f33b\":2656,\"1f33c\":2657,\"1f33d\":3697,\"1f33e\":2665,\"1f33f\":2666,\"1f340\":2668,\"1f341\":2669,\"1f342\":2670,\"1f343\":2671,\"1f344\":3705,\"1f345\":3690,\"1f346\":3694,\"1f347\":3674,\"1f348\":3675,\"1f349\":3676,\"1f34a\":3677,\"1f34b\":3678,\"1f34c\":3679,\"1f34d\":3680,\"1f34e\":3682,\"1f34f\":3683,\"1f350\":3684,\"1f351\":3685,\"1f352\":3686,\"1f353\":3687,\"1f354\":3722,\"1f355\":3724,\"1f356\":3718,\"1f357\":3719,\"1f358\":3744,\"1f359\":3745,\"1f35a\":3746,\"1f35b\":3747,\"1f35c\":3748,\"1f35d\":3749,\"1f35e\":3709,\"1f35f\":3723,\"1f360\":3750,\"1f361\":3756,\"1f362\":3751,\"1f363\":3752,\"1f364\":3753,\"1f365\":3754,\"1f366\":3765,\"1f367\":3766,\"1f368\":3767,\"1f369\":3768,\"1f36a\":3769,\"1f36b\":3774,\"1f36c\":3775,\"1f36d\":3776,\"1f36e\":3777,\"1f36f\":3778,\"1f370\":3771,\"1f371\":3743,\"1f372\":3735,\"1f373\":3733,\"1f374\":3801,\"1f375\":3783,\"1f376\":3784,\"1f377\":3786,\"1f378\":3787,\"1f379\":3788,\"1f37a\":3789,\"1f37b\":3790,\"1f37c\":3779,\"1f37d\":3800,\"1f37e\":3785,\"1f37f\":3739,\"1f380\":51040,\"1f381\":51041,\"1f382\":3770,\"1f383\":51024,\"1f384\":51025,\"1f385\":1527,\"1f386\":51026,\"1f387\":51027,\"1f388\":51030,\"1f389\":51031,\"1f38a\":51032,\"1f38b\":51033,\"1f38c\":71588,\"1f38d\":51034,\"1f38e\":51035,\"1f38f\":51036,\"1f390\":51037,\"1f391\":51038,\"1f392\":61134,\"1f393\":61147,\"1f396\":51045,\"1f397\":51042,\"1f399\":61167,\"1f39a\":61168,\"1f39b\":61169,\"1f39e\":61203,\"1f39f\":51043,\"1f3a0\":4866,\"1f3a1\":4868,\"1f3a2\":4869,\"1f3a3\":51072,\"1f3a4\":61170,\"1f3a5\":61202,\"1f3a6\":62819,\"1f3a7\":61171,\"1f3a8\":51105,\"1f3a9\":61146,\"1f3aa\":4871,\"1f3ab\":51044,\"1f3ac\":61205,\"1f3ad\":51103,\"1f3ae\":51086,\"1f3af\":51078,\"1f3b0\":51088,\"1f3b1\":51081,\"1f3b2\":51089,\"1f3b3\":51060,\"1f3b4\":51102,\"1f3b5\":61165,\"1f3b6\":61166,\"1f3b7\":61173,\"1f3b8\":61175,\"1f3b9\":61176,\"1f3ba\":61177,\"1f3bb\":61178,\"1f3bc\":61164,\"1f3bd\":51074,\"1f3be\":51058,\"1f3bf\":51075,\"1f3c0\":51054,\"1f3c1\":71586,\"1f3c2\":1600,\"1f3c3-200d-2640\":1584,\"1f3c3-200d-2642\":1583,\"1f3c3\":1582,\"1f3c4-200d-2640\":1606,\"1f3c4-200d-2642\":1605,\"1f3c4\":1604,\"1f3c5\":51047,\"1f3c6\":51046,\"1f3c7\":1598,\"1f3c8\":51056,\"1f3c9\":51057,\"1f3ca-200d-2640\":1612,\"1f3ca-200d-2642\":1611,\"1f3ca\":1610,\"1f3cb-200d-2640\":1618,\"1f3cb-200d-2642\":1617,\"1f3cb\":1616,\"1f3cc-200d-2640\":1603,\"1f3cc-200d-2642\":1602,\"1f3cc\":1601,\"1f3cd\":4902,\"1f3ce\":4901,\"1f3cf\":51061,\"1f3d0\":51055,\"1f3d1\":51062,\"1f3d2\":51063,\"1f3d3\":51065,\"1f3d4\":4813,\"1f3d5\":4817,\"1f3d6\":4818,\"1f3d7\":4824,\"1f3d8\":4829,\"1f3d9\":4859,\"1f3da\":4830,\"1f3db\":4823,\"1f3dc\":4819,\"1f3dd\":4820,\"1f3de\":4821,\"1f3df\":4822,\"1f3e0\":4831,\"1f3e1\":4832,\"1f3e2\":4833,\"1f3e3\":4834,\"1f3e4\":4835,\"1f3e5\":4836,\"1f3e6\":4837,\"1f3e7\":62729,\"1f3e8\":4838,\"1f3e9\":4839,\"1f3ea\":4840,\"1f3eb\":4841,\"1f3ec\":4842,\"1f3ed\":4843,\"1f3ee\":61216,\"1f3ef\":4844,\"1f3f0\":4845,\"1f3f3-200d-1f308\":71591,\"1f3f3-200d-26a7\":71592,\"1f3f3\":71590,\"1f3f4-200d-2620\":71593,\"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":71852,\"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":71853,\"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":71854,\"1f3f4\":71589,\"1f3f5\":2652,\"1f3f7\":61234,\"1f3f8\":51066,\"1f3f9\":61303,\"1f3fa\":3805,\"1f3fb\":9525,\"1f3fc\":9526,\"1f3fd\":9527,\"1f3fe\":9528,\"1f3ff\":9529,\"1f400\":2576,\"1f401\":2575,\"1f402\":2556,\"1f403\":2557,\"1f404\":2558,\"1f405\":2547,\"1f406\":2548,\"1f407\":2579,\"1f408-200d-2b1b\":2544,\"1f408\":2543,\"1f409\":2618,\"1f40a\":2613,\"1f40b\":2622,\"1f40c\":2632,\"1f40d\":2616,\"1f40e\":2550,\"1f40f\":2563,\"1f410\":2565,\"1f411\":2564,\"1f412\":2531,\"1f413\":2596,\"1f414\":2595,\"1f415-200d-1f9ba\":2537,\"1f415\":2535,\"1f416\":2560,\"1f417\":2561,\"1f418\":2570,\"1f419\":2629,\"1f41a\":2630,\"1f41b\":2634,\"1f41c\":2635,\"1f41d\":2636,\"1f41e\":2638,\"1f41f\":2625,\"1f420\":2626,\"1f421\":2627,\"1f422\":2614,\"1f423\":2597,\"1f424\":2598,\"1f425\":2599,\"1f426\":2600,\"1f427\":2601,\"1f428\":2586,\"1f429\":2538,\"1f42a\":2566,\"1f42b\":2567,\"1f42c\":2623,\"1f42d\":2574,\"1f42e\":2555,\"1f42f\":2546,\"1f430\":2578,\"1f431\":2542,\"1f432\":2617,\"1f433\":2621,\"1f434\":2549,\"1f435\":2530,\"1f436\":2534,\"1f437\":2559,\"1f438\":2612,\"1f439\":2577,\"1f43a\":2539,\"1f43b-200d-2744\":2585,\"1f43b\":2584,\"1f43c\":2587,\"1f43d\":2562,\"1f43e\":2593,\"1f43f\":2580,\"1f440\":1381,\"1f441-200d-1f5e8\":1159,\"1f441\":1382,\"1f442\":1373,\"1f443\":1375,\"1f444\":1384,\"1f445\":1383,\"1f446\":1347,\"1f447\":1349,\"1f448\":1345,\"1f449\":1346,\"1f44a\":1355,\"1f44b\":1327,\"1f44c\":1336,\"1f44d\":1352,\"1f44e\":1353,\"1f44f\":1358,\"1f450\":1361,\"1f451\":61144,\"1f452\":61145,\"1f453\":61110,\"1f454\":61115,\"1f455\":61116,\"1f456\":61117,\"1f457\":61122,\"1f458\":61123,\"1f459\":61128,\"1f45a\":61129,\"1f45b\":61130,\"1f45c\":61131,\"1f45d\":61132,\"1f45e\":61136,\"1f45f\":61137,\"1f460\":61140,\"1f461\":61141,\"1f462\":61143,\"1f463\":1687,\"1f464\":1684,\"1f465\":1685,\"1f466\":1388,\"1f467\":1389,\"1f468-200d-1f33e\":1457,\"1f468-200d-1f373\":1460,\"1f468-200d-1f37c\":1524,\"1f468-200d-1f393\":1448,\"1f468-200d-1f3a4\":1478,\"1f468-200d-1f3a8\":1481,\"1f468-200d-1f3eb\":1451,\"1f468-200d-1f3ed\":1466,\"1f468-200d-1f466-200d-1f466\":1674,\"1f468-200d-1f466\":1673,\"1f468-200d-1f467-200d-1f466\":1676,\"1f468-200d-1f467-200d-1f467\":1677,\"1f468-200d-1f467\":1675,\"1f468-200d-1f468-200d-1f466\":1663,\"1f468-200d-1f468-200d-1f466-200d-1f466\":1666,\"1f468-200d-1f468-200d-1f467\":1664,\"1f468-200d-1f468-200d-1f467-200d-1f466\":1665,\"1f468-200d-1f468-200d-1f467-200d-1f467\":1667,\"1f468-200d-1f469-200d-1f466\":1658,\"1f468-200d-1f469-200d-1f466-200d-1f466\":1661,\"1f468-200d-1f469-200d-1f467\":1659,\"1f468-200d-1f469-200d-1f467-200d-1f466\":1660,\"1f468-200d-1f469-200d-1f467-200d-1f467\":1662,\"1f468-200d-1f4bb\":1475,\"1f468-200d-1f4bc\":1469,\"1f468-200d-1f527\":1463,\"1f468-200d-1f52c\":1472,\"1f468-200d-1f680\":1487,\"1f468-200d-1f692\":1490,\"1f468-200d-1f9af\":1574,\"1f468-200d-1f9b0\":1396,\"1f468-200d-1f9b1\":1397,\"1f468-200d-1f9b2\":1399,\"1f468-200d-1f9b3\":1398,\"1f468-200d-1f9bc\":1577,\"1f468-200d-1f9bd\":1580,\"1f468-200d-2695\":1445,\"1f468-200d-2696\":1454,\"1f468-200d-2708\":1484,\"1f468-200d-2764-200d-1f468\":1655,\"1f468-200d-2764-200d-1f48b-200d-1f468\":1651,\"1f468\":1392,\"1f469-200d-1f33e\":1458,\"1f469-200d-1f373\":1461,\"1f469-200d-1f37c\":1523,\"1f469-200d-1f393\":1449,\"1f469-200d-1f3a4\":1479,\"1f469-200d-1f3a8\":1482,\"1f469-200d-1f3eb\":1452,\"1f469-200d-1f3ed\":1467,\"1f469-200d-1f466-200d-1f466\":1679,\"1f469-200d-1f466\":1678,\"1f469-200d-1f467-200d-1f466\":1681,\"1f469-200d-1f467-200d-1f467\":1682,\"1f469-200d-1f467\":1680,\"1f469-200d-1f469-200d-1f466\":1668,\"1f469-200d-1f469-200d-1f466-200d-1f466\":1671,\"1f469-200d-1f469-200d-1f467\":1669,\"1f469-200d-1f469-200d-1f467-200d-1f466\":1670,\"1f469-200d-1f469-200d-1f467-200d-1f467\":1672,\"1f469-200d-1f4bb\":1476,\"1f469-200d-1f4bc\":1470,\"1f469-200d-1f527\":1464,\"1f469-200d-1f52c\":1473,\"1f469-200d-1f680\":1488,\"1f469-200d-1f692\":1491,\"1f469-200d-1f9af\":1575,\"1f469-200d-1f9b0\":1401,\"1f469-200d-1f9b1\":1403,\"1f469-200d-1f9b2\":1407,\"1f469-200d-1f9b3\":1405,\"1f469-200d-1f9bc\":1578,\"1f469-200d-1f9bd\":1581,\"1f469-200d-2695\":1446,\"1f469-200d-2696\":1455,\"1f469-200d-2708\":1485,\"1f469-200d-2764-200d-1f468\":1654,\"1f469-200d-2764-200d-1f469\":1656,\"1f469-200d-2764-200d-1f48b-200d-1f468\":1650,\"1f469-200d-2764-200d-1f48b-200d-1f469\":1652,\"1f469\":1400,\"1f46a\":1657,\"1f46b\":1647,\"1f46c\":1648,\"1f46d\":1646,\"1f46e-200d-2640\":1494,\"1f46e-200d-2642\":1493,\"1f46e\":1492,\"1f46f-200d-2640\":1590,\"1f46f-200d-2642\":1589,\"1f46f\":1588,\"1f470-200d-2640\":1518,\"1f470-200d-2642\":1517,\"1f470\":1516,\"1f471-200d-2640\":1409,\"1f471-200d-2642\":1410,\"1f471\":1391,\"1f472\":1511,\"1f473-200d-2640\":1510,\"1f473-200d-2642\":1509,\"1f473\":1508,\"1f474\":1412,\"1f475\":1413,\"1f476\":1386,\"1f477-200d-2640\":1504,\"1f477-200d-2642\":1503,\"1f477\":1502,\"1f478\":1507,\"1f479\":1109,\"1f47a\":1110,\"1f47b\":1111,\"1f47c\":1526,\"1f47d\":1112,\"1f47e\":1113,\"1f47f\":1104,\"1f480\":1105,\"1f481-200d-2640\":1428,\"1f481-200d-2642\":1427,\"1f481\":1426,\"1f482-200d-2640\":1500,\"1f482-200d-2642\":1499,\"1f482\":1498,\"1f483\":1585,\"1f484\":61152,\"1f485\":1366,\"1f486-200d-2640\":1560,\"1f486-200d-2642\":1559,\"1f486\":1558,\"1f487-200d-2640\":1563,\"1f487-200d-2642\":1562,\"1f487\":1561,\"1f488\":4870,\"1f489\":61326,\"1f48a\":61328,\"1f48b\":1127,\"1f48c\":1128,\"1f48d\":61153,\"1f48e\":61154,\"1f48f\":1649,\"1f490\":2648,\"1f491\":1653,\"1f492\":4846,\"1f493\":1133,\"1f494\":1138,\"1f495\":1135,\"1f496\":1131,\"1f497\":1132,\"1f498\":1129,\"1f499\":1145,\"1f49a\":1144,\"1f49b\":1143,\"1f49c\":1146,\"1f49d\":1130,\"1f49e\":1134,\"1f49f\":1136,\"1f4a0\":62946,\"1f4a1\":61214,\"1f4a2\":1151,\"1f4a3\":1157,\"1f4a4\":1163,\"1f4a5\":1152,\"1f4a6\":1154,\"1f4a7\":41022,\"1f4a8\":1155,\"1f4a9\":1107,\"1f4aa\":1368,\"1f4ab\":1153,\"1f4ac\":1158,\"1f4ad\":1162,\"1f4ae\":2650,\"1f4af\":1150,\"1f4b0\":61235,\"1f4b1\":62841,\"1f4b2\":62842,\"1f4b3\":61242,\"1f4b4\":61237,\"1f4b5\":61238,\"1f4b6\":61239,\"1f4b7\":61240,\"1f4b8\":61241,\"1f4b9\":61244,\"1f4ba\":4936,\"1f4bb\":61191,\"1f4bc\":61265,\"1f4bd\":61197,\"1f4be\":61198,\"1f4bf\":61199,\"1f4c0\":61200,\"1f4c1\":61266,\"1f4c2\":61267,\"1f4c3\":61227,\"1f4c4\":61229,\"1f4c5\":61269,\"1f4c6\":61270,\"1f4c7\":61273,\"1f4c8\":61274,\"1f4c9\":61275,\"1f4ca\":61276,\"1f4cb\":61277,\"1f4cc\":61278,\"1f4cd\":61279,\"1f4ce\":61280,\"1f4cf\":61282,\"1f4d0\":61283,\"1f4d1\":61232,\"1f4d2\":61226,\"1f4d3\":61225,\"1f4d4\":61218,\"1f4d5\":61219,\"1f4d6\":61220,\"1f4d7\":61221,\"1f4d8\":61222,\"1f4d9\":61223,\"1f4da\":61224,\"1f4db\":62847,\"1f4dc\":61228,\"1f4dd\":61264,\"1f4de\":61185,\"1f4df\":61186,\"1f4e0\":61187,\"1f4e1\":61325,\"1f4e2\":61159,\"1f4e3\":61160,\"1f4e4\":61249,\"1f4e5\":61250,\"1f4e6\":61251,\"1f4e7\":61246,\"1f4e8\":61247,\"1f4e9\":61248,\"1f4ea\":61253,\"1f4eb\":61252,\"1f4ec\":61254,\"1f4ed\":61255,\"1f4ee\":61256,\"1f4ef\":61161,\"1f4f0\":61230,\"1f4f1\":61182,\"1f4f2\":61183,\"1f4f3\":62823,\"1f4f4\":62824,\"1f4f5\":62751,\"1f4f6\":62822,\"1f4f7\":61207,\"1f4f8\":61208,\"1f4f9\":61209,\"1f4fa\":61206,\"1f4fb\":61172,\"1f4fc\":61210,\"1f4fd\":61204,\"1f4ff\":61151,\"1f500\":62801,\"1f501\":62802,\"1f502\":62803,\"1f503\":62769,\"1f504\":62770,\"1f505\":62820,\"1f506\":62821,\"1f507\":61155,\"1f508\":61156,\"1f509\":61157,\"1f50a\":61158,\"1f50b\":61188,\"1f50c\":61190,\"1f50d\":61211,\"1f50e\":61212,\"1f50f\":61290,\"1f510\":61291,\"1f511\":61292,\"1f512\":61288,\"1f513\":61289,\"1f514\":61162,\"1f515\":61163,\"1f516\":61233,\"1f517\":61313,\"1f518\":62947,\"1f519\":62771,\"1f51a\":62772,\"1f51b\":62773,\"1f51c\":62774,\"1f51d\":62775,\"1f51e\":62752,\"1f51f\":62876,\"1f520\":62877,\"1f521\":62878,\"1f522\":62879,\"1f523\":62880,\"1f524\":62881,\"1f525\":41021,\"1f526\":61215,\"1f527\":61306,\"1f528\":61294,\"1f529\":61308,\"1f52a\":3803,\"1f52b\":61301,\"1f52c\":61323,\"1f52d\":61324,\"1f52e\":51082,\"1f52f\":62787,\"1f530\":62848,\"1f531\":62846,\"1f532\":62949,\"1f533\":62948,\"1f534\":62916,\"1f535\":62920,\"1f536\":62940,\"1f537\":62941,\"1f538\":62942,\"1f539\":62943,\"1f53a\":62944,\"1f53b\":62945,\"1f53c\":62811,\"1f53d\":62813,\"1f549\":62778,\"1f54a\":2602,\"1f54b\":4854,\"1f54c\":4850,\"1f54d\":4852,\"1f54e\":62786,\"1f550\":4955,\"1f551\":4957,\"1f552\":4959,\"1f553\":4961,\"1f554\":4963,\"1f555\":4965,\"1f556\":4967,\"1f557\":4969,\"1f558\":4971,\"1f559\":4973,\"1f55a\":4975,\"1f55b\":4953,\"1f55c\":4956,\"1f55d\":4958,\"1f55e\":4960,\"1f55f\":4962,\"1f560\":4964,\"1f561\":4966,\"1f562\":4968,\"1f563\":4970,\"1f564\":4972,\"1f565\":4974,\"1f566\":4976,\"1f567\":4954,\"1f56f\":61213,\"1f570\":4952,\"1f573\":1156,\"1f574\":1587,\"1f575-200d-2640\":1497,\"1f575-200d-2642\":1496,\"1f575\":1495,\"1f576\":61111,\"1f577\":2641,\"1f578\":2642,\"1f579\":51087,\"1f57a\":1586,\"1f587\":61281,\"1f58a\":61261,\"1f58b\":61260,\"1f58c\":61262,\"1f58d\":61263,\"1f590\":1329,\"1f595\":1348,\"1f596\":1331,\"1f5a4\":1148,\"1f5a5\":61192,\"1f5a8\":61193,\"1f5b1\":61195,\"1f5b2\":61196,\"1f5bc\":51104,\"1f5c2\":61268,\"1f5c3\":61285,\"1f5c4\":61286,\"1f5d1\":61287,\"1f5d2\":61271,\"1f5d3\":61272,\"1f5dc\":61310,\"1f5dd\":61293,\"1f5de\":61231,\"1f5e1\":61299,\"1f5e3\":1683,\"1f5e8\":1160,\"1f5ef\":1161,\"1f5f3\":61257,\"1f5fa\":4810,\"1f5fb\":4816,\"1f5fc\":4847,\"1f5fd\":4848,\"1f5fe\":4811,\"1f5ff\":61362,\"1f600\":11,\"1f601\":14,\"1f602\":18,\"1f603\":12,\"1f604\":13,\"1f605\":16,\"1f606\":15,\"1f607\":114,\"1f608\":1103,\"1f609\":112,\"1f60a\":113,\"1f60b\":124,\"1f60c\":150,\"1f60d\":116,\"1f60e\":170,\"1f60f\":144,\"1f610\":139,\"1f611\":140,\"1f612\":145,\"1f613\":195,\"1f614\":151,\"1f615\":173,\"1f616\":192,\"1f617\":119,\"1f618\":118,\"1f619\":122,\"1f61a\":121,\"1f61b\":125,\"1f61c\":126,\"1f61d\":128,\"1f61e\":194,\"1f61f\":175,\"1f620\":1101,\"1f621\":1100,\"1f622\":189,\"1f623\":193,\"1f624\":199,\"1f625\":188,\"1f626\":184,\"1f627\":185,\"1f628\":186,\"1f629\":196,\"1f62a\":152,\"1f62b\":197,\"1f62c\":147,\"1f62d\":190,\"1f62e-200d-1f4a8\":148,\"1f62e\":178,\"1f62f\":179,\"1f630\":187,\"1f631\":191,\"1f632\":180,\"1f633\":181,\"1f634\":154,\"1f635-200d-1f4ab\":165,\"1f635\":164,\"1f636-200d-1f32b\":143,\"1f636\":141,\"1f637\":155,\"1f638\":1116,\"1f639\":1117,\"1f63a\":1115,\"1f63b\":1118,\"1f63c\":1119,\"1f63d\":1120,\"1f63e\":1123,\"1f63f\":1122,\"1f640\":1121,\"1f641\":176,\"1f642\":19,\"1f643\":110,\"1f644\":146,\"1f645-200d-2640\":1422,\"1f645-200d-2642\":1421,\"1f645\":1420,\"1f646-200d-2640\":1425,\"1f646-200d-2642\":1424,\"1f646\":1423,\"1f647-200d-2640\":1437,\"1f647-200d-2642\":1436,\"1f647\":1435,\"1f648\":1124,\"1f649\":1125,\"1f64a\":1126,\"1f64b-200d-2640\":1431,\"1f64b-200d-2642\":1430,\"1f64b\":1429,\"1f64c\":1359,\"1f64d-200d-2640\":1416,\"1f64d-200d-2642\":1415,\"1f64d\":1414,\"1f64e-200d-2640\":1419,\"1f64e-200d-2642\":1418,\"1f64e\":1417,\"1f64f\":1364,\"1f680\":4942,\"1f681\":4937,\"1f682\":4872,\"1f683\":4873,\"1f684\":4874,\"1f685\":4875,\"1f686\":4876,\"1f687\":4877,\"1f688\":4878,\"1f689\":4879,\"1f68a\":4880,\"1f68b\":4883,\"1f68c\":4884,\"1f68d\":4885,\"1f68e\":4886,\"1f68f\":4911,\"1f690\":4887,\"1f691\":4888,\"1f692\":4889,\"1f693\":4890,\"1f694\":4891,\"1f695\":4892,\"1f696\":4893,\"1f697\":4894,\"1f698\":4895,\"1f699\":4896,\"1f69a\":4898,\"1f69b\":4899,\"1f69c\":4900,\"1f69d\":4881,\"1f69e\":4882,\"1f69f\":4938,\"1f6a0\":4939,\"1f6a1\":4940,\"1f6a2\":4930,\"1f6a3-200d-2640\":1609,\"1f6a3-200d-2642\":1608,\"1f6a3\":1607,\"1f6a4\":4926,\"1f6a5\":4918,\"1f6a6\":4919,\"1f6a7\":4921,\"1f6a8\":4917,\"1f6a9\":71587,\"1f6aa\":61333,\"1f6ab\":62745,\"1f6ac\":61358,\"1f6ad\":62747,\"1f6ae\":62730,\"1f6af\":62748,\"1f6b0\":62731,\"1f6b1\":62749,\"1f6b2\":4907,\"1f6b3\":62746,\"1f6b4-200d-2640\":1621,\"1f6b4-200d-2642\":1620,\"1f6b4\":1619,\"1f6b5-200d-2640\":1624,\"1f6b5-200d-2642\":1623,\"1f6b5\":1622,\"1f6b6-200d-2640\":1566,\"1f6b6-200d-2642\":1565,\"1f6b6\":1564,\"1f6b7\":62750,\"1f6b8\":62743,\"1f6b9\":62733,\"1f6ba\":62734,\"1f6bb\":62735,\"1f6bc\":62736,\"1f6bd\":61340,\"1f6be\":62737,\"1f6bf\":61342,\"1f6c0\":1643,\"1f6c1\":61343,\"1f6c2\":62738,\"1f6c3\":62739,\"1f6c4\":62740,\"1f6c5\":62741,\"1f6cb\":61338,\"1f6cc\":1644,\"1f6cd\":61133,\"1f6ce\":4944,\"1f6cf\":61337,\"1f6d0\":62776,\"1f6d1\":4920,\"1f6d2\":61357,\"1f6d5\":4851,\"1f6d6\":4828,\"1f6d7\":61334,\"1f6e0\":61298,\"1f6e1\":61304,\"1f6e2\":4914,\"1f6e3\":4912,\"1f6e4\":4913,\"1f6e5\":4929,\"1f6e9\":4932,\"1f6eb\":4933,\"1f6ec\":4934,\"1f6f0\":4941,\"1f6f3\":4927,\"1f6f4\":4908,\"1f6f5\":4903,\"1f6f6\":4925,\"1f6f7\":51076,\"1f6f8\":4943,\"1f6f9\":4909,\"1f6fa\":4906,\"1f6fb\":4897,\"1f6fc\":4910,\"1f7e0\":62917,\"1f7e1\":62918,\"1f7e2\":62919,\"1f7e3\":62921,\"1f7e4\":62922,\"1f7e5\":62925,\"1f7e6\":62929,\"1f7e7\":62926,\"1f7e8\":62927,\"1f7e9\":62928,\"1f7ea\":62930,\"1f7eb\":62931,\"1f90c\":1337,\"1f90d\":1149,\"1f90e\":1147,\"1f90f\":1338,\"1f910\":137,\"1f911\":129,\"1f912\":156,\"1f913\":171,\"1f914\":135,\"1f915\":157,\"1f916\":1114,\"1f917\":130,\"1f918\":1343,\"1f919\":1344,\"1f91a\":1328,\"1f91b\":1356,\"1f91c\":1357,\"1f91d\":1363,\"1f91e\":1340,\"1f91f\":1342,\"1f920\":167,\"1f921\":1108,\"1f922\":158,\"1f923\":17,\"1f924\":153,\"1f925\":149,\"1f926-200d-2640\":1440,\"1f926-200d-2642\":1439,\"1f926\":1438,\"1f927\":160,\"1f928\":138,\"1f929\":117,\"1f92a\":127,\"1f92b\":134,\"1f92c\":1102,\"1f92d\":131,\"1f92e\":159,\"1f92f\":166,\"1f930\":1519,\"1f931\":1522,\"1f932\":1362,\"1f933\":1367,\"1f934\":1506,\"1f935-200d-2640\":1515,\"1f935-200d-2642\":1514,\"1f935\":1513,\"1f936\":1528,\"1f937-200d-2640\":1443,\"1f937-200d-2642\":1442,\"1f937\":1441,\"1f938-200d-2640\":1627,\"1f938-200d-2642\":1626,\"1f938\":1625,\"1f939-200d-2640\":1639,\"1f939-200d-2642\":1638,\"1f939\":1637,\"1f93a\":1597,\"1f93c-200d-2640\":1630,\"1f93c-200d-2642\":1629,\"1f93c\":1628,\"1f93d-200d-2640\":1633,\"1f93d-200d-2642\":1632,\"1f93d\":1631,\"1f93e-200d-2640\":1636,\"1f93e-200d-2642\":1635,\"1f93e\":1634,\"1f93f\":51073,\"1f940\":2654,\"1f941\":61180,\"1f942\":3791,\"1f943\":3792,\"1f944\":3802,\"1f945\":51069,\"1f947\":51048,\"1f948\":51049,\"1f949\":51050,\"1f94a\":51067,\"1f94b\":51068,\"1f94c\":51077,\"1f94d\":51064,\"1f94e\":51053,\"1f94f\":51059,\"1f950\":3710,\"1f951\":3693,\"1f952\":3700,\"1f953\":3721,\"1f954\":3695,\"1f955\":3696,\"1f956\":3711,\"1f957\":3738,\"1f958\":3734,\"1f959\":3730,\"1f95a\":3732,\"1f95b\":3780,\"1f95c\":3706,\"1f95d\":3689,\"1f95e\":3715,\"1f95f\":3757,\"1f960\":3758,\"1f961\":3759,\"1f962\":3799,\"1f963\":3737,\"1f964\":3794,\"1f965\":3692,\"1f966\":3702,\"1f967\":3773,\"1f968\":3713,\"1f969\":3720,\"1f96a\":3726,\"1f96b\":3742,\"1f96c\":3701,\"1f96d\":3681,\"1f96e\":3755,\"1f96f\":3714,\"1f970\":115,\"1f971\":198,\"1f972\":123,\"1f973\":168,\"1f974\":163,\"1f975\":161,\"1f976\":162,\"1f977\":1501,\"1f978\":169,\"1f97a\":182,\"1f97b\":61124,\"1f97c\":61113,\"1f97d\":61112,\"1f97e\":61138,\"1f97f\":61139,\"1f980\":3760,\"1f981\":2545,\"1f982\":2643,\"1f983\":2594,\"1f984\":2551,\"1f985\":2603,\"1f986\":2604,\"1f987\":2583,\"1f988\":2628,\"1f989\":2606,\"1f98a\":2540,\"1f98b\":2633,\"1f98c\":2553,\"1f98d\":2532,\"1f98e\":2615,\"1f98f\":2572,\"1f990\":3762,\"1f991\":3763,\"1f992\":2569,\"1f993\":2552,\"1f994\":2582,\"1f995\":2619,\"1f996\":2620,\"1f997\":2639,\"1f998\":2591,\"1f999\":2568,\"1f99a\":2610,\"1f99b\":2573,\"1f99c\":2611,\"1f99d\":2541,\"1f99e\":3761,\"1f99f\":2644,\"1f9a0\":2647,\"1f9a1\":2592,\"1f9a2\":2605,\"1f9a3\":2571,\"1f9a4\":2607,\"1f9a5\":2588,\"1f9a6\":2589,\"1f9a7\":2533,\"1f9a8\":2590,\"1f9a9\":2609,\"1f9aa\":3764,\"1f9ab\":2581,\"1f9ac\":2554,\"1f9ad\":2624,\"1f9ae\":2536,\"1f9af\":61312,\"1f9b4\":1380,\"1f9b5\":1371,\"1f9b6\":1372,\"1f9b7\":1379,\"1f9b8-200d-2640\":1532,\"1f9b8-200d-2642\":1531,\"1f9b8\":1530,\"1f9b9-200d-2640\":1535,\"1f9b9-200d-2642\":1534,\"1f9b9\":1533,\"1f9ba\":61114,\"1f9bb\":1374,\"1f9bc\":4905,\"1f9bd\":4904,\"1f9be\":1369,\"1f9bf\":1370,\"1f9c0\":3717,\"1f9c1\":3772,\"1f9c2\":3741,\"1f9c3\":3796,\"1f9c4\":3703,\"1f9c5\":3704,\"1f9c6\":3731,\"1f9c7\":3716,\"1f9c8\":3740,\"1f9c9\":3797,\"1f9ca\":3798,\"1f9cb\":3795,\"1f9cd-200d-2640\":1569,\"1f9cd-200d-2642\":1568,\"1f9cd\":1567,\"1f9ce-200d-2640\":1572,\"1f9ce-200d-2642\":1571,\"1f9ce\":1570,\"1f9cf-200d-2640\":1434,\"1f9cf-200d-2642\":1433,\"1f9cf\":1432,\"1f9d0\":172,\"1f9d1-200d-1f33e\":1456,\"1f9d1-200d-1f373\":1459,\"1f9d1-200d-1f37c\":1525,\"1f9d1-200d-1f384\":1529,\"1f9d1-200d-1f393\":1447,\"1f9d1-200d-1f3a4\":1477,\"1f9d1-200d-1f3a8\":1480,\"1f9d1-200d-1f3eb\":1450,\"1f9d1-200d-1f3ed\":1465,\"1f9d1-200d-1f4bb\":1474,\"1f9d1-200d-1f4bc\":1468,\"1f9d1-200d-1f527\":1462,\"1f9d1-200d-1f52c\":1471,\"1f9d1-200d-1f680\":1486,\"1f9d1-200d-1f692\":1489,\"1f9d1-200d-1f91d-200d-1f9d1\":1645,\"1f9d1-200d-1f9af\":1573,\"1f9d1-200d-1f9b0\":1402,\"1f9d1-200d-1f9b1\":1404,\"1f9d1-200d-1f9b2\":1408,\"1f9d1-200d-1f9b3\":1406,\"1f9d1-200d-1f9bc\":1576,\"1f9d1-200d-1f9bd\":1579,\"1f9d1-200d-2695\":1444,\"1f9d1-200d-2696\":1453,\"1f9d1-200d-2708\":1483,\"1f9d1\":1390,\"1f9d2\":1387,\"1f9d3\":1411,\"1f9d4-200d-2640\":1395,\"1f9d4-200d-2642\":1394,\"1f9d4\":1393,\"1f9d5\":1512,\"1f9d6-200d-2640\":1593,\"1f9d6-200d-2642\":1592,\"1f9d6\":1591,\"1f9d7-200d-2640\":1596,\"1f9d7-200d-2642\":1595,\"1f9d7\":1594,\"1f9d8-200d-2640\":1642,\"1f9d8-200d-2642\":1641,\"1f9d8\":1640,\"1f9d9-200d-2640\":1538,\"1f9d9-200d-2642\":1537,\"1f9d9\":1536,\"1f9da-200d-2640\":1541,\"1f9da-200d-2642\":1540,\"1f9da\":1539,\"1f9db-200d-2640\":1544,\"1f9db-200d-2642\":1543,\"1f9db\":1542,\"1f9dc-200d-2640\":1547,\"1f9dc-200d-2642\":1546,\"1f9dc\":1545,\"1f9dd-200d-2640\":1550,\"1f9dd-200d-2642\":1549,\"1f9dd\":1548,\"1f9de-200d-2640\":1553,\"1f9de-200d-2642\":1552,\"1f9de\":1551,\"1f9df-200d-2640\":1556,\"1f9df-200d-2642\":1555,\"1f9df\":1554,\"1f9e0\":1376,\"1f9e1\":1142,\"1f9e2\":61148,\"1f9e3\":61118,\"1f9e4\":61119,\"1f9e5\":61120,\"1f9e6\":61121,\"1f9e7\":51039,\"1f9e8\":51028,\"1f9e9\":51090,\"1f9ea\":61320,\"1f9eb\":61321,\"1f9ec\":61322,\"1f9ed\":4812,\"1f9ee\":61201,\"1f9ef\":61356,\"1f9f0\":61316,\"1f9f1\":4825,\"1f9f2\":61317,\"1f9f3\":4945,\"1f9f4\":61346,\"1f9f5\":51106,\"1f9f6\":51108,\"1f9f7\":61347,\"1f9f8\":51091,\"1f9f9\":61348,\"1f9fa\":61349,\"1f9fb\":61350,\"1f9fc\":61352,\"1f9fd\":61355,\"1f9fe\":61243,\"1f9ff\":51084,\"1fa70\":61142,\"1fa71\":61125,\"1fa72\":61126,\"1fa73\":61127,\"1fa74\":61135,\"1fa78\":61327,\"1fa79\":61329,\"1fa7a\":61331,\"1fa80\":51079,\"1fa81\":51080,\"1fa82\":4935,\"1fa83\":61302,\"1fa84\":51083,\"1fa85\":51092,\"1fa86\":51094,\"1fa90\":4993,\"1fa91\":61339,\"1fa92\":61345,\"1fa93\":61295,\"1fa94\":61217,\"1fa95\":61179,\"1fa96\":61149,\"1fa97\":61174,\"1fa98\":61181,\"1fa99\":61236,\"1fa9a\":61305,\"1fa9b\":61307,\"1fa9c\":61318,\"1fa9d\":61315,\"1fa9e\":61335,\"1fa9f\":61336,\"1faa0\":61341,\"1faa1\":51107,\"1faa2\":51109,\"1faa3\":61351,\"1faa4\":61344,\"1faa5\":61354,\"1faa6\":61360,\"1faa7\":61363,\"1faa8\":4826,\"1fab0\":2645,\"1fab1\":2646,\"1fab2\":2637,\"1fab3\":2640,\"1fab4\":2660,\"1fab5\":4827,\"1fab6\":2608,\"1fac0\":1377,\"1fac1\":1378,\"1fac2\":1686,\"1fad0\":3688,\"1fad1\":3699,\"1fad2\":3691,\"1fad3\":3712,\"1fad4\":3729,\"1fad5\":3736,\"1fad6\":3782,\"203c\":62834,\"21a9\":62765,\"21aa\":62766,\"231a\":4948,\"231b\":4946,\"23cf\":62818,\"23e9\":62805,\"23ea\":62809,\"23eb\":62812,\"23ec\":62814,\"23ed\":62806,\"23ee\":62810,\"23ef\":62807,\"23f0\":4949,\"23f1\":4950,\"23f2\":4951,\"23f3\":4947,\"23f8\":62815,\"23f9\":62816,\"23fa\":62817,\"24c2\":62890,\"25aa\":62938,\"25ab\":62939,\"25b6\":62804,\"25c0\":62808,\"25fb\":62935,\"25fc\":62934,\"25fd\":62937,\"25fe\":62936,\"260e\":61184,\"261d\":1350,\"262a\":62784,\"262e\":62785,\"262f\":62781,\"263a\":120,\"264a\":62790,\"264b\":62791,\"264c\":62792,\"264d\":62793,\"264e\":62794,\"264f\":62795,\"265f\":51099,\"267b\":62844,\"267e\":62833,\"267f\":62732,\"269b\":62777,\"269c\":62845,\"26a0\":62742,\"26a1\":41016,\"26a7\":62827,\"26aa\":62924,\"26ab\":62923,\"26b0\":61359,\"26b1\":61361,\"26bd\":51051,\"26be\":51052,\"26c4\":41019,\"26c5\":4999,\"26c8\":41000,\"26ce\":62800,\"26cf\":61296,\"26d1\":61150,\"26d3\":61314,\"26d4\":62744,\"26e9\":4853,\"26ea\":4849,\"26f0\":4814,\"26f1\":41015,\"26f2\":4855,\"26f3\":51070,\"26f4\":4928,\"26f5\":4924,\"26f7\":1599,\"26f8\":51071,\"26f9-200d-2640\":1615,\"26f9-200d-2642\":1614,\"26f9\":1613,\"26fa\":4856,\"26fd\":4915,\"270a\":1354,\"270b\":1330,\"270c\":1339,\"270d\":1365,\"270f\":61258,\"271d\":62782,\"274c\":62853,\"274e\":62854,\"2764-200d-1f525\":1139,\"2764-200d-1fa79\":1140,\"27a1\":62757,\"27b0\":62855,\"27bf\":62856,\"2b05\":62761,\"2b06\":62755,\"2b07\":62759,\"2b1b\":62932,\"2b1c\":62933,\"2b50\":4994,\"2b55\":62849,\"303d\":62857,\"1f385-1f3fb\":0,\"1f385-1f3fc\":0,\"1f385-1f3fd\":0,\"1f385-1f3fe\":0,\"1f385-1f3ff\":0,\"1f3c2-1f3fb\":0,\"1f3c2-1f3fc\":0,\"1f3c2-1f3fd\":0,\"1f3c2-1f3fe\":0,\"1f3c2-1f3ff\":0,\"1f3c3-1f3fb-200d-2640\":0,\"1f3c3-1f3fc-200d-2640\":0,\"1f3c3-1f3fd-200d-2640\":0,\"1f3c3-1f3fe-200d-2640\":0,\"1f3c3-1f3ff-200d-2640\":0,\"1f3c3-1f3fb-200d-2642\":0,\"1f3c3-1f3fc-200d-2642\":0,\"1f3c3-1f3fd-200d-2642\":0,\"1f3c3-1f3fe-200d-2642\":0,\"1f3c3-1f3ff-200d-2642\":0,\"1f3c3-1f3fb\":0,\"1f3c3-1f3fc\":0,\"1f3c3-1f3fd\":0,\"1f3c3-1f3fe\":0,\"1f3c3-1f3ff\":0,\"1f3c4-1f3fb-200d-2640\":0,\"1f3c4-1f3fc-200d-2640\":0,\"1f3c4-1f3fd-200d-2640\":0,\"1f3c4-1f3fe-200d-2640\":0,\"1f3c4-1f3ff-200d-2640\":0,\"1f3c4-1f3fb-200d-2642\":0,\"1f3c4-1f3fc-200d-2642\":0,\"1f3c4-1f3fd-200d-2642\":0,\"1f3c4-1f3fe-200d-2642\":0,\"1f3c4-1f3ff-200d-2642\":0,\"1f3c4-1f3fb\":0,\"1f3c4-1f3fc\":0,\"1f3c4-1f3fd\":0,\"1f3c4-1f3fe\":0,\"1f3c4-1f3ff\":0,\"1f3c7-1f3fb\":0,\"1f3c7-1f3fc\":0,\"1f3c7-1f3fd\":0,\"1f3c7-1f3fe\":0,\"1f3c7-1f3ff\":0,\"1f3ca-1f3fb-200d-2640\":0,\"1f3ca-1f3fc-200d-2640\":0,\"1f3ca-1f3fd-200d-2640\":0,\"1f3ca-1f3fe-200d-2640\":0,\"1f3ca-1f3ff-200d-2640\":0,\"1f3ca-1f3fb-200d-2642\":0,\"1f3ca-1f3fc-200d-2642\":0,\"1f3ca-1f3fd-200d-2642\":0,\"1f3ca-1f3fe-200d-2642\":0,\"1f3ca-1f3ff-200d-2642\":0,\"1f3ca-1f3fb\":0,\"1f3ca-1f3fc\":0,\"1f3ca-1f3fd\":0,\"1f3ca-1f3fe\":0,\"1f3ca-1f3ff\":0,\"1f3cb-1f3fb-200d-2640\":0,\"1f3cb-1f3fc-200d-2640\":0,\"1f3cb-1f3fd-200d-2640\":0,\"1f3cb-1f3fe-200d-2640\":0,\"1f3cb-1f3ff-200d-2640\":0,\"1f3cb-1f3fb-200d-2642\":0,\"1f3cb-1f3fc-200d-2642\":0,\"1f3cb-1f3fd-200d-2642\":0,\"1f3cb-1f3fe-200d-2642\":0,\"1f3cb-1f3ff-200d-2642\":0,\"1f3cb-1f3fb\":0,\"1f3cb-1f3fc\":0,\"1f3cb-1f3fd\":0,\"1f3cb-1f3fe\":0,\"1f3cb-1f3ff\":0,\"1f3cc-1f3fb-200d-2640\":0,\"1f3cc-1f3fc-200d-2640\":0,\"1f3cc-1f3fd-200d-2640\":0,\"1f3cc-1f3fe-200d-2640\":0,\"1f3cc-1f3ff-200d-2640\":0,\"1f3cc-1f3fb-200d-2642\":0,\"1f3cc-1f3fc-200d-2642\":0,\"1f3cc-1f3fd-200d-2642\":0,\"1f3cc-1f3fe-200d-2642\":0,\"1f3cc-1f3ff-200d-2642\":0,\"1f3cc-1f3fb\":0,\"1f3cc-1f3fc\":0,\"1f3cc-1f3fd\":0,\"1f3cc-1f3fe\":0,\"1f3cc-1f3ff\":0,\"1f442-1f3fb\":0,\"1f442-1f3fc\":0,\"1f442-1f3fd\":0,\"1f442-1f3fe\":0,\"1f442-1f3ff\":0,\"1f443-1f3fb\":0,\"1f443-1f3fc\":0,\"1f443-1f3fd\":0,\"1f443-1f3fe\":0,\"1f443-1f3ff\":0,\"1f446-1f3fb\":0,\"1f446-1f3fc\":0,\"1f446-1f3fd\":0,\"1f446-1f3fe\":0,\"1f446-1f3ff\":0,\"1f447-1f3fb\":0,\"1f447-1f3fc\":0,\"1f447-1f3fd\":0,\"1f447-1f3fe\":0,\"1f447-1f3ff\":0,\"1f448-1f3fb\":0,\"1f448-1f3fc\":0,\"1f448-1f3fd\":0,\"1f448-1f3fe\":0,\"1f448-1f3ff\":0,\"1f449-1f3fb\":0,\"1f449-1f3fc\":0,\"1f449-1f3fd\":0,\"1f449-1f3fe\":0,\"1f449-1f3ff\":0,\"1f44a-1f3fb\":0,\"1f44a-1f3fc\":0,\"1f44a-1f3fd\":0,\"1f44a-1f3fe\":0,\"1f44a-1f3ff\":0,\"1f44b-1f3fb\":0,\"1f44b-1f3fc\":0,\"1f44b-1f3fd\":0,\"1f44b-1f3fe\":0,\"1f44b-1f3ff\":0,\"1f44c-1f3fb\":0,\"1f44c-1f3fc\":0,\"1f44c-1f3fd\":0,\"1f44c-1f3fe\":0,\"1f44c-1f3ff\":0,\"1f44d-1f3fb\":0,\"1f44d-1f3fc\":0,\"1f44d-1f3fd\":0,\"1f44d-1f3fe\":0,\"1f44d-1f3ff\":0,\"1f44e-1f3fb\":0,\"1f44e-1f3fc\":0,\"1f44e-1f3fd\":0,\"1f44e-1f3fe\":0,\"1f44e-1f3ff\":0,\"1f44f-1f3fb\":0,\"1f44f-1f3fc\":0,\"1f44f-1f3fd\":0,\"1f44f-1f3fe\":0,\"1f44f-1f3ff\":0,\"1f450-1f3fb\":0,\"1f450-1f3fc\":0,\"1f450-1f3fd\":0,\"1f450-1f3fe\":0,\"1f450-1f3ff\":0,\"1f466-1f3fb\":0,\"1f466-1f3fc\":0,\"1f466-1f3fd\":0,\"1f466-1f3fe\":0,\"1f466-1f3ff\":0,\"1f467-1f3fb\":0,\"1f467-1f3fc\":0,\"1f467-1f3fd\":0,\"1f467-1f3fe\":0,\"1f467-1f3ff\":0,\"1f468-1f3fb-200d-1f33e\":0,\"1f468-1f3fc-200d-1f33e\":0,\"1f468-1f3fd-200d-1f33e\":0,\"1f468-1f3fe-200d-1f33e\":0,\"1f468-1f3ff-200d-1f33e\":0,\"1f468-1f3fb-200d-1f373\":0,\"1f468-1f3fc-200d-1f373\":0,\"1f468-1f3fd-200d-1f373\":0,\"1f468-1f3fe-200d-1f373\":0,\"1f468-1f3ff-200d-1f373\":0,\"1f468-1f3fb-200d-1f37c\":0,\"1f468-1f3fc-200d-1f37c\":0,\"1f468-1f3fd-200d-1f37c\":0,\"1f468-1f3fe-200d-1f37c\":0,\"1f468-1f3ff-200d-1f37c\":0,\"1f468-1f3fb-200d-1f393\":0,\"1f468-1f3fc-200d-1f393\":0,\"1f468-1f3fd-200d-1f393\":0,\"1f468-1f3fe-200d-1f393\":0,\"1f468-1f3ff-200d-1f393\":0,\"1f468-1f3fb-200d-1f3a4\":0,\"1f468-1f3fc-200d-1f3a4\":0,\"1f468-1f3fd-200d-1f3a4\":0,\"1f468-1f3fe-200d-1f3a4\":0,\"1f468-1f3ff-200d-1f3a4\":0,\"1f468-1f3fb-200d-1f3a8\":0,\"1f468-1f3fc-200d-1f3a8\":0,\"1f468-1f3fd-200d-1f3a8\":0,\"1f468-1f3fe-200d-1f3a8\":0,\"1f468-1f3ff-200d-1f3a8\":0,\"1f468-1f3fb-200d-1f3eb\":0,\"1f468-1f3fc-200d-1f3eb\":0,\"1f468-1f3fd-200d-1f3eb\":0,\"1f468-1f3fe-200d-1f3eb\":0,\"1f468-1f3ff-200d-1f3eb\":0,\"1f468-1f3fb-200d-1f3ed\":0,\"1f468-1f3fc-200d-1f3ed\":0,\"1f468-1f3fd-200d-1f3ed\":0,\"1f468-1f3fe-200d-1f3ed\":0,\"1f468-1f3ff-200d-1f3ed\":0,\"1f468-1f3fb-200d-1f4bb\":0,\"1f468-1f3fc-200d-1f4bb\":0,\"1f468-1f3fd-200d-1f4bb\":0,\"1f468-1f3fe-200d-1f4bb\":0,\"1f468-1f3ff-200d-1f4bb\":0,\"1f468-1f3fb-200d-1f4bc\":0,\"1f468-1f3fc-200d-1f4bc\":0,\"1f468-1f3fd-200d-1f4bc\":0,\"1f468-1f3fe-200d-1f4bc\":0,\"1f468-1f3ff-200d-1f4bc\":0,\"1f468-1f3fb-200d-1f527\":0,\"1f468-1f3fc-200d-1f527\":0,\"1f468-1f3fd-200d-1f527\":0,\"1f468-1f3fe-200d-1f527\":0,\"1f468-1f3ff-200d-1f527\":0,\"1f468-1f3fb-200d-1f52c\":0,\"1f468-1f3fc-200d-1f52c\":0,\"1f468-1f3fd-200d-1f52c\":0,\"1f468-1f3fe-200d-1f52c\":0,\"1f468-1f3ff-200d-1f52c\":0,\"1f468-1f3fb-200d-1f680\":0,\"1f468-1f3fc-200d-1f680\":0,\"1f468-1f3fd-200d-1f680\":0,\"1f468-1f3fe-200d-1f680\":0,\"1f468-1f3ff-200d-1f680\":0,\"1f468-1f3fb-200d-1f692\":0,\"1f468-1f3fc-200d-1f692\":0,\"1f468-1f3fd-200d-1f692\":0,\"1f468-1f3fe-200d-1f692\":0,\"1f468-1f3ff-200d-1f692\":0,\"1f468-1f3fb-200d-1f9af\":0,\"1f468-1f3fc-200d-1f9af\":0,\"1f468-1f3fd-200d-1f9af\":0,\"1f468-1f3fe-200d-1f9af\":0,\"1f468-1f3ff-200d-1f9af\":0,\"1f468-1f3fb-200d-1f9b0\":0,\"1f468-1f3fc-200d-1f9b0\":0,\"1f468-1f3fd-200d-1f9b0\":0,\"1f468-1f3fe-200d-1f9b0\":0,\"1f468-1f3ff-200d-1f9b0\":0,\"1f468-1f3fb-200d-1f9b1\":0,\"1f468-1f3fc-200d-1f9b1\":0,\"1f468-1f3fd-200d-1f9b1\":0,\"1f468-1f3fe-200d-1f9b1\":0,\"1f468-1f3ff-200d-1f9b1\":0,\"1f468-1f3fb-200d-1f9b2\":0,\"1f468-1f3fc-200d-1f9b2\":0,\"1f468-1f3fd-200d-1f9b2\":0,\"1f468-1f3fe-200d-1f9b2\":0,\"1f468-1f3ff-200d-1f9b2\":0,\"1f468-1f3fb-200d-1f9b3\":0,\"1f468-1f3fc-200d-1f9b3\":0,\"1f468-1f3fd-200d-1f9b3\":0,\"1f468-1f3fe-200d-1f9b3\":0,\"1f468-1f3ff-200d-1f9b3\":0,\"1f468-1f3fb-200d-1f9bc\":0,\"1f468-1f3fc-200d-1f9bc\":0,\"1f468-1f3fd-200d-1f9bc\":0,\"1f468-1f3fe-200d-1f9bc\":0,\"1f468-1f3ff-200d-1f9bc\":0,\"1f468-1f3fb-200d-1f9bd\":0,\"1f468-1f3fc-200d-1f9bd\":0,\"1f468-1f3fd-200d-1f9bd\":0,\"1f468-1f3fe-200d-1f9bd\":0,\"1f468-1f3ff-200d-1f9bd\":0,\"1f468-1f3fb-200d-2695\":0,\"1f468-1f3fc-200d-2695\":0,\"1f468-1f3fd-200d-2695\":0,\"1f468-1f3fe-200d-2695\":0,\"1f468-1f3ff-200d-2695\":0,\"1f468-1f3fb-200d-2696\":0,\"1f468-1f3fc-200d-2696\":0,\"1f468-1f3fd-200d-2696\":0,\"1f468-1f3fe-200d-2696\":0,\"1f468-1f3ff-200d-2696\":0,\"1f468-1f3fb-200d-2708\":0,\"1f468-1f3fc-200d-2708\":0,\"1f468-1f3fd-200d-2708\":0,\"1f468-1f3fe-200d-2708\":0,\"1f468-1f3ff-200d-2708\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fb\":0,\"1f468-1f3fc\":0,\"1f468-1f3fd\":0,\"1f468-1f3fe\":0,\"1f468-1f3ff\":0,\"1f469-1f3fb-200d-1f33e\":0,\"1f469-1f3fc-200d-1f33e\":0,\"1f469-1f3fd-200d-1f33e\":0,\"1f469-1f3fe-200d-1f33e\":0,\"1f469-1f3ff-200d-1f33e\":0,\"1f469-1f3fb-200d-1f373\":0,\"1f469-1f3fc-200d-1f373\":0,\"1f469-1f3fd-200d-1f373\":0,\"1f469-1f3fe-200d-1f373\":0,\"1f469-1f3ff-200d-1f373\":0,\"1f469-1f3fb-200d-1f37c\":0,\"1f469-1f3fc-200d-1f37c\":0,\"1f469-1f3fd-200d-1f37c\":0,\"1f469-1f3fe-200d-1f37c\":0,\"1f469-1f3ff-200d-1f37c\":0,\"1f469-1f3fb-200d-1f393\":0,\"1f469-1f3fc-200d-1f393\":0,\"1f469-1f3fd-200d-1f393\":0,\"1f469-1f3fe-200d-1f393\":0,\"1f469-1f3ff-200d-1f393\":0,\"1f469-1f3fb-200d-1f3a4\":0,\"1f469-1f3fc-200d-1f3a4\":0,\"1f469-1f3fd-200d-1f3a4\":0,\"1f469-1f3fe-200d-1f3a4\":0,\"1f469-1f3ff-200d-1f3a4\":0,\"1f469-1f3fb-200d-1f3a8\":0,\"1f469-1f3fc-200d-1f3a8\":0,\"1f469-1f3fd-200d-1f3a8\":0,\"1f469-1f3fe-200d-1f3a8\":0,\"1f469-1f3ff-200d-1f3a8\":0,\"1f469-1f3fb-200d-1f3eb\":0,\"1f469-1f3fc-200d-1f3eb\":0,\"1f469-1f3fd-200d-1f3eb\":0,\"1f469-1f3fe-200d-1f3eb\":0,\"1f469-1f3ff-200d-1f3eb\":0,\"1f469-1f3fb-200d-1f3ed\":0,\"1f469-1f3fc-200d-1f3ed\":0,\"1f469-1f3fd-200d-1f3ed\":0,\"1f469-1f3fe-200d-1f3ed\":0,\"1f469-1f3ff-200d-1f3ed\":0,\"1f469-1f3fb-200d-1f4bb\":0,\"1f469-1f3fc-200d-1f4bb\":0,\"1f469-1f3fd-200d-1f4bb\":0,\"1f469-1f3fe-200d-1f4bb\":0,\"1f469-1f3ff-200d-1f4bb\":0,\"1f469-1f3fb-200d-1f4bc\":0,\"1f469-1f3fc-200d-1f4bc\":0,\"1f469-1f3fd-200d-1f4bc\":0,\"1f469-1f3fe-200d-1f4bc\":0,\"1f469-1f3ff-200d-1f4bc\":0,\"1f469-1f3fb-200d-1f527\":0,\"1f469-1f3fc-200d-1f527\":0,\"1f469-1f3fd-200d-1f527\":0,\"1f469-1f3fe-200d-1f527\":0,\"1f469-1f3ff-200d-1f527\":0,\"1f469-1f3fb-200d-1f52c\":0,\"1f469-1f3fc-200d-1f52c\":0,\"1f469-1f3fd-200d-1f52c\":0,\"1f469-1f3fe-200d-1f52c\":0,\"1f469-1f3ff-200d-1f52c\":0,\"1f469-1f3fb-200d-1f680\":0,\"1f469-1f3fc-200d-1f680\":0,\"1f469-1f3fd-200d-1f680\":0,\"1f469-1f3fe-200d-1f680\":0,\"1f469-1f3ff-200d-1f680\":0,\"1f469-1f3fb-200d-1f692\":0,\"1f469-1f3fc-200d-1f692\":0,\"1f469-1f3fd-200d-1f692\":0,\"1f469-1f3fe-200d-1f692\":0,\"1f469-1f3ff-200d-1f692\":0,\"1f469-1f3fb-200d-1f9af\":0,\"1f469-1f3fc-200d-1f9af\":0,\"1f469-1f3fd-200d-1f9af\":0,\"1f469-1f3fe-200d-1f9af\":0,\"1f469-1f3ff-200d-1f9af\":0,\"1f469-1f3fb-200d-1f9b0\":0,\"1f469-1f3fc-200d-1f9b0\":0,\"1f469-1f3fd-200d-1f9b0\":0,\"1f469-1f3fe-200d-1f9b0\":0,\"1f469-1f3ff-200d-1f9b0\":0,\"1f469-1f3fb-200d-1f9b1\":0,\"1f469-1f3fc-200d-1f9b1\":0,\"1f469-1f3fd-200d-1f9b1\":0,\"1f469-1f3fe-200d-1f9b1\":0,\"1f469-1f3ff-200d-1f9b1\":0,\"1f469-1f3fb-200d-1f9b2\":0,\"1f469-1f3fc-200d-1f9b2\":0,\"1f469-1f3fd-200d-1f9b2\":0,\"1f469-1f3fe-200d-1f9b2\":0,\"1f469-1f3ff-200d-1f9b2\":0,\"1f469-1f3fb-200d-1f9b3\":0,\"1f469-1f3fc-200d-1f9b3\":0,\"1f469-1f3fd-200d-1f9b3\":0,\"1f469-1f3fe-200d-1f9b3\":0,\"1f469-1f3ff-200d-1f9b3\":0,\"1f469-1f3fb-200d-1f9bc\":0,\"1f469-1f3fc-200d-1f9bc\":0,\"1f469-1f3fd-200d-1f9bc\":0,\"1f469-1f3fe-200d-1f9bc\":0,\"1f469-1f3ff-200d-1f9bc\":0,\"1f469-1f3fb-200d-1f9bd\":0,\"1f469-1f3fc-200d-1f9bd\":0,\"1f469-1f3fd-200d-1f9bd\":0,\"1f469-1f3fe-200d-1f9bd\":0,\"1f469-1f3ff-200d-1f9bd\":0,\"1f469-1f3fb-200d-2695\":0,\"1f469-1f3fc-200d-2695\":0,\"1f469-1f3fd-200d-2695\":0,\"1f469-1f3fe-200d-2695\":0,\"1f469-1f3ff-200d-2695\":0,\"1f469-1f3fb-200d-2696\":0,\"1f469-1f3fc-200d-2696\":0,\"1f469-1f3fd-200d-2696\":0,\"1f469-1f3fe-200d-2696\":0,\"1f469-1f3ff-200d-2696\":0,\"1f469-1f3fb-200d-2708\":0,\"1f469-1f3fc-200d-2708\":0,\"1f469-1f3fd-200d-2708\":0,\"1f469-1f3fe-200d-2708\":0,\"1f469-1f3ff-200d-2708\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fb\":0,\"1f469-1f3fc\":0,\"1f469-1f3fd\":0,\"1f469-1f3fe\":0,\"1f469-1f3ff\":0,\"1f46b-1f3fb\":0,\"1f46b-1f3fc\":0,\"1f46b-1f3fd\":0,\"1f46b-1f3fe\":0,\"1f46b-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46c-1f3fb\":0,\"1f46c-1f3fc\":0,\"1f46c-1f3fd\":0,\"1f46c-1f3fe\":0,\"1f46c-1f3ff\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46d-1f3fb\":0,\"1f46d-1f3fc\":0,\"1f46d-1f3fd\":0,\"1f46d-1f3fe\":0,\"1f46d-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe\":0,\"1f46e-1f3fb-200d-2640\":0,\"1f46e-1f3fc-200d-2640\":0,\"1f46e-1f3fd-200d-2640\":0,\"1f46e-1f3fe-200d-2640\":0,\"1f46e-1f3ff-200d-2640\":0,\"1f46e-1f3fb-200d-2642\":0,\"1f46e-1f3fc-200d-2642\":0,\"1f46e-1f3fd-200d-2642\":0,\"1f46e-1f3fe-200d-2642\":0,\"1f46e-1f3ff-200d-2642\":0,\"1f46e-1f3fb\":0,\"1f46e-1f3fc\":0,\"1f46e-1f3fd\":0,\"1f46e-1f3fe\":0,\"1f46e-1f3ff\":0,\"1f470-1f3fb-200d-2640\":0,\"1f470-1f3fc-200d-2640\":0,\"1f470-1f3fd-200d-2640\":0,\"1f470-1f3fe-200d-2640\":0,\"1f470-1f3ff-200d-2640\":0,\"1f470-1f3fb-200d-2642\":0,\"1f470-1f3fc-200d-2642\":0,\"1f470-1f3fd-200d-2642\":0,\"1f470-1f3fe-200d-2642\":0,\"1f470-1f3ff-200d-2642\":0,\"1f470-1f3fb\":0,\"1f470-1f3fc\":0,\"1f470-1f3fd\":0,\"1f470-1f3fe\":0,\"1f470-1f3ff\":0,\"1f471-1f3fb-200d-2640\":0,\"1f471-1f3fc-200d-2640\":0,\"1f471-1f3fd-200d-2640\":0,\"1f471-1f3fe-200d-2640\":0,\"1f471-1f3ff-200d-2640\":0,\"1f471-1f3fb-200d-2642\":0,\"1f471-1f3fc-200d-2642\":0,\"1f471-1f3fd-200d-2642\":0,\"1f471-1f3fe-200d-2642\":0,\"1f471-1f3ff-200d-2642\":0,\"1f471-1f3fb\":0,\"1f471-1f3fc\":0,\"1f471-1f3fd\":0,\"1f471-1f3fe\":0,\"1f471-1f3ff\":0,\"1f472-1f3fb\":0,\"1f472-1f3fc\":0,\"1f472-1f3fd\":0,\"1f472-1f3fe\":0,\"1f472-1f3ff\":0,\"1f473-1f3fb-200d-2640\":0,\"1f473-1f3fc-200d-2640\":0,\"1f473-1f3fd-200d-2640\":0,\"1f473-1f3fe-200d-2640\":0,\"1f473-1f3ff-200d-2640\":0,\"1f473-1f3fb-200d-2642\":0,\"1f473-1f3fc-200d-2642\":0,\"1f473-1f3fd-200d-2642\":0,\"1f473-1f3fe-200d-2642\":0,\"1f473-1f3ff-200d-2642\":0,\"1f473-1f3fb\":0,\"1f473-1f3fc\":0,\"1f473-1f3fd\":0,\"1f473-1f3fe\":0,\"1f473-1f3ff\":0,\"1f474-1f3fb\":0,\"1f474-1f3fc\":0,\"1f474-1f3fd\":0,\"1f474-1f3fe\":0,\"1f474-1f3ff\":0,\"1f475-1f3fb\":0,\"1f475-1f3fc\":0,\"1f475-1f3fd\":0,\"1f475-1f3fe\":0,\"1f475-1f3ff\":0,\"1f476-1f3fb\":0,\"1f476-1f3fc\":0,\"1f476-1f3fd\":0,\"1f476-1f3fe\":0,\"1f476-1f3ff\":0,\"1f477-1f3fb-200d-2640\":0,\"1f477-1f3fc-200d-2640\":0,\"1f477-1f3fd-200d-2640\":0,\"1f477-1f3fe-200d-2640\":0,\"1f477-1f3ff-200d-2640\":0,\"1f477-1f3fb-200d-2642\":0,\"1f477-1f3fc-200d-2642\":0,\"1f477-1f3fd-200d-2642\":0,\"1f477-1f3fe-200d-2642\":0,\"1f477-1f3ff-200d-2642\":0,\"1f477-1f3fb\":0,\"1f477-1f3fc\":0,\"1f477-1f3fd\":0,\"1f477-1f3fe\":0,\"1f477-1f3ff\":0,\"1f478-1f3fb\":0,\"1f478-1f3fc\":0,\"1f478-1f3fd\":0,\"1f478-1f3fe\":0,\"1f478-1f3ff\":0,\"1f47c-1f3fb\":0,\"1f47c-1f3fc\":0,\"1f47c-1f3fd\":0,\"1f47c-1f3fe\":0,\"1f47c-1f3ff\":0,\"1f481-1f3fb-200d-2640\":0,\"1f481-1f3fc-200d-2640\":0,\"1f481-1f3fd-200d-2640\":0,\"1f481-1f3fe-200d-2640\":0,\"1f481-1f3ff-200d-2640\":0,\"1f481-1f3fb-200d-2642\":0,\"1f481-1f3fc-200d-2642\":0,\"1f481-1f3fd-200d-2642\":0,\"1f481-1f3fe-200d-2642\":0,\"1f481-1f3ff-200d-2642\":0,\"1f481-1f3fb\":0,\"1f481-1f3fc\":0,\"1f481-1f3fd\":0,\"1f481-1f3fe\":0,\"1f481-1f3ff\":0,\"1f482-1f3fb-200d-2640\":0,\"1f482-1f3fc-200d-2640\":0,\"1f482-1f3fd-200d-2640\":0,\"1f482-1f3fe-200d-2640\":0,\"1f482-1f3ff-200d-2640\":0,\"1f482-1f3fb-200d-2642\":0,\"1f482-1f3fc-200d-2642\":0,\"1f482-1f3fd-200d-2642\":0,\"1f482-1f3fe-200d-2642\":0,\"1f482-1f3ff-200d-2642\":0,\"1f482-1f3fb\":0,\"1f482-1f3fc\":0,\"1f482-1f3fd\":0,\"1f482-1f3fe\":0,\"1f482-1f3ff\":0,\"1f483-1f3fb\":0,\"1f483-1f3fc\":0,\"1f483-1f3fd\":0,\"1f483-1f3fe\":0,\"1f483-1f3ff\":0,\"1f485-1f3fb\":0,\"1f485-1f3fc\":0,\"1f485-1f3fd\":0,\"1f485-1f3fe\":0,\"1f485-1f3ff\":0,\"1f486-1f3fb-200d-2640\":0,\"1f486-1f3fc-200d-2640\":0,\"1f486-1f3fd-200d-2640\":0,\"1f486-1f3fe-200d-2640\":0,\"1f486-1f3ff-200d-2640\":0,\"1f486-1f3fb-200d-2642\":0,\"1f486-1f3fc-200d-2642\":0,\"1f486-1f3fd-200d-2642\":0,\"1f486-1f3fe-200d-2642\":0,\"1f486-1f3ff-200d-2642\":0,\"1f486-1f3fb\":0,\"1f486-1f3fc\":0,\"1f486-1f3fd\":0,\"1f486-1f3fe\":0,\"1f486-1f3ff\":0,\"1f487-1f3fb-200d-2640\":0,\"1f487-1f3fc-200d-2640\":0,\"1f487-1f3fd-200d-2640\":0,\"1f487-1f3fe-200d-2640\":0,\"1f487-1f3ff-200d-2640\":0,\"1f487-1f3fb-200d-2642\":0,\"1f487-1f3fc-200d-2642\":0,\"1f487-1f3fd-200d-2642\":0,\"1f487-1f3fe-200d-2642\":0,\"1f487-1f3ff-200d-2642\":0,\"1f487-1f3fb\":0,\"1f487-1f3fc\":0,\"1f487-1f3fd\":0,\"1f487-1f3fe\":0,\"1f487-1f3ff\":0,\"1f48f-1f3fb\":0,\"1f48f-1f3fc\":0,\"1f48f-1f3fd\":0,\"1f48f-1f3fe\":0,\"1f48f-1f3ff\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f491-1f3fb\":0,\"1f491-1f3fc\":0,\"1f491-1f3fd\":0,\"1f491-1f3fe\":0,\"1f491-1f3ff\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe\":0,\"1f4aa-1f3fb\":0,\"1f4aa-1f3fc\":0,\"1f4aa-1f3fd\":0,\"1f4aa-1f3fe\":0,\"1f4aa-1f3ff\":0,\"1f574-1f3fb\":0,\"1f574-1f3fc\":0,\"1f574-1f3fd\":0,\"1f574-1f3fe\":0,\"1f574-1f3ff\":0,\"1f575-1f3fb-200d-2640\":0,\"1f575-1f3fc-200d-2640\":0,\"1f575-1f3fd-200d-2640\":0,\"1f575-1f3fe-200d-2640\":0,\"1f575-1f3ff-200d-2640\":0,\"1f575-1f3fb-200d-2642\":0,\"1f575-1f3fc-200d-2642\":0,\"1f575-1f3fd-200d-2642\":0,\"1f575-1f3fe-200d-2642\":0,\"1f575-1f3ff-200d-2642\":0,\"1f575-1f3fb\":0,\"1f575-1f3fc\":0,\"1f575-1f3fd\":0,\"1f575-1f3fe\":0,\"1f575-1f3ff\":0,\"1f57a-1f3fb\":0,\"1f57a-1f3fc\":0,\"1f57a-1f3fd\":0,\"1f57a-1f3fe\":0,\"1f57a-1f3ff\":0,\"1f590-1f3fb\":0,\"1f590-1f3fc\":0,\"1f590-1f3fd\":0,\"1f590-1f3fe\":0,\"1f590-1f3ff\":0,\"1f595-1f3fb\":0,\"1f595-1f3fc\":0,\"1f595-1f3fd\":0,\"1f595-1f3fe\":0,\"1f595-1f3ff\":0,\"1f596-1f3fb\":0,\"1f596-1f3fc\":0,\"1f596-1f3fd\":0,\"1f596-1f3fe\":0,\"1f596-1f3ff\":0,\"1f645-1f3fb-200d-2640\":0,\"1f645-1f3fc-200d-2640\":0,\"1f645-1f3fd-200d-2640\":0,\"1f645-1f3fe-200d-2640\":0,\"1f645-1f3ff-200d-2640\":0,\"1f645-1f3fb-200d-2642\":0,\"1f645-1f3fc-200d-2642\":0,\"1f645-1f3fd-200d-2642\":0,\"1f645-1f3fe-200d-2642\":0,\"1f645-1f3ff-200d-2642\":0,\"1f645-1f3fb\":0,\"1f645-1f3fc\":0,\"1f645-1f3fd\":0,\"1f645-1f3fe\":0,\"1f645-1f3ff\":0,\"1f646-1f3fb-200d-2640\":0,\"1f646-1f3fc-200d-2640\":0,\"1f646-1f3fd-200d-2640\":0,\"1f646-1f3fe-200d-2640\":0,\"1f646-1f3ff-200d-2640\":0,\"1f646-1f3fb-200d-2642\":0,\"1f646-1f3fc-200d-2642\":0,\"1f646-1f3fd-200d-2642\":0,\"1f646-1f3fe-200d-2642\":0,\"1f646-1f3ff-200d-2642\":0,\"1f646-1f3fb\":0,\"1f646-1f3fc\":0,\"1f646-1f3fd\":0,\"1f646-1f3fe\":0,\"1f646-1f3ff\":0,\"1f647-1f3fb-200d-2640\":0,\"1f647-1f3fc-200d-2640\":0,\"1f647-1f3fd-200d-2640\":0,\"1f647-1f3fe-200d-2640\":0,\"1f647-1f3ff-200d-2640\":0,\"1f647-1f3fb-200d-2642\":0,\"1f647-1f3fc-200d-2642\":0,\"1f647-1f3fd-200d-2642\":0,\"1f647-1f3fe-200d-2642\":0,\"1f647-1f3ff-200d-2642\":0,\"1f647-1f3fb\":0,\"1f647-1f3fc\":0,\"1f647-1f3fd\":0,\"1f647-1f3fe\":0,\"1f647-1f3ff\":0,\"1f64b-1f3fb-200d-2640\":0,\"1f64b-1f3fc-200d-2640\":0,\"1f64b-1f3fd-200d-2640\":0,\"1f64b-1f3fe-200d-2640\":0,\"1f64b-1f3ff-200d-2640\":0,\"1f64b-1f3fb-200d-2642\":0,\"1f64b-1f3fc-200d-2642\":0,\"1f64b-1f3fd-200d-2642\":0,\"1f64b-1f3fe-200d-2642\":0,\"1f64b-1f3ff-200d-2642\":0,\"1f64b-1f3fb\":0,\"1f64b-1f3fc\":0,\"1f64b-1f3fd\":0,\"1f64b-1f3fe\":0,\"1f64b-1f3ff\":0,\"1f64c-1f3fb\":0,\"1f64c-1f3fc\":0,\"1f64c-1f3fd\":0,\"1f64c-1f3fe\":0,\"1f64c-1f3ff\":0,\"1f64d-1f3fb-200d-2640\":0,\"1f64d-1f3fc-200d-2640\":0,\"1f64d-1f3fd-200d-2640\":0,\"1f64d-1f3fe-200d-2640\":0,\"1f64d-1f3ff-200d-2640\":0,\"1f64d-1f3fb-200d-2642\":0,\"1f64d-1f3fc-200d-2642\":0,\"1f64d-1f3fd-200d-2642\":0,\"1f64d-1f3fe-200d-2642\":0,\"1f64d-1f3ff-200d-2642\":0,\"1f64d-1f3fb\":0,\"1f64d-1f3fc\":0,\"1f64d-1f3fd\":0,\"1f64d-1f3fe\":0,\"1f64d-1f3ff\":0,\"1f64e-1f3fb-200d-2640\":0,\"1f64e-1f3fc-200d-2640\":0,\"1f64e-1f3fd-200d-2640\":0,\"1f64e-1f3fe-200d-2640\":0,\"1f64e-1f3ff-200d-2640\":0,\"1f64e-1f3fb-200d-2642\":0,\"1f64e-1f3fc-200d-2642\":0,\"1f64e-1f3fd-200d-2642\":0,\"1f64e-1f3fe-200d-2642\":0,\"1f64e-1f3ff-200d-2642\":0,\"1f64e-1f3fb\":0,\"1f64e-1f3fc\":0,\"1f64e-1f3fd\":0,\"1f64e-1f3fe\":0,\"1f64e-1f3ff\":0,\"1f64f-1f3fb\":0,\"1f64f-1f3fc\":0,\"1f64f-1f3fd\":0,\"1f64f-1f3fe\":0,\"1f64f-1f3ff\":0,\"1f6a3-1f3fb-200d-2640\":0,\"1f6a3-1f3fc-200d-2640\":0,\"1f6a3-1f3fd-200d-2640\":0,\"1f6a3-1f3fe-200d-2640\":0,\"1f6a3-1f3ff-200d-2640\":0,\"1f6a3-1f3fb-200d-2642\":0,\"1f6a3-1f3fc-200d-2642\":0,\"1f6a3-1f3fd-200d-2642\":0,\"1f6a3-1f3fe-200d-2642\":0,\"1f6a3-1f3ff-200d-2642\":0,\"1f6a3-1f3fb\":0,\"1f6a3-1f3fc\":0,\"1f6a3-1f3fd\":0,\"1f6a3-1f3fe\":0,\"1f6a3-1f3ff\":0,\"1f6b4-1f3fb-200d-2640\":0,\"1f6b4-1f3fc-200d-2640\":0,\"1f6b4-1f3fd-200d-2640\":0,\"1f6b4-1f3fe-200d-2640\":0,\"1f6b4-1f3ff-200d-2640\":0,\"1f6b4-1f3fb-200d-2642\":0,\"1f6b4-1f3fc-200d-2642\":0,\"1f6b4-1f3fd-200d-2642\":0,\"1f6b4-1f3fe-200d-2642\":0,\"1f6b4-1f3ff-200d-2642\":0,\"1f6b4-1f3fb\":0,\"1f6b4-1f3fc\":0,\"1f6b4-1f3fd\":0,\"1f6b4-1f3fe\":0,\"1f6b4-1f3ff\":0,\"1f6b5-1f3fb-200d-2640\":0,\"1f6b5-1f3fc-200d-2640\":0,\"1f6b5-1f3fd-200d-2640\":0,\"1f6b5-1f3fe-200d-2640\":0,\"1f6b5-1f3ff-200d-2640\":0,\"1f6b5-1f3fb-200d-2642\":0,\"1f6b5-1f3fc-200d-2642\":0,\"1f6b5-1f3fd-200d-2642\":0,\"1f6b5-1f3fe-200d-2642\":0,\"1f6b5-1f3ff-200d-2642\":0,\"1f6b5-1f3fb\":0,\"1f6b5-1f3fc\":0,\"1f6b5-1f3fd\":0,\"1f6b5-1f3fe\":0,\"1f6b5-1f3ff\":0,\"1f6b6-1f3fb-200d-2640\":0,\"1f6b6-1f3fc-200d-2640\":0,\"1f6b6-1f3fd-200d-2640\":0,\"1f6b6-1f3fe-200d-2640\":0,\"1f6b6-1f3ff-200d-2640\":0,\"1f6b6-1f3fb-200d-2642\":0,\"1f6b6-1f3fc-200d-2642\":0,\"1f6b6-1f3fd-200d-2642\":0,\"1f6b6-1f3fe-200d-2642\":0,\"1f6b6-1f3ff-200d-2642\":0,\"1f6b6-1f3fb\":0,\"1f6b6-1f3fc\":0,\"1f6b6-1f3fd\":0,\"1f6b6-1f3fe\":0,\"1f6b6-1f3ff\":0,\"1f6c0-1f3fb\":0,\"1f6c0-1f3fc\":0,\"1f6c0-1f3fd\":0,\"1f6c0-1f3fe\":0,\"1f6c0-1f3ff\":0,\"1f6cc-1f3fb\":0,\"1f6cc-1f3fc\":0,\"1f6cc-1f3fd\":0,\"1f6cc-1f3fe\":0,\"1f6cc-1f3ff\":0,\"1f90c-1f3fb\":0,\"1f90c-1f3fc\":0,\"1f90c-1f3fd\":0,\"1f90c-1f3fe\":0,\"1f90c-1f3ff\":0,\"1f90f-1f3fb\":0,\"1f90f-1f3fc\":0,\"1f90f-1f3fd\":0,\"1f90f-1f3fe\":0,\"1f90f-1f3ff\":0,\"1f918-1f3fb\":0,\"1f918-1f3fc\":0,\"1f918-1f3fd\":0,\"1f918-1f3fe\":0,\"1f918-1f3ff\":0,\"1f919-1f3fb\":0,\"1f919-1f3fc\":0,\"1f919-1f3fd\":0,\"1f919-1f3fe\":0,\"1f919-1f3ff\":0,\"1f91a-1f3fb\":0,\"1f91a-1f3fc\":0,\"1f91a-1f3fd\":0,\"1f91a-1f3fe\":0,\"1f91a-1f3ff\":0,\"1f91b-1f3fb\":0,\"1f91b-1f3fc\":0,\"1f91b-1f3fd\":0,\"1f91b-1f3fe\":0,\"1f91b-1f3ff\":0,\"1f91c-1f3fb\":0,\"1f91c-1f3fc\":0,\"1f91c-1f3fd\":0,\"1f91c-1f3fe\":0,\"1f91c-1f3ff\":0,\"1f91d-1f3fb\":0,\"1f91d-1f3fc\":0,\"1f91d-1f3fd\":0,\"1f91d-1f3fe\":0,\"1f91d-1f3ff\":0,\"1f91e-1f3fb\":0,\"1f91e-1f3fc\":0,\"1f91e-1f3fd\":0,\"1f91e-1f3fe\":0,\"1f91e-1f3ff\":0,\"1f91f-1f3fb\":0,\"1f91f-1f3fc\":0,\"1f91f-1f3fd\":0,\"1f91f-1f3fe\":0,\"1f91f-1f3ff\":0,\"1f926-1f3fb-200d-2640\":0,\"1f926-1f3fc-200d-2640\":0,\"1f926-1f3fd-200d-2640\":0,\"1f926-1f3fe-200d-2640\":0,\"1f926-1f3ff-200d-2640\":0,\"1f926-1f3fb-200d-2642\":0,\"1f926-1f3fc-200d-2642\":0,\"1f926-1f3fd-200d-2642\":0,\"1f926-1f3fe-200d-2642\":0,\"1f926-1f3ff-200d-2642\":0,\"1f926-1f3fb\":0,\"1f926-1f3fc\":0,\"1f926-1f3fd\":0,\"1f926-1f3fe\":0,\"1f926-1f3ff\":0,\"1f930-1f3fb\":0,\"1f930-1f3fc\":0,\"1f930-1f3fd\":0,\"1f930-1f3fe\":0,\"1f930-1f3ff\":0,\"1f931-1f3fb\":0,\"1f931-1f3fc\":0,\"1f931-1f3fd\":0,\"1f931-1f3fe\":0,\"1f931-1f3ff\":0,\"1f932-1f3fb\":0,\"1f932-1f3fc\":0,\"1f932-1f3fd\":0,\"1f932-1f3fe\":0,\"1f932-1f3ff\":0,\"1f933-1f3fb\":0,\"1f933-1f3fc\":0,\"1f933-1f3fd\":0,\"1f933-1f3fe\":0,\"1f933-1f3ff\":0,\"1f934-1f3fb\":0,\"1f934-1f3fc\":0,\"1f934-1f3fd\":0,\"1f934-1f3fe\":0,\"1f934-1f3ff\":0,\"1f935-1f3fb-200d-2640\":0,\"1f935-1f3fc-200d-2640\":0,\"1f935-1f3fd-200d-2640\":0,\"1f935-1f3fe-200d-2640\":0,\"1f935-1f3ff-200d-2640\":0,\"1f935-1f3fb-200d-2642\":0,\"1f935-1f3fc-200d-2642\":0,\"1f935-1f3fd-200d-2642\":0,\"1f935-1f3fe-200d-2642\":0,\"1f935-1f3ff-200d-2642\":0,\"1f935-1f3fb\":0,\"1f935-1f3fc\":0,\"1f935-1f3fd\":0,\"1f935-1f3fe\":0,\"1f935-1f3ff\":0,\"1f936-1f3fb\":0,\"1f936-1f3fc\":0,\"1f936-1f3fd\":0,\"1f936-1f3fe\":0,\"1f936-1f3ff\":0,\"1f937-1f3fb-200d-2640\":0,\"1f937-1f3fc-200d-2640\":0,\"1f937-1f3fd-200d-2640\":0,\"1f937-1f3fe-200d-2640\":0,\"1f937-1f3ff-200d-2640\":0,\"1f937-1f3fb-200d-2642\":0,\"1f937-1f3fc-200d-2642\":0,\"1f937-1f3fd-200d-2642\":0,\"1f937-1f3fe-200d-2642\":0,\"1f937-1f3ff-200d-2642\":0,\"1f937-1f3fb\":0,\"1f937-1f3fc\":0,\"1f937-1f3fd\":0,\"1f937-1f3fe\":0,\"1f937-1f3ff\":0,\"1f938-1f3fb-200d-2640\":0,\"1f938-1f3fc-200d-2640\":0,\"1f938-1f3fd-200d-2640\":0,\"1f938-1f3fe-200d-2640\":0,\"1f938-1f3ff-200d-2640\":0,\"1f938-1f3fb-200d-2642\":0,\"1f938-1f3fc-200d-2642\":0,\"1f938-1f3fd-200d-2642\":0,\"1f938-1f3fe-200d-2642\":0,\"1f938-1f3ff-200d-2642\":0,\"1f938-1f3fb\":0,\"1f938-1f3fc\":0,\"1f938-1f3fd\":0,\"1f938-1f3fe\":0,\"1f938-1f3ff\":0,\"1f939-1f3fb-200d-2640\":0,\"1f939-1f3fc-200d-2640\":0,\"1f939-1f3fd-200d-2640\":0,\"1f939-1f3fe-200d-2640\":0,\"1f939-1f3ff-200d-2640\":0,\"1f939-1f3fb-200d-2642\":0,\"1f939-1f3fc-200d-2642\":0,\"1f939-1f3fd-200d-2642\":0,\"1f939-1f3fe-200d-2642\":0,\"1f939-1f3ff-200d-2642\":0,\"1f939-1f3fb\":0,\"1f939-1f3fc\":0,\"1f939-1f3fd\":0,\"1f939-1f3fe\":0,\"1f939-1f3ff\":0,\"1f93d-1f3fb-200d-2640\":0,\"1f93d-1f3fc-200d-2640\":0,\"1f93d-1f3fd-200d-2640\":0,\"1f93d-1f3fe-200d-2640\":0,\"1f93d-1f3ff-200d-2640\":0,\"1f93d-1f3fb-200d-2642\":0,\"1f93d-1f3fc-200d-2642\":0,\"1f93d-1f3fd-200d-2642\":0,\"1f93d-1f3fe-200d-2642\":0,\"1f93d-1f3ff-200d-2642\":0,\"1f93d-1f3fb\":0,\"1f93d-1f3fc\":0,\"1f93d-1f3fd\":0,\"1f93d-1f3fe\":0,\"1f93d-1f3ff\":0,\"1f93e-1f3fb-200d-2640\":0,\"1f93e-1f3fc-200d-2640\":0,\"1f93e-1f3fd-200d-2640\":0,\"1f93e-1f3fe-200d-2640\":0,\"1f93e-1f3ff-200d-2640\":0,\"1f93e-1f3fb-200d-2642\":0,\"1f93e-1f3fc-200d-2642\":0,\"1f93e-1f3fd-200d-2642\":0,\"1f93e-1f3fe-200d-2642\":0,\"1f93e-1f3ff-200d-2642\":0,\"1f93e-1f3fb\":0,\"1f93e-1f3fc\":0,\"1f93e-1f3fd\":0,\"1f93e-1f3fe\":0,\"1f93e-1f3ff\":0,\"1f977-1f3fb\":0,\"1f977-1f3fc\":0,\"1f977-1f3fd\":0,\"1f977-1f3fe\":0,\"1f977-1f3ff\":0,\"1f9b5-1f3fb\":0,\"1f9b5-1f3fc\":0,\"1f9b5-1f3fd\":0,\"1f9b5-1f3fe\":0,\"1f9b5-1f3ff\":0,\"1f9b6-1f3fb\":0,\"1f9b6-1f3fc\":0,\"1f9b6-1f3fd\":0,\"1f9b6-1f3fe\":0,\"1f9b6-1f3ff\":0,\"1f9b8-1f3fb-200d-2640\":0,\"1f9b8-1f3fc-200d-2640\":0,\"1f9b8-1f3fd-200d-2640\":0,\"1f9b8-1f3fe-200d-2640\":0,\"1f9b8-1f3ff-200d-2640\":0,\"1f9b8-1f3fb-200d-2642\":0,\"1f9b8-1f3fc-200d-2642\":0,\"1f9b8-1f3fd-200d-2642\":0,\"1f9b8-1f3fe-200d-2642\":0,\"1f9b8-1f3ff-200d-2642\":0,\"1f9b8-1f3fb\":0,\"1f9b8-1f3fc\":0,\"1f9b8-1f3fd\":0,\"1f9b8-1f3fe\":0,\"1f9b8-1f3ff\":0,\"1f9b9-1f3fb-200d-2640\":0,\"1f9b9-1f3fc-200d-2640\":0,\"1f9b9-1f3fd-200d-2640\":0,\"1f9b9-1f3fe-200d-2640\":0,\"1f9b9-1f3ff-200d-2640\":0,\"1f9b9-1f3fb-200d-2642\":0,\"1f9b9-1f3fc-200d-2642\":0,\"1f9b9-1f3fd-200d-2642\":0,\"1f9b9-1f3fe-200d-2642\":0,\"1f9b9-1f3ff-200d-2642\":0,\"1f9b9-1f3fb\":0,\"1f9b9-1f3fc\":0,\"1f9b9-1f3fd\":0,\"1f9b9-1f3fe\":0,\"1f9b9-1f3ff\":0,\"1f9bb-1f3fb\":0,\"1f9bb-1f3fc\":0,\"1f9bb-1f3fd\":0,\"1f9bb-1f3fe\":0,\"1f9bb-1f3ff\":0,\"1f9cd-1f3fb-200d-2640\":0,\"1f9cd-1f3fc-200d-2640\":0,\"1f9cd-1f3fd-200d-2640\":0,\"1f9cd-1f3fe-200d-2640\":0,\"1f9cd-1f3ff-200d-2640\":0,\"1f9cd-1f3fb-200d-2642\":0,\"1f9cd-1f3fc-200d-2642\":0,\"1f9cd-1f3fd-200d-2642\":0,\"1f9cd-1f3fe-200d-2642\":0,\"1f9cd-1f3ff-200d-2642\":0,\"1f9cd-1f3fb\":0,\"1f9cd-1f3fc\":0,\"1f9cd-1f3fd\":0,\"1f9cd-1f3fe\":0,\"1f9cd-1f3ff\":0,\"1f9ce-1f3fb-200d-2640\":0,\"1f9ce-1f3fc-200d-2640\":0,\"1f9ce-1f3fd-200d-2640\":0,\"1f9ce-1f3fe-200d-2640\":0,\"1f9ce-1f3ff-200d-2640\":0,\"1f9ce-1f3fb-200d-2642\":0,\"1f9ce-1f3fc-200d-2642\":0,\"1f9ce-1f3fd-200d-2642\":0,\"1f9ce-1f3fe-200d-2642\":0,\"1f9ce-1f3ff-200d-2642\":0,\"1f9ce-1f3fb\":0,\"1f9ce-1f3fc\":0,\"1f9ce-1f3fd\":0,\"1f9ce-1f3fe\":0,\"1f9ce-1f3ff\":0,\"1f9cf-1f3fb-200d-2640\":0,\"1f9cf-1f3fc-200d-2640\":0,\"1f9cf-1f3fd-200d-2640\":0,\"1f9cf-1f3fe-200d-2640\":0,\"1f9cf-1f3ff-200d-2640\":0,\"1f9cf-1f3fb-200d-2642\":0,\"1f9cf-1f3fc-200d-2642\":0,\"1f9cf-1f3fd-200d-2642\":0,\"1f9cf-1f3fe-200d-2642\":0,\"1f9cf-1f3ff-200d-2642\":0,\"1f9cf-1f3fb\":0,\"1f9cf-1f3fc\":0,\"1f9cf-1f3fd\":0,\"1f9cf-1f3fe\":0,\"1f9cf-1f3ff\":0,\"1f9d1-1f3fb-200d-1f33e\":0,\"1f9d1-1f3fc-200d-1f33e\":0,\"1f9d1-1f3fd-200d-1f33e\":0,\"1f9d1-1f3fe-200d-1f33e\":0,\"1f9d1-1f3ff-200d-1f33e\":0,\"1f9d1-1f3fb-200d-1f373\":0,\"1f9d1-1f3fc-200d-1f373\":0,\"1f9d1-1f3fd-200d-1f373\":0,\"1f9d1-1f3fe-200d-1f373\":0,\"1f9d1-1f3ff-200d-1f373\":0,\"1f9d1-1f3fb-200d-1f37c\":0,\"1f9d1-1f3fc-200d-1f37c\":0,\"1f9d1-1f3fd-200d-1f37c\":0,\"1f9d1-1f3fe-200d-1f37c\":0,\"1f9d1-1f3ff-200d-1f37c\":0,\"1f9d1-1f3fb-200d-1f384\":0,\"1f9d1-1f3fc-200d-1f384\":0,\"1f9d1-1f3fd-200d-1f384\":0,\"1f9d1-1f3fe-200d-1f384\":0,\"1f9d1-1f3ff-200d-1f384\":0,\"1f9d1-1f3fb-200d-1f393\":0,\"1f9d1-1f3fc-200d-1f393\":0,\"1f9d1-1f3fd-200d-1f393\":0,\"1f9d1-1f3fe-200d-1f393\":0,\"1f9d1-1f3ff-200d-1f393\":0,\"1f9d1-1f3fb-200d-1f3a4\":0,\"1f9d1-1f3fc-200d-1f3a4\":0,\"1f9d1-1f3fd-200d-1f3a4\":0,\"1f9d1-1f3fe-200d-1f3a4\":0,\"1f9d1-1f3ff-200d-1f3a4\":0,\"1f9d1-1f3fb-200d-1f3a8\":0,\"1f9d1-1f3fc-200d-1f3a8\":0,\"1f9d1-1f3fd-200d-1f3a8\":0,\"1f9d1-1f3fe-200d-1f3a8\":0,\"1f9d1-1f3ff-200d-1f3a8\":0,\"1f9d1-1f3fb-200d-1f3eb\":0,\"1f9d1-1f3fc-200d-1f3eb\":0,\"1f9d1-1f3fd-200d-1f3eb\":0,\"1f9d1-1f3fe-200d-1f3eb\":0,\"1f9d1-1f3ff-200d-1f3eb\":0,\"1f9d1-1f3fb-200d-1f3ed\":0,\"1f9d1-1f3fc-200d-1f3ed\":0,\"1f9d1-1f3fd-200d-1f3ed\":0,\"1f9d1-1f3fe-200d-1f3ed\":0,\"1f9d1-1f3ff-200d-1f3ed\":0,\"1f9d1-1f3fb-200d-1f4bb\":0,\"1f9d1-1f3fc-200d-1f4bb\":0,\"1f9d1-1f3fd-200d-1f4bb\":0,\"1f9d1-1f3fe-200d-1f4bb\":0,\"1f9d1-1f3ff-200d-1f4bb\":0,\"1f9d1-1f3fb-200d-1f4bc\":0,\"1f9d1-1f3fc-200d-1f4bc\":0,\"1f9d1-1f3fd-200d-1f4bc\":0,\"1f9d1-1f3fe-200d-1f4bc\":0,\"1f9d1-1f3ff-200d-1f4bc\":0,\"1f9d1-1f3fb-200d-1f527\":0,\"1f9d1-1f3fc-200d-1f527\":0,\"1f9d1-1f3fd-200d-1f527\":0,\"1f9d1-1f3fe-200d-1f527\":0,\"1f9d1-1f3ff-200d-1f527\":0,\"1f9d1-1f3fb-200d-1f52c\":0,\"1f9d1-1f3fc-200d-1f52c\":0,\"1f9d1-1f3fd-200d-1f52c\":0,\"1f9d1-1f3fe-200d-1f52c\":0,\"1f9d1-1f3ff-200d-1f52c\":0,\"1f9d1-1f3fb-200d-1f680\":0,\"1f9d1-1f3fc-200d-1f680\":0,\"1f9d1-1f3fd-200d-1f680\":0,\"1f9d1-1f3fe-200d-1f680\":0,\"1f9d1-1f3ff-200d-1f680\":0,\"1f9d1-1f3fb-200d-1f692\":0,\"1f9d1-1f3fc-200d-1f692\":0,\"1f9d1-1f3fd-200d-1f692\":0,\"1f9d1-1f3fe-200d-1f692\":0,\"1f9d1-1f3ff-200d-1f692\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fb-200d-1f9af\":0,\"1f9d1-1f3fc-200d-1f9af\":0,\"1f9d1-1f3fd-200d-1f9af\":0,\"1f9d1-1f3fe-200d-1f9af\":0,\"1f9d1-1f3ff-200d-1f9af\":0,\"1f9d1-1f3fb-200d-1f9b0\":0,\"1f9d1-1f3fc-200d-1f9b0\":0,\"1f9d1-1f3fd-200d-1f9b0\":0,\"1f9d1-1f3fe-200d-1f9b0\":0,\"1f9d1-1f3ff-200d-1f9b0\":0,\"1f9d1-1f3fb-200d-1f9b1\":0,\"1f9d1-1f3fc-200d-1f9b1\":0,\"1f9d1-1f3fd-200d-1f9b1\":0,\"1f9d1-1f3fe-200d-1f9b1\":0,\"1f9d1-1f3ff-200d-1f9b1\":0,\"1f9d1-1f3fb-200d-1f9b2\":0,\"1f9d1-1f3fc-200d-1f9b2\":0,\"1f9d1-1f3fd-200d-1f9b2\":0,\"1f9d1-1f3fe-200d-1f9b2\":0,\"1f9d1-1f3ff-200d-1f9b2\":0,\"1f9d1-1f3fb-200d-1f9b3\":0,\"1f9d1-1f3fc-200d-1f9b3\":0,\"1f9d1-1f3fd-200d-1f9b3\":0,\"1f9d1-1f3fe-200d-1f9b3\":0,\"1f9d1-1f3ff-200d-1f9b3\":0,\"1f9d1-1f3fb-200d-1f9bc\":0,\"1f9d1-1f3fc-200d-1f9bc\":0,\"1f9d1-1f3fd-200d-1f9bc\":0,\"1f9d1-1f3fe-200d-1f9bc\":0,\"1f9d1-1f3ff-200d-1f9bc\":0,\"1f9d1-1f3fb-200d-1f9bd\":0,\"1f9d1-1f3fc-200d-1f9bd\":0,\"1f9d1-1f3fd-200d-1f9bd\":0,\"1f9d1-1f3fe-200d-1f9bd\":0,\"1f9d1-1f3ff-200d-1f9bd\":0,\"1f9d1-1f3fb-200d-2695\":0,\"1f9d1-1f3fc-200d-2695\":0,\"1f9d1-1f3fd-200d-2695\":0,\"1f9d1-1f3fe-200d-2695\":0,\"1f9d1-1f3ff-200d-2695\":0,\"1f9d1-1f3fb-200d-2696\":0,\"1f9d1-1f3fc-200d-2696\":0,\"1f9d1-1f3fd-200d-2696\":0,\"1f9d1-1f3fe-200d-2696\":0,\"1f9d1-1f3ff-200d-2696\":0,\"1f9d1-1f3fb-200d-2708\":0,\"1f9d1-1f3fc-200d-2708\":0,\"1f9d1-1f3fd-200d-2708\":0,\"1f9d1-1f3fe-200d-2708\":0,\"1f9d1-1f3ff-200d-2708\":0,\"1f9d1-1f3fb\":0,\"1f9d1-1f3fc\":0,\"1f9d1-1f3fd\":0,\"1f9d1-1f3fe\":0,\"1f9d1-1f3ff\":0,\"1f9d2-1f3fb\":0,\"1f9d2-1f3fc\":0,\"1f9d2-1f3fd\":0,\"1f9d2-1f3fe\":0,\"1f9d2-1f3ff\":0,\"1f9d3-1f3fb\":0,\"1f9d3-1f3fc\":0,\"1f9d3-1f3fd\":0,\"1f9d3-1f3fe\":0,\"1f9d3-1f3ff\":0,\"1f9d4-1f3fb-200d-2640\":0,\"1f9d4-1f3fc-200d-2640\":0,\"1f9d4-1f3fd-200d-2640\":0,\"1f9d4-1f3fe-200d-2640\":0,\"1f9d4-1f3ff-200d-2640\":0,\"1f9d4-1f3fb-200d-2642\":0,\"1f9d4-1f3fc-200d-2642\":0,\"1f9d4-1f3fd-200d-2642\":0,\"1f9d4-1f3fe-200d-2642\":0,\"1f9d4-1f3ff-200d-2642\":0,\"1f9d4-1f3fb\":0,\"1f9d4-1f3fc\":0,\"1f9d4-1f3fd\":0,\"1f9d4-1f3fe\":0,\"1f9d4-1f3ff\":0,\"1f9d5-1f3fb\":0,\"1f9d5-1f3fc\":0,\"1f9d5-1f3fd\":0,\"1f9d5-1f3fe\":0,\"1f9d5-1f3ff\":0,\"1f9d6-1f3fb-200d-2640\":0,\"1f9d6-1f3fc-200d-2640\":0,\"1f9d6-1f3fd-200d-2640\":0,\"1f9d6-1f3fe-200d-2640\":0,\"1f9d6-1f3ff-200d-2640\":0,\"1f9d6-1f3fb-200d-2642\":0,\"1f9d6-1f3fc-200d-2642\":0,\"1f9d6-1f3fd-200d-2642\":0,\"1f9d6-1f3fe-200d-2642\":0,\"1f9d6-1f3ff-200d-2642\":0,\"1f9d6-1f3fb\":0,\"1f9d6-1f3fc\":0,\"1f9d6-1f3fd\":0,\"1f9d6-1f3fe\":0,\"1f9d6-1f3ff\":0,\"1f9d7-1f3fb-200d-2640\":0,\"1f9d7-1f3fc-200d-2640\":0,\"1f9d7-1f3fd-200d-2640\":0,\"1f9d7-1f3fe-200d-2640\":0,\"1f9d7-1f3ff-200d-2640\":0,\"1f9d7-1f3fb-200d-2642\":0,\"1f9d7-1f3fc-200d-2642\":0,\"1f9d7-1f3fd-200d-2642\":0,\"1f9d7-1f3fe-200d-2642\":0,\"1f9d7-1f3ff-200d-2642\":0,\"1f9d7-1f3fb\":0,\"1f9d7-1f3fc\":0,\"1f9d7-1f3fd\":0,\"1f9d7-1f3fe\":0,\"1f9d7-1f3ff\":0,\"1f9d8-1f3fb-200d-2640\":0,\"1f9d8-1f3fc-200d-2640\":0,\"1f9d8-1f3fd-200d-2640\":0,\"1f9d8-1f3fe-200d-2640\":0,\"1f9d8-1f3ff-200d-2640\":0,\"1f9d8-1f3fb-200d-2642\":0,\"1f9d8-1f3fc-200d-2642\":0,\"1f9d8-1f3fd-200d-2642\":0,\"1f9d8-1f3fe-200d-2642\":0,\"1f9d8-1f3ff-200d-2642\":0,\"1f9d8-1f3fb\":0,\"1f9d8-1f3fc\":0,\"1f9d8-1f3fd\":0,\"1f9d8-1f3fe\":0,\"1f9d8-1f3ff\":0,\"1f9d9-1f3fb-200d-2640\":0,\"1f9d9-1f3fc-200d-2640\":0,\"1f9d9-1f3fd-200d-2640\":0,\"1f9d9-1f3fe-200d-2640\":0,\"1f9d9-1f3ff-200d-2640\":0,\"1f9d9-1f3fb-200d-2642\":0,\"1f9d9-1f3fc-200d-2642\":0,\"1f9d9-1f3fd-200d-2642\":0,\"1f9d9-1f3fe-200d-2642\":0,\"1f9d9-1f3ff-200d-2642\":0,\"1f9d9-1f3fb\":0,\"1f9d9-1f3fc\":0,\"1f9d9-1f3fd\":0,\"1f9d9-1f3fe\":0,\"1f9d9-1f3ff\":0,\"1f9da-1f3fb-200d-2640\":0,\"1f9da-1f3fc-200d-2640\":0,\"1f9da-1f3fd-200d-2640\":0,\"1f9da-1f3fe-200d-2640\":0,\"1f9da-1f3ff-200d-2640\":0,\"1f9da-1f3fb-200d-2642\":0,\"1f9da-1f3fc-200d-2642\":0,\"1f9da-1f3fd-200d-2642\":0,\"1f9da-1f3fe-200d-2642\":0,\"1f9da-1f3ff-200d-2642\":0,\"1f9da-1f3fb\":0,\"1f9da-1f3fc\":0,\"1f9da-1f3fd\":0,\"1f9da-1f3fe\":0,\"1f9da-1f3ff\":0,\"1f9db-1f3fb-200d-2640\":0,\"1f9db-1f3fc-200d-2640\":0,\"1f9db-1f3fd-200d-2640\":0,\"1f9db-1f3fe-200d-2640\":0,\"1f9db-1f3ff-200d-2640\":0,\"1f9db-1f3fb-200d-2642\":0,\"1f9db-1f3fc-200d-2642\":0,\"1f9db-1f3fd-200d-2642\":0,\"1f9db-1f3fe-200d-2642\":0,\"1f9db-1f3ff-200d-2642\":0,\"1f9db-1f3fb\":0,\"1f9db-1f3fc\":0,\"1f9db-1f3fd\":0,\"1f9db-1f3fe\":0,\"1f9db-1f3ff\":0,\"1f9dc-1f3fb-200d-2640\":0,\"1f9dc-1f3fc-200d-2640\":0,\"1f9dc-1f3fd-200d-2640\":0,\"1f9dc-1f3fe-200d-2640\":0,\"1f9dc-1f3ff-200d-2640\":0,\"1f9dc-1f3fb-200d-2642\":0,\"1f9dc-1f3fc-200d-2642\":0,\"1f9dc-1f3fd-200d-2642\":0,\"1f9dc-1f3fe-200d-2642\":0,\"1f9dc-1f3ff-200d-2642\":0,\"1f9dc-1f3fb\":0,\"1f9dc-1f3fc\":0,\"1f9dc-1f3fd\":0,\"1f9dc-1f3fe\":0,\"1f9dc-1f3ff\":0,\"1f9dd-1f3fb-200d-2640\":0,\"1f9dd-1f3fc-200d-2640\":0,\"1f9dd-1f3fd-200d-2640\":0,\"1f9dd-1f3fe-200d-2640\":0,\"1f9dd-1f3ff-200d-2640\":0,\"1f9dd-1f3fb-200d-2642\":0,\"1f9dd-1f3fc-200d-2642\":0,\"1f9dd-1f3fd-200d-2642\":0,\"1f9dd-1f3fe-200d-2642\":0,\"1f9dd-1f3ff-200d-2642\":0,\"1f9dd-1f3fb\":0,\"1f9dd-1f3fc\":0,\"1f9dd-1f3fd\":0,\"1f9dd-1f3fe\":0,\"1f9dd-1f3ff\":0,\"261d-1f3fb\":0,\"261d-1f3fc\":0,\"261d-1f3fd\":0,\"261d-1f3fe\":0,\"261d-1f3ff\":0,\"26f9-1f3fb-200d-2640\":0,\"26f9-1f3fc-200d-2640\":0,\"26f9-1f3fd-200d-2640\":0,\"26f9-1f3fe-200d-2640\":0,\"26f9-1f3ff-200d-2640\":0,\"26f9-1f3fb-200d-2642\":0,\"26f9-1f3fc-200d-2642\":0,\"26f9-1f3fd-200d-2642\":0,\"26f9-1f3fe-200d-2642\":0,\"26f9-1f3ff-200d-2642\":0,\"26f9-1f3fb\":0,\"26f9-1f3fc\":0,\"26f9-1f3fd\":0,\"26f9-1f3fe\":0,\"26f9-1f3ff\":0,\"270a-1f3fb\":0,\"270a-1f3fc\":0,\"270a-1f3fd\":0,\"270a-1f3fe\":0,\"270a-1f3ff\":0,\"270b-1f3fb\":0,\"270b-1f3fc\":0,\"270b-1f3fd\":0,\"270b-1f3fe\":0,\"270b-1f3ff\":0,\"270c-1f3fb\":0,\"270c-1f3fc\":0,\"270c-1f3fd\":0,\"270c-1f3fe\":0,\"270c-1f3ff\":0,\"270d-1f3fb\":0,\"270d-1f3fc\":0,\"270d-1f3fd\":0,\"270d-1f3fe\":0,\"270d-1f3ff\":0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","// Copyright Twitter Inc. Licensed under MIT\r\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\r\n\r\nconst originalString = \"((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)\";\r\nexport default originalString;\r\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nconst TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\n\nexport default TLD;\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../vendor/emoji/regex';\nimport { encodeEmoji, toCodePoints } from '../vendor/emoji';\nimport { Message, MessageEntity } from '../layer';\nimport { IS_SAFARI } from '../environment/userAgent';\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport copy from '../helpers/object/copy';\nimport encodeEntities from '../helpers/string/encodeEntities';\nimport Emoji, { EmojiVersions } from '../config/emoji';\nimport TLD from '../config/tld';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nconst alphaCharsRegExp = '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)\nconst alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\nconst domainAddChars = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nconst urlAlphanumericRegExpPart = '[' + alphaCharsRegExp + '0-9]';\nconst urlProtocolRegExpPart = '((?:https?|ftp)://|mailto:)?';\nconst urlRegExp = urlProtocolRegExpPart +\n // user:pass authentication\n '(?:' + urlAlphanumericRegExpPart + '{1,64}(?::' + urlAlphanumericRegExpPart + '{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 urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nconst urlProtocolRegExp = new RegExp('^' + urlProtocolRegExpPart.slice(0, -1), 'i');\nconst urlAnyProtocolRegExp = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nconst usernameRegExp = '[a-zA-Z\\\\d_]{5,32}';\nconst botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)';\nconst fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i');\nconst emailRegExp = /^(([^<>()[\\]\\\\.,;:\\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 = /[`_*@~]/;\nconst markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nconst siteHashtags: {[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\nconst siteMentions: {[siteName: string]: string} = {\n Telegram: '#/im?p=%40{1}',\n Twitter: 'https://twitter.com/{1}',\n Instagram: 'https://instagram.com/{1}/',\n GitHub: 'https://github.com/{1}'\n};\nconst markdownEntities: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nconst passConflictingEntities: Set<MessageEntity['_']> = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(let i in markdownEntities) {\n passConflictingEntities.add(markdownEntities[i]);\n}\n\nnamespace RichTextProcessor {\n export const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n export function getEmojiUnified(emojiCode: string) {\n let unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n \n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n \n if(!Emoji.hasOwnProperty(unified) \n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n //console.error('lol', unified);\n return;\n }\n \n return unified;\n }\n\n export function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n fullRegExp.lastIndex = 0;\n while((match = raw.match(fullRegExp))) {\n matchIndex = rawOffset + match.index;\n \n //console.log('parseEntities match:', match);\n \n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(emailRegExp.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n \n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n \n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n \n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n //console.log('hit', match[8]);\n const unified = getEmojiUnified(match[8]);\n if(unified) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: unified\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n \n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n \n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n }\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 export function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n   /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(markdownRegExp)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n //text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n \n newTextParts.push(match[1] + text + match[5]);\n \n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: markdownEntities[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n //offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n \n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n \n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n }\n\n export function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n return currentEntities.find(currentEntity => {\n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!passConflictingEntities.has(newEntity._) && !passConflictingEntities.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n }\n\n export function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter(e => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n }\n\n const CAN_COMBINE_ENTITIES: Set<MessageEntity['_']> = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n ]);\n export function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n }\n\n export function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n }\n\n function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\n }\n\n /**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\n export function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n //mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n\n contextHashtag?: string,\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean\n }> = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n entity.length = entity.offset + entity.length - textLength;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement, \n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontWeight = 'bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontStyle = 'italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n element = document.createElement('span');\n element.style.cssText = `${styleName}: line-through;`;\n } else if(!options.noTextFormat) {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n element = document.createElement('span');\n element.style.cssText = `${styleName}: underline;`;\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n \n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontFamily = 'var(--font-monospace)';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n \n break;\n }\n \n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n \n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version];\n if(emojiData.hasOwnProperty(entity.unicode)) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n //if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '<span class=\"emoji\">', '</span>');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '<span class=\"emoji\" contenteditable=\"false\">', '</span>');\n } */\n /* if(!isSupported) {\n insertPart(entity, `<img src=\"assets/img/emoji/${entity.unicode}.png\" alt=\"`, `\" class=\"emoji\">`);\n } */\n\n break;\n }\n \n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\n break;\n }\n\n // case 'messageEntityLinebreak': {\n // if(options.noLinebreaks) {\n // insertPart(entity, ' ');\n // } else {\n // insertPart(entity, '<br/>');\n // }\n \n // break;\n // }\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n nasty.i++;\n }\n\n if(url !== fullEntityText) {\n masked = true;\n }\n } else {\n //inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') \n ? url\n : `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && siteHashtags[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = `#/im?p=${encodeURIComponent(entity.user_id)}`;\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n element = document.createElement('a');\n element.className = 'mention';\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n // insertPart(entity, `<a class=\"mention\" href=\"${contextUrl.replace('{1}', encodeURIComponent(username))}\"${contextExternal ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : ''}>`, '</a>');\n }\n \n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const before = nasty.text.slice(0, entity.offset);\n const spoilerBefore = nasty.text.slice(entity.offset, entity.offset + entity.length);\n const spoilerAfter = partText = spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */;\n const after = nasty.text.slice(entity.offset + entity.length);\n nasty.text = before + spoilerAfter + after;\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontFamily = 'spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n }\n \n break;\n }\n }\n\n if(!usedText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentElement) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < (endOffset - 1)) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentElement) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n return fragment;\n }\n\n export function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach(entity => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n \n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n }\n\n export function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n }> = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n return wrapRichText(text, {\n entities: options.entities, \n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n }\n\n export function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n }\n\n export function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n \n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n let char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\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 /**\n * ! This function is still unsafe to use with .innerHTML\n */\n export function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n if(entities?.length) {\n entities = entities.filter(entity => entity._ === 'messageEntitySpoiler');\n }\n \n return wrapRichText(text, {\n entities, \n noEncoding: true,\n noTextFormat: true,\n noLinebreaks: true,\n noLinks: true\n }).textContent;\n }\n\n export function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return wrapRichText('');\n \n let entities = parseEntities(text).filter(e => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n }\n\n export function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n \n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n\n // second regexp is for phone numbers (t.me/+38050...)\n if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n const path = fullPath.split('/');\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'voicechat':\n onclick = path[0];\n break;\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];\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 return {url, onclick};\n }\n\n export function matchUrlProtocol(text: string) {\n return !text ? null : text.match(urlAnyProtocolRegExp);\n }\n \n export function matchUrl(text: string) {\n return !text ? null : text.match(urlRegExp);\n }\n\n export function matchEmail(text: string) {\n return !text ? null : text.match(emailRegExp);\n }\n\n export function getAbbreviation(str: string, onlyFirst = false) {\n if(!str) return '';\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n }\n\n export function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n }\n\n export function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n }\n\n export function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n }\n}\n\nMOUNT_CLASS_TO.RichTextProcessor = RichTextProcessor;\n\nexport {RichTextProcessor};\nexport default RichTextProcessor;\n\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array<string> {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&amp;').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(/</g, '&lt;').replace(/>/g, '&gt;');\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 let 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function fixSafariStickyInput(input: HTMLElement) {\r\n input.style.transform = 'translateY(-99999px)';\r\n /* input.style.position = 'fixed';\r\n input.style.top = '-99999px';\r\n input.style.left = '0'; */\r\n input.focus();\r\n \r\n // setTimeout(() => {\r\n doubleRaf().then(() => {\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n /* input.style.position = '';\r\n input.style.top = ''; */\r\n input.style.transform = '';\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n \r\n /* setTimeout(() => {\r\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\r\n }, 50); */\r\n });\r\n // }, 0);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelEvent(event: Event) {\r\n event = event || window.event;\r\n if(event) {\r\n // @ts-ignore\r\n event = event.originalEvent || event;\r\n\r\n try {\r\n if(event.stopPropagation) event.stopPropagation();\r\n if(event.preventDefault) event.preventDefault();\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n } catch(err) {}\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//export function findUpClassName<T>(el: any, className: string): T;\r\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\r\n return (el as any).closest('.' + className);\r\n /* if(el.classList.contains(className)) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.classList.contains(className)) \r\n return el;\r\n }\r\n return null; */\r\n}\r\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 { Dialog } from './appMessagesManager';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport type { AppMediaPlaybackController } from '../../components/appMediaPlaybackController';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { AutoDownloadSettings, Chat, NotifyPeer, PeerNotifySettings } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\nimport getTimeFormat from '../../helpers/getTimeFormat';\nimport copy from '../../helpers/object/copy';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport validateInitObject from '../../helpers/object/validateInitObject';\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\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\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 Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\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 updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\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,\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: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType<AppMediaPlaybackController['getPlaybackParams']>,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude<NotifyPeer['_'], 'notifyPeer'>]?: PeerNotifySettings.peerNotifySettings}\n};\n\nconst BACKGROUND_DAY_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n};\n\nconst 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\nconst BACKGROUND_NIGHT_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n};\n\nconst 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 STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\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 animationsEnabled: true,\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 autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: IS_MOBILE ? BACKGROUND_DAY_MOBILE : BACKGROUND_DAY_DESKTOP\n }, {\n name: 'night',\n background: IS_MOBILE ? BACKGROUND_NIGHT_MOBILE : BACKGROUND_NIGHT_DESKTOP\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\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\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array<keyof State>;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array<keyof State>;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array<keyof State>;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise<void>,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise<State>;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map<PeerId, Set<string>> = new Map();\n private singlePeerMap: Map<string, PeerId> = new Map();\n\n public storages = {\n users: new AppStorage<Record<UserId, User>, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage<Record<ChatId, Chat>, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage<Record<PeerId, Dialog>, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n public oldVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n\n rootScope.addEventListener('user_auth', () => {\n this.requestPeerSingle(rootScope.myId, 'self');\n });\n }\n\n public loadSavedState(): Promise<State> {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array<keyof AppStateManager['storages']>;\n const storagesPromises: Promise<any>[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise<any>[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\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 let state: State = this.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 this.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 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 let 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 // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map<keyof State, State[keyof State]> = 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 = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(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 this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\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 // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\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 this.pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\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) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' && \n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' && \n theme.background.type === 'image' \n ) || (\n theme.name === 'night' && \n theme.background.color === '#0f0f0f' && \n theme.background.type === 'color' \n )) {\n const newTheme = STATE_INIT.settings.themes.find(newTheme => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n this.pushToState('settings', state.settings);\n }\n }\n \n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n this.newVersion = STATE_VERSION;\n this.oldVersion = state.version;\n }\n\n this.pushToState('version', STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState<T extends keyof State>(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage<T extends keyof State>(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\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","import getDeepProperty from \"./getDeepProperty\";\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport { NoneToVoidFunction } from \"../types\";\r\n\r\n/*\r\nexport function throttleWithTickEnd<F extends AnyToVoidFunction>(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow<F extends AnyToVoidFunction>(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise<void>;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise<void>((resolve) => fastRaf(() => resolve()));\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise<void>((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport I18n, { i18n } from \"../lib/langPack\";\r\nimport tsNow from './tsNow';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\nexport {tsNow};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function blurActiveElement() {\r\n if(document.activeElement && (document.activeElement as HTMLInputElement).blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","export default function findAndSplice<T>(array: Array<T>, verify: (value: T, index?: number, array?: Array<T>) => boolean) {\n const index = array.findIndex(verify);\n return index !== -1 ? array.splice(index, 1)[0] : undefined;\n};\n","export default function noop() {}\r\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every(key => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from \"../schedulers/pause\";\r\n\r\nconst texts = ['b', 'б'];\r\ntype FontType = 'text' | 'icons' | 'monospace';\r\n\r\nconst cache: {\r\n [key: string]: {\r\n [text: string]: Promise<any>\r\n }\r\n} = {};\r\n\r\nconst fonts: {[type in FontType]: string} = {\r\n text: 'Roboto',\r\n icons: 'tgico',\r\n monospace: 'Roboto Mono'\r\n};\r\n\r\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\r\n text: texts,\r\n icons: undefined,\r\n monospace: texts\r\n}): Promise<any> {\r\n if(!('fonts' in document)) {\r\n return Promise.resolve();\r\n }\r\n \r\n const promises: Promise<any>[] = [];\r\n for(const type in types) {\r\n let _texts = types[type as FontType];\r\n if(_texts === 'all') {\r\n _texts = texts;\r\n }\r\n\r\n const font = fonts[type as FontType];\r\n const weights = type === 'icons' ? [500] : [400, 500];\r\n for(const weight of weights) {\r\n const _promises = (_texts || [undefined]).map(text => {\r\n const key = [weight, '1rem', font].join(' ');\r\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\r\n return promise;\r\n });\r\n promises.push(..._promises);\r\n }\r\n }\r\n\r\n return Promise.race([\r\n Promise.all(promises),\r\n pause(1000)\r\n ]);\r\n}\r\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","import { RestrictionReason } from \"../layer\";\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find(reason => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach(reason => {\n ignore.add(reason);\n });\n}\n","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach(key => {\n if(!key) {\n return;\n }\n \n // @ts-ignore\n o = o[key];\n });\n \n return o;\n}\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct<T extends Uint8Array | string>(blobParts: Array<T> | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(canRedirect &&\r\n curValue &&\r\n curValue.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect, \r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map(url => {\r\n const script = document.createElement('script');\r\n const promise = new Promise<void>((resolve) => {\r\n script.onload = script.onerror = () => {\r\n script.remove();\r\n resolve();\r\n };\r\n });\r\n script.src = url;\r\n document.body.appendChild(script);\r\n return promise;\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","import copy from \"./copy\";\nimport isObject from \"./isObject\";\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport { logger } from \"../logger\";\nimport rootScope from \"../rootScope\";\nimport sessionStorage from \"../sessionStorage\";\nimport apiManager from \"./mtprotoworker\";\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nconst CHECK_INSTANCE_INTERVAL = 5000; \nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\n\nexport class SingleInstance {\n private instanceID: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: boolean;\n private initial: boolean;\n private log = logger('INSTANCE');\n\n public start() {\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n this.reset();\n //IdleManager.start();\n\n rootScope.addEventListener('idle', 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 public reset() {\n this.instanceID = nextRandomUint(32);\n this.masterInstance = false;\n if(this.deactivateTimeout) clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n this.deactivated = false;\n this.initial = false;\n }\n\n public 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 rootScope.dispatchEvent('instance_activated');\n }\n }\n\n public deactivateInstance = () => {\n if(this.masterInstance || this.deactivated) {\n return false;\n }\n\n this.log('deactivate');\n this.deactivateTimeout = 0;\n this.deactivated = true;\n this.clearInstance();\n //$modalStack.dismissAll();\n\n //document.title = _('inactive_tab_title_raw')\n\n rootScope.idle.deactivated = true;\n rootScope.dispatchEvent('instance_deactivated');\n };\n\n public checkInstance = (idle = rootScope.idle && rootScope.idle.isIDLE) => {\n if(this.deactivated) {\n return false;\n }\n \n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceID, \n idle, \n time\n };\n\n sessionStorage.get('xt_instance', false).then((curInstance: AppInstance) => {\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 apiManager.startAll();\n if(!this.initial) {\n this.initial = true;\n } else {\n this.log.warn('now master instance', newInstance);\n }\n\n this.masterInstance = true;\n }\n\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n } else {\n if(this.masterInstance) {\n apiManager.stopAll();\n this.log.warn('now idle instance', newInstance);\n if(!this.deactivateTimeout) {\n this.deactivateTimeout = window.setTimeout(this.deactivateInstance, DEACTIVATE_TIMEOUT);\n }\n\n this.masterInstance = false;\n }\n }\n });\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { NotificationSettings } from \"../appManagers/appNotificationsManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport { ServiceWorkerNotificationsClearTask, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"../serviceWorker/index.service\";\r\nimport apiManager from \"./mtprotoworker\";\r\nimport I18n, { LangPackKey } from \"../langPack\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appRuntimeManager from \"../appManagers/appRuntimeManager\";\r\nimport copy from \"../../helpers/object/copy\";\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n \r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || rootScope.idle && rootScope.idle.deactivated) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '') + '#/im';\r\n\r\n const lang: ServiceWorkerPingTask['payload']['lang'] = {} as any;\r\n const ACTIONS_LANG_MAP: Record<keyof ServiceWorkerPingTask['payload']['lang'], LangPackKey> = {\r\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\r\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\r\n push_message_nopreview: 'PushNotification.Message.NoPreview'\r\n };\r\n\r\n for(const action in ACTIONS_LANG_MAP) {\r\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\r\n }\r\n\r\n const task: ServiceWorkerPingTask = {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n }\r\n };\r\n\r\n apiManager.postSWMessage(task);\r\n\r\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\r\n }\r\n\r\n public setSettings(newSettings: WebPushApiManager['settings']) {\r\n this.settings = copy(newSettings);\r\n clearTimeout(this.isAliveTO);\r\n this.isAliveNotify();\r\n }\r\n\r\n public hidePushNotifications() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n const task: ServiceWorkerNotificationsClearTask = {type: 'notifications_clear'};\r\n apiManager.postSWMessage(task);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManager.addServiceWorkerTaskListener('push_click', (task: ServiceWorkerPushClickTask) => {\r\n if(rootScope.idle && rootScope.idle.deactivated) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('push_notification_click', task.payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n \r\n this.log.warn('Push', event, subscriptionObj);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n \n let lastLength = 0;\n args.forEach(b => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"webp.worker.c0cc94110cda650246b2.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport WebpWorker from 'worker-loader!./webp.worker';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport deferredPromise, { CancellablePromise } from '../../helpers/cancellablePromise';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type WebpConvertTask = {\r\n type: 'convertWebp', \r\n payload: {\r\n fileName: string, \r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise<Uint8Array>} = {};\r\n \r\n private init() {\r\n this.worker = new WebpWorker();\r\n this.worker.addEventListener('message', (e) => {\r\n const payload = (e.data as WebpConvertTask).payload;\r\n\r\n if(payload.fileName.indexOf('main-') === 0) {\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n } else {\r\n apiManagerProxy.postMessage(e.data);\r\n }\r\n });\r\n }\r\n\r\n public postMessage(data: WebpConvertTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n fileName = 'main-' + fileName;\r\n\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n \r\n const convertPromise = deferredPromise<Uint8Array>();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;","/*\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 //console.log(target, args);\n const url = args[0] + location.search;\n\n return new target(url);\n }\n };\n\n const workerProxy = new Proxy(Worker, workerHandler);\n Worker = workerProxy;\n}\n\nsetWorkerProxy();\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\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n }\n}\n\nexport {};\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 bufferConcats from \"../helpers/bytes/bufferConcats\";\n\nUint8Array.prototype.concat = function(...args: Array<Uint8Array | ArrayBuffer | number[]>) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n //return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function<T>(this: Promise<T>, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array<Uint8Array | ArrayBuffer | number[]>) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Promise<T> {\n finally: (onfinally?: () => void) => Promise<T>;\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 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 appStateManager from './lib/appManagers/appStateManager';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\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 && !rootScope.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 && !rootScope.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 rootScope.addEventListener('im_tab_change', (id) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n });\n \n rootScope.addEventListener('overlay_toggle', () => {\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 // 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 if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox');\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 /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\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 let perf = performance.now();\n\n const langPromise = I18n.getCacheLangPack();\n\n const [state, langPack] = await Promise.all([\n appStateManager.getState(), \n langPromise\n ]);\n I18n.setTimeFormat(state.settings.timeFormat);\n\n rootScope.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<any>) {\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 const authState = state.authState;\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<void>;\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 }\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\": \"\",\t\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\": \"\",\t\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"],"sourceRoot":""}