diff --git a/.patch-version b/.patch-version index 60d3b2f4a..b6a7d89c6 100644 --- a/.patch-version +++ b/.patch-version @@ -1 +1 @@ -15 +16 diff --git a/dev/perf/globals/0c46207b-1000.json b/dev/perf/globals/0c46207b-1000.json deleted file mode 100644 index 8ee21c69d..000000000 --- a/dev/perf/globals/0c46207b-1000.json +++ /dev/null @@ -1,22051 +0,0 @@ -{ - "isChatInfoShown": true, - "isLeftColumnShown": true, - "fileUploads": { - "byMessageLocalId": {} - }, - "recentEmojis": [ - "grinning", - "kissing_heart", - "christmas_tree", - "brain", - "trophy" - ], - "stickers": { - "setsById": {}, - "added": { - "setIds": [] - }, - "recent": { - "stickers": [] - }, - "favorite": { - "stickers": [] - }, - "featured": { - "setIds": [] - }, - "search": {} - }, - "gifs": { - "saved": { - "gifs": [] - }, - "search": {} - }, - "globalSearch": {}, - "messageSearch": { - "byChatId": {} - }, - "topPeers": {}, - "mediaViewer": {}, - "audioPlayer": {}, - "forwardMessages": {}, - "pollResults": {}, - "chatFolders": { - "byId": {} - }, - "settings": { - "byKey": { - "animationLevel": 1, - "messageTextSize": 16, - "messageSendKeyCombo": "enter", - "language": "en" - } - }, - "errors": [], - "users": { - "byId": { - "454000": { - "id": 454000, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Telegram", - "lastName": null, - "username": "dmcatelegram", - "phoneNumber": "42454", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "1087749393156453034", - "avatar": { - "hash": "1949915608623048" - } - }, - "656567": { - "id": 656567, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Антон", - "lastName": null, - "username": "naukaiprogress", - "phoneNumber": "79024827183", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "7087438295025146936", - "avatar": { - "hash": "2819934248875858" - } - }, - "777000": { - "id": 777000, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Telegram", - "lastName": null, - "username": "", - "phoneNumber": "42777", - "status": { - "type": "userStatusOffline", - "wasOnline": 1565655224 - }, - "accessHash": "-7788485269605279038", - "avatar": { - "hash": "3337190045231023" - } - }, - "914597": { - "id": 914597, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Markus", - "lastName": "Ra", - "username": "MarkusRa", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "8487464354880985091", - "avatar": { - "hash": "3928164660266503" - } - }, - "2317363": { - "id": 2317363, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Ivan", - "lastName": "Zelenin", - "username": "MayneX", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-2380928966981891772", - "avatar": { - "hash": "9952998754200395" - } - }, - "2676926": { - "id": 2676926, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "М", - "lastName": "R", - "username": "rovkin", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "6274207358605821778", - "avatar": { - "hash": "11497310080051238" - } - }, - "3247289": { - "id": 3247289, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Alexey", - "lastName": "Kulichevskiy", - "username": "akulichevskiy", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "4208922841455209314", - "avatar": { - "hash": "13947000511900060" - } - }, - "3412850": { - "id": 3412850, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Alex", - "lastName": "Shakun", - "username": "sashashakun", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579004927 - }, - "accessHash": "-2124314261317387467", - "avatar": { - "hash": "14658079592392679" - } - }, - "3718260": { - "id": 3718260, - "isSelf": true, - "type": "userTypeRegular", - "firstName": "Alexander", - "lastName": "Zinchuk", - "username": "zinchuk", - "phoneNumber": "79150942395", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579006794 - }, - "accessHash": "-3710819038313911682", - "avatar": { - "hash": "15969805554263980" - } - }, - "4274761": { - "id": 4274761, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "hlomzik", - "lastName": null, - "username": "hlomzik", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007484 - }, - "accessHash": "-2310230662522467761", - "avatar": { - "hash": "18359959149456360" - } - }, - "8179415": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007689 - } - }, - "27803002": { - "id": 27803002, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Игнат", - "lastName": null, - "username": "phexq", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-6189636805781011085", - "avatar": { - "hash": "119412984776861704" - } - }, - "38016217": { - "id": 38016217, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Konstantin", - "lastName": "Darutkin", - "username": "kdarutkin", - "phoneNumber": "", - "status": { - "type": "userStatusOnline" - }, - "accessHash": "5387369175054348315", - "avatar": { - "hash": "163278409188879933" - } - }, - "40907434": { - "id": 40907434, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Vlad", - "lastName": null, - "username": "vsha10", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579006379 - }, - "accessHash": "340901894473091634", - "avatar": { - "hash": "175696091649518932" - } - }, - "44588451": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007642 - } - }, - "53759108": { - "id": 53759108, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "kirill.e", - "lastName": null, - "username": "kiririn", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-1895854267611186346", - "avatar": { - "hash": "230893611178371256" - } - }, - "54158593": { - "id": 54158593, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Лиза", - "lastName": null, - "username": "pseudoliza", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "6983116929695588742", - "avatar": { - "hash": "232609386188614561" - } - }, - "56240484": { - "id": 56240484, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Vlad", - "lastName": "Ponomarev", - "username": "vponomarev", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579006264 - }, - "accessHash": "1516515623735745502", - "avatar": { - "hash": "241551039947450467" - } - }, - "63238467": { - "id": 63238467, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Lev", - "lastName": "Rogozhin", - "username": "leoreijii", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-8508649651002820821", - "avatar": { - "hash": "271607148070415054" - } - }, - "68539483": { - "status": { - "type": "userStatusOnline" - } - }, - "71715671": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007509 - } - }, - "73285792": { - "id": 73285792, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Олег", - "lastName": "Семёнов", - "username": "SatoAV", - "phoneNumber": "79067384823", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007881 - }, - "accessHash": "2308517068116032973", - "avatar": { - "hash": "314760080357698567" - } - }, - "81549896": { - "status": { - "type": "userStatusOnline" - } - }, - "83835125": { - "id": 83835125, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Денис", - "lastName": "Хананеин", - "username": "zloylos", - "phoneNumber": "79955031313", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578996285 - }, - "accessHash": "-816665157367596786", - "avatar": { - "hash": "360069120587311032" - } - }, - "84871351": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007587 - } - }, - "85210904": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007616 - } - }, - "85436674": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007835 - } - }, - "88036873": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007809 - } - }, - "88888263": { - "id": 88888263, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Mike", - "lastName": null, - "username": "merqry", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "7721366673927234508", - "avatar": { - "hash": "381772183039486263" - } - }, - "89182674": { - "id": 89182674, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Лёша", - "lastName": "Чудинов", - "username": "alekseich", - "phoneNumber": "420777007652", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007211 - }, - "accessHash": "7037550407740169389", - "avatar": { - "hash": "383036668656070124" - } - }, - "101724799": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007644 - } - }, - "103443200": { - "status": { - "type": "userStatusOnline" - } - }, - "105945096": { - "id": 105945096, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Anton", - "lastName": "Gorshenin", - "username": "AntonyHatchet", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-3974496029461846214", - "avatar": { - "hash": "455030722947820211" - } - }, - "108649628": { - "id": 108649628, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Aleksandr", - "lastName": "Ostanin", - "username": "", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579006414 - }, - "accessHash": "3622299070914801810", - "avatar": { - "hash": "466646599438804906" - } - }, - "112068266": { - "id": 112068266, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Денис", - "lastName": "Матюнин", - "username": "alckbstrd", - "phoneNumber": "79037565660", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-1726647209696382847", - "avatar": { - "hash": "481329537845667768" - } - }, - "115255727": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007743 - } - }, - "117061025": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007488 - } - }, - "117155430": { - "status": { - "type": "userStatusOnline" - } - }, - "119344766": { - "id": 119344766, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Антон", - "lastName": "Корзунов", - "username": "thekashey", - "phoneNumber": "79267390739", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578987456 - }, - "accessHash": "7645370836604316659", - "avatar": { - "hash": "512581867375012116" - } - }, - "120566766": { - "id": 120566766, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Виталик", - "lastName": "Панарин", - "username": "", - "phoneNumber": "79031361264", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007357 - }, - "accessHash": "-2595694477288040447", - "avatar": { - "hash": "517830317410723755" - } - }, - "121657549": { - "id": 121657549, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Сережа", - "lastName": "Константинов", - "username": "twirl", - "phoneNumber": "79152025751", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "818814331837259358", - "avatar": { - "hash": "522515194722757292" - } - }, - "121754413": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007878 - } - }, - "122196269": { - "id": 122196269, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Alex", - "lastName": null, - "username": "tom8opot8o", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-7480239332980307483", - "avatar": { - "hash": "524828979504457650" - } - }, - "124920404": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007911 - } - }, - "126920812": { - "id": 126920812, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Яков", - "lastName": "Лысков", - "username": "YakovLyskov", - "phoneNumber": "79263529362", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "2715341103751301834", - "avatar": { - "hash": "545120737178003733" - } - }, - "132050387": { - "id": 132050387, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Дмитрий", - "lastName": "Бондаренко", - "username": "", - "phoneNumber": "79654237473", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007693 - }, - "accessHash": "-2285872714920985879" - }, - "136294554": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007838 - } - }, - "136817688": { - "id": 136817688, - "isSelf": false, - "type": "userTypeBot", - "firstName": "Channel", - "lastName": null, - "username": "Channel_Bot", - "phoneNumber": "", - "status": { - "type": "userStatusEmpty" - }, - "accessHash": "3779054650090625737", - "avatar": { - "hash": "587627495930570665" - } - }, - "139432426": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007932 - } - }, - "140267078": { - "id": 140267078, - "isSelf": false, - "type": "userTypeBot", - "firstName": "Giphy GIF Search", - "lastName": null, - "username": "gif", - "phoneNumber": "", - "status": { - "type": "userStatusEmpty" - }, - "accessHash": "1201383718420955299", - "avatar": { - "hash": "602442513171720105" - } - }, - "141185012": { - "id": 141185012, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Natalia", - "lastName": "Asaul", - "username": "shmtvn", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579004105 - }, - "accessHash": "-7860424863173868031", - "avatar": { - "hash": "606385009681608535" - } - }, - "143235707": { - "id": 143235707, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "James", - "lastName": "Franko", - "username": "Nizarius", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-9111830739567183612", - "avatar": { - "hash": "615192677640677303" - } - }, - "146406074": { - "status": { - "type": "userStatusOnline" - } - }, - "146686085": { - "id": 146686085, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Nataliya", - "lastName": "Dzhariani", - "username": "dzhariani", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007070 - }, - "accessHash": "-7784178486997672340", - "avatar": { - "hash": "630011938309515177" - } - }, - "149266234": { - "id": 149266234, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Krolone", - "lastName": null, - "username": "Krolone", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007306 - }, - "accessHash": "3203268560126386402", - "avatar": { - "hash": "641093593883322286" - } - }, - "165916816": { - "id": 165916816, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "IᒪYᗩ", - "lastName": "ᗩᖇᗩᒪIᑎ", - "username": "EVERYDAYHER0", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579005965 - }, - "accessHash": "5782462503497143230", - "avatar": { - "hash": "712607299032688704" - } - }, - "177121435": { - "id": 177121435, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Лиза", - "lastName": null, - "username": "lizazhdan", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-7543401176279961954", - "avatar": { - "hash": "760730771201829799" - } - }, - "185357627": { - "status": { - "type": "userStatusOnline" - } - }, - "190601014": { - "id": 190601014, - "isSelf": false, - "type": "userTypeBot", - "firstName": "LikeBot", - "lastName": null, - "username": "like", - "phoneNumber": "", - "status": { - "type": "userStatusEmpty" - }, - "accessHash": "4575312890980331016", - "avatar": { - "hash": "818625122170677161" - } - }, - "193824343": { - "id": 193824343, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Толя", - "lastName": "Янот", - "username": "tolyayanot", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "8622400639054286002", - "avatar": { - "hash": "832469214809925560" - } - }, - "193986593": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007719 - } - }, - "194771934": { - "id": 194771934, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Kos", - "lastName": "👀", - "username": "thadjbullet", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-4717428187206294319", - "avatar": { - "hash": "836539087164909483" - } - }, - "204715787": { - "id": 204715787, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Vladislav", - "lastName": "Bachevsky", - "username": "vbachevsky", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579004021 - }, - "accessHash": "1909872570995119725", - "avatar": { - "hash": "879247610596141335" - } - }, - "205372114": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007805 - } - }, - "205688700": { - "id": 205688700, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Aleksey", - "lastName": "Leshko", - "username": "alekseyleshko", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579006831 - }, - "accessHash": "-4946811484285447900", - "avatar": { - "hash": "883426240112994218" - } - }, - "234480941": { - "id": 234480941, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "<[GNU/std::twit]>", - "lastName": "💩⭐️ [now with more fame]", - "username": "tWiTfAcE", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-3547900009735628302", - "avatar": { - "hash": "1007087973586544810" - } - }, - "237316136": { - "id": 237316136, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Сережа", - "lastName": "Братик", - "username": "szotin", - "phoneNumber": "79629614499", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578998201 - }, - "accessHash": "4932076153316541218", - "avatar": { - "hash": "1019265043389327273" - } - }, - "241647476": { - "id": 241647476, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Andrey", - "lastName": "Mayorov", - "username": "frandsaw", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579006960 - }, - "accessHash": "-3681507183641315877", - "avatar": { - "hash": "1037868007037183979" - } - }, - "246748014": { - "id": 246748014, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Дима", - "lastName": "Ляпин", - "username": "dmlyapin", - "phoneNumber": "79263027874", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "7011827349957199464", - "avatar": { - "hash": "1059774650939189166" - } - }, - "276328880": { - "id": 276328880, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Марина", - "lastName": "Жарова", - "username": "", - "phoneNumber": "79057131493", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578995568 - }, - "accessHash": "6797515757248553586" - }, - "276892535": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007942 - } - }, - "287698835": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007520 - } - }, - "290281303": { - "id": 290281303, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Aleksandr", - "lastName": "Proskurin", - "username": "aleksProsk", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579006107 - }, - "accessHash": "6510216211306064703", - "avatar": { - "hash": "1246748703481505706" - } - }, - "290394546": { - "id": 290394546, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Анечка", - "lastName": null, - "username": "AnaZharova", - "phoneNumber": "79266987141", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007897 - }, - "accessHash": "-3867594960753582949", - "avatar": { - "hash": "1247235078463006898" - } - }, - "310552513": { - "id": 310552513, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Alexander", - "lastName": "Balashov", - "username": "alexanderbalashov", - "phoneNumber": "34625991013", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579006187 - }, - "accessHash": "1895194792035722844", - "avatar": { - "hash": "1333812887481853866" - } - }, - "314552265": { - "id": 314552265, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Мама", - "lastName": null, - "username": "", - "phoneNumber": "79031166005", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579003726 - }, - "accessHash": "-5029148124725908474" - }, - "327556368": { - "id": 327556368, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Tanya", - "lastName": null, - "username": "tanyatakida", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-296977702523430050", - "avatar": { - "hash": "1406843888612779946" - } - }, - "332648262": { - "id": 332648262, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Алексей", - "lastName": "Осипов", - "username": "atomSmart", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579000938 - }, - "accessHash": "-2663974177952274895", - "avatar": { - "hash": "1428713406817478569" - } - }, - "343593401": { - "status": { - "type": "userStatusOnline" - } - }, - "344577595": { - "id": 344577595, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Alex", - "lastName": null, - "username": "a2xchip", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "1454634979100337092", - "avatar": { - "hash": "1479949501915572145" - } - }, - "345833115": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007544 - } - }, - "356765513": { - "id": 356765513, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Артём", - "lastName": "Дикмаров", - "username": "adikmarov", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "5936825635256377207", - "avatar": { - "hash": "1532296211131901887" - } - }, - "381155062": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007938 - } - }, - "400319287": { - "id": 400319287, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "painor", - "lastName": null, - "username": "painor", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578976704 - }, - "accessHash": "8575777610547612403", - "avatar": { - "hash": "1719358246079276972" - } - }, - "407368531": { - "id": 407368531, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Дашка", - "lastName": "Прохватилова", - "username": "", - "phoneNumber": "79269439980", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578913597 - }, - "accessHash": "-4153575517386691895", - "avatar": { - "hash": "1749634518520801195" - } - }, - "419136265": { - "id": 419136265, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Игорь", - "lastName": "Шемятенков", - "username": "Xor1024", - "phoneNumber": "79856617290", - "status": { - "type": "userStatusOnline" - }, - "accessHash": "3213993671925160653" - }, - "420851400": { - "id": 420851400, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Олег", - "lastName": "Братик", - "username": "", - "phoneNumber": "79779773756", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578930868 - }, - "accessHash": "864263979199890906", - "avatar": { - "hash": "1807542999932053417" - } - }, - "427775494": { - "id": 427775494, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Guess", - "lastName": "Who", - "username": "surgie", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "-2877652694018983893" - }, - "471433401": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007859 - } - }, - "514132543": { - "id": 514132543, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Alex", - "lastName": "Khokhlyavin", - "username": "xoxai", - "phoneNumber": "", - "status": { - "type": "userStatusRecently" - }, - "accessHash": "7241435135577866481", - "avatar": { - "hash": "2208182458450552749" - } - }, - "524900290": { - "id": 524900290, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Анна", - "lastName": "Дьякова", - "username": "", - "phoneNumber": "79170809871", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578862192 - }, - "accessHash": "3217371758289283304", - "avatar": { - "hash": "2254429579667154857" - } - }, - "542350852": { - "id": 542350852, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Артём", - "lastName": "Виталика", - "username": "", - "phoneNumber": "79165528671", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579000680 - }, - "accessHash": "-271058820642766154" - }, - "714226506": { - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007795 - } - }, - "715284311": { - "id": 715284311, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Бабушка Лора", - "lastName": null, - "username": "", - "phoneNumber": "79150692260", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578937545 - }, - "accessHash": "2986785013254352469" - }, - "802771524": { - "id": 802771524, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Julia", - "lastName": "Belokrinitskaya", - "username": "bel_julia", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579006149 - }, - "accessHash": "382680019298981651", - "avatar": { - "hash": "3447877442196318122" - } - }, - "860139781": { - "id": 860139781, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Yana", - "lastName": "Petruk", - "username": "PetrukYana", - "phoneNumber": "", - "status": { - "type": "userStatusOffline", - "wasOnline": 1579007482 - }, - "accessHash": "1422737909874001325", - "avatar": { - "hash": "3694272229839841215" - } - }, - "903250362": { - "id": 903250362, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Сергей", - "lastName": "Кощеев", - "username": "", - "phoneNumber": "79295760645", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578181782 - }, - "accessHash": "-2230752646882991078" - }, - "938430445": { - "id": 938430445, - "isSelf": false, - "type": "userTypeRegular", - "firstName": "Витя", - "lastName": "Устинов", - "username": "", - "phoneNumber": "79883402813", - "status": { - "type": "userStatusOffline", - "wasOnline": 1578998705 - }, - "accessHash": "-8521819193925892158" - }, - "974851635": { - "id": 974851635, - "isSelf": false, - "type": { - "type": "userTypeDeleted" - }, - "firstName": null, - "lastName": null, - "username": "", - "phoneNumber": "", - "status": { - "type": "userStatusEmpty" - }, - "accessHash": "-7500710878276106389" - } - } - }, - "chats": { - "listIds": { - "active": [ - 3718260, - 777000, - -1036855149, - -208483550, - 656567, - -1186709966, - -1322215945, - -1267450324, - 407368531, - -398751458, - -264075795, - 419136265, - -1180212174, - -1453798102, - 314552265, - 276328880, - -1406145223, - 193824343, - 290394546, - 938430445, - 524900290, - 237316136, - 112068266, - 715284311, - 454000, - 400319287, - 73285792, - -1038976893, - 38016217, - 427775494, - 246748014, - -227209700, - 903250362, - 126920812, - 420851400, - 120566766, - 132050387, - -1344059810, - -1330843177, - -380899033, - 119344766, - -287980009, - -1416855018, - 89182674, - 974851635, - -219517351, - -300045230, - 83835125, - 310552513, - 914597 - ] - }, - "isFullyLoaded": {}, - "orderedPinnedIds": {}, - "totalCount": {}, - "byId": { - "454000": { - "id": 454000, - "type": "chatTypePrivate", - "title": "Telegram", - "lastReadOutboxMessageId": 357521, - "lastReadInboxMessageId": 391658, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "dmcatelegram", - "isPinned": false, - "accessHash": "1087749393156453034", - "avatar": { - "hash": "1949915608623048" - }, - "lastMessage": { - "id": 391658, - "chatId": 454000, - "isOutgoing": false, - "content": { - "text": { - "text": "Hello! Congratulations on winning the JavaScript Contest - https://t.me/contest/146!\nCould you send your full address and your bank account details in the following format please?\nYour full name\nName of your bank\nBank account number (or IBAN)\nBank SWIFT code", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 59, - "length": 24 - } - ] - } - }, - "date": 1578704314, - "senderUserId": 454000, - "replyToMessageId": null - } - }, - "656567": { - "id": 656567, - "type": "chatTypePrivate", - "title": "Антон", - "lastReadOutboxMessageId": 392455, - "lastReadInboxMessageId": 392454, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "naukaiprogress", - "isPinned": false, - "accessHash": "7087438295025146936", - "avatar": { - "hash": "2819934248875858" - }, - "lastMessage": { - "id": 392455, - "chatId": 656567, - "isOutgoing": true, - "content": { - "text": { - "text": "👌" - } - }, - "date": 1579006182, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "777000": { - "id": 777000, - "type": "chatTypePrivate", - "title": "Telegram", - "lastReadOutboxMessageId": 374571, - "lastReadInboxMessageId": 392447, - "unreadCount": 1, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "-7788485269605279038", - "avatar": { - "hash": "3337190045231023" - }, - "lastMessage": { - "id": 392457, - "chatId": 777000, - "isOutgoing": false, - "content": { - "text": { - "text": "Код подтверждения: 83247. Никому не давайте код, даже если его требуют от имени Telegram!\n\nЭтот код используется для входа в Ваш аккаунт в Telegram. Он никогда не нужен для чего-то еще. \n\nЕсли Вы не запрашивали код для входа, проигнорируйте это сообщение.", - "entities": [ - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 0, - "length": 18 - }, - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 26, - "length": 6 - } - ] - } - }, - "date": 1579007453, - "senderUserId": 777000, - "replyToMessageId": null - } - }, - "914597": { - "id": 914597, - "type": "chatTypePrivate", - "title": "Markus Ra", - "lastReadOutboxMessageId": 0, - "lastReadInboxMessageId": 0, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "MarkusRa", - "isPinned": false, - "accessHash": "8487464354880985091", - "avatar": { - "hash": "3928164660266503" - }, - "lastMessage": { - "id": 384308, - "chatId": 914597, - "isOutgoing": true, - "content": { - "text": { - "text": "Hi Markus, how are you? I wanted to ask, is there any chance to remove the sourcemaps from my JS contest submissions? I did not notice they went to the bundle, and now all my source code and project structure is exposed to everyone in the community. Quite disappointing, considering the fact the other contest rounds are to follow. I am Jolly Cobra and Shiny Yak. Thank you!" - } - }, - "date": 1576180720, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "3718260": { - "id": 3718260, - "type": "chatTypePrivate", - "title": "Alexander Zinchuk", - "lastReadOutboxMessageId": 829, - "lastReadInboxMessageId": 392210, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "zinchuk", - "isPinned": true, - "accessHash": "-3710819038313911682", - "avatar": { - "hash": "15969805554263980" - }, - "lastMessage": { - "id": 392210, - "chatId": 3718260, - "isOutgoing": false, - "content": { - "text": { - "text": "https://www.udacity.com/course/browser-rendering-optimization--ud860", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 68 - } - ] - } - }, - "date": 1578913104, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "38016217": { - "id": 38016217, - "type": "chatTypePrivate", - "title": "Konstantin Darutkin", - "lastReadOutboxMessageId": 391483, - "lastReadInboxMessageId": 391482, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "kdarutkin", - "isPinned": false, - "accessHash": "5387369175054348315", - "avatar": { - "hash": "163278409188879933" - }, - "lastMessage": { - "id": 391483, - "chatId": 38016217, - "isOutgoing": true, - "content": { - "text": { - "text": "Понятно)" - } - }, - "date": 1578670067, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "73285792": { - "id": 73285792, - "type": "chatTypePrivate", - "title": "Олег Семёнов", - "lastReadOutboxMessageId": 391525, - "lastReadInboxMessageId": 391524, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "SatoAV", - "isPinned": false, - "accessHash": "2308517068116032973", - "avatar": { - "hash": "314760080357698567" - }, - "lastMessage": { - "id": 391525, - "chatId": 73285792, - "isOutgoing": true, - "content": { - "text": { - "text": "Ага" - } - }, - "date": 1578686330, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "83835125": { - "id": 83835125, - "type": "chatTypePrivate", - "title": "Денис Хананеин", - "lastReadOutboxMessageId": 384501, - "lastReadInboxMessageId": 384499, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "zloylos", - "isPinned": false, - "accessHash": "-816665157367596786", - "avatar": { - "hash": "360069120587311032" - }, - "lastMessage": { - "id": 384501, - "chatId": 83835125, - "isOutgoing": true, - "content": { - "text": { - "text": "Для конкурса как раз, для другого разработчика" - } - }, - "date": 1576263888, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "89182674": { - "id": 89182674, - "type": "chatTypePrivate", - "title": "Лёша Чудинов", - "lastReadOutboxMessageId": 387451, - "lastReadInboxMessageId": 387444, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "alekseich", - "isPinned": false, - "accessHash": "7037550407740169389", - "avatar": { - "hash": "383036668656070124" - }, - "lastMessage": { - "id": 387451, - "chatId": 89182674, - "isOutgoing": true, - "content": { - "text": { - "text": "Ок" - } - }, - "date": 1576946008, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "112068266": { - "id": 112068266, - "type": "chatTypePrivate", - "title": "Денис Матюнин", - "lastReadOutboxMessageId": 392028, - "lastReadInboxMessageId": 392033, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "alckbstrd", - "isPinned": false, - "accessHash": "-1726647209696382847", - "avatar": { - "hash": "481329537845667768" - }, - "lastMessage": { - "id": 392033, - "chatId": 112068266, - "isOutgoing": false, - "content": { - "text": { - "text": "Заработался)" - } - }, - "date": 1578790141, - "senderUserId": 112068266, - "replyToMessageId": null - } - }, - "119344766": { - "id": 119344766, - "type": "chatTypePrivate", - "title": "Антон Корзунов", - "lastReadOutboxMessageId": 389287, - "lastReadInboxMessageId": 389290, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "thekashey", - "isPinned": false, - "accessHash": "7645370836604316659", - "avatar": { - "hash": "512581867375012116" - }, - "lastMessage": { - "id": 389290, - "chatId": 119344766, - "isOutgoing": false, - "content": { - "text": { - "text": "Вроде как совершенно естественно что одни и теже грабли, одни и те же ямы" - } - }, - "date": 1577479949, - "senderUserId": 119344766, - "replyToMessageId": null - } - }, - "120566766": { - "id": 120566766, - "type": "chatTypePrivate", - "title": "Виталик Панарин", - "lastReadOutboxMessageId": 389873, - "lastReadInboxMessageId": 389875, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "-2595694477288040447", - "avatar": { - "hash": "517830317410723755" - }, - "lastMessage": { - "id": 389875, - "chatId": 120566766, - "isOutgoing": false, - "content": { - "text": { - "text": "В целом можно:)" - } - }, - "date": 1577911018, - "senderUserId": 120566766, - "replyToMessageId": null - } - }, - "126920812": { - "id": 126920812, - "type": "chatTypePrivate", - "title": "Яков Лысков", - "lastReadOutboxMessageId": 390301, - "lastReadInboxMessageId": 390302, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "YakovLyskov", - "isPinned": false, - "accessHash": "2715341103751301834", - "avatar": { - "hash": "545120737178003733" - }, - "lastMessage": { - "id": 390302, - "chatId": 126920812, - "isOutgoing": false, - "content": { - "text": { - "text": "Пилим) не без проблем:), но куда без них))" - } - }, - "date": 1578137127, - "senderUserId": 126920812, - "replyToMessageId": null - } - }, - "132050387": { - "id": 132050387, - "type": "chatTypePrivate", - "title": "Дмитрий Бондаренко", - "lastReadOutboxMessageId": 389845, - "lastReadInboxMessageId": 389846, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "-2285872714920985879", - "lastMessage": { - "id": 389846, - "chatId": 132050387, - "isOutgoing": false, - "content": { - "text": { - "text": "Неее" - } - }, - "date": 1577909217, - "senderUserId": 132050387, - "replyToMessageId": null - } - }, - "193824343": { - "id": 193824343, - "type": "chatTypePrivate", - "title": "Толя Янот", - "lastReadOutboxMessageId": 392316, - "lastReadInboxMessageId": 392317, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "tolyayanot", - "isPinned": false, - "accessHash": "8622400639054286002", - "avatar": { - "hash": "832469214809925560" - }, - "lastMessage": { - "id": 392317, - "chatId": 193824343, - "isOutgoing": false, - "content": { - "text": { - "text": "это хорошо" - } - }, - "date": 1578932628, - "senderUserId": 193824343, - "replyToMessageId": null - } - }, - "237316136": { - "id": 237316136, - "type": "chatTypePrivate", - "title": "Сережа Братик", - "lastReadOutboxMessageId": 392158, - "lastReadInboxMessageId": 392159, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "szotin", - "isPinned": false, - "accessHash": "4932076153316541218", - "avatar": { - "hash": "1019265043389327273" - }, - "lastMessage": { - "id": 392159, - "chatId": 237316136, - "isOutgoing": false, - "content": { - "text": { - "text": "Запутать)))" - } - }, - "date": 1578860382, - "senderUserId": 237316136, - "replyToMessageId": 392156 - } - }, - "246748014": { - "id": 246748014, - "type": "chatTypePrivate", - "title": "Дима Ляпин", - "lastReadOutboxMessageId": 391390, - "lastReadInboxMessageId": 391388, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "dmlyapin", - "isPinned": false, - "accessHash": "7011827349957199464", - "avatar": { - "hash": "1059774650939189166" - }, - "lastMessage": { - "id": 391390, - "chatId": 246748014, - "isOutgoing": true, - "content": { - "text": { - "text": "Ладно, во втором разберемся с ними)" - } - }, - "date": 1578666126, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "276328880": { - "id": 276328880, - "type": "chatTypePrivate", - "title": "Марина Жарова", - "lastReadOutboxMessageId": 392331, - "lastReadInboxMessageId": 392330, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "6797515757248553586", - "lastMessage": { - "id": 392331, - "chatId": 276328880, - "isOutgoing": true, - "content": { - "text": { - "text": "И мы вас!" - } - }, - "date": 1578948807, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "290394546": { - "id": 290394546, - "type": "chatTypePrivate", - "title": "Анечка", - "lastReadOutboxMessageId": 392292, - "lastReadInboxMessageId": 392291, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "AnaZharova", - "isPinned": false, - "accessHash": "-3867594960753582949", - "avatar": { - "hash": "1247235078463006898" - }, - "lastMessage": { - "id": 392292, - "chatId": 290394546, - "isOutgoing": true, - "content": { - "text": { - "text": "ок" - } - }, - "date": 1578931954, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "310552513": { - "id": 310552513, - "type": "chatTypePrivate", - "title": "Alexander Balashov", - "lastReadOutboxMessageId": 384435, - "lastReadInboxMessageId": 384432, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "alexanderbalashov", - "isPinned": false, - "accessHash": "1895194792035722844", - "avatar": { - "hash": "1333812887481853866" - }, - "lastMessage": { - "id": 384435, - "chatId": 310552513, - "isOutgoing": true, - "content": { - "text": { - "text": ")))" - } - }, - "date": 1576254055, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "314552265": { - "id": 314552265, - "type": "chatTypePrivate", - "title": "Мама", - "lastReadOutboxMessageId": 392327, - "lastReadInboxMessageId": 392332, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "-5029148124725908474", - "lastMessage": { - "id": 392332, - "chatId": 314552265, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну.. это было предсказуемо (" - } - }, - "date": 1578949927, - "senderUserId": 314552265, - "replyToMessageId": null - } - }, - "400319287": { - "id": 400319287, - "type": "chatTypePrivate", - "title": "painor", - "lastReadOutboxMessageId": 391650, - "lastReadInboxMessageId": 391656, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "painor", - "isPinned": false, - "accessHash": "8575777610547612403", - "avatar": { - "hash": "1719358246079276972" - }, - "lastMessage": { - "id": 391656, - "chatId": 400319287, - "isOutgoing": false, - "content": { - "text": { - "text": "no errors." - } - }, - "date": 1578689969, - "senderUserId": 400319287, - "replyToMessageId": null - } - }, - "407368531": { - "id": 407368531, - "type": "chatTypePrivate", - "title": "Дашка Прохватилова", - "lastReadOutboxMessageId": 0, - "lastReadInboxMessageId": 0, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "-4153575517386691895", - "avatar": { - "hash": "1749634518520801195" - }, - "lastMessage": { - "id": 392440, - "chatId": 407368531, - "isOutgoing": true, - "content": { - "sticker": { - "id": "1391391008142393371", - "emoji": "🥳", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 14252, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1579001312, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "419136265": { - "id": 419136265, - "type": "chatTypePrivate", - "title": "Игорь Шемятенков", - "lastReadOutboxMessageId": 392416, - "lastReadInboxMessageId": 392414, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "Xor1024", - "isPinned": false, - "accessHash": "3213993671925160653", - "lastMessage": { - "id": 392416, - "chatId": 419136265, - "isOutgoing": true, - "content": { - "text": { - "text": "Перечитаю" - } - }, - "date": 1578991419, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "420851400": { - "id": 420851400, - "type": "chatTypePrivate", - "title": "Олег Братик", - "lastReadOutboxMessageId": 390077, - "lastReadInboxMessageId": 390212, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "864263979199890906", - "avatar": { - "hash": "1807542999932053417" - }, - "lastMessage": { - "id": 390212, - "chatId": 420851400, - "isOutgoing": false, - "content": { - "text": { - "text": "Часов до 8 утра сидели болтали" - } - }, - "date": 1578082141, - "senderUserId": 420851400, - "replyToMessageId": null - } - }, - "427775494": { - "id": 427775494, - "type": "chatTypePrivate", - "title": "Guess Who", - "lastReadOutboxMessageId": 391414, - "lastReadInboxMessageId": 391413, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "surgie", - "isPinned": false, - "accessHash": "-2877652694018983893", - "lastMessage": { - "id": 391414, - "chatId": 427775494, - "isOutgoing": true, - "content": { - "text": { - "text": "Спасибо, и тебя" - } - }, - "date": 1578667052, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "524900290": { - "id": 524900290, - "type": "chatTypePrivate", - "title": "Анна Дьякова", - "lastReadOutboxMessageId": 392157, - "lastReadInboxMessageId": 392160, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "3217371758289283304", - "avatar": { - "hash": "2254429579667154857" - }, - "lastMessage": { - "id": 392160, - "chatId": 524900290, - "isOutgoing": false, - "content": { - "text": { - "text": "Спасиииибо (  ͡  ߜ  ͡  )" - } - }, - "date": 1578862156, - "senderUserId": 524900290, - "replyToMessageId": null - } - }, - "715284311": { - "id": 715284311, - "type": "chatTypePrivate", - "title": "Бабушка Лора", - "lastReadOutboxMessageId": 392020, - "lastReadInboxMessageId": 388530, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "2986785013254352469", - "lastMessage": { - "id": 392020, - "chatId": 715284311, - "isOutgoing": true, - "content": { - "text": { - "text": "Привет, как у вас дела? Скучаю!" - } - }, - "date": 1578786713, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "903250362": { - "id": 903250362, - "type": "chatTypePrivate", - "title": "Сергей Кощеев", - "lastReadOutboxMessageId": 0, - "lastReadInboxMessageId": 390332, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "-2230752646882991078", - "lastMessage": { - "id": 390332, - "chatId": 903250362, - "isOutgoing": false, - "content": { - "action": { - "text": "%user% joined Telegram" - } - }, - "date": 1578152955, - "senderUserId": 903250362, - "replyToMessageId": null - } - }, - "938430445": { - "id": 938430445, - "type": "chatTypePrivate", - "title": "Витя Устинов", - "lastReadOutboxMessageId": 0, - "lastReadInboxMessageId": 392162, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "-8521819193925892158", - "lastMessage": { - "id": 392162, - "chatId": 938430445, - "isOutgoing": false, - "content": { - "action": { - "text": "%user% joined Telegram" - } - }, - "date": 1578875535, - "senderUserId": 938430445, - "replyToMessageId": null - } - }, - "974851635": { - "id": 974851635, - "type": "chatTypePrivate", - "lastReadOutboxMessageId": 0, - "lastReadInboxMessageId": 387425, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "-7500710878276106389", - "lastMessage": { - "id": 387425, - "chatId": 974851635, - "isOutgoing": false, - "content": { - "text": { - "text": "❗️Не переплачивай больше за стафф, покупай аккаунты с балансом со скидкой до 70%.\n\n🚫Вывод средств с гидры невозможен, средства могут быть использованы только для покупок.\n\n🎦 Предоставим доказательства входа в аккаунт на фоне диалога.\n\n🔺В наличии почти всегда есть аккаунты с балансом. Данный канал носит чисто информационный характер. Наличие нужного баланса уточняйте у нашего менеджера.\n\nПриобрести можно по контактам -> @acc_drugsbot\nОстерегайтесь мошенников - фейков.", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 427, - "length": 13 - } - ] - } - }, - "date": 1576909987, - "senderUserId": 974851635, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - } - }, - "-1036855149": { - "id": -1036855149, - "type": "chatTypeSuperGroup", - "title": "Главчят", - "lastReadOutboxMessageId": 252775, - "lastReadInboxMessageId": 252758, - "unreadCount": 22, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "5356397661100462170", - "avatar": { - "hash": "2-230113312-293114" - }, - "lastMessage": { - "id": 252780, - "chatId": -1036855149, - "isOutgoing": false, - "content": { - "text": { - "text": "уходил)" - } - }, - "date": 1579007922, - "senderUserId": 62391846, - "replyToMessageId": 252778 - } - }, - "-208483550": { - "id": -208483550, - "type": "chatTypeBasicGroup", - "title": "Anyway Labs · Crew", - "lastReadOutboxMessageId": 392462, - "lastReadInboxMessageId": 392456, - "unreadCount": 6, - "unreadMentionsCount": 0, - "isPinned": false, - "avatar": { - "hash": "2-250938229-102594" - }, - "lastMessage": { - "id": 392463, - "chatId": -208483550, - "isOutgoing": false, - "content": { - "text": { - "text": "Окей" - } - }, - "date": 1579007880, - "senderUserId": 73285792, - "replyToMessageId": null - } - }, - "-1186709966": { - "id": -1186709966, - "type": "chatTypeSuperGroup", - "title": "Moscow Office OSOME", - "lastReadOutboxMessageId": 2726, - "lastReadInboxMessageId": 2726, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "8403662618272069678", - "avatar": { - "hash": "2-246929396-29410" - }, - "lastMessage": { - "id": 2726, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "перестали принимать много карточек?" - } - }, - "date": 1579005939, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "membersCount": 43, - "onlineCount": 22, - "fullInfo": { - "about": "", - "pinnedMessageId": null - } - }, - "-1322215945": { - "id": -1322215945, - "type": "chatTypeSuperGroup", - "title": "Telegram Contests", - "lastReadOutboxMessageId": 65452, - "lastReadInboxMessageId": 65450, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "contests", - "isPinned": false, - "accessHash": "-9023057957488876765", - "avatar": { - "hash": "1-806625367-105295" - }, - "lastMessage": { - "id": 65450, - "chatId": -1322215945, - "isOutgoing": false, - "content": { - "text": { - "text": "🤣🤣🤣🤣" - } - }, - "date": 1579005472, - "senderUserId": 344577595, - "replyToMessageId": 65427 - } - }, - "-1267450324": { - "id": -1267450324, - "type": "chatTypeSuperGroup", - "title": "Конкурсы Telegram", - "lastReadOutboxMessageId": 28958, - "lastReadInboxMessageId": 28953, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "contests_ru", - "isPinned": false, - "accessHash": "-9158153993949327243", - "avatar": { - "hash": "1-806624804-266198" - }, - "lastMessage": { - "id": 28953, - "chatId": -1267450324, - "isOutgoing": false, - "content": { - "text": { - "text": "Эх, теперь я никогда не узнаю, как это сделать" - } - }, - "date": 1579001553, - "senderUserId": 514132543, - "replyToMessageId": null - } - }, - "-398751458": { - "id": -398751458, - "type": "chatTypeBasicGroup", - "title": "AnywayLabs · Wearable Coach", - "lastReadOutboxMessageId": 392438, - "lastReadInboxMessageId": 392437, - "unreadCount": 0, - "unreadMentionsCount": 0, - "isPinned": false, - "avatar": { - "hash": "2-250821924-336781" - }, - "lastMessage": { - "id": 392438, - "chatId": -398751458, - "isOutgoing": true, - "content": { - "text": { - "text": "Ответил" - } - }, - "date": 1579001141, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "-264075795": { - "id": -264075795, - "type": "chatTypeBasicGroup", - "title": "Stunt Channel", - "lastReadOutboxMessageId": 392431, - "lastReadInboxMessageId": 392436, - "unreadCount": 0, - "unreadMentionsCount": 0, - "isPinned": false, - "avatar": { - "hash": "2-263701105-361361" - }, - "lastMessage": { - "id": 392436, - "chatId": -264075795, - "isOutgoing": false, - "content": { - "text": { - "text": "))) заценю обязательно, прям интрига" - } - }, - "date": 1579000674, - "senderUserId": 542350852, - "replyToMessageId": null - } - }, - "-1180212174": { - "id": -1180212174, - "type": "chatTypeSuperGroup", - "title": "Gram JS Chat", - "lastReadOutboxMessageId": 8031, - "lastReadInboxMessageId": 8031, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "gramjschat", - "isPinned": false, - "accessHash": "-2017644511911141514", - "avatar": { - "hash": "1-806022188-353689" - }, - "lastMessage": { - "id": 8031, - "chatId": -1180212174, - "isOutgoing": false, - "content": { - "text": { - "text": "You can check recent actions" - } - }, - "date": 1578967369, - "senderUserId": 234480941, - "replyToMessageId": 8028 - } - }, - "-1453798102": { - "id": -1453798102, - "type": "chatTypeChannel", - "title": "Живи там хорошо!", - "lastReadOutboxMessageId": 0, - "lastReadInboxMessageId": 76, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "zhivi_tam_horosho", - "isPinned": false, - "accessHash": "3523347799747927492", - "avatar": { - "hash": "2-263838104-263574" - }, - "lastMessage": { - "id": 76, - "chatId": -1453798102, - "isOutgoing": false, - "content": { - "text": { - "text": "Бисквитки. Понимаете, бисквитки! \n\n«Граждане, принимаем печеньки, не задерживаемся» :-)" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDR37nyGfHXFSeaB2NVxn+HFPNVZEXZIZx6GoHmQyhi2MdqZPIIkyT9Krq6vzuxn1qZwTVhpsvi6iGfnX86Kpl4kxubr7UVNn3KLaoAmKU8Annj0pcj/IqneRyzkBGUIOx7n8qslJjZBLK27DhfTYpx+tUnfDnr+IxU4tLlPuPGPoMf0p0VjIZlaUqR1+tAyxaRBYtzr8zdfYdqKsiNh6UVzzg+Zlp6CnAPQ/8AfNKFHp+lFFU3LuKwuwen6UBQO36UUUuaXcLC0UUVom7CP//Z", - "width": 1110, - "height": 1206 - }, - "sizes": [ - { - "width": 294, - "height": 320, - "type": "m" - }, - { - "width": 736, - "height": 800, - "type": "x" - }, - { - "width": 1110, - "height": 1206, - "type": "y" - } - ] - } - }, - "date": 1578955674, - "senderUserId": 0, - "replyToMessageId": null - } - }, - "-1406145223": { - "id": -1406145223, - "type": "chatTypeSuperGroup", - "title": "Футбол по понедельникам", - "lastReadOutboxMessageId": 1440, - "lastReadInboxMessageId": 1438, - "unreadCount": 2, - "unreadMentionsCount": 0, - "username": null, - "isPinned": false, - "accessHash": "5770593500960833105", - "lastMessage": { - "id": 1440, - "chatId": -1406145223, - "isOutgoing": false, - "content": { - "text": { - "text": "по 500р мне или @riadwaw, у меня +79161967673 Тинькофф сбер или авангард", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 16, - "length": 8 - }, - { - "className": "MessageEntityPhone", - "classType": "constructor", - "offset": 33, - "length": 12 - } - ] - } - }, - "date": 1578948236, - "senderUserId": 108649628, - "replyToMessageId": null - } - }, - "-1038976893": { - "id": -1038976893, - "type": "chatTypeChannel", - "title": "Telegram Contests", - "lastReadOutboxMessageId": 0, - "lastReadInboxMessageId": 147, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "contest", - "isPinned": false, - "accessHash": "3138075399534869952", - "avatar": { - "hash": "1-802208040-73728" - }, - "lastMessage": { - "id": 147, - "chatId": -1038976893, - "isOutgoing": false, - "content": { - "text": { - "text": "The second round of the VoIP Сontest will start on Tuesday, January 14. Contestants will have two weeks to complete the task. \n\nEveryone will be able to participate, including contestants who didn’t take part in the first round of the VoIP Contest.\n\nStay tuned!\n\nP.S. Note that the second round of the JavaScript Contest, also starting next week, will have different rules: only the 32 winners of round one will be able to participate.", - "entities": [ - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 4, - "length": 12 - }, - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 24, - "length": 12 - }, - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 60, - "length": 10 - }, - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 93, - "length": 11 - }, - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 115, - "length": 1 - }, - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 128, - "length": 8 - }, - { - "className": "MessageEntityItalic", - "classType": "constructor", - "offset": 302, - "length": 18 - }, - { - "className": "MessageEntityTextUrl", - "classType": "constructor", - "offset": 383, - "length": 10, - "url": "https://t.me/contest/146" - } - ] - } - }, - "date": 1578671169, - "senderUserId": 0, - "replyToMessageId": null - } - }, - "-227209700": { - "id": -227209700, - "type": "chatTypeBasicGroup", - "title": "Anyway Labs", - "lastReadOutboxMessageId": 391182, - "lastReadInboxMessageId": 389808, - "unreadCount": 0, - "unreadMentionsCount": 0, - "isPinned": false, - "avatar": { - "hash": "2-255431668-114862" - }, - "lastMessage": { - "id": 391182, - "chatId": -227209700, - "isOutgoing": true, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAZACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDP3nYBtXjvTTk+n4U4dOSaaWPQ/wA6YhMUlLkegoyPSmAlFFFADgKNv1ptLQAlFLRQAlFFFAH/2Q==", - "width": 1280, - "height": 800 - }, - "sizes": [ - { - "width": 320, - "height": 200, - "type": "m" - }, - { - "width": 800, - "height": 500, - "type": "x" - }, - { - "width": 1280, - "height": 800, - "type": "y" - } - ] - } - }, - "date": 1578550688, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "-1344059810": { - "id": -1344059810, - "type": "chatTypeChannel", - "title": "TON.Dev", - "lastReadOutboxMessageId": 0, - "lastReadInboxMessageId": 32, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "TON_DEV", - "isPinned": false, - "accessHash": "8717337303364720758", - "avatar": { - "hash": "2-263836324-205447" - }, - "lastMessage": { - "id": 32, - "chatId": -1344059810, - "isOutgoing": false, - "content": { - "text": { - "text": "https://www.youtube.com/watch?v=oMWIJHs0dEo\nWe know that many of you (like us) will continue to work on these holidays, even those who have them longer than usual ;)\nSo if you' try our Solidity compiler, here is the second part of tips and tricks for gas optimization.\nPrevious part is here. \nMerry Christmas and Happy New Year for all TON community! See you next Year!", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 43 - }, - { - "className": "MessageEntityTextUrl", - "classType": "constructor", - "offset": 286, - "length": 4, - "url": "https://t.me/TON_DEV/29" - } - ] - } - }, - "date": 1577735026, - "senderUserId": 0, - "replyToMessageId": null - } - }, - "-1330843177": { - "id": -1330843177, - "type": "chatTypeChannel", - "title": "TON technical overview", - "lastReadOutboxMessageId": 0, - "lastReadInboxMessageId": 37, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "ton_overview", - "isPinned": false, - "accessHash": "-5709475904498515540", - "avatar": { - "hash": "2-263907397-120621" - }, - "lastMessage": { - "id": 37, - "chatId": -1330843177, - "isOutgoing": false, - "content": { - "text": { - "text": "Viewst Creative Ad Builder viewst.com (with me as the developer) released pyTON: python wrapper for tonlibjson. https://github.com/viewst/pyTON\nThere are functions for getting account states, transactions, sending messages to blockchain, and running getmethods.\nAlso, there is embedded webserver, and now you can run your own local analog ton.sh or toncenter.com via two commands:\npip3 install pyTON && python3 -m pyTON\n(python 3.7+ is required)\nWhile we keep web server API close to presented on ton.sh, our service is more functional. For instance, there are no limits for requested transactions, and it is possible to request all transactions which happened after the known one. Also, you may send BOC's to network both as serialized cell and in object format: {\"data\": {\"b64\": \"...\", \"len\": int }, \"refs\": [...subcells...]}. It is also possible to turn on API for running getMethods (although we do not recommend to open this API for public servers since it is possible to crash liteclient by maliciously constructed getMethod).", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 27, - "length": 10 - }, - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 112, - "length": 31 - }, - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 339, - "length": 6 - }, - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 349, - "length": 13 - }, - { - "className": "MessageEntityCode", - "classType": "constructor", - "offset": 381, - "length": 38 - }, - { - "className": "MessageEntityItalic", - "classType": "constructor", - "offset": 420, - "length": 25 - }, - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 497, - "length": 6 - }, - { - "className": "MessageEntityCode", - "classType": "constructor", - "offset": 764, - "length": 63 - } - ] - } - }, - "date": 1577553717, - "senderUserId": 0, - "replyToMessageId": null - } - }, - "-380899033": { - "id": -380899033, - "type": "chatTypeBasicGroup", - "title": "GROUP WITH ME", - "lastReadOutboxMessageId": 389297, - "lastReadInboxMessageId": 381740, - "unreadCount": 0, - "unreadMentionsCount": 0, - "isPinned": false, - "lastMessage": { - "id": 389297, - "chatId": -380899033, - "isOutgoing": true, - "content": { - "text": { - "text": "уиуиуи" - }, - "video": { - "duration": 2, - "width": 464, - "height": 848, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDSxjvTN3LAEEj0qEyiG3ZsE7egzWfFdSI7F8jdnqOlIo2BsUZZh+dFYm4lyDk8ZHtRSCxZuGLwso4HXNUPMdyoLFsHpmrkpyjD1FVYYX8wEjaBzzTQmEqPG24A7W7mirb7Su0nAzmigYpUMKXaT3oopAKYye1FFFAH/9k=", - "width": 175, - "height": 320 - } - }, - "document": { - "size": 419567, - "mimeType": "video/mp4", - "fileName": "IMG_8007.MOV" - } - }, - "date": 1577496082, - "senderUserId": 3718260, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": 177121435, - "origin": { - "senderUserId": 177121435 - } - } - } - }, - "-287980009": { - "id": -287980009, - "type": "chatTypeBasicGroup", - "title": "Anyway Labs · FVTransport", - "lastReadOutboxMessageId": 388814, - "lastReadInboxMessageId": 388812, - "unreadCount": 0, - "unreadMentionsCount": 0, - "isPinned": false, - "avatar": { - "hash": "2-246929220-414259" - }, - "lastMessage": { - "id": 388814, - "chatId": -287980009, - "isOutgoing": true, - "content": { - "text": { - "text": "Пора вызывать Ночной дозор)" - } - }, - "date": 1577340991, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "-1416855018": { - "id": -1416855018, - "type": "chatTypeChannel", - "title": "Telegram Designers", - "lastReadOutboxMessageId": 0, - "lastReadInboxMessageId": 133, - "unreadCount": 0, - "unreadMentionsCount": 0, - "username": "designers", - "isPinned": false, - "accessHash": "4395592559835756670", - "avatar": { - "hash": "1-806010698-157266" - }, - "lastMessage": { - "id": 133, - "chatId": -1416855018, - "isOutgoing": false, - "content": { - "text": { - "text": "Suggested by @kirillorlov", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 13, - "length": 12 - } - ] - }, - "video": { - "duration": 71, - "width": 820, - "height": 626, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDZprnAHOOadTX6D60AICxPBFOA55pinJ45/wA/WpKACiiigApr9OKdSEZFADRzTgKAMDFKBigAooooA//Z", - "width": 320, - "height": 244 - } - }, - "document": { - "size": 7497413, - "mimeType": "video/mp4", - "fileName": "File" - } - }, - "date": 1577277792, - "senderUserId": 0, - "replyToMessageId": null - } - }, - "-219517351": { - "id": -219517351, - "type": "chatTypeBasicGroup", - "title": "Winning 🏆 Telegram Lightweight Client Contest", - "lastReadOutboxMessageId": 386318, - "lastReadInboxMessageId": 382536, - "unreadCount": 0, - "unreadMentionsCount": 0, - "isPinned": false, - "avatar": { - "hash": "2-257715944-115885" - }, - "lastMessage": { - "id": 386318, - "chatId": -219517351, - "isOutgoing": true, - "content": { - "text": { - "text": "And one more time" - } - }, - "date": 1576701202, - "senderUserId": 3718260, - "replyToMessageId": null - } - }, - "-300045230": { - "id": -300045230, - "type": "chatTypeBasicGroup", - "title": "Криптостая Smart TV", - "lastReadOutboxMessageId": 362233, - "lastReadInboxMessageId": 385579, - "unreadCount": 0, - "unreadMentionsCount": 0, - "isPinned": false, - "avatar": { - "hash": "2-235140631-137735" - }, - "lastMessage": { - "id": 385579, - "chatId": -300045230, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABMDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCQanOU3i1O0jOd/wD9amSavJGdr2+CR/z0H+FY4cgYy350b/mzlvzoA1f7cI/5Yn/vv/61FZJ5OeaKAEz7UuCRnFJS4OOnFACUUUUAW4LiKMAG1WQ4/WpXvIdvNii+hz/9aiigClI6tIWVAoPQelFFFAH/2Q==", - "width": 591, - "height": 1280 - }, - "sizes": [ - { - "width": 148, - "height": 320, - "type": "m" - }, - { - "width": 369, - "height": 800, - "type": "x" - }, - { - "width": 591, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1576557069, - "senderUserId": 120566766, - "replyToMessageId": null - } - } - }, - "scrollOffsetById": { - "-1186709966": 50000 - }, - "replyingToById": {}, - "editingById": {}, - "draftsById": {}, - "selectedId": -1186709966 - }, - "groups": { - "ids": [], - "byId": { - } - }, - "messages": { - "byChatId": { - "-1186709966": { - "byId": { - "1718": { - "id": 1718, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "5161485537902736", - "emoji": "🔪", - "isAnimated": false, - "width": 512, - "height": 365 - }, - "document": { - "size": 16786, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573226544, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1719": { - "id": 1719, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCseKtxSwcfNjHYiqlNPTkA1DVyk7GriN/uHP0NQlG3YBrPOQOCQauWLSOrFnJ5wO9TyFcxGACKiI+cHHFW3gZOcVC4I6jitCBjqdgb16VbtAiwLxljzwRkfnioAwxSg/jQBOLoFfnyD71DOygA+tFFABGgkXIpxiI6UUUgP//Z", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1573230151, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1720": { - "id": 1720, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "рип ин пис" - } - }, - "date": 1573230155, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1721": { - "id": 1721, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "штопора нет" - } - }, - "date": 1573230167, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1722": { - "id": 1722, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Пора корпоративный заиметь" - } - }, - "date": 1573230228, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1723": { - "id": 1723, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Титановый" - } - }, - "date": 1573230233, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1724": { - "id": 1724, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Osome 2:0 Штопоры" - } - }, - "date": 1573230331, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "1725": { - "id": 1725, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "да хотя бы нарзанник нормальный купить" - } - }, - "date": 1573230551, - "senderUserId": 177121435, - "replyToMessageId": 1723 - }, - "1726": { - "id": 1726, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а на это говнище" - } - }, - "date": 1573230556, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1727": { - "id": 1727, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "фу" - } - }, - "date": 1573230561, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1728": { - "id": 1728, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "179482044735160948", - "emoji": "😕", - "isAnimated": false, - "width": 128, - "height": 96, - "thumbnail": { - "width": 128, - "height": 96, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 10902, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573230573, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1729": { - "id": 1729, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А вот для киселя он не нужен" - } - }, - "date": 1573230578, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1730": { - "id": 1730, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3664822579234178", - "emoji": "😄", - "isAnimated": false, - "width": 320, - "height": 320, - "thumbnail": { - "width": 320, - "height": 320, - "type": "m", - "dataUri": "data:image/jpeg;base64,UklGRhgaAABXRUJQVlA4WAoAAAAQAAAAPwEAPwEAQUxQSCwAAAABHyAQSPEG6xYREUNBIykOJjGJSQzUrxvR/5TvkIZz/Md//Md//F8TCyffF1ZQOCDGGQAAcNsAnQEqQAFAAT5RII5Eo6GhGHgt7DgFBLODRR4A6h6xVRneelllqV5aJe8vry5lyeX8Or/Yeng4T+3fYl/7+av43/2a6CFPgLqun1V7A/SN9ABTH7h3vkY4fRJth3vkYYdUHnKQHzTtRzFKZM4U+o13vNwiwAm1yL7mvWYBlHTrOZI7HJZfaGIm8QetE9EJ+RLaUi4EW9jrKgndF7z/CmNvie3OqeSOR4SRqEWDg2srjUhcUgMu95ZyvQ0U4FKCsnimEMH5/r2PyGIVF6wXOrCIRT76WvrsLMYZKiW19ij3XYv4dsjA3ePTq9hB6MGZCXqhxXHeGcDqW/cCu/xMSlKJp++FMXnXY2qFO3Xso4EIadDwDKTJ4oZaabGF1Shaa2D+H/cw0JndDBKjzYZjLvDqa1SWP0Ms2cWdzaRS0sBbn1DrwAs9gDLdhOnBT5FwhLDRkNNZxgmHPu+Q09F+cHcuvizpkH6kZ3ghBjD4eMwu9rKznU19jPqJoLYKcQcp0SmO75Qdq0uy9dh1u+cmAwv5SZaMWQFTzv0gr9hb1d4GyDS8L2mbrW4SCMIdOBijcXI+NtRVhnlWHUUPfh+dEVzpsWU+qKLAQ+XzQPl8oxNut5fMmxkJMbIkbMJ4F5aFem6ZNQuDYxyP9rcX0d0Isf+JOja9vMZ0kRRe+t7gNTCYdQOXUKYo+LTRKCjIqB3NKZleRDa67n0DsguGWQvB2/tCRZvFS53+OStQ7iXjpz24mE1XqwmUMjfqJde+dFhEc5VXmffJaQHCEXS+zP83pZCBpin23W48Isu3l+yGUaC+k4G3DGc6nITc0JjMIGsw02/v/qnJVghEmEewOacMoW2yXDWU36hH0CsZn/t9M9BRlXPoQ64EX6cCCC+hh0ISI73+HnwLDV5M8s232dP2d7Y3+bBtTfC/GSOCoTiZjmEHcmFZmC0kK/4O9Nugcq9MoL7z9qfWvYQQHLySGfZadRkEoHcXhQh8LFePEE+2Evm+8wZKTPm/G9qOOsLof7VVX2R//y28vgSEf2YSY71kdZ6dA5+V/v8p2eLJ9lzcEWQTbQyfLpbValI6hvQWufjnmrddWNrCIihs0Mjd9Z/B+WROFBbmYyAd7Da9ppYhtyaLyCxtkYmYeIBLyRMoxZqhbnazf641FCv98otaXh26NDS7g3p9oieFF+CO44zpHYT+1+EP9aib2ieVxTzacf2CkZ3w8pT5mSfOnYVCWwVunHrBjeTxoBFgknvBHUqOxQ9Wm6xd19jH1V6yBcYa6LKUM/gc+sKyvjTLyFHcdCmpD/w5iQXFkw3KGJL+srKOByST1On9zlQezYBhLEPJMarbo+ibGFfyKMma2tQbm2hDhm08iEmTjqkzSa5w0yiZepZpLY0sPEBnXpx39gsaHiTFIo1t3jmFuU8B5Cqfp2QL8C6hn90rTtXUr/WIafF+CUcR5YxB4xgjy32awspLKUDYCZBlz7M7pPua73Kq0ADqSrqsMHh6846j40Jgn1xpyS9vTCHyQ8x4isj9hGE5UEcoydI7QQd7MkggH08R7GhX2gjfLOpMmMfUH20BPoOj9+hiZcUBnv6TR/QKNM/b5S9jguACFPhO0fT5Hbp3dtsbv8VfDKEkdDf/vg1D/rR10Evrtj8G64+l3LexK1peLe/eUdkvoz4UvXrCB3kSQQjQxIirDx6Ap8paGAQd9/wOx6iX3/YMw8v8gL/fVm+4ND69gpppEkrkzZJbYHcN6+1/YZj+pB1LkktWpaJteU39sa1JASabPg2ppA/Aoov5xSHEnxrCWFZn1oQQAgsVVymNMgKCl02Nsq1t1wdv3BfqXOakKmlXMXKo7ZJ+3oe3N1Zys6UQcC4D/PeoR2l3V7dMbjb1nhgHiNJLR2mJh8fG6xQP/VVYUyH4d75Zfe7WECf8KZ25Vtq1Kd9XSFrHDIwKBLlchDHJ142z226k528upZ7PvFa+jJx6JFtVBcjlH9ESUuHWEFBAdHRN3+Vm8iIHMFkRsxqLyH/nqGYg4hasMymbK7WwCR2a28c4tBG3UQvQ/BZq32CRen3Wmvi+xZEgHZXcRKdxIfWM2i9zRUNabnCvBta4y+L3HS2TeKKCVV5KvW/jg07H4BSyohQ4RvrYlwwJ8DA3YNqbhV5S5kCk/oGt+6FOWJT8/dNJW21ikI7FFslA371x6mZ6ZVswFox0YSWanaJi6dz4pNAp98VqgH2gNnxH8VYhMIR9LU56omqVrHbOdJVZxJMHvbVX3+qPVK7b7Gh6S0Ctd5iGO5stxNP6xdEAY/ivAqgE/wxJVji6kmWD7e/iNNSv7tr+7Syce3SVOCB1Kw4xw+iTbDvfIxw+iTRAAP7+BtAAAAAAAAAAAI38BHuP/svabF3eKeDau5l7mplFTQCPC3WWZ7oBRg+e+xnCuoUmzBX9sELhNpZLzGsOSuo5LcSWEo8M+DNyJPkbF5nKXl54P9U8SIv2qHvaDB+8XIMtLJOR7kGpWNGjg+0YLT1K7OKJn9I8Gyi1wvHoCrA8AbyOqGjf4SFSqP1MghWp6T6sMM0PtQHh62H2FQfqBG7aTdrUeYhptI9lI9XmicZXs6huQsDWzauwrkQ0obGnkfbKdWow7KWAz7iS92jeAx2xb9O+JER6hrAjIC9Iv4yrRApjofRai/rwJPSqLm+xgLShPICanyt/+IpxdrxjgAO3PyoPOaPACuMXqKXhyPIpv5/rVOcTIpz6r9leeoP63QX39+jVbdIrRmoghuk7uX/BrX/0hy5XBAaQL0dxY1vDVr5er05Ko31Ik6EBkj+Rvibka8P/5JrP6PRARVNPXWSwtnoKtZGMeKw2ZjV+1V6IRgjntvZZl0b/qh3Pb3VMPQisgKDCOXzjpGysDD99CFqCfnKqyr4WkN1Cs2iFFVKJ+LBvPWpqQjpDdtpGLwyJQ2FBgdbNNmYwZFiNdLSki9rSZc/fvRGNfPDrYlXjDOZyZ2TGqZxDc1v1NffeTxmnI3Fy2nMtOWi/eGD7ozk+8B1MI9TflMPu65JmcX4L3c2kI3CyGuhmBLfxVWykPhH+WzNyPnIyRfVwgw7Z30HekxkjyOGBZriRcYM49edg7AnXLM7HuPQd3a4zkJ60300tlHzqoV2rDQvYTNO0mCfQddsziBM/gdnEhRL2OryWWe0v19hJFaGo6nv5n4dQFKlN1tCbDaaAtWKcCZPkL/WkseBp5ULTqRdeCKIPi9S+TeE3Li1apLydbgvRhpmeTyHDhtcXO15tqKuRjsyCRfxnAo7z4AkWySV5w6jWtUbl3PMLq9HdL/PBNTeh7r695dfhdmpO14Z9k1wPkA6OKx9JlLVD2wIuoMh/x0Jv675lAmeCHMYREtOLeMuHCH5nQTqKCocx/aHyZJTrRP/902opSjWyaqD/McktVXLG6oB3+F5RKu0lu7CQuOvXpdOKiBn2AD02fNC/pwSRxA6/h4gzcDzEDkKYXaFRBJfO1e3umpsCk1NphBijbV/VgNY93kTa78lNsAfp8WaBk695K9RgI7H4KFicbp9pOvwfU6scg7h7DDSHctcwtAn1M3yROa9RDK9dslIA+iZnh1XtHNdbPOpNwFG7u36dqucJR2fcE9b0nxDGtayV6A78Mvu314AXTLrGvxuB/Q447Pls2RtX0igVgh0B+iABAbzG0iZLVuZ6NZBRA7RCFo005DXGfDbv6pjlvDVNelJxMRaVD68M6Lv4awjWrYlJqsT5psyX60QPSpn8XszOEWFSLuaUkOSUp84ETvlEtbzDTsTMvKCxYRKP/AUEK3YEWVEyUxB3WIXBn+xw4PofV0x4GWYCnjEd+2ycn4dGDldtWwTsn/jw50UFV8vUNPgyJRfRCq+TbhmZDvNugVIzFxRZHSRP4NeG99NQrICI6UeewO6l38juljx0aRmJGq+V41sloBQLHtwgAcrnLKcFxKqKGdrKCS/i7k/wuiS/b3ue9VbdDO70oKizaMLjNYojBuiDsEJvL3uo/Uqz7hbvi80m5Hw9b5aPyal5gc9ncVdac2ucPayf7AT0ix2oLUjqh2ls5ERqdxQx3jishUOhA63rG95o4RaDloAtCdrHi3xppzoSBPb0cTGvn7O39Pu0+PafJGlvyg3VrP2MwzFFW9vt3/6k/xHoREri+sn+/XLJ8ieRxVPqhuUMx/800yeUQrtpQMfNs2CiKNtFXMZbvuY+JSBBZTgKOeo0fyvEpYFWEwh9F8VActykkR2uPUszjvPiB3ryYV1tuAkYKkO+AZUKj4Mwg13lx+bU+S5XlHLcU5gohog19mFMMaklkupA80AhNORyA+HovTS5Fducep1hW/HOi7A7T0F4vmsXHn9Fv+gB8y6uATlmKHrU37PGduJK0WtoO85lKFHVDeKN88+pwn23vxGpB3ZjC//5t8CBXTih4ID/EeTzNcLcCZYBoTjWpsnv5u3E/30G9FlXadetK6DWS8EOfp8pe+4kbrWwtr0dDD6BykBWwJusOqvNysZDcrGlM8YW+TbKk0dowOYRcYiWzjJLCc0l/P8zp4t8Ievs0v+8gFz9lAerunCaopAQ15wDi6npap4UOWhPI3vTIe3TZte13Xcw0yRlFlAMpfhZXP5ZlcKanSKW0GtU7/oGW6kF8DdJLbR/Nb//MAFUpCQ5A7ckD1i8TNsfxXwKbhU3KC5YHIVACIn8IFuG76+R3MVlUHnCEN6W48vgL2xPMLDrnAofajH9oDjbAi0eKeGcJA+Qvzj588rhuYxtMsYrZpymMKARrbCheh7zz8rrVCkxf1z/xAxwjGuuoi/4NqyE2yl6s/TgJaTQxffpIVT7M6L6fLal8dQiRa8/qBii+tADX+DAImoFFehGZFGQMzxxjqbpW4XcW/+BvMlYkpODz3qTPtuAs8J2baW2P1JAV9j0aOrg/E7Wj6HbLfXHL6XyS/wa8rnoVGeK5J0Ij+AXY4yfslTxLxNIKQagOTCtBihGu8oakdnoS6oPWFJAs2oLjOqhZjb8+5oiEReRoz0id6QV0EX8nZmQlvFsACdNVgeZYD4VfY3Wemr4bStk2rFtVtZLKpKDKD4mfwrSXg/yoIgjkTbHfDZIk0oBve6Vx3xui0MjEs2PhXtrYKzlsK4rfR1uQHLpG+52k9JxvUiTO3Vm8K3wd73e4B01Lit5ZInJAqcoSLWWL+7KdRr6snO3otoTdPlOly1zOn8s527mXvAFFc9WLRLjT6H2w2eWDLRFN9AxS7RZb8bnNome/76Bj/9ITqZlWgT82veW6M1pZ8J6RLobreJI2jke2UGimpqxajGdovOpxnlX5H5IiAc3Lisr7ZQbKuxneusGM7Xrbgmc70xhFp6WmLAp4b4JApuxX+sDr4tvO0YaFKT7+ZmYf9qZQf0OjRkdFOIovfFRW1pffOF33UgGlU4ykYAM52lRJbddTvAMvOSFlR+4uQn4OVhRbq47Ypc51shEqQjT7PMA/I7Ss20P7BuhNx7NRXs2Ynp5mjwTcC92gH2fnPIY+z01wxxEvDkIO7ElDxRnv2e6zSeF9w0PrkqPFeezSKtsl+ALS28nSm9M1Zyv7uTV9jKX5Aa44Uk5rKt5Irjxrp2SrZdjkk9/FPDWDstiy0a4SBXmO7Iz07VdKslh9eKA8GrXG6HkqV7dWhINlmJwfO3JVpW06j1JDdjqQZPKPXRyXpVwzVfA4KWEjkrtNWuXC9X8gsB8v28xlb1y31ejEgo6mHlYYh5qncH9P3HZIth9XoEdl6LtJGla9cDcvUH40Lyl0QSxtJnDHSNOVX0lUxqL/ylvnltWtSXMoiAjSRHLBFOpgGWZ+gtncHq0APi6KHm7LwzQd7v6BAQMgJ35egLCC/oUP78K9n+aPuZSlI8x1IzSqQ20vPULmdOSl8HUp1uX3kKwb8Cn1NZpGwup1kZccts7t4LYGDrWGFV2MIIufMFwJzsf91rhtCDU3wTpam6aJmrpGp1CJMECIyE6VutJhO537RB8sDJVKnwj00YLt/kWFJoYvfJCwh4hzwuAoZB1DznXcF/qUL5dfB/wG5DaECQGbthmanuAvowcTf6zhbK9rPPR0A7dtF7naPZJOTZ+SzhMo435TPMqX1xriwsSWM4JpaRNx/8RbeXEt1p9I8N0rjRKJEUPM+jBKxvHxWiAkVAsD7Me9FXjGwB+pJWqmyrErNurAH9oLU16hYVlNt7NaZXtP8+f5JhlOywbI+EsxAAakTIB2uUm0BcgmOePgN985+JEZpPCuAEOu8naKxCtO+6wPyQj4sQ5TptGnBpCDR+GEEfkmBwHTOvH6FcZo0o7C+JokvOyg9T9TyiE3IID0dh6NkbfvBNKWBRm7BV6RWDz4EExqiHbjw7c3MAcuLIzyne/fnUqVDh4VTw0248qu5CKDQkNkXk4ARoi+GXu2jfkQ28IVECn9lRaBpWMyD1mMr3snK8Q6t8AbDCLkKFZg1euCbI9N7yL8XCe+9gXFbp/CVEho8MyhCzyero/LizdFqTA1EJRkoImIWDtwCbmUV1bKg3YYZiqmNRVCZ0puWZWJDfHlAfhSznxQhrqJ0EPxQdbOAwVp8diFMaGP0uIPiXTdHjuAzKDIEn1nDP2mK9RxwLIcd7ewybXT9stTFu/A7QowVTjUs/yIPqJfK5CrKnNljSRpUxtA+klLzuFuINh2I2cqEgm8m56fWpkpzk2OoEsxaTM1bCaYXdZrk1GfN/E45P4kOGSY4Q2J6C1632WplGvPJXYMC5pmq2pzv2VVVywIIfWL7z/VaoV6cwIpLlDe1rZDi+dsS0Brc5WZrEbLroV3S2G6356xZxs23t0U3g16NC8guT/nCOOJ/NpemE6sq05Gq3koT+3Dkp1cCAQy0LaCw3V6p1VKzYDh2xK8QkrSq9C8EzuZw9lpycsGn0Qxj/n6amnEsTYcSnIvTMHiqLOoq5HSUaxezDjvWHqVjGBK2e7ufCPFPZN6CGen3MURXTkkaKD804TNHD0pG5XIc5CE0VnLTUd5bYVaAXKg62WgLt51Iz5YHwrhfL/cQnmqiwXsZO7HYM6z5eBo0P8QaALo6LlwU0JR3vWlUntsTTKJaIjiCLBzlToU0NbULISVDyKpayfNgELwq9yRWnJyo4DEWyOtAaqEzLIlFDDVuhue97KjXtCh1sObrrwkRJKfRtSRZU1TWQRz8Syx/Crpw+IF9lNUvox7pdS9ZwstJZJ+RlqOmw5KMnQbkKknQXiX7Cq0jH1e/MO39RoVvZa/24W76FxLQCCX+p6UR5BvsL4Hq4C12IH6qpdkQ8+Xdix13wjI3lSrbAspxsgZaTn9xpduPtW7twiNqToCiOf0JvGszkQ+sYsCUr4mz6kz3/ig5XMBDjOZELqEHnL0pGmbzbM73xfgQ9S8GEdvfHcCv7Yhcq/XVzVdErCbVj89QtnbsSUwSDj/dBQk/EtWl37ukBOYqUNDMWgDoXinLHIhjihq3UpqXshutQjBVADewsyXPXKJQ6F3JfVZocm3SVg++Z4Ivvo7E02v5fvp1+mi4UslOjQ5pvU2cBJmhfY5rdkXqDycX3BSEaZDPuaLYK+OjlE4zOEo7P2B3xjG7Vw7YsXqWl82eDZXyZGIz0UYVmyXS3sbV5aTVwouH2f2r0JogRf632a80JaVIOfK/5S69yTqdC7xcHudh0kix6WK0FA18jd0ZLoHRmth2uqUCXHd1OvoK1OfXgaEyGNtnN01rdYlizZ9doLw1S/1FJlK3dVIm/Tqo1RQR+n4HzCFj1dV3ScGhRay72TS4/QteTpbphJjazFerqBH6ZJMWP4NrdAvgODsGK9EBDcAXJIMFTGYxEQCBDl4/87eNLlVopfK483MqxTfihwh4hK6NukE/OBcajZh429w388zCfta4JGzn69lUrN3qh6X5BJoJrNY5pUX1ySJVDj8pY1Nqw/IlUbBiXc7YJ0tUczb9Vlx/byoC0UOnBBM741hgLhSF1KWHpoCcAcHhbkEmoIK/b5NXM9BAn5+BHoQ1DDFhpG+z0iTzkOuXcPGa8olPItwLnNTQ1L2kP/odVjbE1WxVuyTEqGjnI5I8aaotHfrdfNx8+GrdNICYGFu7lfzIk/8orRyP3nbRNpVgp+waWFP0aUT5siTeQh80N9daYPkVx1hWMSVFNv2bu+GMyuZ1Z+PZVTt5fm+32Cx03cVVYyTX3NwiOCTU/G9/pVDyVSVHPRYNnlD6eYnFGheHqGGAsio1jwFEklfT2IWFCPM2t/8yTZ0YZ5YgNO9eflSwLfhJC1m0qtwOjnkpvwBH9HHfGMoSR1cnJqFj/MJwywgVLVJgn5HTbHrYn141Etl8cy2SFEfaSfV0Rq9iQrCUZ0rgtqjUNBNZ5TZcBt1suTV4XWBiqoX00wIr0cNqIbypzZnfmOO8EEolE/yeP4LnpR9Q25Lg4fVcp3pS2H/EO67SYN3NPwaITHK3fYvF0GFvkQdGk+H/cURqyn9VNN8POXKevCTmFXA9RilioyzBBaQpehyGT9zWtypAAkk5W0481rAr8hVsGiom5miDrW6WXdRcQ/9mHX/9tL7Hy7exGK9vTL9HR4979aooMW4WykqJ5Lb0CWEYUD1NAPDqp7ACMHClUePum3M9loEF0kKqJX/3B8EZy2RjgAND0/WIduEBOuTvZLkozALbZm9B2UUz0ghgOjNZXL1hKUlXSR5DkjoCk8PFbJMUBXN9+G9PIavu+Pe0iTywAoPjv6twAcTQBjbw03vUmpu18ejsAiSAHw7dCnjoGokJELPls8xg77K1FV1DAzi5dEq+AAAJVgAAAAAAAhiAAAAA==" - } - }, - "document": { - "size": 14636, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573230590, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1731": { - "id": 1731, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а у меня особый кисель" - } - }, - "date": 1573230596, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1732": { - "id": 1732, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "э" - } - }, - "date": 1573230596, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1733": { - "id": 1733, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1112358875685716016", - "emoji": "👁", - "isAnimated": false, - "width": 128, - "height": 22, - "thumbnail": { - "width": 128, - "height": 22, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 8840, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573230602, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1734": { - "id": 1734, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "виноградный" - } - }, - "date": 1573230602, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1735": { - "id": 1735, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "с пробкой" - } - }, - "date": 1573230605, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1736": { - "id": 1736, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Кстати, сегодня я припёр два штопора. Один лежит в стеллаже в B7, второй отдал на ресепшн таблицы" - } - }, - "date": 1573493013, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "1737": { - "id": 1737, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 1, - "width": 480, - "height": 326, - "supportsStreaming": true, - "isRound": false - }, - "document": { - "size": 112414, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1573493066, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1738": { - "id": 1738, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Человечище!" - } - }, - "date": 1573493079, - "senderUserId": 4274761, - "replyToMessageId": 1736 - }, - "1739": { - "id": 1739, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "348373043715768484", - "emoji": "😊", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 16336, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573493153, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "1740": { - "id": 1740, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "кто рано придёт, тому больше миндального пирога с имбирными грушами в карамели достанется" - } - }, - "date": 1573506966, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1741": { - "id": 1741, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Яяяяя" - } - }, - "date": 1573506975, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "1742": { - "id": 1742, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "179482044735160948", - "emoji": "😕", - "isAnimated": false, - "width": 128, - "height": 96, - "thumbnail": { - "width": 128, - "height": 96, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 10902, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573506989, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1743": { - "id": 1743, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "179482044735160957", - "emoji": "😔", - "isAnimated": false, - "width": 512, - "height": 487 - }, - "document": { - "size": 7044, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573507021, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "1744": { - "id": 1744, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1360886329340072497", - "emoji": "✊", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 12369, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1573537917, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1745": { - "id": 1745, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это могло бы быть ваше утро" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCULk5NSqYwpyce1IB61HKgfp1FQkU2SrkjKbdvvxTZPlPFRsj/AGfanU9aWESBdroeO+6qtcVxss/l5VfvevpVUO5YvuOfXNJKds7jpzQpHlnLjGcVDuUrFyKYnjv/ADqYSN/c/Ws+D5plAOe9XxwapN2JaRW2R3RDKcMOopr2aiMhTznOTRRVNCTHWsaISQQSeMirR60UVKKZ/9k=", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1573542136, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "1746": { - "id": 1746, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Буду через 16 минут" - } - }, - "date": 1573542232, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1747": { - "id": 1747, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://m.facebook.com/100000379272171/posts/2621163677906249/?app=fbl", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 70 - } - ] - } - }, - "date": 1573730696, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1748": { - "id": 1748, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "интердастинг" - } - }, - "date": 1573730709, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1749": { - "id": 1749, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "У меня уже бомбануло по этому поводу" - } - }, - "date": 1573730801, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1750": { - "id": 1750, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "интересно, много им людей написало, и сколько они потеряют клиентов?" - } - }, - "date": 1573730818, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1751": { - "id": 1751, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "(я уже знаю 7)" - } - }, - "date": 1573730826, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1752": { - "id": 1752, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "еп\nу меня довольно сильно горит, стала бы восьмой, но куда идти, не знаю\nвсе российские банки — такое себе)" - } - }, - "date": 1573731020, - "senderUserId": 177121435, - "replyToMessageId": 1749 - }, - "1753": { - "id": 1753, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я пойду в Альфу" - } - }, - "date": 1573731042, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1754": { - "id": 1754, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Либо тупо на точке останусь" - } - }, - "date": 1573731060, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1755": { - "id": 1755, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я в альфе, но хз, не думаю, что они чем-то отличаются" - } - }, - "date": 1573731079, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1756": { - "id": 1756, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "В этом плане" - } - }, - "date": 1573731082, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1757": { - "id": 1757, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а смысл? кмк, шило на мыло" - } - }, - "date": 1573731145, - "senderUserId": 177121435, - "replyToMessageId": 1753 - }, - "1758": { - "id": 1758, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Клиент Тинькова смотрит на тебя с недоумением" - } - }, - "date": 1573731236, - "senderUserId": 3412850, - "replyToMessageId": 1752 - }, - "1759": { - "id": 1759, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCPTLNJf30hBA6L/U1Nd6WJAXgAD/3ex/wqhDcGIgxvirdxqbeTtjOJG6kdB9KANd27cj6GhDwRkn60hB3cBvwpwLdxgfWgDIbRcdLjJ/3B/jSjRCRzOR/wD/69abH5/wAPXFOQjn/GgDMfVGdQBGUx6N1/SiPVWQENGXJ9X/8ArVWAT7vG7/PvTHQBu+fpTFc3ZRjDBGYnjg0sOSpyhT60UUhnOjAlEmGLDoMVK0xZs7CMUUUxH//Z", - "width": 1024, - "height": 1280 - }, - "sizes": [ - { - "width": 256, - "height": 320, - "type": "m" - }, - { - "width": 640, - "height": 800, - "type": "x" - }, - { - "width": 1024, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1573731274, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1760": { - "id": 1760, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "пойдет" - } - }, - "date": 1573731288, - "senderUserId": 177121435, - "replyToMessageId": 1759 - }, - "1761": { - "id": 1761, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "868996962018394191", - "emoji": "👍", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 17112, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573731302, - "senderUserId": 860139781, - "replyToMessageId": 1759 - }, - "1762": { - "id": 1762, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Тинек тоже известен своим многочисленным говном\nкак и любой российский банк)" - } - }, - "date": 1573731339, - "senderUserId": 177121435, - "replyToMessageId": 1758 - }, - "1763": { - "id": 1763, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а зачем вообще банк в 2к19?" - } - }, - "date": 1573731365, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1764": { - "id": 1764, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "надо деньги в биткоинах хранить" - } - }, - "date": 1573731374, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1765": { - "id": 1765, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я тоже читал эти офигительные истории, но со мной такого ничего не происходило 🤷‍♀️" - } - }, - "date": 1573731377, - "senderUserId": 3412850, - "replyToMessageId": 1762 - }, - "1766": { - "id": 1766, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "(или лешкоинах)" - } - }, - "date": 1573731378, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1767": { - "id": 1767, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "кукоинах" - } - }, - "date": 1573731381, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1768": { - "id": 1768, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Опередил" - } - }, - "date": 1573731384, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1769": { - "id": 1769, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Долго терпел" - } - }, - "date": 1573731388, - "senderUserId": 3412850, - "replyToMessageId": 1766 - }, - "1770": { - "id": 1770, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Смотрю на клиента Тинькова с презрением" - } - }, - "date": 1573731399, - "senderUserId": 194771934, - "replyToMessageId": 1758 - }, - "1771": { - "id": 1771, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "На самом деле вкусовщина" - } - }, - "date": 1573731438, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1772": { - "id": 1772, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "*очевидная шутка с отсылкой про разбан в чате, который я буду эксплуатировать годами*" - } - }, - "date": 1573731463, - "senderUserId": 3412850, - "replyToMessageId": 1770 - }, - "1773": { - "id": 1773, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Тиньков мне не нра, хотя есть карта (и сегодня привезут с Риком и Морти)." - } - }, - "date": 1573731488, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1774": { - "id": 1774, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Деньги в битховены, битховены в холодный кошелек, кошелек на флешку, флешку в землю)\nи сиди довольный" - } - }, - "date": 1573731504, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "1775": { - "id": 1775, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "*сделал вид, что не заметил*" - } - }, - "date": 1573731522, - "senderUserId": 194771934, - "replyToMessageId": 1772 - }, - "1776": { - "id": 1776, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Главное пароль распечатать, порезать на буквы и закопать в разных местах" - } - }, - "date": 1573731565, - "senderUserId": 194771934, - "replyToMessageId": 1774 - }, - "1777": { - "id": 1777, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Нет, деньги зло. Закопай их и наслаждайся)" - } - }, - "date": 1573731589, - "senderUserId": 205688700, - "replyToMessageId": 1776 - }, - "1778": { - "id": 1778, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "У Альфы есть фича в детализации платежей" - } - }, - "date": 1573731700, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1779": { - "id": 1779, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABMDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDP8hz2pPJk/u/rXTIGUtuYtk8cdKfRcDlvJl/uj8xRXVUU7gMzzyBTtwpCgJ6mlCgHgUgF/CiiigAJAGTxSBgehB+hoooAWiiigD//2Q==", - "width": 591, - "height": 1280 - }, - "sizes": [ - { - "width": 148, - "height": 320, - "type": "m" - }, - { - "width": 369, - "height": 800, - "type": "x" - }, - { - "width": 591, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1573731707, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1780": { - "id": 1780, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Не Облагаетсян! Армян какой то?" - } - }, - "date": 1573731742, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "1781": { - "id": 1781, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ахаха" - } - }, - "date": 1573731762, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1782": { - "id": 1782, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ору" - } - }, - "date": 1573731763, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1783": { - "id": 1783, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "sooooqa" - } - }, - "date": 1573731780, - "senderUserId": 177121435, - "replyToMessageId": 1779 - }, - "1784": { - "id": 1784, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Мы с Лизой на весь офис орем" - } - }, - "date": 1573731787, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1785": { - "id": 1785, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "мне кажется, Яна сейчас заплачет" - } - }, - "date": 1573731820, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1786": { - "id": 1786, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "868996962018394191", - "emoji": "👍", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 17112, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573731880, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1787": { - "id": 1787, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "В Ростелекоме все как армяне пахали" - } - }, - "date": 1573731995, - "senderUserId": 356765513, - "replyToMessageId": 1780 - }, - "1788": { - "id": 1788, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Навар Евгеньевич Необлагаесян" - } - }, - "date": 1573732065, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1789": { - "id": 1789, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1685141920508018879", - "emoji": "👺", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 18438, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573732080, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1790": { - "id": 1790, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1137162165791227928", - "emoji": "😂", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 11493, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1573732140, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "1791": { - "id": 1791, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "проорал" - } - }, - "date": 1573732581, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1792": { - "id": 1792, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "157750352030991019", - "emoji": "☺️", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 11576, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573732655, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1793": { - "id": 1793, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "причем как бы\nкейс Рокета очень стандартный\nс сотнями клиентов так поступают и они, и другие банки" - } - }, - "date": 1573732716, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1794": { - "id": 1794, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "просто грустно в принципе" - } - }, - "date": 1573732721, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1795": { - "id": 1795, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "и опять-таки, они не то, чтобы добровольно это делают" - } - }, - "date": 1573732746, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1796": { - "id": 1796, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Да вот не сказал бы. У меня очень много прилетает денег от вообще разных людей" - } - }, - "date": 1573732834, - "senderUserId": 194771934, - "replyToMessageId": 1793 - }, - "1797": { - "id": 1797, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "но меня никто ни о чем не спрашивал" - } - }, - "date": 1573732842, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1798": { - "id": 1798, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "тут явно политика" - } - }, - "date": 1573732847, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1799": { - "id": 1799, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ну блин ровно в день когда я выпустила вторую карту у них)))))" - } - }, - "date": 1573732884, - "senderUserId": 141185012, - "replyToMessageId": 1747 - }, - "1800": { - "id": 1800, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "не знаю, как работает финмон, но сомневаюсь\nпросто если вот представить, что это не Волков, а просто чувак, который получает прям много-много переводов с других карт, то вполне себе ясно становится, почему ему кинули запрос\n\nя таких встречала много" - } - }, - "date": 1573733247, - "senderUserId": 177121435, - "replyToMessageId": 1798 - }, - "1801": { - "id": 1801, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я сейчас не оправдываю Рокет" - } - }, - "date": 1573733274, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1802": { - "id": 1802, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я просто говорю, как оно примерно работает" - } - }, - "date": 1573733280, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1803": { - "id": 1803, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ситуация обычная, так-то. Просто так много грустных новостей" - } - }, - "date": 1573733320, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1804": { - "id": 1804, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "272479773299573627", - "emoji": "😉", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 24734, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573733729, - "senderUserId": 149266234, - "replyToMessageId": 1801 - }, - "1805": { - "id": 1805, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "есть достаточно распространённое мнение среди sme, что банки злоупотребляют и манипулируют 115фз" - } - }, - "date": 1573736517, - "senderUserId": 54158593, - "replyToMessageId": 1800 - }, - "1806": { - "id": 1806, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "да, тоже так думаю" - } - }, - "date": 1573736534, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1807": { - "id": 1807, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А некоторые банки это мнение укрепляют" - } - }, - "date": 1573736536, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1808": { - "id": 1808, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "“лишь бы чего не вышло\"" - } - }, - "date": 1573736539, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1809": { - "id": 1809, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "658767117562151061", - "emoji": "🥴", - "isAnimated": true, - "width": 512, - "height": 512 - }, - "document": { - "size": 6902, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1573736541, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1810": { - "id": 1810, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Кстати, Сбербанк в этом вопросе у всех на хорошем счету" - } - }, - "date": 1573736561, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1811": { - "id": 1811, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAOACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwChycEZppY5pA5AwO3tTc9615mTyoduNJ1NJUkA3Sqp6E0pSuhxjqHl5HAOaKvrAqkHJ4orHnOj2R//2Q==", - "width": 1125, - "height": 390 - }, - "sizes": [ - { - "width": 320, - "height": 111, - "type": "m" - }, - { - "width": 800, - "height": 277, - "type": "x" - }, - { - "width": 1125, - "height": 390, - "type": "y" - } - ] - } - }, - "date": 1573738523, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "1812": { - "id": 1812, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Кто то промахнулся" - } - }, - "date": 1573738529, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "1813": { - "id": 1813, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Мне тож пришло ахаха" - } - }, - "date": 1573738582, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1814": { - "id": 1814, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "+1, люблю отладку в проде" - } - }, - "date": 1573738707, - "senderUserId": 63238467, - "replyToMessageId": null - }, - "1815": { - "id": 1815, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Собираемся (не)много выпить этим славным вечерком, давайте грешить вместе, коли возжелаете. Хотя, может, и так все собираются, а я опять все пропустила 🌚" - } - }, - "date": 1573814095, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1816": { - "id": 1816, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну как все... не все😁" - } - }, - "date": 1573814121, - "senderUserId": 860139781, - "replyToMessageId": 1815 - }, - "1817": { - "id": 1817, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "830557752043504127", - "emoji": "👋", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 19544, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573814147, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1818": { - "id": 1818, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1057263438939553868", - "emoji": "😡", - "isAnimated": false, - "width": 128, - "height": 99, - "thumbnail": { - "width": 128, - "height": 99, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 56458, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573814195, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1819": { - "id": 1819, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "+1" - } - }, - "date": 1573814209, - "senderUserId": 53759108, - "replyToMessageId": 1816 - }, - "1820": { - "id": 1820, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а мы потом устроим свою вечеринку, с блэкджэком так сказать" - } - }, - "date": 1573814241, - "senderUserId": 860139781, - "replyToMessageId": 1819 - }, - "1821": { - "id": 1821, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я за, если кто-то разделит со мной бутылочку рислинга" - } - }, - "date": 1573814422, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1822": { - "id": 1822, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я выпью за твое здоровье сегодня вечером😻 считай, разделю" - } - }, - "date": 1573814447, - "senderUserId": 860139781, - "replyToMessageId": 1821 - }, - "1823": { - "id": 1823, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "40599651539223283", - "emoji": "🐢", - "isAnimated": false, - "width": 512, - "height": 511 - }, - "document": { - "size": 28280, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573814493, - "senderUserId": 327556368, - "replyToMessageId": 1821 - }, - "1824": { - "id": 1824, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "забились" - } - }, - "date": 1573814523, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1825": { - "id": 1825, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "спасиба" - } - }, - "date": 1573814531, - "senderUserId": 177121435, - "replyToMessageId": 1822 - }, - "1826": { - "id": 1826, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Airbnb в России всё?" - } - }, - "date": 1573820727, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1827": { - "id": 1827, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "В России запретили посуточную аренду квартир\n\nДимон душит малый бизнес" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC4syFm2yLwTnluKPNBBxIOnHLVnIAb1uecnj161cSIEA+1KV0xx1RIs6h8eanH+01P+1Hu8fX0NVZBHG2DuJ9hml8sYU1PMVymgs0bDIbI+lFQwAeXRVkGUpIvCcZO44/WrCMy/wASoScAetPWxInLlhnJ59KmW1AA3OGIOQStKd2xx0RXc+Z82ADjGc0LMiqI33ZXA4BNWVtlC8kbvXBpIYpEQKzA46Hn/CpSZVySAjZ17+lFSJGwXkiirJEIfJ4NGH9P50UUCF2P/k0BZAeg/OiigCUZxyMfjRRRQB//2Q==", - "width": 683, - "height": 768 - }, - "sizes": [ - { - "width": 285, - "height": 320, - "type": "m" - }, - { - "width": 683, - "height": 768, - "type": "x" - } - ] - } - }, - "date": 1573820727, - "senderUserId": 356765513, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "1828": { - "id": 1828, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "неверно, в россии запретили гостиничные услуги" - } - }, - "date": 1573820953, - "senderUserId": 54158593, - "replyToMessageId": 1827 - }, - "1829": { - "id": 1829, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "посуточная аренда квартир != гостиничные услуги" - } - }, - "date": 1573820971, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1830": { - "id": 1830, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 17, - "width": 464, - "height": 848, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDSkuYox8z8j0qt/aUBOMMPc1mlxkHbjA596YvzvgnA5wKQ7Ggb9A7bAQPXPJorLZgGIopgSy8qGHeoweRg0xXLJtzU1tIIGLMgJP3WPakgY8wYbdIhBbnBookusMTnzGPUk8UUWKUl2KY4NTkb1HrRRQxIhZcHFFFFAmf/2Q==", - "width": 175, - "height": 320 - } - }, - "document": { - "size": 2569320, - "mimeType": "video/mp4", - "fileName": "IMG_1489.MOV" - } - }, - "date": 1573823486, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1831": { - "id": 1831, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCAJ5l6wJI4PSpHgeMFgQwHPPBqDYJbkA85b+tXBbDO1XdVPGN2f50MEQMjBSXQgd8jP8qFY4wrH6DmpVLmKZHOSuRmpJI1kA3KD9RSuOxTtsPdIPep7meMJ8jjfnqD0qrZ83S/Wnz2brMRGMg8inu7C2RF57l2+bbu6gVpxq0sasrcEVlm3kU5YYxzVm0lcArvYDrwM0pKw07lS1fbOD15/oa0fM8wg4wOnWiirjuRLYivY5BtYcrtz9KZbZkj2xsARyaKKmTuUlY//9k=", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1573823517, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "1832": { - "id": 1832, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBsCCTfGThsgr+lJNGyKyOMMKdAwEj5GehqzelWiBAI7ZJzSYFGZPkLL0xyKRFPlJ9BU8iEQyjPIXmqVwQgjCMR8vNLyKLAkVAZgMjIGDSTzvhU4KEA5HvVZI5WTeg4Bz1/pTjIWHUJxjimItGVHtp9jE8d6oSJhyoOakSKRozsYY70+SHact8uffFEVaQMuIhlkVVO3dnJxUv9jr/z1/SiihAxJbE28JZZMgHpiql15k0g2ZwBRRQ9AWp//9k=", - "width": 956, - "height": 1276 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 599, - "height": 800, - "type": "x" - }, - { - "width": 956, - "height": 1276, - "type": "y" - } - ] - } - }, - "date": 1573823522, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "1833": { - "id": 1833, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCeNUlt1DZBGcGomG2VMnt1qS2I8lc+mevtSSACZd3SpGRXXJgH/TQVLkqdpBNRXGd8OMYEg/Clt7reh80AkHHy0mNDY5RGIosBmJApTIXlRj8gPc1XhhkDo7lSuRg561NcW8qwOZQFXPyktmqEJdlhGpVudxPB9qgtFbaxx1NSLBtjRZWUru6Z70qxSfMkboec856VLWmgJkMxxeMyHCxkYyc8/wD66Lq9kuYlR2GM5IAooqxFm2kja1UyEZAwc1JHLCo+VwBnI5oorNlo/9k=", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1573823528, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1834": { - "id": 1834, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "11942135091696674", - "emoji": "🙄", - "isAnimated": false, - "width": 320, - "height": 193, - "thumbnail": { - "width": 320, - "height": 193, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 16876, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573823557, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1835": { - "id": 1835, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCFRtUCpYMCTc3QVEDkcGgSDbUSTasjRW6k8jA7gp4NRSFUjUck1P5kL42jnHNSO8TIAPvd6FCwnK5SJwKKlkYAEYoqybkDoBxG5YeuMUiKzA87QO9K8hKjmodxGRk4PalcCR/kAIcmm/aCRyM/jTQcqV/EVIsKnrRzWBRvsOR3k4Ubsdfb8aKCHRcKciii9x8rRBG4MeD1puRn3oooEWoo4li3sSz56UyUgNgH6r6UUUtyouw3zSoxmiiilYpt3P/Z", - "width": 1280, - "height": 1280 - }, - "sizes": [ - { - "width": 320, - "height": 320, - "type": "m" - }, - { - "width": 800, - "height": 800, - "type": "x" - }, - { - "width": 1280, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1573823621, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1836": { - "id": 1836, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "чо за флешмоб" - } - }, - "date": 1573826066, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1837": { - "id": 1837, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Эээээ!! Как всегда все пропускаю интересное" - } - }, - "date": 1573827110, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1838": { - "id": 1838, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Шо такое" - } - }, - "date": 1573827112, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1839": { - "id": 1839, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "кто там хотел кьянти? я в симпле, брать тут?" - } - }, - "date": 1573827869, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1840": { - "id": 1840, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "тик ток" - } - }, - "date": 1573827987, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1841": { - "id": 1841, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ток" - } - }, - "date": 1573828127, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1842": { - "id": 1842, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "все в холодосе" - } - }, - "date": 1573829572, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1843": { - "id": 1843, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBUICYBzz6Yp0asSdwwRUb3Aj/5Z5x9P8Kmjn8yFpChXNSU2ROMMSUH5ml2BuNg9e9LOFZSvzbj3A6frTI2UNt3Hgc7lP8AQ0CFaJZOrY/CpxsEQQEHBqGJ0dckjmph5ZPDr+dAyCRJXd3jcDP5io4oJ3kdmXbnngg1cCDsaeq7aBGdiW3T9y5Ck9Dg1C085OSwP/ARRRSTKaAXDLwY4z9QaeLzH/LP8nIoop7k7H//2Q==", - "width": 956, - "height": 1276 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 599, - "height": 800, - "type": "x" - }, - { - "width": 956, - "height": 1276, - "type": "y" - } - ] - } - }, - "date": 1573829581, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1844": { - "id": 1844, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ждёт своего часа" - } - }, - "date": 1573829582, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1845": { - "id": 1845, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1112358875685716113", - "emoji": "😁", - "isAnimated": false, - "width": 512, - "height": 184 - }, - "document": { - "size": 12066, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573830080, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1846": { - "id": 1846, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ребят, не на улице так тепло" - } - }, - "date": 1573848634, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1847": { - "id": 1847, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "747903279685435596", - "emoji": "😂", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 26030, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1573848634, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1848": { - "id": 1848, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "из метро выбегал одинокий молодой человек с криками «сука, чё так холодно!»" - } - }, - "date": 1573851975, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1849": { - "id": 1849, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "в Испашке тоже необычный для этого времени холод пришёл" - } - }, - "date": 1573887760, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "1850": { - "id": 1850, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "+18?" - } - }, - "date": 1573889977, - "senderUserId": 2676926, - "replyToMessageId": 1849 - }, - "1851": { - "id": 1851, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Сейчас 8 утром, ночью 4 по прогнозу" - } - }, - "date": 1573890257, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "1852": { - "id": 1852, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Но дело не в градусах, по прогнозу непонятно, что сильный ветер холодный и влажный, охлаждает как будто снег в лицо" - } - }, - "date": 1573890981, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "1853": { - "id": 1853, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Всем привет. Доделал немного концептов. Посмотреть и залайкать можно тут ;)" - } - }, - "date": 1574269837, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "1854": { - "id": 1854, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://www.behance.net/gallery/88411489/Sci-Fi-concepts", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 56 - } - ] - } - }, - "date": 1574269839, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "1855": { - "id": 1855, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ничеси у тебя там киберпанк" - } - }, - "date": 1574269907, - "senderUserId": 860139781, - "replyToMessageId": 1854 - }, - "1856": { - "id": 1856, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Панкуем" - } - }, - "date": 1574270412, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "1857": { - "id": 1857, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "доброе утро!" - } - }, - "date": 1574322910, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1858": { - "id": 1858, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Сбербанк отправил клиенту сообщение с паролем «Плачь, убивай евреев», который нужно было сообщить при получении кредита в офисе.\n\nНа встречный вопрос компания сначала заявила, что SMS «отфотошопили», а потом извинилась и переложила ответственность за ошибку на генератор кодов.\n\nhttps://tjournal.ru/127204", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 279, - "length": 26 - } - ] - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDTdyrbQue9N80twU4/H/CknAMn4UwEKQaALCcDGMfjmpMVDG+/tgVNQAmKKWigCtNjf1x/n60zIHGfwz/9enyuN/BoV1OMbifrQARMA20YJPvVmowcnoakoAKKKKAIJGAfGwH86EkHQpj8DRRQA9WBPA/SpKKKACiiigD/2Q==", - "width": 640, - "height": 771 - }, - "sizes": [ - { - "width": 266, - "height": 320, - "type": "m" - }, - { - "width": 640, - "height": 771, - "type": "x" - } - ] - } - }, - "date": 1574322910, - "senderUserId": 177121435, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "1859": { - "id": 1859, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "782981450117939469", - "emoji": "😬", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 22354, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574323051, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1860": { - "id": 1860, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "272479773299573703", - "emoji": "😆", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 26548, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574323086, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "1861": { - "id": 1861, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это серьёзно такая проблема, за которую банку нужно извиняться?😨" - } - }, - "date": 1574323797, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1862": { - "id": 1862, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "извинити, мы не призываем убивать евреев" - } - }, - "date": 1574323829, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1863": { - "id": 1863, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это же нормальная история, когда на капче что-то читается" - } - }, - "date": 1574323863, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1864": { - "id": 1864, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Мдааа" - } - }, - "date": 1574323906, - "senderUserId": 4274761, - "replyToMessageId": null - }, - "1865": { - "id": 1865, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "У нас такой прикол был, когда по случаю редизайна Ростелекома нагенерировали промокодов, а один был RTK.OLOPIDOR\nЖаль, что его вовремя заметили" - } - }, - "date": 1574323937, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1866": { - "id": 1866, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "олло" - } - }, - "date": 1574323959, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1867": { - "id": 1867, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А кто-нибудь из присутствующих делал такие скрипты? Реально их пропускают через регулярки, чтобы отсеять оскорбительные слова?🤔" - } - }, - "date": 1574324033, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1868": { - "id": 1868, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Сразу вспоминаю историю, как в эппл поступили жалобы, что их шаффл недостаточно рандомно перемешивает песни." - } - }, - "date": 1574324076, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1869": { - "id": 1869, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "911454474675945689", - "emoji": "😁", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 37612, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574324081, - "senderUserId": 860139781, - "replyToMessageId": 1865 - }, - "1870": { - "id": 1870, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я однажды в Я.Такси отправил какой-то смешной код, сгенерированный по правилам. Но доманаться до него могли только те, кто правда бы начал на компоненты раскладывать" - } - }, - "date": 1574324614, - "senderUserId": 2317363, - "replyToMessageId": 1858 - }, - "1871": { - "id": 1871, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "«Сбербанк» подтвердил, что отправлял клиенту пароль для кредита «плачь и убивай евреев» и пообещал пересмотреть процесс формирования кодов. Об этом изданию «Подъём» сообщили в пресс-службе банка. \n\n«Данный код представляет собой набор случайных символов. Мы используем сгенерированные коды в регулярных рассылках персональных предложений по потребительским кредитам для максимально быстрой консультации клиентов. В год мы формируем около 13 млрд паролей, механизм генерации такого большого количества уникальных сочетаний символов осуществляется системой автоматически и не предполагает участие сотрудника. Мы приносим свои извинения и в ближайшее время пересмотрим процесс формирования кода участника».\n\nРанее клиент «Сбербанка» Александр Шишов сообщил «Подъёму», что получил смс от банка с предложением по кредиту. В сообщении был указан код «CRYVKILLJEWS». Шишов подчеркнул, что с этого номера ранее получал и другие сообщения от банка, например, с кодом для онлайн-оплаты. \n\n@pdmnews", - "entities": [ - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 0, - "length": 140 - }, - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 147, - "length": 17 - }, - { - "className": "MessageEntityItalic", - "classType": "constructor", - "offset": 198, - "length": 507 - }, - { - "className": "MessageEntityTextUrl", - "classType": "constructor", - "offset": 746, - "length": 7, - "url": "https://pdmnews.ru/7143/" - }, - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 754, - "length": 9 - }, - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 979, - "length": 8 - } - ] - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDUlbYcjvTWkKkY2jIzzRcHauajmfCpg4JFADw7Nx8pqVSQMHHHpVIbsghjn/PvU8TloySeQD2oAnByaKbGd2DRQAy4G4YqOZCUXGcgDtU0qM3cU14nbHK8DFAFbJL9P0/+tU8UbKjZPUcU5Y2zkv8AlT1XAIyaAEhUqME5op6jmigD/9k=", - "width": 1013, - "height": 768 - }, - "sizes": [ - { - "width": 320, - "height": 243, - "type": "m" - }, - { - "width": 800, - "height": 607, - "type": "x" - }, - { - "width": 1013, - "height": 768, - "type": "y" - } - ] - } - }, - "date": 1574326534, - "senderUserId": 54158593, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "1872": { - "id": 1872, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Рандом не знает жалости" - } - }, - "date": 1574326894, - "senderUserId": 2676926, - "replyToMessageId": null - }, - "1873": { - "id": 1873, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Госдума запретила продажу смартфонов без российских приложений\n\nБудем надеяться, что это говно можно будет удалить после первой активации устройства" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC8Q2fvYH1/+ypdpJ5fb9WP/wAVWaxRi8TgnByDnpUU9kAAyli390/40kwsbHlkn/XD8z/jSqpQ5Eq498n+tc2cxEjawOMcip0HnryANowxpsEdEG4++tFZsSxeUmFbG0d6KAKzNiUE8gEj9astPlDH2xxn1qz9ngyfkPJ/vGneTDx8mcf7R/xqLMdzFcTtjKBvQ8EColkYKw47DFdCyROMMgPGOtRfY7R2y0Y9OGNWIpRyHyk57CitMWVuAAI+PqaKAF289qMUUUAL5ZoEZB6A0UUAS0UUUAf/2Q==", - "width": 769, - "height": 906 - }, - "sizes": [ - { - "width": 272, - "height": 320, - "type": "m" - }, - { - "width": 679, - "height": 800, - "type": "x" - }, - { - "width": 769, - "height": 906, - "type": "y" - } - ] - } - }, - "date": 1574335569, - "senderUserId": 54158593, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "1874": { - "id": 1874, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3664822579234095", - "emoji": "🤔", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 45470, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574335583, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1875": { - "id": 1875, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "366064958900804654", - "emoji": "🌈", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 7016, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574335618, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1876": { - "id": 1876, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "366064958900804629", - "emoji": "😎", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 13986, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574335621, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1877": { - "id": 1877, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ну все, айфоны, пока" - } - }, - "date": 1574336541, - "senderUserId": 2676926, - "replyToMessageId": null - }, - "1878": { - "id": 1878, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "пополнили список запрещенки вместе с телеграммом и пармезаном" - } - }, - "date": 1574336578, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1879": { - "id": 1879, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а как же наши дебилы в думе будут юзать свои айфончики? сами себе вставляют палки в колеса" - } - }, - "date": 1574336581, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1880": { - "id": 1880, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "так они только в россии запретили, сами могут и за бугром отовариваться:)" - } - }, - "date": 1574336634, - "senderUserId": 54158593, - "replyToMessageId": 1879 - }, - "1881": { - "id": 1881, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "разве уже приняли точно это? мне казалось, что еще нет. не думаю, что примут. но инициатива тупая в наивысшей степени." - } - }, - "date": 1574336644, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1882": { - "id": 1882, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "приняли уже ж" - } - }, - "date": 1574336668, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1883": { - "id": 1883, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ну чо, пиздос" - } - }, - "date": 1574336828, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1884": { - "id": 1884, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Госдума приняла закон об обязательной предустановке российских приложений на смартфоны, ноутбуки и телевизоры с функцией Smart TV.\n\nЗакон должен вступить в силу 1 июля 2020 года. Список устройств и обязательных приложений определит правительство: vc.ru/legal/93732", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 247, - "length": 17 - } - ] - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAXACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCi0OA205zUiKWeMAZJQjipobZ5MFvlX9auxxpEMIPx7miwylbW5DDLDc3Yc/maS1yjSxngqavqAgwoA71E0Q87zh1PDe9DQIpEbbx07OKKddgo8UnocGipA0etOITjaSfrRRWghDgDNZ9zf790UQ4PBY0UUgIDl02sTt9KKKKkZ//Z", - "width": 2000, - "height": 1125 - }, - "sizes": [ - { - "width": 320, - "height": 180, - "type": "m" - }, - { - "width": 800, - "height": 450, - "type": "x" - }, - { - "width": 1280, - "height": 720, - "type": "y" - }, - { - "width": 2000, - "height": 1125, - "type": "w" - } - ] - } - }, - "date": 1574336915, - "senderUserId": 53759108, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "1885": { - "id": 1885, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Яндекс видать не хило бабла занес им, Яндекс фоны то толком не продавались" - } - }, - "date": 1574336926, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "1886": { - "id": 1886, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "еще нет, с 1 июля" - } - }, - "date": 1574336934, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "1887": { - "id": 1887, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Еще успеем вальнуть отсюда 😂" - } - }, - "date": 1574336949, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "1888": { - "id": 1888, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "мдааааа" - } - }, - "date": 1574336957, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1889": { - "id": 1889, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ну у нас есть пол года что бы обновить все свои гаджеты и жиь спокойно 2-3 года)" - } - }, - "date": 1574336995, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "1890": { - "id": 1890, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "как будто горбушку отменили" - } - }, - "date": 1574337065, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1891": { - "id": 1891, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://meduza.io/feature/2019/11/21/v-moskve-otkryli-moskovskie-tsentralnye-diametry-s-nerabotayuschimi-validatorami-korotkimi-poezdami-i-medlennym-ekspressom-v-aeroport", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 170 - } - ] - } - }, - "date": 1574338235, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1892": { - "id": 1892, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну как всегда" - } - }, - "date": 1574338298, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1893": { - "id": 1893, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "интересные новости" - } - }, - "date": 1574338309, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1894": { - "id": 1894, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "никогда такого не было" - } - }, - "date": 1574338369, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1895": { - "id": 1895, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ну как всегда - интересные новости" - } - }, - "date": 1574338385, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1896": { - "id": 1896, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "вот к чему это относилось)" - } - }, - "date": 1574338401, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1897": { - "id": 1897, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "О том, что «Тройку» надо обновить, мэрия начала активно предупреждать всего за день до запуска — но валидаторы все равно не заработали." - } - }, - "date": 1574338524, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1898": { - "id": 1898, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "обидно, когда прод упал" - } - }, - "date": 1574338576, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1899": { - "id": 1899, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "интересно получается, аэроэкспресс теперь едет со скоростью собаки?" - } - }, - "date": 1574338922, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1900": { - "id": 1900, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "но по цене аэроэкспресса, ну" - } - }, - "date": 1574339171, - "senderUserId": 63238467, - "replyToMessageId": null - }, - "1901": { - "id": 1901, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ребят, все тут готовы стать иностранными агентами?" - } - }, - "date": 1574340631, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1902": { - "id": 1902, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "канешн" - } - }, - "date": 1574340681, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1903": { - "id": 1903, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "272479773299573635", - "emoji": "😏", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 49180, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574340693, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1904": { - "id": 1904, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Гайз, а вам обязательно постить новости из России?" - } - }, - "date": 1574341956, - "senderUserId": 2317363, - "replyToMessageId": 1884 - }, - "1905": { - "id": 1905, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "не я начал =_=" - } - }, - "date": 1574341984, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "1906": { - "id": 1906, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я вот тоже сейчас ленту полистала, и захотелось хороших новостей" - } - }, - "date": 1574341985, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1907": { - "id": 1907, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "может, где-то панда родила, я не знаю" - } - }, - "date": 1574341996, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1908": { - "id": 1908, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну мы тут живем как бы" - } - }, - "date": 1574342006, - "senderUserId": 860139781, - "replyToMessageId": 1904 - }, - "1909": { - "id": 1909, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "что такого?)" - } - }, - "date": 1574342009, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1910": { - "id": 1910, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Не в России, я вас уверяю =)" - } - }, - "date": 1574342010, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "1911": { - "id": 1911, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Да, это же Москоу офис" - } - }, - "date": 1574342021, - "senderUserId": 54158593, - "replyToMessageId": 1904 - }, - "1912": { - "id": 1912, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ты хотел сказать “я вас умоляю“?" - } - }, - "date": 1574342043, - "senderUserId": 332648262, - "replyToMessageId": 1910 - }, - "1913": { - "id": 1913, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Новости из России != хорошие новости?" - } - }, - "date": 1574342044, - "senderUserId": 54158593, - "replyToMessageId": 1906 - }, - "1914": { - "id": 1914, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDLVGdggq/Y7o7oxt3HB9arJhM7SatWrfOGY8DPJ+lK5VhZZ5Le+zuYrnOM8YrVEiyRhwcqRnNZWoKCiSDAxwc07TrrH7h2BB+7QSXX60UnbFFIoxV37cEH8qlTOQMEVcidGUHsD/dHSnkLz7dPkFJtD0InQtalVPJGetUQHByJV4/261RtY4BwMkY2CmGKIZyi8gYwg60KS7khFN5kYORnvg0UKqLnGB9EFFHMu4z/2Q==", - "width": 960, - "height": 729 - }, - "sizes": [ - { - "width": 320, - "height": 243, - "type": "m" - }, - { - "width": 800, - "height": 607, - "type": "x" - }, - { - "width": 960, - "height": 729, - "type": "y" - } - ] - } - }, - "date": 1574342057, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1915": { - "id": 1915, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "вооо, крутая новость" - } - }, - "date": 1574342081, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1916": { - "id": 1916, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вань, и ты уже не в России живёшь?" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAANACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDQid2Zw6FcHAOetS8/5aoLbcTKGbOHwKsYIOQf0oAQ4A4J/M0byO1KS3PP6UoJ9aAGliRRSs3y0UxH/9k=", - "width": 771, - "height": 255 - }, - "sizes": [ - { - "width": 320, - "height": 106, - "type": "m" - }, - { - "width": 771, - "height": 255, - "type": "x" - } - ] - } - }, - "date": 1574342117, - "senderUserId": 54158593, - "replyToMessageId": 1910 - }, - "1917": { - "id": 1917, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Москва - не Россия" - } - }, - "date": 1574342131, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "1918": { - "id": 1918, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Так тут все новости из Москвы" - } - }, - "date": 1574342147, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1919": { - "id": 1919, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Госдума же все законы принимает" - } - }, - "date": 1574342155, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1920": { - "id": 1920, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну и мцд" - } - }, - "date": 1574342171, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1921": { - "id": 1921, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я жила в России (Брянск) 26 лет) Я могу постить?" - } - }, - "date": 1574342174, - "senderUserId": 860139781, - "replyToMessageId": 1910 - }, - "1922": { - "id": 1922, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Москва не Россия - это да)" - } - }, - "date": 1574342192, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1923": { - "id": 1923, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я не тебе отвечал, а Лизе, которая писала про то что возможно Панда где-то родила :)" - } - }, - "date": 1574342221, - "senderUserId": 2317363, - "replyToMessageId": 1916 - }, - "1924": { - "id": 1924, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Окец" - } - }, - "date": 1574342231, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1925": { - "id": 1925, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDHII6girqlXj+WzQDPBLVppeQzsYJVUsD0IyDURW3jmzcHk8hR2FAFIxk8/ZY8ez0EbSV+xKd3TBJrYDWn2Uyqo8sd8VUtriJpHeH5MDkHpigDLezuI4jI8RVR1Joqze6gZozCudvcnvRQMgsdj3KpISM9GHUGtO8tVe6ViDtIx2rEVirAg4IrRjvpJU2EA8c570gCa7ETGGIDyV4Kn+L1qezij+eUKPLZcAZ/SqgSGMZON3vzipZHk8nYvyKf7vQ0wM5/vt9aKm8jdkYwfWikBFDGZZAoIHue1atnZwqoclmYjgjtRRTAb5AhABZSepY8VK5hKHEi89QXG00UUCKbDy5CAcr+dFFFIZ//2Q==", - "width": 600, - "height": 600 - }, - "sizes": [ - { - "width": 320, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 600, - "type": "x" - } - ] - } - }, - "date": 1574342248, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1926": { - "id": 1926, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ихиххии" - } - }, - "date": 1574342253, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1927": { - "id": 1927, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Чо хотите делайте, если вас это веселит. При чём тут чат таблицы вообще не понятно" - } - }, - "date": 1574342260, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "1928": { - "id": 1928, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "вас поняли" - } - }, - "date": 1574342280, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1929": { - "id": 1929, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "no more" - } - }, - "date": 1574342284, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1930": { - "id": 1930, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А это и не я писала, а Яна" - } - }, - "date": 1574342286, - "senderUserId": 54158593, - "replyToMessageId": 1923 - }, - "1931": { - "id": 1931, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "❤️" - } - }, - "date": 1574342308, - "senderUserId": 2317363, - "replyToMessageId": 1930 - }, - "1932": { - "id": 1932, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это не чат таблицы🌝" - } - }, - "date": 1574342313, - "senderUserId": 54158593, - "replyToMessageId": 1927 - }, - "1933": { - "id": 1933, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "272479773299573625", - "emoji": "🤷‍♀️", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 30082, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574342325, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "1934": { - "id": 1934, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 4, - "width": 640, - "height": 576, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAkACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCuYvNYKeCR+tJEGGUIwc457VFOxWRQD07ip7NpZZcNls9zU2OhztIWH/WuvY80jpIG2rvZT261ZEaI77xg7ecGmJN5YDclRxx60LcU7Si2jOmBEuCMECinzN507uvT8qKoxH3a8LJjr6U2K7liACOQB2qWOQOjI3U8CqskbRNhvzpI1qLW6LcM5ldgxyXBp8RBiZcZI6DOKr2aM1wmBxWhewiN/NVRsbrjsaTCDXwsrLOkURGzbuyCPQ0VDOQTuABHfiimmRKNnYiU1Zi/eIUbkGiikbLYWA+W3y1pxHcpDcgjpRRTMGZ7RIs7IBwKKKKk36H/2Q==", - "width": 320, - "height": 288 - } - }, - "document": { - "size": 377983, - "mimeType": "video/mp4", - "fileName": "IMG_6746.MP4" - } - }, - "date": 1574342326, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1935": { - "id": 1935, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "40599651539223277", - "emoji": "🐵", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 17342, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574342329, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1936": { - "id": 1936, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я вообще-то" - } - }, - "date": 1574342372, - "senderUserId": 177121435, - "replyToMessageId": 1930 - }, - "1937": { - "id": 1937, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я тоже Лиза" - } - }, - "date": 1574342374, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1938": { - "id": 1938, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ахахах" - } - }, - "date": 1574342379, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1939": { - "id": 1939, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 3, - "width": 320, - "height": 210, - "supportsStreaming": true, - "isRound": false - }, - "document": { - "size": 37141, - "mimeType": "video/mp4", - "fileName": "_eJwFwTkOwyAQAMC_0IflMJd_gKz06Sy.mp4" - } - }, - "date": 1574342379, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1940": { - "id": 1940, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "868996962018394128", - "emoji": "😬", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 25256, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574342388, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1941": { - "id": 1941, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я знаю" - } - }, - "date": 1574342395, - "senderUserId": 54158593, - "replyToMessageId": 1937 - }, - "1942": { - "id": 1942, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Но отвечал Ваня все-таки Яне" - } - }, - "date": 1574342406, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1943": { - "id": 1943, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "сложно" - } - }, - "date": 1574342410, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1944": { - "id": 1944, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1370278228815511561", - "emoji": "❤️", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 31426, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574342443, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1945": { - "id": 1945, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1370278228815511554", - "emoji": "😘", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 21174, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574342448, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1946": { - "id": 1946, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ребят, там небо красивое!" - } - }, - "date": 1574342534, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1947": { - "id": 1947, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ваня даже не выдержал новостей одного сегодняшнего дня ..." - } - }, - "date": 1574342537, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1948": { - "id": 1948, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "достаточно хорошая новость, по-моему" - } - }, - "date": 1574342542, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1949": { - "id": 1949, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "action": { - "text": "%user% was removed from the chat" - } - }, - "date": 1574342553, - "senderUserId": 204715787, - "replyToMessageId": null - }, - "1950": { - "id": 1950, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCMqUPIwauxfPGDURmicbSRjNPinhjTbvHWpUiuUk2UbKPtMP8AfX86PtEP99fzp84uQaUopxni/vr+dFPmFymYuwdefrUbSiO53LggYqMHfnPSmsMk0DNMm2mHJX+RqnOsCn907E/pUJPHHXFMycdaLCJTkDrRUYJooA//2Q==", - "width": 1104, - "height": 828 - }, - "sizes": [ - { - "width": 320, - "height": 240, - "type": "m" - }, - { - "width": 800, - "height": 600, - "type": "x" - }, - { - "width": 1104, - "height": 828, - "type": "y" - } - ] - } - }, - "date": 1574342562, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1951": { - "id": 1951, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Влад тоже не выдержал" - } - }, - "date": 1574342581, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1952": { - "id": 1952, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Не дождался заката" - } - }, - "date": 1574342590, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1953": { - "id": 1953, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "868996962018394187", - "emoji": "😜", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 20460, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574342614, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1954": { - "id": 1954, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Он дождался заката этого чата" - } - }, - "date": 1574342622, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1955": { - "id": 1955, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а мне нравится чат" - } - }, - "date": 1574342629, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1956": { - "id": 1956, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ушел в закат!" - } - }, - "date": 1574342630, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1957": { - "id": 1957, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "АХАХАХ" - } - }, - "date": 1574342631, - "senderUserId": 54158593, - "replyToMessageId": 1954 - }, - "1958": { - "id": 1958, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ахахах" - } - }, - "date": 1574342632, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1959": { - "id": 1959, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1685141920508018842", - "emoji": "😫", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 22082, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574342645, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1960": { - "id": 1960, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1370278228815511576", - "emoji": "❓", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 17708, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574342690, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1961": { - "id": 1961, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "топ чат" - } - }, - "date": 1574342706, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1962": { - "id": 1962, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1685141920508018879", - "emoji": "👺", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 18438, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574342709, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1963": { - "id": 1963, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCZLRHYKOAY1b9TUUUCbFZwxGfXjGant7lA0Zwf9SB+RoiINrGfr/M0AQXEa+WxUADIGB9aR4UIyADSzFChwfmDD+dSM8CHDNg/Q0rjsilAx/d/7hH60+3lkKhEGQuf50yJ3eO3CcEbuT35qIwkqzDkgn+dAEzpMozIeCw5qORzJIdjbgO5qEh8AEnGRwaGOcDnAoQE9qsmY8DIyRVyKImAtjA3HH50UVDZSILgcJ67qruoDYxg0UU0Jn//2Q==", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1574343894, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "1964": { - "id": 1964, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "@denbl", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 0, - "length": 6 - } - ] - } - }, - "date": 1574343896, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "1965": { - "id": 1965, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ни кого... переживаю" - } - }, - "date": 1574343906, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "1966": { - "id": 1966, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB8IzECak2VWN5sGBHge9SC4k2g+SSPao5maJIl20bKrtfbfvRkfWk+3jH3KOZ9h2RZKUVWN+P7tFO7JsijM+XyM1PDdskagjOO+aqldxzmlAwMUCTLUt2WBUAD681W3AA85NNK96aaEDY4GimqcUUxH//Z", - "width": 1280, - "height": 960 - }, - "sizes": [ - { - "width": 320, - "height": 240, - "type": "m" - }, - { - "width": 800, - "height": 600, - "type": "x" - }, - { - "width": 1280, - "height": 960, - "type": "y" - } - ] - } - }, - "date": 1574343946, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "1967": { - "id": 1967, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "красотааа" - } - }, - "date": 1574343958, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1968": { - "id": 1968, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://youtu.be/0tEv8OFHH8s", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 28 - } - ] - } - }, - "date": 1574422445, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1969": { - "id": 1969, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я что-то так орала, что не могу не поделиться" - } - }, - "date": 1574422460, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1970": { - "id": 1970, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "aw! saw british! Ни слова не понял сначала :)" - } - }, - "date": 1574423349, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "1971": { - "id": 1971, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "wot iz u" - } - }, - "date": 1574423391, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1972": { - "id": 1972, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "но с my mum don’t fall over я просто визжала" - } - }, - "date": 1574423410, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1973": { - "id": 1973, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Да, чувак классно отыгрывает. Я бы посмотрел полный стендап с ним :)" - } - }, - "date": 1574423635, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "1974": { - "id": 1974, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ребятки. Си ю сам дей. Всех чмаки. Вы крутые!!!! Спасибо за все" - } - }, - "date": 1574442324, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "1975": { - "id": 1975, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "document": { - "size": 9525248, - "mimeType": "audio/mpeg", - "fileName": "2517 - 03Комната (ЕЕВВ 2017).mp3" - } - }, - "date": 1574442452, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "1976": { - "id": 1976, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "@EVERYDAYHER0 планшет и стилус у тебя на столе ;) вспомни былое", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 0, - "length": 13 - } - ] - } - }, - "date": 1574442581, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "1977": { - "id": 1977, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Нашел" - } - }, - "date": 1574443571, - "senderUserId": 165916816, - "replyToMessageId": null - }, - "1978": { - "id": 1978, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "всем чудесных выходных!" - } - }, - "date": 1574455483, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1979": { - "id": 1979, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 2, - "width": 480, - "height": 360, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCFRxQ7bAPenKuMGllVWQjNMQgyUPyHPXimKVJxyPrUazuox1FSxKNuX5Lc0kMVlwKKVSCCvGR3opgJ1xQ5Cxsfao1OcU2duAPXmkBGvzMB61cC5Gcge1U9pRgc1Y8zCj5VOfUZoEOdTG/Uc+lFNd9xBwBx2FFMZ//Z", - "width": 320, - "height": 240 - } - }, - "document": { - "size": 91487, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1574455490, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1980": { - "id": 1980, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1360886329340072505", - "emoji": "👋", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 13178, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1574455758, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1981": { - "id": 1981, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1269403972611866824", - "emoji": "😉", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 13460, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1574461332, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "1982": { - "id": 1982, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ребят, там очень красивое небо" - } - }, - "date": 1574688308, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1983": { - "id": 1983, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 7, - "width": 464, - "height": 848, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBjy4U8kHPapo54wgBYZxWY0mT7U9XJGKFdFOzNRWDAnPeiqCzFBgZPuaKrmYuVFQ5Iz71JjYMls/SnypEhXGSA/PPUZpr4dsRjqeBUgAO45oqI9fSimIfI27rTM9DRRSGITk0UUUCP/9k=", - "width": 175, - "height": 320 - } - }, - "document": { - "size": 1132990, - "mimeType": "video/mp4", - "fileName": "IMG_6606.MP4" - } - }, - "date": 1574688398, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1984": { - "id": 1984, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCrRRSgE5x2qrhYCoIwRxVaW3K8pyPSrYpcVLZXKZlFXLmFAhfof50UCaaDeg/iFKJkzjdVXdk9BQR3oC5fDJ/fH50ryIiEhgT6ZqipG3kUhPNTYrnJpbguhTaAD3oqGinYlts//9k=", - "width": 1276, - "height": 956 - }, - "sizes": [ - { - "width": 320, - "height": 240, - "type": "m" - }, - { - "width": 800, - "height": 599, - "type": "x" - }, - { - "width": 1276, - "height": 956, - "type": "y" - } - ] - } - }, - "date": 1574688412, - "senderUserId": 177121435, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": 177121435, - "origin": { - "senderUserId": 177121435 - } - } - }, - "1985": { - "id": 1985, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBRS1GsiscAgml3qDgsB9TT5h8pIKeBUYdOzL+dSrz/ABA/jUuRaiKMCinqvvRUcxVjHCKe/P1oaIYJBqNQMA96Ypyy5qzIeVI/umkAJOCMCns4XjmozIT7UwHl3CY3tj0zRURJPfiigR//2Q==", - "width": 1280, - "height": 960 - }, - "sizes": [ - { - "width": 320, - "height": 240, - "type": "m" - }, - { - "width": 800, - "height": 600, - "type": "x" - }, - { - "width": 1280, - "height": 960, - "type": "y" - } - ] - } - }, - "date": 1574688426, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1986": { - "id": 1986, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "произошёл лимонный тарт" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDXV1b7rA/SlzWaHOMYxSlpcYVsUAaWarXb4KD61S82YZGWqC4mfjlvxoAcZOgV+vr2oeRlGFcmpIraNjnHA6571Y2RqOFFRKaTKUSpG42Dcear3Lb34PArSKRt1UVXnt0bBFJTT0BxIY7wLznHqDU4vIj1yKKKcoq4k2KbuEdDn8KqTXu84XgD0oopRirjcmf/2Q==", - "width": 956, - "height": 1276 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 599, - "height": 800, - "type": "x" - }, - { - "width": 956, - "height": 1276, - "type": "y" - } - ] - } - }, - "date": 1574754511, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1987": { - "id": 1987, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "311503369409659028", - "emoji": "❤️", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 27436, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574754702, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1988": { - "id": 1988, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1269403972611866823", - "emoji": "😘", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 10364, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1574754715, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1989": { - "id": 1989, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Тарт огонь 🔥" - } - }, - "date": 1574757510, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "1990": { - "id": 1990, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 7, - "width": 640, - "height": 480, - "supportsStreaming": true, - "isRound": false - }, - "document": { - "size": 1915973, - "mimeType": "video/mp4", - "fileName": "DASH_2_4_M.mp4" - } - }, - "date": 1574757518, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1991": { - "id": 1991, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "399338500039639313", - "emoji": "👍", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 7084, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574757526, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "1992": { - "id": 1992, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "399338500039639317", - "emoji": "💁", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 10676, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574758487, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1993": { - "id": 1993, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "@lizazhdan", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 0, - "length": 10 - } - ] - } - }, - "date": 1574758496, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "1994": { - "id": 1994, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 5, - "width": 640, - "height": 640, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCvlin+NCQPOQoQdcBh2pDC4UDdz3wK27SIQ26r3xk0ALchls5AnJCEVzi7FXJY7vQV0yyBjgZNY+qWuyYNFHw3oKAKG8sMHkUUiKS4XBBoouBeacYGDwOtWINRjCBGcr9azAMr71A1AHRwXEbZ8uQNU7Ksow4BrmrWbyZlbsDzXSRuHjVx0IzSegyrdQQwQs4HOOAe1FUdUufMk2L0HpRTAqIRkemKjkwTRRQIWBPMmROxNdHkRRccKB0ooqWNGDO6PdM54BPaiiiqEf/Z", - "width": 320, - "height": 320 - } - }, - "document": { - "size": 521525, - "mimeType": "video/mp4", - "fileName": "50842765_343692752901993_1160566442930294085_n.mp4" - } - }, - "date": 1574758554, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "1995": { - "id": 1995, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Нашёл тут более дешевый аналог Apple Watch, но непонятно насколько качество ок. Кто-нибудь что-то слышал про этот бренд?" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDVZ8SAZ4xnFZhv5pnbyWKcEgFR2/8ArVpsMyYyeR6VipE1pM3ntwqtjjrkYpiRqWFw1xb7nxuBwcUUmmxlLbLZy53YopDLDZzwSPwpQTwCCfemuMtnjOPSgFjwGH5UrhYkooopgIVyc5P50bR6n86KKAFooooA/9k=", - "width": 292, - "height": 545 - }, - "sizes": [ - { - "width": 171, - "height": 320, - "type": "m" - }, - { - "width": 292, - "height": 545, - "type": "x" - } - ] - } - }, - "date": 1574760409, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "1996": { - "id": 1996, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Отличный бренд! Полностью оправдывает своё название! Берите, не пожалеете!" - } - }, - "date": 1574760757, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "1997": { - "id": 1997, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Только свистни, он появится! @dzhariani", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 29, - "length": 10 - } - ] - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB4tkxygpRbqFzzn6moklmLlBJhgehUVIrzh8Oy49aLhYdGyLNtDsOO+ahvDh+GLduTmrMeCzEPvI4OO1ULpiZCe1ADIbhxcbyN2TyPWrkjGOyLyAeb0BrPiYxyZBYDuAakuJ3l2gZVfTNIYyG5lSXj5gTyCM5qSdvmHHr/ADqsqMr5yKklPI+gpiNL7PFnll/MUG1hx95f0/xoopAR/ZItpJYZ/wA+9UZSokYZ4ziiigZ//9k=", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1574765050, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "1998": { - "id": 1998, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "наверное я слоупок" - } - }, - "date": 1574765082, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "1999": { - "id": 1999, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://vc.ru/finance/94434-finteh-startap-osome-soosnovatelya-roketbanka-viktora-lysenko-privlek-3-mln", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 103 - } - ] - } - }, - "date": 1574765082, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2000": { - "id": 2000, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "911454474675945663", - "emoji": "🎉", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 22842, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1574765122, - "senderUserId": 327556368, - "replyToMessageId": 1998 - }, - "2001": { - "id": 2001, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вряд ли, новость только вышла сегодня" - } - }, - "date": 1574768588, - "senderUserId": 146686085, - "replyToMessageId": 1999 - }, - "2002": { - "id": 2002, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "там первый же коммент — ну такое..." - } - }, - "date": 1574768790, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2003": { - "id": 2003, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это же виси, там всегда в комментах можно даже панамку не протягивать, хуёв гарантированно напихают" - } - }, - "date": 1574768842, - "senderUserId": 146686085, - "replyToMessageId": 2002 - }, - "2004": { - "id": 2004, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "В целом, годный срач только увеличивает просмотры" - } - }, - "date": 1574768857, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2005": { - "id": 2005, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "он не первый раз реально пишет, мы ему правда не помогли? или просто по инерции написали \"ой, сорри, что не ответили\" в прошлый раз?" - } - }, - "date": 1574769147, - "senderUserId": 40907434, - "replyToMessageId": null - }, - "2006": { - "id": 2006, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "если человеку реально не помогли, было бы классно исправить это и подарить ему бесплатное обслуживание" - } - }, - "date": 1574769398, - "senderUserId": 143235707, - "replyToMessageId": null - }, - "2007": { - "id": 2007, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "@shmtvn говорит, что кидала его агентам в прошлый раз, надо бы посмотреть, что там случилось", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 0, - "length": 7 - } - ] - } - }, - "date": 1574769438, - "senderUserId": 146686085, - "replyToMessageId": 2005 - }, - "2008": { - "id": 2008, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "вот да, я поэтому и сказала, что такое себе" - } - }, - "date": 1574769494, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2009": { - "id": 2009, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "надо глянуть" - } - }, - "date": 1574769503, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2010": { - "id": 2010, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://mobile.twitter.com/SumLare/status/1196906838404599808?s=20", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 66 - } - ] - } - }, - "date": 1574774357, - "senderUserId": 3412850, - "replyToMessageId": 1999 - }, - "2011": { - "id": 2011, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "cc @AntonyHatchet ^", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 3, - "length": 14 - } - ] - } - }, - "date": 1574774371, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "2012": { - "id": 2012, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я приставала к агентам с этим чуваком, насколько я помню" - } - }, - "date": 1574775805, - "senderUserId": 141185012, - "replyToMessageId": 2005 - }, - "2013": { - "id": 2013, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Какой у него email?" - } - }, - "date": 1574780215, - "senderUserId": 40907434, - "replyToMessageId": null - }, - "2014": { - "id": 2014, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Осом с лета не видел такой тусни в 11 утра" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBeGdcetSsAFz0qvt2Sjc+D1zip5CqxMHXDYJHoaAI1KuMijbU9oii1yQMHk07yVcBkbAI/z1pWGZ8shViXGWxx7UsUzmLDnMfcU75JDtdtzn9abLtjQgJjgimIc8ioP3EjbX4IPUU97gGBEXIK9apxh2+4Mkc1NNL5uCUw3cjjNIZXkBFxsQcelXEBYfvevQH/ABoooEKGED4KY9aglcySFsdaKKBn/9k=", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575014157, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2015": { - "id": 2015, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Кальян что ли сейчас вынесут?" - } - }, - "date": 1575014436, - "senderUserId": 54158593, - "replyToMessageId": 2014 - }, - "2016": { - "id": 2016, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ребят, я знаю, немного странно, но у меня есть кусок теста для печенек, потому что уже некуда его девать. Если кому надо дома наделать печенюх, заберите" - } - }, - "date": 1575018965, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2017": { - "id": 2017, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "продано" - } - }, - "date": 1575019005, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2018": { - "id": 2018, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "потрачено" - } - }, - "date": 1575019114, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2019": { - "id": 2019, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Пропечено" - } - }, - "date": 1575019786, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2020": { - "id": 2020, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "не прожрато" - } - }, - "date": 1575019802, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2021": { - "id": 2021, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "476885410174206223", - "emoji": "🍷", - "isAnimated": false, - "width": 512, - "height": 384 - }, - "document": { - "size": 13868, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575019822, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2022": { - "id": 2022, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "476885410174206242", - "emoji": "😂", - "isAnimated": false, - "width": 128, - "height": 96, - "thumbnail": { - "width": 128, - "height": 96, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 23454, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575019830, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2023": { - "id": 2023, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я совершенно случайно оказался в магазине, надо кому что под/для глинтвейна?🤔" - } - }, - "date": 1575041397, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2024": { - "id": 2024, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Сыр камамбер можна пожалуйста" - } - }, - "date": 1575041429, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2025": { - "id": 2025, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "И помидорчики Черри" - } - }, - "date": 1575041436, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2026": { - "id": 2026, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Спасибо не случайно" - } - }, - "date": 1575041447, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2027": { - "id": 2027, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "368147511233217103", - "emoji": "🎁", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 26090, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575041449, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2028": { - "id": 2028, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Принято" - } - }, - "date": 1575041491, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2029": { - "id": 2029, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ожидайте" - } - }, - "date": 1575041501, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2030": { - "id": 2030, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "@MayneX а ты где? Вы случайно телефон не потеряли?)", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 0, - "length": 7 - } - ] - } - }, - "date": 1575053322, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2031": { - "id": 2031, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну Таня точно потеряла" - } - }, - "date": 1575053537, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2032": { - "id": 2032, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "@kiririn проверьте пож че там делает посудомойка на кофейной кухне \nИ не расплавила ли она то что я туда засунула", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 0, - "length": 8 - } - ] - } - }, - "date": 1575053591, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2033": { - "id": 2033, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1192705477432049733", - "emoji": "🙏", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 4687, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1575053607, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2034": { - "id": 2034, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А что/кого ты туда засунула?" - } - }, - "date": 1575053756, - "senderUserId": 53759108, - "replyToMessageId": 2032 - }, - "2035": { - "id": 2035, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "😱😱😱" - } - }, - "date": 1575053762, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2036": { - "id": 2036, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "186649756741665195", - "emoji": "🤡", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 7333, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1575053771, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2037": { - "id": 2037, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "476885410174206236", - "emoji": "😡", - "isAnimated": false, - "width": 512, - "height": 397 - }, - "document": { - "size": 30600, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575053797, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2039": { - "id": 2039, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я ЗАБЫЛА ВИНО" - } - }, - "date": 1575054572, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2040": { - "id": 2040, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "в пакете инвизибл два красных\nпоставьте там у меня где-то" - } - }, - "date": 1575054598, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2041": { - "id": 2041, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я заеду заберу потом" - } - }, - "date": 1575054608, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2042": { - "id": 2042, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "дайте знать, что все ок...." - } - }, - "date": 1575054688, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2043": { - "id": 2043, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 16, - "width": 480, - "height": 480, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCO6u5o7gjbgY6GpomLxr6YpUXzUAkQEdiajNzHbHygM470FEySeUrBhgY61XW5gIWMOcA8nGM1K4F2ox9zPzYqEWsUcu7O9R2NMDSCAqCv50VReZkkBjf5T1XOcUUAOM6I/lkgehqrcozSZKZ9/WptQjy4kVeo5xVdLt4xt4I96TKLluytGFUY9RTpYEIzjn61TN4/O3A+gpnnyN1Y5oEOfKnB5xRQoz8xDYP5UUAaKvTJLeCX7yDPqOKKKYyB9OHHlvx6NTBZyg8gEexoooEWU3gBCm0epFFFFAH/2Q==", - "width": 320, - "height": 320 - } - }, - "document": { - "size": 1502333, - "mimeType": "video/mp4", - "fileName": "File" - } - }, - "date": 1575054760, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2044": { - "id": 2044, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://music.apple.com/ru/album/glaubeliebetod/268837275", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 57 - } - ] - } - }, - "date": 1575054857, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2045": { - "id": 2045, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "буду думать, что это ок" - } - }, - "date": 1575054936, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2046": { - "id": 2046, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "640414812500656491", - "emoji": "🎄", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,UklGRjoSAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSCQAAAABH0CQbbPt/r5HiYj4HNS0bcCQbPkjGXcQNKL/EyDTGf3PdTRWUDgg8BEAAJBJAJ0BKoAAgAA+USCMRCOiIRdLDgw4BQSzAGSD9slGS9a/8r/Xv1fymZie3zO1/t/Wbt0vMf+3XrCejj+/eoB/Y+p09CXy7P28+Ff+/ec3gT/ArFH0H/Lfcr9zvgh/vvA5Ep7v/3XGHtpcH2zN56f9h+V3okbBWCr+sf7T8u/W48tD0L2BP6H/aP9h+Yf9w+Wb/g+3L3T/V3/Y+1n7CP5Z/SP87/Z/3o/x///+tD2R/uP7IP7BtWgOKyHZcfzNAJOpf6RkI7eyvry62pJV/YVAk9mdNhJ6CeHP65zSScwCoMAMj9Wea24/UQoC/dmslZirkhEKkutVQX+3OIv2ARSGyRleza+xeG2Z1c6MaZ2EDj5I5puuiA6KchdfruKFoJrVARpstUHQ7EsXsXP+Sw5+nzBpT6yf3NjMNKYWei/R6rYcVDisLjqL+FoyvUU1uJUBtFfYqTLhktKKqu3XGC31MfH4U1+nVRfsLYOYn0B7+WpjhH5KZeJhsiqpFAsrTF0Y1pS82SGg67ZGG9OBf7S+g0DdN10b+2LxkCxYbExqIccH8/T+hIvODyrNTYm734ihoDjT/9wyQUywRWwLv/euWWhc907riWSaBuaqXFCZnlreFOxiX03X9CbIzm1DaMwOu9h6QLy3K5ewJ1zQ7aWLk5+7Pk6ooCb0KS6VOPweEvlquguycFAuRc9l7xfq0CKMYFPjw0LVFIYV/riU8XK6Z7QTWb8d9crtP1gM88hVcTJdEugRcZl3+s1B2W16dPDS6/Szw6TcyTcuOgGB8vTRFKSQAAD+/8gBWkGV+d4wy5FbsXCyEmsLHWp68xt3kknSmt8KERhmOweXfoO6LY3Sm1bT0KeN+Az83vtQU580La4neXQ16gkwu1iahThO+gblJQJsf5eeIjowpaHGewDcm3XH9ishzI/i6K24+l2uUG6Cr0iMUmCUYomN1WBvbMG7K2g+nif2foWUonLbDtNarQ2ihasVSxORL4kDu4IT8UOiezCJCmMRWP3SG43aoIOedxUOVRahRz+FkPmxJ2DsHnZFn1d2CxQ47YV5HF5ep9pf7xrpD4K8vWb4bsabhJNpAoh42lDEZAXDF5ZGhhGrVCcWW4bp9WnlEc/PN+fz7h0nNC4LlWZQmQXR4qdjsRZKkz3OAw9kLLsBizLA7ta5VApd3LpIdrdz2vKhpCcdFJtYu5/u+73u+ZlJMnCpIVCIoG8LbhAx3KdoDrO1lIWm9WbIO8YxE6E+yXSUmdzGY11ru/dEca0JHAY/5Ozngp1QN8pbjtOsAFJLAOC+kxcMPZT4/eto0VtNQ0vC2qz1Okm+zXUs3Qf3YcFeP6eYCE5/t6bZOsum38XcvKnoIN65BRXtR+cRMvivOHiQObbGGff8YNun6BBJA8EHWTbAmsdNtemmuXNqjlQWGYF3mpAbwzHjL+7TGA20+6v7qtUT+El33T6tqOdpOdKuAAdwkNCDkB9XEUIwrAwDjYF9/tCs24V0QGL+psfvYZ0wdsv7V+EbxNPqx7JfuIOCLs3mod0q8Ij5aWYv0V0BOrsdpZh8LNBPzZCYuG8g5DYyMp8bEA0T13nq0ez1iv3QNh+b74qWac96wAFLBcIFoRHOMB5s+Ypkew/qZL/rWDZZL6YWIqPTr3qocSl/DjhVctGfteGWE+Ktoxv1N9PVZKluwiu+likdonA9IXBt+Wf/BgoHk46bGBaLTql8azsz4twrVjom8jgaM/UEZsGkeaycN8qTnhvsV/TWrqStMmTPYmip/ae0b8zz9TdXlPHn6KlWc19ykDbnpiivZPWFSe+iu2e1bEiu9iQMDb/GHsrB562s70/ubq0ql6us5FzAA/2QXuOCnzpOPyUKvrhyZ0ZB5pdMkvPOGbaTPsgIi8PmbCnsZLdbZJH1e5TpKclioby1zuxvBbxqhWjoAsJVQNjGNaPr30cpWg/kuPG9qtbjtmeTyrlgP9Iv/mH5PDcIW0lKwLRjyJ03DQEXSQxVNkXtYX0ea5CZkoOzxPH2Cb+EIuT3S0w+wTFhU9Ot7LgcAmUi1HgSoTCWTsgaIYqBdkFtH/zbXSMpvNC58AUuVtKLyATQz8BgE8uTyJP3WTOcc+8kZYnhtGv0SemLexwynNbt/fxPvilxULeJOGxaw6dnvGUZZco4ZLf5YftLr62DPWPsBLWtaXZyw+wu+njl5opm/f/E1Nxu7982F2riqn2gOsyn3cAM4wO8+DuDSHKx5lA5/sVg6d2QXiRo0few4O93TDQeMe3hO6ZCdWWiQuXboajQHOXwFQlDw99kqDvmdNQvI6rcv5rJg1pWbdTQkDWQBqzhVMilFn53ARcldgLHMwYhX1uEBj7t7CylAnde9rAB26yEjgEehkg1KM9Eo+vUrj0vqfLiuPuQ+DB67E/bn1CPrNfJ6oQ7ySKffCSMNdy7vgoGcWIwpOfkKljU7ba89mj2r/cs+TN7ilCSMqfIn+K4drYixR4y/tGO4kx4N/z3VNVVlmgXvYDRuvA2sQcy4IqafA1n0xx08g7Dye9UMm8hbABL5S4vtGEEBBYXX4WsYIgQQLhWkMXul+moxoqOy3TMyC+7+iZp9KH04vXxsc3SMUPw3QvenBA0kN8wzM1a2mCNspbKORo8I0hg+gHJZJCt8Z9xZmLPnR4Q4JE5oK1Q827b3w+3Bh7nKXwTXC3ZjSQ4DyEDYT8HN6LrapQGJwMb1S2SNIq6v2N29dJ/7wb3/8Ad8icWmfoaRBKlbQrs/sjM1hUBQpjvAGxRoRSncd++CgDMpf3inQ1Oyoa67VCWSSke+hQ+VcYM7z3Csk3P2fUUJ1VAgSQBGXu63coOj06WGnUko5JdYJ+uzBysr4lsH5CY0cw9/qhrVsRbd0ovbb6o4xetYg75Z+VFU1MOltLyk61kr+W8329L5XEocx/29Rdmjmn6IiUEEfi361Inlc/7gmezT8JexpeXEucap4hEgi/zgYWXTN/TY/CMFjP8PoP60WCwzaeH8yyiyHnHWUOTyZ1CgInVIxwrabgW+ttqmKaDZfyv5pDVhsSr1zUyucpY67ScR3pWpt/OLglUvTA3OQJin1DglpRoxtJF61Yzssch7MYtcBKLPeJAL8v3x61lRX0Na0273z0sG7/w8/1BJoc1iawLbzevs3tsRpBE+4v6t/NtovzTTxfDMg66b4Gfy0pv6+g5ym61cGtjd/V9i3u88JqMIVvxuXJSYLhv0vvFEYOuh+udlQqVXxzCHma6btrLI2jXRMlPhb/D6y6hcfIY1HZa+DNQcagGBhuRVkkK3cuoYkW6xJma/zUDJCHOwAA8/01m89CLUl4z9n8gakbDbWqCOadCWk9YdMkKMDWxnjjuDFxP/Zg7e0M1bTRHRfw2YCqI5bPM9n7deAmhcRrTt5o5Dtek8v+iIBZXvDtUyI5FbloCCKjGHeO9wbkfRX5BVZop1E7MboYnuuiaU+EE2gu2iMRIt+5IBF9g6vX4rXBX/AvJ+rDrbrEseNwEoor+0k/Otauu+b1L90RHETQFtCXeeCY8x796ozWmDhCLQDYuJM9Rs3cHWLuIdDWmbglIPaEtvwE+2g9NpmMuOCUM+mlIQbdkVZntBYYFdtppBflpSHqynjlYeU9EUB6Ni+cEYNEZLyMMPL3ZKH94LnOpwT2MxN8p5i2If0H1JNSPOHclKPF75JKxHWIg3tu2v63Y667FU+TW864+7GX4w29lincUIVuvizVV1p+34sxTVaBub4ysE3yqAPu8wzBf+y/Ks5r+WkLYDlo7A8//1/l08Z98SgF+m1SqtM1JAKtdTifKZVyUpKOpmW5wwfXy9DSDi8WVDvIt95DDUBDW4W470GQVD21n3kIyG5XEGQNWlYOUp0e5K61Qz8pXjdEa59kxvMtpk8clmyAjWJZLgBoSmXb407OGO2FTNk+hHn2ngJW5ye1NhPMXttpPe7PhUWNFe6cem8J4/DSdGJU2t5E6qGij9wZlqL/czmFzWuMY8Qds7IAysPgdmlHgyC/wTAToieTN9UkVpqvLZVC3tfY/momrcu9KWtZuo8UusIkPMpALTdaB/3UH4w73UJdO6+CUdDpin0H9/WgogsWCChbPeAIs8fFiWG2jx8BJQ6+M15vEI38w88PzvU+o/3WyuOIQ3KN3UrZdyE2jIgYD7e6AHYggrQfKS5ljqFo1Tv+oJFS0frPwvg2xvzG+v7+R2MVRIl2h1JTyfOL3TixKub1IjVv85EuK6mfN/2nePw7b7YhRbRf73fHEd10NJ65jOGvdgVyW8MRpUFP7ZDEURtV6Fp1uBnVfvll2aUd/DwN/pEQE7uPBn/oZkqmGA8DkP9OqiF/Ybcx8qh65/bIP/2TJs8Hk4B4Nmv6ZV3pxf+ijzXHumqmBR2EyYzVGvmJmXka/giR8R7nzmC2SyjEb/+s6j7SEXMAcqvX7njM0AiLD49F0Pz/vLCOCwhpwNG7/g2Gm7ujgjkyAwswALQZBdwc53x8vx1Nm1Vd6oUj0iA6RgBLyLjrnHRc36lz/Wcnir8OO6kRtvHM8GDJXiGmyfNwYGAz8yujw7N96TvHqnjyBldndyAIP/dMeZ7G/subYOfqmDwpqJz9Wc6bgR1DFrWX/57dOnTaIdt4BjR46JOgIUaj8LE8LeqQtwYesdV9zkFcBxHjKz9yRFxOSDcHk0AxhWaWW4F851UFA07/KSRmg56EWOCmSfaissIwHWivslEDR8qOesvdPHwTPJm8C7rhXIVRHP0oSf+d626v/eqMIiKvjVgGAWTBOLK01QmJ509gFBuLO48NLo2awGyfM7B5RtO2ijTNZegr6kSSEUUPlEKZNYz15UTKtSErRzwGiwUZhr7yKFRd96kQnQT/0oUEw1GnisD14p/txYqPh6VUuOmf8FNeRfrAMYaO9Dh81kz2WeXNqG0vZ5Suz8beWsSQQTMwPxcMXz1Bc9CtIWsYlxa/lsvFp1P/TJV/8tR2sMk0e4Vg0T6JPJH8OlWSYR7XiMoCxnSClrcby+3Ge/9pUw/eKPNLBHW4etGyZwOhj861wF46EV6y02wz2LYKkN+iQZ/NoXE99/rZadFqT8/mLVIoq8WIVz46pe8FyXl3puQMedvrrZnC1ZPG/Ym98sywD2bh2hun9TldKz8fJkutlUFqGwzC3wx6rIiQcNeR3OeEpNofKlPhvK8+ssGtKrgzfpoYxpSOd4+6qzmRoOTgXv6oPsmXEdaF/Shc3+XIOeWLCVP/h1d7fqGGNszFP/4Xhv4dn8xRJd9dG2Pf6qk4lbW9cKc8c5Hz5S133yk6E0wDwDClFrcTTvAQxK4v/zIv2atBQtd/NWZWqlwHrHBhEJXYIYX6XmKP7awtnvKgOJnxygV3zrJSjyONdf7Pev/vDUpzNYWi1xluzlxLVl0Ndejn54HJra1GRN3BfeAnq8erT947HiR9OqLmJsUoMcg3jPt8Pwrpo6VEAefl1lgGWTSHXJZtD3j7aHMMqBs7ZSHW2bvIYp1UJ8hzAr1zpcuBg5RcNMxiCaGK42htvIMmoHs+wfrpZ4A1nhvdAgyKxWH+JRX7rZ59GDUda5c2hBCltbw0Z6qD32Jt1ZR0LWRoIJEy91WNEU5my36/cRmNNk3v9dKajJGq6xtVLsVbih2/1MoDnegqRcxlL+PpUEbE5V9li8reDkHiniggVgEl7XwAp4TLorl+Ln+aPrm36ek7ZuMweHzeCn/1hWTzAGqf0NvVBWfDTCwRJ9y+K3eE6qMC3DvwnWcby9Kg4OPD+cF4HBqGC9HSIpLHu4OyxpOoV47AqlWn9jF/8plUvNXhPU5ZAe3puIZUTsEcPIp6Ay5Xtz2Q75Vmu00tWWpJxAp3vSrrjEIpvxmgpkYKy0SFPYSDzgPcRvxMeCjpM3XE/Y7X29gzwd8EwFJFVjmVrYMwvkXfBfltgJapv+YMvSLM1Os6qA/Nw+PnG/vXhKL2IS+2mzqosi5CcJJcjfTptx68Yli1Vo+q/kOxDJlUJFqauWbev+FNNZebHAnnhXtP1i+brc+7EB0GdSOhbAmhxgZpWcPGXnIl4VhgwwIDbTNZJpAZV/NsIjOXuofSZnambX7AJfM1hBZRT/YKFO4Iv+RYXgJhX2jBj5KPdQAAA" - } - }, - "document": { - "size": 33164, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575054940, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2047": { - "id": 2047, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "спасибо, блин, большое" - } - }, - "date": 1575066161, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2048": { - "id": 2048, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "action": { - "text": "%user% was removed from the chat" - } - }, - "date": 1575066168, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2049": { - "id": 2049, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "action": { - "text": "%user% was removed from the chat" - } - }, - "date": 1575076431, - "senderUserId": 241647476, - "replyToMessageId": null - }, - "2050": { - "id": 2050, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "F" - } - }, - "date": 1575094747, - "senderUserId": 356765513, - "replyToMessageId": 2048 - }, - "2051": { - "id": 2051, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ребятки, а дайте кто-нибудь промокод в Invisible" - } - }, - "date": 1575094766, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2052": { - "id": 2052, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ща найду" - } - }, - "date": 1575096662, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2053": { - "id": 2053, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "NDZHA" - } - }, - "date": 1575096823, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2054": { - "id": 2054, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Спасибо!" - } - }, - "date": 1575098516, - "senderUserId": 356765513, - "replyToMessageId": 2053 - }, - "2055": { - "id": 2055, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Хэй! Есть извращенцы?)" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB4uEA2yNgH2phdU5LcHpUDR5UnjBPSniE7QpIIHTNTdFJNk25c85/ChZISOGOB1quS7TGPjbyP0pVh2g5wQeuKLoLMtCWJ04Jx0oqAYAJ+baO5xRTWonoIsU6xBWjBx3z70pWXgmPkH1pE1Eg4EXX/AGv/AK1NbVMN/qf/AB//AOtRZBdgIpxOZNmRknH4U8CbHEJ6561E2qFjnysf8C/+tQdV+QKYTx/tUWQXZJLHMyFVhCk96KQaqCuDEf8AvqiiyC7P/9k=", - "width": 1280, - "height": 960 - }, - "sizes": [ - { - "width": 320, - "height": 240, - "type": "m" - }, - { - "width": 800, - "height": 600, - "type": "x" - }, - { - "width": 1280, - "height": 960, - "type": "y" - } - ] - } - }, - "date": 1575104829, - "senderUserId": 4274761, - "replyToMessageId": null - }, - "2056": { - "id": 2056, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Или может кому ещё чего привезти? @AntonyHatchet что там за вафли?", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 34, - "length": 14 - } - ] - } - }, - "date": 1575104842, - "senderUserId": 4274761, - "replyToMessageId": null - }, - "2057": { - "id": 2057, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Кто-то сказал вафли? Какие вафли?" - } - }, - "date": 1575104953, - "senderUserId": 860139781, - "replyToMessageId": 2056 - }, - "2058": { - "id": 2058, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вот я не знаю. Но как минимум есть Manner. А Антон какие-то круглые хотел" - } - }, - "date": 1575105020, - "senderUserId": 4274761, - "replyToMessageId": 2057 - }, - "2059": { - "id": 2059, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну так и быть, привези пожалуйста вафли какие-нибудь😳" - } - }, - "date": 1575105088, - "senderUserId": 860139781, - "replyToMessageId": 2058 - }, - "2060": { - "id": 2060, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вафли? Не помню ничего про вафли )" - } - }, - "date": 1575105983, - "senderUserId": 105945096, - "replyToMessageId": 2056 - }, - "2061": { - "id": 2061, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ттцсс, ты что, вафли не хочешь? 😀" - } - }, - "date": 1575106014, - "senderUserId": 860139781, - "replyToMessageId": 2060 - }, - "2062": { - "id": 2062, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ты был пьян и громок) ну и ладно)" - } - }, - "date": 1575106053, - "senderUserId": 4274761, - "replyToMessageId": 2060 - }, - "2063": { - "id": 2063, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это могло быть, но про вафли не помню ))" - } - }, - "date": 1575106105, - "senderUserId": 105945096, - "replyToMessageId": 2062 - }, - "2064": { - "id": 2064, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ты в Чехии? Вафли мне!" - } - }, - "date": 1575106816, - "senderUserId": 3412850, - "replyToMessageId": 2056 - }, - "2065": { - "id": 2065, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Нугу захвати" - } - }, - "date": 1575108914, - "senderUserId": 194771934, - "replyToMessageId": 2056 - }, - "2066": { - "id": 2066, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А это не Лёша был?)))" - } - }, - "date": 1575109024, - "senderUserId": 141185012, - "replyToMessageId": 2062 - }, - "2067": { - "id": 2067, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "1. Ведутся переговоры по возвращению Лизы в чат 😱\n2. Я вчера уходила, там шапочка лежала и в ней ещё много было бумажек, многие не вытянули? 🤔" - } - }, - "date": 1575110322, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2068": { - "id": 2068, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "И немного футаджа ещё есть" - } - }, - "date": 1575110381, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2069": { - "id": 2069, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 3, - "width": 464, - "height": 848, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB8c0UhLLGAw5HOangjSQbiTuJ6ZrKhYrICp6AmpYpyGJJJA5IHc1Nir6FecK07np8xooeUPy0eG9QcZoqiRgZhkKOcVGGYHOamYcFlwSRgqaiEbMQuAKQyQFnGQM+tFSRqEG3rRQASo0cmyXr2f+99aABuwRgiiigBSOaKKKAP/9k=", - "width": 175, - "height": 320 - } - }, - "document": { - "size": 508326, - "mimeType": "video/mp4", - "fileName": "IMG_1968.MOV" - } - }, - "date": 1575110384, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2070": { - "id": 2070, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCDzk3feq417EbUIJPm9MGqiafcSDPlKoPqcUyS0eKRUcxqzdBupDJY5FLj5qt3lzH8gVxgDtWcIHx8oXj3qcQwMo895GIHAXAAoAtQXEYYrG/y54GazLu5M1yzcBc8cU6FH8xWkOO+SajuArSOy49sUAT2rq77TwGPX3q61kR0NZdujhsjg9jVxY7t/mVs/Ug/zpDKHmue+PpQCcUUUyRy5qRXdDlSQfrRRQM//9k=", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575110384, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2071": { - "id": 2071, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCFpk3feq6t7F9kK+Z83pg1SisJ5QGEShT0yetNlsnhKiRolJOPvGkMkWRS+d1XLm5QJGFcYx1rO+zMc4MeR7mplhh2ASs7kdg2AKAJ7e4hR9kb8YHX171T1C5MlyQMbRgdOaYiMZAX6Z7nOKLrY8uQc4FHUQ62lG8BsYOATWi1onGHH51jwxtvByB71bCTHkTHPThxx+dIopb36ZOKUFiKKKZI5c5pxyKKKBn/2Q==", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575110384, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2072": { - "id": 2072, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwAklkSchgGweuaYZiZdxCqM5welacbjGRVS6eGTzPkYyqMA1IynOcylsAA8jHSrkEi/ZMMwGG7n2qr9meeIEEAjjDGqrwSRkgg5BxwM0AzTM/l4XBJNRNPld2OT1OKAS2XC8r3PaomQyMGGOnNCY7DxOS6DtnHFM1IlXXBIzzS25gUb872B49KrXU5lk6Dj2piNeQKLYqo+tUY1y4ySaKKyuaDzZNtJiYA+9VHtJ4z80bc9xzRRTUmJxR//2Q==", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575110384, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2073": { - "id": 2073, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBZpkWY4dTz2OakmvIZLdV35cdsGs6WIxTeWdufxx+tTQ2bNMsbOqsy7hxkVIx0cyb+tX/tHmgNHGSMd6oy2sUcm0z5cdhHgVbhuPIjCAKccdKBmVNJJ56kscgCpLWZlug2c9uvaomKkkkZPrSDAOQ36UxFm4lP2gk4B44rR8q37hj9AayAvmTKeoJ5q69rJER5bEBhnBIyKRW5RKc8CjZ7UUUEgMqwxxV+VYA3zSMpoooYI//Z", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575110384, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2074": { - "id": 2074, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB0ziOY8gYPrT7m6heBB5gLdxWc8flyBGUbjwBn/CpY7N2mETMiORkA81Ix8Uqh+tXjP52GjRiMd+KoS2kcb7WnXf8A3QlW47jyIwoC8cZxRYdzOvJfMulfHQDjFIlw6zhg2NvAx6U1tjEnv2poAByGHFMRauJWNwztgEgcVfENvgbt2cdMGsnHmTKTyOKutbSQkFGOGGcHqKRW5SKc8Ck2e1FFBIZKnitCRYVwWlK8etFFDBH/2Q==", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575110384, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2075": { - "id": 2075, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBLOcKCAAx9KmImkGUTH61VRoo5/wBwJEdeu4g1M19OMgsRj2FSMY9tdN1B/QUi6e5+8QD+dOjuyZN0jHAFaG6gDGcbLx2JxyaYJ2UYPPOc1ZJtpH3sxBPamulmqsGDFhnHNA1oRSShtoQAcc1bt7zdhHHQdfWszG0D3qVD8vXFMRJbEK9NdxJNsIGM44FFFICV7YPQLcAd/wA6KKLjsf/Z", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575110384, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2076": { - "id": 2076, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 6, - "width": 464, - "height": 848, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBl3dRyylk3EfSo4bmNHBOeParkenwFTl5SR23D/CqDfZyzCOOUbT3Yc0hmp5cs5LglVPIGMUVV+1usa7HYD3NFLQeo43QMUjxkjrg1m52ndvB+lTudiKM9evvUCIGfDZxnqKYI0bdo3Qboiw7FRRVZLSZifLXkepANFIb3KoFPRyp49RRRTJLTMTOytJgYyDmiiikM/9k=", - "width": 175, - "height": 320 - } - }, - "document": { - "size": 948092, - "mimeType": "video/mp4", - "fileName": "IMG_1957.MOV" - } - }, - "date": 1575110384, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2077": { - "id": 2077, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я тоже скину футадж попозже" - } - }, - "date": 1575110395, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2078": { - "id": 2078, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Какие все сладкие" - } - }, - "date": 1575110817, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2079": { - "id": 2079, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3323402743993723", - "emoji": "❤️", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 31522, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1575110831, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2080": { - "id": 2080, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Германия) покажи, какие, а то я каких-то не тех взял, кажется" - } - }, - "date": 1575110853, - "senderUserId": 4274761, - "replyToMessageId": 2064 - }, - "2081": { - "id": 2081, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABMDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBxtcDLFQB70zykJwjKx9jmnHLbjMxZOflHsab5pSNFVNgbOCT3pK7G7Id9kY9qKkt5JHgVmDEnvRStILoum3jww2n5uuO9Ne1jKfc3t2zVRftLq48x1fPBPGOakX7YVXqeB3A7VWwtyzHEAg3KFPpnpRTYjceWPMX5ue4ooAz/ALfcdjz9B/hQb6fcN+duOg4zRRR0ETjUzgZiz+NFFFAz/9k=", - "width": 591, - "height": 1280 - }, - "sizes": [ - { - "width": 148, - "height": 320, - "type": "m" - }, - { - "width": 369, - "height": 800, - "type": "x" - }, - { - "width": 591, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575110933, - "senderUserId": 3412850, - "replyToMessageId": 2080 - }, - "2082": { - "id": 2082, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Если попадутся, бери пару пачек любых кроме тех что самые простые без начинок" - } - }, - "date": 1575110972, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "2083": { - "id": 2083, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Интересные! Вот две недели назад бы точно привёз" - } - }, - "date": 1575111019, - "senderUserId": 4274761, - "replyToMessageId": 2081 - }, - "2084": { - "id": 2084, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Такие?" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCYuinBYD2zUckkZQ4dfzqFGXzH3Y5pvkl3+RSazsXcjVvmOSMduadv96SSBk+8hFQyRshAIA+lOwiSQ7X44rSjxHEEHYc+5qlLEWfK4IAyeae1xGBnfyRV2uTclkYEGs+UhXOPwyavB43iJGCOlUZhmQ7R04pclgU7mvNArqxKgkCsqSc/c8pBj60UVKKJIYS0e49+lOEAFFFS2x2P/9k=", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575111778, - "senderUserId": 63238467, - "replyToMessageId": null - }, - "2085": { - "id": 2085, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А мне больше из Амстердама вафли нравятся, чем из Праги 😊" - } - }, - "date": 1575113983, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2086": { - "id": 2086, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Они" - } - }, - "date": 1575115088, - "senderUserId": 3412850, - "replyToMessageId": 2084 - }, - "2087": { - "id": 2087, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Нам всем интересны новости из Туркменистана" - } - }, - "date": 1575270393, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2088": { - "id": 2088, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Trent Reznor and Atticus Ross in the studio" - }, - "video": { - "duration": 75, - "width": 640, - "height": 352, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAWACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBkVwn3QcHPFT7qpwxxG4C7yf8Aa7VaVSzFVOcd6lDeo8PSCQMxGOlRtI6D5RnPXjOaIjnhjy3I4pk2JmII6Cio5FaP7wIopXCzIlkijkKCEbenWpIpPLmBAoopxGyzdARIzr35Yev/ANeoSimNXTIJIPX1ooqZboa2I7mU7FwSOTRRRVFLY//Z", - "width": 320, - "height": 176 - } - }, - "document": { - "size": 7096228, - "mimeType": "video/mp4", - "fileName": "File" - } - }, - "date": 1575270393, - "senderUserId": 2317363, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "2089": { - "id": 2089, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Джон Оливер делал про него очень смешной выпуск в этом сезоне" - } - }, - "date": 1575270793, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2090": { - "id": 2090, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это ещё круче отряда Путина" - } - }, - "date": 1575270795, - "senderUserId": 356765513, - "replyToMessageId": 2088 - }, - "2091": { - "id": 2091, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Он там покупает рекорды Гиннесса" - } - }, - "date": 1575270808, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2092": { - "id": 2092, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Чо вы прикопались к творческому человеку" - } - }, - "date": 1575270851, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2093": { - "id": 2093, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Какие-то кони, огромные торты, в общем, дичовая дичь" - } - }, - "date": 1575270851, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2094": { - "id": 2094, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "🙈" - } - }, - "date": 1575270860, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2095": { - "id": 2095, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://youtu.be/-9QYu8LtH2E", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 28 - } - ] - } - }, - "date": 1575270894, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2096": { - "id": 2096, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 40, - "width": 1280, - "height": 720, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAWACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCZX4pS1QrwxFPJMZBYYz03VMdgluIspZiMYAOM07dUKHJLEjJ6AVIFY9qdxWBmopsisnWii6CzEtpv3qgLz65qS6zLcRq5wOc4oopIuQ6Tam1EUBs49jVjYIUMjYZgOwwB9KKKaJZTe4G7zJE3Y5C0UUUMD//Z", - "width": 320, - "height": 180 - } - }, - "document": { - "size": 54879987, - "mimeType": "video/mp4", - "fileName": "Турк.mp4" - } - }, - "date": 1575272039, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2099": { - "id": 2099, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "227521399969809651", - "emoji": "🎃", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 14960, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575292890, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2101": { - "id": 2101, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "И кто-то ещё один не тянул \nКто же интересно" - } - }, - "date": 1575292939, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2102": { - "id": 2102, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Мы все видели Лёш" - } - }, - "date": 1575292958, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2103": { - "id": 2103, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "fuf" - } - }, - "date": 1575292965, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2104": { - "id": 2104, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ага" - } - }, - "date": 1575292966, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2105": { - "id": 2105, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC9aWqxZZhls1JdgfZ2NNlu44MBslj2FMnnWW1LJ0NIDJc/vSM456VetbSRgSdoH51TZE+ZyOav6bMDCVJzigZVuZFnfI42naD61FHOy5gcdTkGqzyMGVeBtp8LtNtQkfKc80ATzXGyExDGSck1XimKZwame1WR2xOu/wBMVUxtJGc00xNDnjcdVI+tLbnZL83Qg0UUgI8kNkE5pBRRTA//2Q==", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575293256, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2106": { - "id": 2106, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Эльфы Санты за работой" - } - }, - "date": 1575293604, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2107": { - "id": 2107, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "677815138606121559", - "emoji": "🤗", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 25598, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575293646, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2108": { - "id": 2108, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCwaTFOwaKQxAKeKBnnI4ooAsQAYJopkL4ooAr/ADk9Rt7CnDsPSmgkdKeMGgCGaciXYuM4yc0QTmTCvjJ6e9V2JkkJGBhj1HvinXBPkAjgqcikO2heU4NFVbW4M6btuDnFFMR//9k=", - "width": 1280, - "height": 961 - }, - "sizes": [ - { - "width": 320, - "height": 240, - "type": "m" - }, - { - "width": 800, - "height": 601, - "type": "x" - }, - { - "width": 1280, - "height": 961, - "type": "y" - } - ] - } - }, - "date": 1575294548, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2109": { - "id": 2109, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "368147511233217067", - "emoji": "🎅", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 29878, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575294788, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2110": { - "id": 2110, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я никому не давал свою зарядку для mi band 3? потерял (\nи наоборот — если у вас есть своя в офисе, можно на пару часов одолжить?" - } - }, - "date": 1575360885, - "senderUserId": 4274761, - "replyToMessageId": null - }, - "2111": { - "id": 2111, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А там какая-то нестандартная зарядка?🤔" - } - }, - "date": 1575361043, - "senderUserId": 54158593, - "replyToMessageId": 2110 - }, - "2112": { - "id": 2112, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А блин, там же капсула" - } - }, - "date": 1575361062, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2113": { - "id": 2113, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ну специальная) да" - } - }, - "date": 1575361066, - "senderUserId": 4274761, - "replyToMessageId": 2111 - }, - "2114": { - "id": 2114, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "обидно, что 2 и 3 версии различаются. для 2 нашел, для 3 нет" - } - }, - "date": 1575361084, - "senderUserId": 4274761, - "replyToMessageId": null - }, - "2115": { - "id": 2115, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Да, бесит" - } - }, - "date": 1575361093, - "senderUserId": 54158593, - "replyToMessageId": 2114 - }, - "2116": { - "id": 2116, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "может я слоупок, но все же вот https://invisible.coffee/offers/", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 31, - "length": 32 - } - ] - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAXACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCT+yYif9a/5Uv9jx/89X/KrxfnqKN59RQBUGlx4+//AOOimf2PH/z1f8qvbz6ijefagCj/AGPH/wA9X/KitANntn3FFACY5+6fzox/sn86KKAFC57EfjRtH+TRRQAoGKKKKAP/2Q==", - "width": 1214, - "height": 686 - }, - "sizes": [ - { - "width": 320, - "height": 181, - "type": "m" - }, - { - "width": 800, - "height": 452, - "type": "x" - }, - { - "width": 1214, - "height": 686, - "type": "y" - } - ] - } - }, - "date": 1575384558, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2117": { - "id": 2117, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вау!" - } - }, - "date": 1575384849, - "senderUserId": 356765513, - "replyToMessageId": 2116 - }, - "2118": { - "id": 2118, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Дайте промокод 😂" - } - }, - "date": 1575384914, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2119": { - "id": 2119, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://invisible.coffee/i/INU.GREY?from=page_account_invites-copy_link велкоме!", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 71 - } - ] - } - }, - "date": 1575385107, - "senderUserId": 53759108, - "replyToMessageId": 2118 - }, - "2120": { - "id": 2120, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Нннаклейки ннннада?" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCG2t47kSEgrgjhasLZRRYILgn3qcRxxqdoxznrQANpwue9TutCiruljG5rfCgE/fFTQIzTSkE4470txGXRiMZKYA96biVWfY+3nnijQQsZO1i7ZPHXtTwNyjjp0wTVNpjE7Z5yMkfyq8uDGmBjIB4oWwPcrXCHzATKyZ42jmoriSWOYquSAB+PFW7hvLQkAZz9ahuMecaTuNFAsTJknOTzmtGIzMgKFdo4FFFJuxVh5EjKd7Y9sA1AyHcS7ZNFFTdsLH//2Q==", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1575560078, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2121": { - "id": 2121, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "нада" - } - }, - "date": 1575560095, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2122": { - "id": 2122, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "забрали" - } - }, - "date": 1575560131, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2123": { - "id": 2123, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ной не ныл и мы не ноем😔" - } - }, - "date": 1575560169, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2124": { - "id": 2124, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "675168768736887041", - "emoji": "😭", - "isAnimated": false, - "width": 128, - "height": 104, - "thumbnail": { - "width": 128, - "height": 104, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 36402, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575560179, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2125": { - "id": 2125, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1078212296544616504", - "emoji": "😭", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,UklGRiwFAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSJUAAAABDzD/ERHCbWRbrfPlQ0qgFEqD0iiFEghlGK7Ms0iZkoj+T8D2p9sQFANZAWAnqgAuog4giq4AkmgAgAifO0FRVeIgaMRF0IkguBpFwSCSYLqBzFxxq1bgmltndmZX5qC6MMMsmE0muiUGZtmqfA9WqVz+Fc0uLReprrraBWqopqZAUwUXorl11dVtOARiLhQJLJQ+AABWUDggcAQAALAXAJ0BKoAAgAA+USaQRSOiIZQKhNQ4BQS0gBHmdAUdhH+A6Kr0X7DckR5b7WxOLXG6mwA+uOsbx2f7H2Uf579nfNf9OewJ+uHVG/cT2Hv2RK3KlFbHSquNdVsdKq4zEXaxcB/pbDykDXSZLp0Uoawv8T7xHCKX4N8hI28/DlLPub8xyZizn6yEfQHWfYYFK3hGLTQpq+6UcC6OiqxVJrazWbaXNN/96c8827irbhWyZSw+LCl7dtIHheUu2mScQtJ6PVAkAAD+/bToAAA2vo9sh4fge15EKXL1u/b5+dbvamOEUtTalpYZj35fgJgkIAx1RdbdFkzvEBQQR8ay4NxbJ4ytHiZbeDmuL7tE0wbaAEymC55RZeT5B6iz7nX7V4YTXQJvG6QkmN1gUs+F8VTOndu3kiheYtVixQqMvQdcE9Klj+Y204FWaVCsRRZFnu4/Vv5MR6DrzwfBZWw5Qe1ssQ00QwOMrJ7AMm3J5BopVrhaebKpNQ+iZIYNCsv1WiJee821/cj2OkcbpvhbcGyc9O2Vf6O/VgBCuE9BhHL2m12wnD8Z6oHzhqpL+DBve9QwWOoiQ6A+pAM7EUGTZT50JYXqcpfKonJuDdd4kuXTThmIUR7NDYpedabDqM49pE+BX1ywakHYRRbfZILuQRoSQ2L649L9U5zRC/pT18zEckTmliQShc+lx/qYRnnB0eaziUdanprueQOxAIzbBgxVxDrzbGpq0gVTKeLjrv/DTx0ejW0aJxjABdHt8fX3t6znCAeR912P/q9A2vbxu5f2O7Dj9JrKkosX94ysDyrrxIM4N+oHHi9C/4+DGPFMFDErbf5jOp8QqJlMDrklNioe6hHMKSk2Kj2wJRw39b2/fj8hKb+0o/bEGB8msnd/K1uLt3mCfOZ85DNTzhW9uNLjAZhtCIr+fVs5gyD97479NlvMS/EFg1f2iMhzlyhyT+k0/BLqTK+v9wnsf8TGHX9YH/xHta/N4cgZMfjM94gntsHVoxmsGp982uT5SsuMefb5122pV7xz2+rAXZ6D0JL4aQ2dW/zC3IrCwT7vbR+R/+LKr+a94q4OpqByzoTXPSKPoC7SAavVf6lGi6u25LUWB01FRji0TQLkkGMQnZkQUa58aCNWiDlw+yXM9U9vDHtT/1cEVfeXbxcTmlwiCWwB0keoW9+IkB2xrURfjBgUpams3jeIgNRYKmh50YqTi5TwPVoPGG3M0YqM7Ai3WQBtrocO1o4OWcWwRaUgeiHFUQwyIBIYgqAMYQeiVgvDzqO5/XphtCukT/0e5gLtyNCL1cC72cDCrfGDUh/V49/VtOYL4ucA8Zeib7YqMpnreHCHJkvvMrzz7taA8fEvKqfbUJt6Ge5420D76Wf//5Ns1q6lkfb45oSDKD+bFGf1liu9oPHHyDAxsklZgP3kYIrPqxZnzerqyrgEe1a1+TFiPkrR6PFUpHExOx/dDR+22EFLvIptMfchyej+tLRYPnfHdLxiDSNJrlazbed/UgAA" - } - }, - "document": { - "size": 29081, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1575560182, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2126": { - "id": 2126, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1078212296544616502", - "emoji": "🦜", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 64821, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1575560266, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2127": { - "id": 2127, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вколоть путешествия внутривенно 🤔" - } - }, - "date": 1575560991, - "senderUserId": 54158593, - "replyToMessageId": 2120 - }, - "2128": { - "id": 2128, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "так сингапурщики" - } - }, - "date": 1575643086, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2129": { - "id": 2129, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "реквестуем ящик" - } - }, - "date": 1575643089, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2130": { - "id": 2130, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://vc.ru/marketing/96156-coca-cola-v-singapure-vypustila-ogranichennuyu-seriyu-butylok-po-zvezdnym-voynam-s-oled-panelyu-v-vide-svetovogo-mecha", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 148 - } - ] - } - }, - "date": 1575643090, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2131": { - "id": 2131, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Уже уже" - } - }, - "date": 1575643153, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2132": { - "id": 2132, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1078212296544616502", - "emoji": "🦜", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 64821, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1575643156, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2133": { - "id": 2133, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 1, - "width": 480, - "height": 480, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCoFp68HGaVRSXCZUHPSoNnoSqw6Z5qaJBIxUnHHWqcA2uVz2qzFwX/ANw0wvoSNatuwDn3wcUVGbdgikTKuRnBOKKBXZXQ06Y5iz6GmbWU4Iwfc1KI3KH5eCKBvYrE4XIPNXrRC9v87H5j261nqrSMFUZJq8HeNRGgHA5NUZEksYC5kPCjC+9FVppi2FznHX60UhqwhXzWyTkgdzirSJmPDEHjGA1FFAMFjVBiMBc+9NkjPJJGfSiii4rFJutFFFA7H//Z", - "width": 320, - "height": 320 - } - }, - "document": { - "size": 106779, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1575643179, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2135": { - "id": 2135, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 5, - "width": 480, - "height": 660, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCkTgUB8dKfFH5k209BVspD90RdBnvU3sa2bZRMmeopQQRmnTRjsMCmRDg0boI3TsXIAFYt3qRpSd+3aO2DUOdvNP8ANAjIZTz6VBtJWImkzDt79DTFX5RxTXkHQCnrKhHXFN3sTFq+oxfvAtT2fc21jxjrRRVMyjIjcKxAUYA70BQKKKfQlu7uf//Z", - "width": 233, - "height": 320 - } - }, - "document": { - "size": 165744, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1575643743, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2136": { - "id": 2136, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "красиво глазками стреляешь" - } - }, - "date": 1575643768, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2137": { - "id": 2137, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Все как в жизни" - } - }, - "date": 1575643782, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2138": { - "id": 2138, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "499916253176007419", - "emoji": "😑", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 15016, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1575643838, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2139": { - "id": 2139, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBttBG5uJJS21fSrVvbxSAs0UqYPAc8mobQg2j84Lv+mBUsZmEahZMhQAeOv+RQOw2/iiit8ouGLYzms7DGr9yWNtCJCCx5JqvtB+6aBCxpJG4jI5B4xVrlWC9PbinqQuQOWJyaefLLhz1FSncbM+6ScSdyo+6Paowsw/gP5VpFt59hSfSpcrDSuG1FBAP/ANeo8HPPC+9FFSmW0WBGwjHpimYINFFDJR//2Q==", - "width": 956, - "height": 1276 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 599, - "height": 800, - "type": "x" - }, - { - "width": 956, - "height": 1276, - "type": "y" - } - ] - } - }, - "date": 1575643854, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2140": { - "id": 2140, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Он тоже умеет" - } - }, - "date": 1575643857, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2141": { - "id": 2141, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "186649756741665188", - "emoji": "😱", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,UklGRrQkAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSGcPAAABwED/v2m7tVaa1Ly2fe8za13btm0bdYOa79Y2XqO6jX2btEERn5w0N8bea87f77fnGHv+51xz7T5jjIigIEmS4LbpwxEnmEbk9C4O0heq//d7fOTXvz3ld5973b8V398f/9NTjvv64SMGirt8jDm+tEe7jPjC7ZcNwvfmK28ZbXA/ee4gcWOS42fPapE9fj15zlUD8H3uptkTUtzxfzkgXD5jfve0TA7/xNe+8+W3HWCz73v+cPoVV5zQ1jfyqJ+edslNv8vgTv2LTJ77xS9892sfeFE57oIzU8a3k7zrphsiY/ToT+zZz9tOPvu2qfOuP/mCM1r5/vI3p11//7xJp551Xoo7YU+b11883izzuK8/pxSnjQsvTRjPizvsi7fPPTdxjP7Fc6p3T1zZVU8K2vhQC98ZNy3ZqV5PIexYeltiOTbmmCvnZTbMhRMKcSGEndNs3lSN+sg982dfMyZznPD7oT7VYFv5LtvkGXFG5xaPNZgvVNXBN86fOymHQyEuMrCon7Fff9r7jxsz5vRLvj82kwdq9pK08d28rdcjTcyxOq7rL1501M/Hjhl35fdH53AqwwUB3U2PjDn1nceePPqiu+YunHzu2RedajMTopK08N3WibS+Tz2D81vWnjr6y2/47bhzx89cOPX80y4Zl8OxBAcoBO6a+IZjL3poo5cppl4+JWLHuz6DNij3XbxFRsZ+LM5j2VtePnbGcNfuMq2Zf26C6xXh+oRaIWw/bvEuu8S9uCwavnnMv2zr9bUmBMp9w73MSA5xc0phx9hZsY3MKm/Z2AaHLXYn+p49jDTS7l0QhxOTE1tLfUDyQ3QhbJKxeCU4pTiU4xQSaWPkdkaoOSltbuFDbWmUtsHiXAbXS3By7J9luEx52YAAUHcIe/bg1M4X66HUzeGykdG5bq8UZxG9bEDIdIVaPUl9LkJo6aPiU9phyEYpjl0U4iIKQZnQxyEdFYK873tAoo8t9THxgYKCCUO2HBc1khQCGnG5QLmmGDt2teXJuZ4oc93S57tKugnIliP5ELQjHaIuw5k6M6EkA03qAellGG19HkoJIROJClszOMEV4UJwyiwC2dMuhZCjQg4mrX2eCc5lIqnn1KCrS3Ah5KVxpJA94hVMv+19SQ1O2eceEEJDSnAB3tQpcyQfsYZLIJY3AJ/9QMeNZn+DLMG5ugAXnA9SUqWitHkgOfPwrX3OmXZMDK5XNkQBLnjExB4gIJTMI8UXB+EDZEAWR6kM123GCUrjpVBy+KjEYHyAPELPLg7AIp0KcGkk1UBRzOoJDT6W+gBHuzl78lRZCnBYZtJjn8GOihPQ4KtLfcJUmFCSQ1kKcLhMISRvDRZZEwouz/t8qQ8/lILiYT/lRSnAfVoK5varIEepIMGk/sxAfDiSClFnJqMKdFQzbvmJTHBR4RgarXJ2quUnDcKHzcdtT3GSUPCQL8BJtkMRZVbvZbYDbI1E8UwCGS0+KAQymYlowjGDS76upN894oyCyYepYaDumc8/ZOKGXYCfbnwWV+R7ZGgHhUfHTN4oBTHVNT1WDWdwMdZ397qbdwEIDFRiTSIJtxxdVdWRk2rcfvfQEzsEi2v0bT7/OVX1mtM3a9ZVw/dugaCcDkhw2696bQ43FBsJxjfpRdXZHswlwFSatOrX/etfVtXV8pO+6BemafZh84Mfrapvb9eCN+07BHkx1zZVgqveQpCB0Rf/Dbk+DgQxM5Bd10AKZGfNFw52l1ff0vkrElyTz0dcd8u43R6dfmD1gnXrA5R/8uZ/dXlcVd0afzD63tJXHKfYQ263RCrpFUBQ5LaXLZr+pm/pi3/n7X/I+gQ6+ohzn77p0e/0c92jJLPLE3GuCVdVezxOyPjW3fLX1be2bwWBhoAyu7Ym6R9+6WXD87e/4uhuF1A2itXUlCOJoWN/t2Lqlzf8/KAuiezqSMGzm8d9qKpe7ZKq/+KO9becsvxpQ/0kWDhHepCerMno3nZw9RcL/Y2X/mkbvBQyPtAhvm5wOKl62kXr3I8Ohcu1IzjQe/o8bmjKh1+0aXw3DhemzJ8ye+Omv1i6HRELux3MdgJhrFK981fnTFm9dXa9FbFANfjgCUF90WnjJs+f4x6rY18RJ0AWhybc9FmPz922x/j1ni75yp68S7E+Rlod60Ckm6YkbzZERDkwhG7qq330OUZcsLggQR0yOLNuYO08BaIBF3eiG7XhlbM3boMdiT4W413NANeNfe+kI4IkB0ulOWoFovYu+moAcLT3YYUkpP1aRO0hoevBBlzqG171huHvjbgtqZQkalCmSrJLijBjIKSB+WjSdSV1jc+DPgSKLrMZFXUSY3u7GN3e5XFZn9/6zlGzTEIQa9//CXmBDlSUgt6ZrjI4SPR1XB8KcCEQoPe5QqkgeJHOm3+3it0GXJPvz5s6poR+4m94mHcEneJ8XW++W7KBJOvzjogqv8uRUsjqApHiANZFuDiB8Xkff9euplkj1J1+uubDRgvNxtAS3y5PQumy5ANPWZ2rHelKcIGKvjrigszveZn7kshOHAjeN1ojjkTO50DWKPl7lSAofUvvSeeacYpLLSa44BHoHan0GwKka6zK4ryY8Xk500DTyWBusTAe00FNEo2n4hQdg0MABOfNnpIQB/O7miaKHgQ4EDlf7TumOCqDM8sCZXHdPk4RhyxOUC0hwcXFoycUYrxZAAdIVEKF5GuGOBRzPkAhKPEp6rwXA2tRMriQfgGIInI41URcXyVdAR7BduA7NTwI0ibl0CGeyvvi2lifxcQFgxCiBZLZwgkO/WRw8YlCgnMwKBPvxDpZImROelEwP/M+5Hzx4USpBj2Z4DzYTXAiUpxRO2SWLzbRCTH0Uqyg8YSo4MA60JX6TDdUkCd8HiemOORwpkUwxQXaPeYRoUGZnpLTSSF4H6Es9Ul2RcCahkZ5b3CJDlQWR8XfQ4oD6WvCyMwoSU9JEDWoQUgs8CWneTtPAF6+9lAIOZwacZKATgbn6X3y11xzxH4hexpiAOjpJRb4KIvzjH66+OyEHE6I3TTgJDn6HI7oCsx/I3rHkMbRLhIhuGYfElxNAYQFsgHHmk0480yfw3GXclBj9B7JZPQMngqgE+tmH2RCR4Ewv01HNOACG3FScHRZXC3fNI5qn0hqwlSNOJIv8ZnyHG03IZbq5QqGaMBJsZo8Lj9Ouj9pE0eV95T3ULHPlCL62Ktjw2lKJsEUR8rVELtqWJgmqIQAG9B5iPaTXu4j4bqpDo24EPuGxQGIrwANuGaoiAAGGyi5zbTzwUlwBkc14xggRAYCfPQ14hoNRil6I5XoZI5WPjBzP1BznxKD5A3EQfSNuBKouS0IDGLDIhb7PCWqLS4aZHyluIxBkIWalSRC01WJDyzVpaPCTmF9LXAZQubKi1CreZh5xZXqckMoIALVEhdpIizUQ75snAYfPAXnVaSDSJHKTEG0xVlASBug77qyK+R8DiSc9yjDKeLMFMF50tetcZCSVj1B1k61Cl9JfM50Aw+hGedo9ktSofF5tsTJg0H2FYKopfDni3zJFWQAHnEccxcOTaepxnaZ+uARiJY4At5WJNmrwF1PgkT+FIJ1EjK3YuNzRNOuDMq9IsDHATstcUk1sQrQfmMQZqVIZbCZdYk6L2V8aMTFMPUZjqPKcLFvBdFHknmd3tKoYJ1gGkqeTHRQ3icqjdk+yPhsNy6IzbgAAGYyWFwImQLt9mKwrCTO0woVl6bJB6aJJWR8yL1TCY4FOKYwW5eDURheUmXaU4MvgjJFOGR8TMTJ/sjh5ECkOCQ400BSqzV15nmSBszEaQghNPngLKvQR6+kkTxOIdNNBpf+Wu4ues9ayUIzFFNYk8+KS30CUlxJNUFZXL7MNNtPQDJNi1fTrVnga+4miI1XgVQBrulWv+TG/DQBVKmPSoYoe8/sE8xV83tml6H5Rv/gugZoCx+LBvLNujxOpBpxQNHXXAPUAgbjE8twKsG1Phqg5m6q9j6I7ecBXYIbWLauXrTeYRBQ7zuDwMF3EQZ7YPO5r6ye8Y2rp63yLdOZ+s4P/PHexzotl0YLf9QWJzUvEhTCsjFHj6wO+NgVMze38g1f+sH9qj2OOe++tbkdVrAvWuBc7v6YzbYnOolgy7WffFpVHb6kwdf8Wa/v+s7LquqF9ya9aqC48xcrttmEffKH1f4fu2576p5yzYoZpb7zzhlKDYsvW7T4nFkuwSH3WanvPbsBd+4sn8Wd+YE7tofEmGI3fruKx57vumh9Cn7ijHLfwacsSXEbr/z4eWsD0YDzVzXjPnHBuhwuhO3z1zoi5LD+wio9Rhx8UuaF7fPKfa/8weK0ZD9vZW2/yJMV0tSR7XCpsMsMwU8blUn1F3MXHfXtO11b377jV3/i41dvyUxRU5mLZS9pi0uEWzchFblLR+RylTYsXrBw1U62832vu2PpQwse35Li6uHMlxoWHtAWtwMGouAzC1Hfslsme35k7IXXT565dN3Odr4jTzrv6vHTHl69DZQiDkwfmveslrjXvfdHJ1405eFrb7krd3/z/UfjceBgfHu9/E3fPu6sOxffeuOERXX20Q6XA418xwK0eQze95p7t+cerXB5xqjTh5QMdGFzngrfF5daXHyTNrgmxusmJHf4jR9qzFPiO/CPa+wFzqkGeLxj6g5jXfqsfxO+V9y6wVxseE81yOOdE9YpBN3wb8T3uqseixfzq8EeL7t2SOHxvf+t+PYfu1Sh89ZqwMd7toShp/3b8T1redDnB5xDF2rLJf92fM++R+7BAweafc5cs/X+t//b8X1rsZv/o4Fejfje4g2Tj/6343vztK3TvzpioOcHlq244EX/dnx/8cCTNx020FdGfnPt418a9W/H9+Y/bTzpoIFe7X38pkVvykOe9ldHvO+oEU+Z7zPL131rt/wufc1h73zHvgW4XL7zxOJ/TrbUS951/BUTZywZ3ikMv9Jm4L6j5w59MX2vI3968e1TFq3dBm35RgEuk+O2rfrOh97//XOuHj992QYphOElt1538+gP/PN+JoP2vXVN54yPvu8r46647YFHhpxCWL988rU3nf/Zw5/TjMvkgpVeUvbfFbJHvcBk0L6vLNtViMPq5zTicox9D/vCCRfdMHnGI6s25cmdm8wfBu4b9Tcf+9X5146fsnD5Bp/F1StHNeLK7mevPPZLPx99waXX3Dz+wSc6mmbue0+db9SLDvn0D0869+KrbrzjniXbtPI51YCPPf/6sP3/DflGvPawF1T/3TgqAFZQOCAmFQAA8EgAnQEqgACAAD5NII1EIqIhGDpuMCgExKANROE1Y8Bjzj2J/JHlXuXKXspf8H1D/n30N/Td6QP3S9R3nkem3/aekP1Lu87+UNmjX9V+iv4hd8f3vw58X/p323/u/tfZI+qD/P9Fv5N97P3H9z/c31+7xfiZqBfkf8o/y3oafF9jFr3+Y9AL2n+m/8X84PQJ1IMgD9af+T7A/7vwG/RfYA/of99/7Xsyf1X/s/1v5k+1D6S/8f+h+AX+af1//lf432x/YF+4P/192j9gP/G3lccJnH+YEL7Hy07wmecooEM12DADfO0AHpojzoNAoX7LXrxGUr2Gpz0UIdEdJm5euR+Vaj4y2dYG4bbpINUfBYFk7ZuIbpKfkuzB8O7UmblMQpiQ1Q1DLhXez4jz2D4RdoE8YvVgQV9afsDQobgnh+4tBnBLsT8cqVQCAppiF7+rYqLbgETAk2ymz6EVwKK1fliCf7Vt58AZrdeFy1xWXe6DznuH6ynVqr43Z5hN68sTf7csUH4GFsPYEMb8JnfrQAjoA1ZbINhG9jNf8Ui+UZq/xqxIKR0jxrqZyhrrbt36VSu04uqt+xHVtsnC00fl3n+YMESEFS8K1cvOhRVd44LFiiqemFF3zUYe/34pWP+pEivRy0ang2JjaP92/6BCI1icyf6vr+0NA6YPh0J7019wyN2i/QNnt9uab8qQSRH/Z0wd6tvLgj+1SHyDrqW9witwbM5UvjbdK/vedR/n8+SCXfv67hjm99tsVgzqdqn/H79xod3QrP3Vbc48el/QwAD+/QbieB7zKS4YmHhABuyDJzIOpV/o3BZTKCDZzebpiXIJ6AXmD/SJXD+ChPXTQaiJeDuyjpgc6t6NwkoNn1EB039ONXszXxx/pQxiIlxDHoJtB4K/9kYYW+5PKPX/eHlWCzbg6b9sYjhrx/omrE4A7gf7c5tBPmxFiT0frtTdU4c7LMh3L0AUGTGu8hewxpguHGHG/esHzfMnHMhQD6ckxXsEjznePuZNFj1yNujjtn7xWyDCsw1PwjOjbDQcB718rKmK4tLJ9k385pd0+dvJc414miQ/+HyWSlT9dtXTF7kGwF5XTvMHReyqK7zZLQemJp68vt/cA2Drj3v84V7qEuh/8mAmcV9zT66EG7no2Pw/qJXmU09DV6FuVNJovkHuAP40hL2UIu0KAhw85jbexTj70KisJJM5D2Yj/6vZSe7Iz2//47AWostwMhh2PCUAuHmZbe4/oX+XV9GwxIfD7bkWWcx+gxo+ZFza7WJTRKdorAG94VCY2H4F/SOoTYO8W2umuQI53Tkm3kMkKtDdnqt0CK/f4hTmQn/Dogm38pNf3NsDjuHyPVTwRv4Lw4gTOOE+pkyJa5V8Zr2WcNODTH3a9YPG9Ho/dkws7Zh2dvxD4vA2n3DDiNRJO3zZzlkJ1AgsYJwQDu7Gkt1rpFG/tW/pGkIOTSnDKj1XzB+kAvYM9QlFj/kUaObEry0K3hBhv2eGhoDBSnt+dFH/SIxqer3LexWEkccd499VxnI3zhhkUyW+zPJ80s9EqjOyue94l/NP9kyn9a70IKDFaDnrCwqq0JO7QBuWqwVs3kj8+QJ8ASgZ1t/6u1HNU8ucq6Hob6kc2x0/zox01UJwtXOJ7/8zE2bfsTrfiObGmuFHWV8p1fnbTIOHPgJGn/RuJM0a9WvPVSqEZnCbRQv/lo36+D7zOR+SwnsNAI1mWC/jf0lRcTNcIkQu3P/f4WJ6vlINpFWgCZ1Bku+0XS+gl9RMfoCbJSoWq63LcooFpE3liV+VsUxqGQ2+C6KudE11a/96CDnveUJjS3P/dTwQzVOmnU2PtUUTemoEjEF88y9hCyBNSwiH6/d+GWRMWLk3nLX15F021A7L/bOEDzsZ4rbbm/zmON6rKMJzuWovusBQTCL+C0WZHFD9DNehdEW8dUQd5PHG8bnHLXThXE28ygHX8uc8uAK6iFRt9eJRWdOKe75KLKUShF4rNxDb6z9RUfczxIcAS5Xj31U6j8ligSgBMMCHzAtLN79KzQbYpXXbQlHpRaAXsD6wWcPYgC3VRVlTVVXb0MmKnkrhXmCIS+FL+8pQcTiFJaZxVKBhHJk7MHHvhcuRp8SV34/rg4DJbBF19BS2lUvIwKoJ9MNVWXht7qB98zVoHz/h3rLMJ6Dm+8njkk2GpT6scUXzot0v3jhwzdYYAITjZdOqW96+rWLGFYb64DvJ443mOS25geT3YUQl4YFc+mI+oAW4J15/QkPcR4/EhS7HIV1zgsggJQVhlU5UY7pI9xHk+yqlFLm94j0jLB1Mu8rN2eWVYpFiAmszsUrvM+fTjomhoAJD7Z7pNyqZfUxt4Iq0PrPD1b10Ly1b+ZOr6pk+863afj+WTkvh30BWEVxryrOluCyhVGaVpipzB9A0lxmKDXlLnlysbsb0AF7uY9C+cfTRD+qJmU3U6x050gIQiwNiDaqpsXED4Sva0v4MCtyuPIx9qCkrdpZ52rBA5VGp7Q8jbrPoOvSniNeoynROuIpNX+GdZKEnzu2smMnCmjehB3f1mJ7WR5+VQB/FOyZcXT7lX8quvwzrLw2ORFcEWWw/4oggCisbT4NY5cXQdOGrjVguqTNviKbvua3cYqc6/6SXd/FOoE3KbFOFfIPZebtq6M/7pADERZjZ2/3MVHsIP/l5h6jk1Kk6Y2lqPBRC5OrMf0lpfuezLDSwBC134ssy0FH/w/W+E2JmCakL80QAbYMIVEzvHSF2yZd+nImz8/ZumffODHhE+iEdlVkmpopBq0b/ieJLKLVfyJPkLKBiofJ+9LNyR/SWrsSLVhVRD/VdfPIUsFCJbejlhnyqo5274kL3/pblx0wRtx9MYM1HvXlH/xJinW+vyMoQQNHeWDKxX0ZGRMnXtrSm3/4FR9NaiUDfJNCavyXktKyeYXnbZzt0yuGbddggN87oQ59dK9qJHCRMmA1DFMaQlfuya+fWBqziee4SIy25PJn5t1zxKGIyqO4olNHWFSpe/epCFx7QDO+lJlWjTq8r5OizKCUOhgwZbEoBgBJp/0ueA0oTk4oAlD9EVZFAM0nBJDAVVyZPIHJQa1RQcOoHgHVkfcLEKJNBCZUWdjFyCJ4nOSOSgXa0r9bukHSolI/nYVZwZyEL3uE8bEYa2KhDbLgTTE9x3HNGasz5pnUFnfSnj/L+9O+/v/26NY00LAdGcBo2DF6MAOVDf/+3FE/N5FCmH/QT27Nt5N/WpoZJrQhZ0HVtsWi4nuGlszosExsJQqF3SAhuO8ztfCUoEdozZ9GVT8VclfDGNgP9hTZZokd558U1L8ZsPBoa+9JR6D1fDi0FRGfidPhnMcTL6FnJp+znYpbw+PgM0Zy9poR5FG1WA9ciYWxQ9+mTPhwqXLHti+aTsj8AVwZpXrO8rkjaEDmdVn8bJb2dxci/bt2TydNrLVOTKv3KptXru0Cv8vRJ/DO8g7bKnCYYstnIP/0fQfYUWqo4OtxXLbPQPdx/ZF5X4kCyww2qdyQgw7/qDLiKpr4ACNZcg7lTabOtyXqmd1//oaJvUw8sqzcfmA/RyBH2155GP2C4rsKgPKlid8kWr2baKdbV4WGlgyqy56L8pranByWUAjJQpQEuavEsolWIp6tDdGyL96+3CmnuGEb2zJwz8yQsA+vaA8opEcP7wieOk8hZJtyjwLqFGxW1Ik2ZpsfWxcq7/duacViBq50/k8EEaC5bOm7VNQziJ6TNxvOGvSNPHh6sA3sxVs8AWeJhmFsUR0aocDs7AsdyqYecZ7Unb9DM1Z8TncyJS+F35/1Z0m+6UIm0wEWwWiFplQptJa8qCemSTL+MH8dyWOKaa7EPxa4GbpkSGxNLOYrATntD3/7nHZKPiAI2N/DH57B/Svhs9MYvR9e4OBSKy30BOvJDQJXjaLtSyvJK6BO+dxuwd//AD+sKRsNHU2JWM/09MkPfwtAnVIKCrfiBtEB+31gHdqsE0MTu7bONWlsYVdB88Z4m7WeU/uFYS38invvHTqM74kJtOjubyS+r4/zgfT7J9HjX01/7xPXswGgzkrWtQt3IOgKH1JWc3IPtb0glOJzUuTud2thLGWHj1chzqzrtCC3KssjguG2O8wumigBm4eNZyJ7KognmU1RX5v4Y+4znjV367iUIlana/lIz/1PFl3jJWljB7bMhtLzBPDNMbob91PQnrX3oHftlipu+YcVLhEfExWbv0eQCLfWAnE2P7qD6RsS4zxv7wTlPgd8jXFgtx5X6FJ/NOej+D8NAG8czck2QV+TQO9o3IALT4KFozqJ8MepqBZmPv0rq7aD33wVXs3mRzHIPES/G0DUgyFW3/2vN2vbXEN8YvwkZ0yqWbnP4dYSZHa00uW6hB3bfiQz8d7qFLEpgjiSDmTrS5qjY7cOELvNPfcD9zkXJzumIka5PuRvsbKVOhxR1uumVXxnhcriHCHW0Q6Qw6/6R9x11B/HIzNcixoxrcEBkUEUPRNHHQsJbgiiW9L4G/qRC71IabiV1L59aE9XUCiyOZdXhFt0hw2m5uvdJ6Lbn3PM+R7T5LJSwSgBdBQn+HQH8+4LiYmqULiEP8XurzYocEN/jFaEjbN/TsCImVpT/doEztQCXZ8RF85ywCA7xGt8JR5KZw61gpKW3vsIsNR0sF1Yz9f9DxOwU774Dr8y7WBDZLnzN3B15f1sLS1FHXw+c2mLlVgtqP8zbxa3cewUUB/DkohhwoihkJjhX0MU743/bkU7c6sOQBwHkm+burEK5sUs+9ziPAsvTzhwJrU0PDjMBYaVr2mbRDK/06Ala6Ss2e3RZxlPXOyG2DWUZ0RNqO/Mdese5FnhNj9Fun9Nh6tO7GOc+wzI8akGIBBC4Tq1sdXFo/Sy4Kz/AVA32sSMgC6sgdsAzenmhHc08O6t8th8O3811OI7CTffhaSS8U5arwfgps5oH4rtgKPgnVU4xkdw9gEpxkK0ToKWVtiBkpW23QHQpXQck9qHApLUdXYlzXZSi6YnT6072pF2li/CGQCDG6457sPs1z+f2etoK4+2xOQYnk9kMbINEISE5uejqCUM+0DEahktFUM9xJuLh+E1ajDv5GiiiPX/gBve/fLtbQcDJdyREsQYGBqCfjIBh5ZcDc7m2Yic44Q64FSENiuql0mEsUx4XK5sjwd5tl5Gq9K5HXBuPSt8412y5x+dE4FC6+i70hzFnivBJV4XS/pBGmn24qt0F7iD/3yS+7SkpXZe0NjRCp9JIDOpVQsG7TOi/1zPylpaBwoHxjmExem+fTk8RZ4QGQ+Ivj4eG/Uy8V1GLfmBWhknL0NZYV9z9v2ow042ivRgeXAW0DXjpSCrGNYpbWh9+SBOoIwC8Qhp3je4JAp/FIvzoEyBYhdvZnBBRYwc7xRSYDKicJMEpeAIy9pXNIxa3I0VRM6at3zjYdzqEiTFn51JzqckS0c5ALxfwtPgawpZdGfpwvSuaCKNSOVmlj04MEwkiAIQSefZnHOCqclrFJTnt0ZavINyITE4SZPwADaIbH+Kbj1lgujy/l10ClQpm0lUA/cnNTe9EU24IiOnwW/X48WNYAkxmelxs9Eg44p1hUsUn+qDgOQFyZUkAH05DA4zcrkgska8lYfTQKW2rwcB1p29jbxdqU/9FINwULzHor1BPjIqVCJ9UyLSZnOCqloA/Dg/IffNhAJ8d8RUf+ha3B4vlRg14lPFSd3fFSfPoKa2FmTLXXP/UBYu5ouYjvOIr/UxKexe6da3INDdPo1ubJpAnlyezB1mbcKNDNwsLW5fdTbNybdcitkOfdC6wUm3TavTQ+1mi+2ox6Nz3jZt4bxvEKbWf0q83JF9GNWG+H/xS7JFNbWQ/7Er6lb8wbZoocAkOlCOUap660gyv8FVkOtJx4LSmEp3C6hfliVwAS7eEHJCz5wV9L/b3u+gTdop96lmtnshL5CpDKk1b15g5YnGFeco7FyPdKCOgCwOJGa4Uej4vtcDAInHuqqbXNQc+L5xzy7K4PQJoVg3DDgV+k3e2Bu/G/WUfXnoNbD9SUYHc2zOfnd6vpaFanZTAvRzO9CDpNgRn5xaFbiEJCVpf2PhuJKVIAyfTh8j2mElvqC8g2l+pq9YTt/hG3tZyfJwUiQhwAQ/F3EVccy5V3D5VJXbj7bND+zXhMCZYQ3OSHYmY+/dFwdWYdruglwDlu+/Xw0F1jgvyo7uvMth6WZUh/f4bX0cyrq0k2mT/LfnzL5McifZ9kzL/fEXnQt+W5ovKkxuSNCArUMP3YUMT++DKw4YbK+BN5v4nMXDufCiK11/l6qq3H87Zb2JE4BfpQ4HqOw3n9eswB11Q2zZZY862ieALRO1QCIZyZr3+lO2Wu/sE1U9sXEkCRKhBBtNmiZhQ2Sb3fYBzzT++0+Y4xdjKnppqBfSj4mUbwoM9uJnAwGon9dXmZAF3pscEvW3L095kxrsv9M6P5YH91TXvUdwjiX2WR2bjX+s66OI9FVy11BHj8gjG+6Brn7cjJKIG0983QydcQqQI++0YdHQr9+NLLES1J9Ze50CIHB1Mu5OJfQTOlNFqI65ScRIjGTqnmyHC5af6b/fFuibd85cp3mzsBWfC4iNp9ttO0CDqjWI2okB/yN4PLgwFoRNA0eDEiiog6Ih79EDYKGzYyLgYiwUS+ABpBpgxxWBq0rKVynTDWxgwMuzfufk9nCOhOHp+ZXHgHH/OXArzVsUzhxmvmdlYNKX3p5THANIenHwZTf/TukNrQpUJY+OvN1NzJzK7Pb59VuSMXxjodp03Y4CNLcrY2WLezHZCrnJiuPw3vb+NAXmrmYHbSP4i9tIdZWf5inCs5A2P7kMWKkhEL0/OnkSXqK0plk3GyD6lbU+ixjnIvTwXeXw4u72w9a5B7j513fWHsTw8bs/ucYCQHqRiBjoWsm1Sm4AQ7JIwzSD0f0vZMc42Vg0pYlt+5vra0IA7DHWqs7OXD86cD68vtbvFzgkrMewnXIQcUGpPzYoNPonFCjUlhr6khevQpOxteAsuYhzVSHbi6g+EfOzYJ4JKYARS0ZeQtyTHgTbPnwoci4IoGpD2yErQBBMsT5UxJ+8boLbGJel8ia2EfPf1ApohvTykEVkXJ3+6vIM9RsqVjIvQ7FC6uTA8ka3/MwuqH5U4jvuL1S9PQ3mJ6Dfldxw5eTg+ULHX7HkTwNK+uhbMgoOt6joBpWdWi4EcZcDC6RjBL0pAAAA=" - } - }, - "document": { - "size": 16133, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1575643897, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2142": { - "id": 2142, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "60854042997294705", - "emoji": "👁", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 46448, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575644438, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2143": { - "id": 2143, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "лол" - } - }, - "date": 1575644786, - "senderUserId": 141185012, - "replyToMessageId": 2139 - }, - "2144": { - "id": 2144, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Так как я в пятницу был охуеннейшим фотографом, держите дозу расфокуса и смазанности" - } - }, - "date": 1575800625, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2145": { - "id": 2145, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCyl9z/AKof99VILvzGePYQdpOQ2e1ZcUpKKSD8uS2PSgSeW5ZeQU9emaAHSSnnEkw/4FShl+zHzC7KSBz1qqPmfHPWp5gsce3II3DODnsaQCFIwyld3OcA0U5oyI4pc8Zxj05opoBz2jDkcDFR7NkYYc59eKuyffI9AKhnGHgA6en40h3KzYCK3c9qTAYMHbC9R9afMAYge+ajxkpn2piLnlM0BiUZ28q3v6Ciq73EsZARyBiipYz/2Q==", - "width": 1280, - "height": 853 - }, - "sizes": [ - { - "width": 320, - "height": 213, - "type": "m" - }, - { - "width": 800, - "height": 533, - "type": "x" - }, - { - "width": 1280, - "height": 853, - "type": "y" - } - ] - } - }, - "date": 1575800652, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2146": { - "id": 2146, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCqgRSHk5UHp68imzPE7gom0Bj3q5YtbSwKJAu8HAB60X2wXUeAORg8Vn7RXsOxQI4OOmePzpfmIGASBzVmBIZojGRhyTgj60ltEHlNvJuRs9RVXCxWdgVIFFOuIGgkZH6j9aKYiwIwlus4ZSY8ADGKgnneQo7Yzz0p9vyJUPK7CcUwKDJECOCTSaVxjrRX8yMhTgk81dQ/vfNdlXaOfXFTxgBV+tUbxiVUE8U7WYiC7uDMxPJHOCaKcCfsxHbBooA//9k=", - "width": 1280, - "height": 853 - }, - "sizes": [ - { - "width": 320, - "height": 213, - "type": "m" - }, - { - "width": 800, - "height": 533, - "type": "x" - }, - { - "width": 1280, - "height": 853, - "type": "y" - } - ] - } - }, - "date": 1575800653, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2147": { - "id": 2147, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCqYkEayYxk4602SPdIB7dqgzzWjAIiplkYcDGM0AQRbBKqnAwQSTU0aA4UP8mThvaoblAk5IGARxjpTrWWIgRSNhW/i9KTAWcQ+X8rktkfljmirN1ZwwwqVBJBAJJ60UlOLCxnGJEU53F/boKIxz8/3faonJMhOeaQM3qaoC3OjttZP9XgYGeB7UWtn9ogIGA5PBzVcyMbYjPBYf1qxYMVkXBx1pDJp7vzLXywpGwDk0VXl480Dp/9eipjFILn/9k=", - "width": 1280, - "height": 853 - }, - "sizes": [ - { - "width": 320, - "height": 213, - "type": "m" - }, - { - "width": 800, - "height": 533, - "type": "x" - }, - { - "width": 1280, - "height": 853, - "type": "y" - } - ] - } - }, - "date": 1575800654, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2148": { - "id": 2148, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCkgXAA+9mnAnkAcntUsbqohLLuAJ/rUzx+VcxzRgGNjkjpile4WIFJEYBGCOOauwHNlB9D/OqbvBLI8xA35xtP86nib/Roh6Z6H3pgTL3opEPWigDNiiklchOgz/WpdQDxxQq/BwcinWjEOearXzN5pUkkL0z2osBBn2q3avui2H+E1SqxaHlqANGJvvUVFGT81FNAf//Z", - "width": 1280, - "height": 853 - }, - "sizes": [ - { - "width": 320, - "height": 213, - "type": "m" - }, - { - "width": 800, - "height": 533, - "type": "x" - }, - { - "width": 1280, - "height": 853, - "type": "y" - } - ] - } - }, - "date": 1575800655, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2149": { - "id": 2149, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBR5RAO7bz0NOVwdOnA9R/MVU3F7oCVgFJ5xUwZcTog/d5GKLhYrgpvBcEgehxVmF0eGVGHBIJ9e1U3/dsBnJxT4XPly464H8xQApBZDgc0U+3uzGChjUj39aKNRqwklsY4y+f0poBBC7jzV2R2MUgJ/hqlkkRk9cUkDZYW3BXDc89elLIUSDycbh9arbm+9k5PcVKWLQAscnNAhk/+rjAIOBjpjFFMn/1dFUgP/9k=", - "width": 1280, - "height": 853 - }, - "sizes": [ - { - "width": 320, - "height": 213, - "type": "m" - }, - { - "width": 800, - "height": 533, - "type": "x" - }, - { - "width": 1280, - "height": 853, - "type": "y" - } - ] - } - }, - "date": 1575800656, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2150": { - "id": 2150, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCvAUjDkbW6dRkGrcd5IIWIWIAYGAtZ0fEeSRhh/WprRd77XICnknvRcLEs8zu+4+WrEDnoelVDIxDEnJA7nPep7iPMrBMheoqH7O3lM6kEHj9aAImOWGOn0xRSbSMknlcUUAJJMzE44FPR8EVEoBlAPTNWLtVjmIQYAFAD1UmMvn9aSOYRx4PzZPTHSlh5iNVWJzQBfF1C+AI2B7gAUVRDFWypwaKmw7n/2Q==", - "width": 1280, - "height": 853 - }, - "sizes": [ - { - "width": 320, - "height": 213, - "type": "m" - }, - { - "width": 800, - "height": 533, - "type": "x" - }, - { - "width": 1280, - "height": 853, - "type": "y" - } - ] - } - }, - "date": 1575800657, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2151": { - "id": 2151, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDM8tgecfmKkl3JIRjgUm/5uGbGfWnmRg7fMepxQAMxRsACnxAySAHODx1xTl2O4jwNzY+cngVNGg81kAJYfdxQwIrl1QCOMkgdTk/MaKJbeREBMeNx6k0UlYZAsatKqk4zTntzvOPmOe1RNxgjjBrS09i4+Y55oegJXKvlPHLvIOF4z+FFuzwz9QG7enNW7+RocCPCj6CmWyhrxSwySmTnnmle4WEursSRKCTuB54+tFVbziaQf7dFSoJBc//Z", - "width": 1280, - "height": 853 - }, - "sizes": [ - { - "width": 320, - "height": 213, - "type": "m" - }, - { - "width": 800, - "height": 533, - "type": "x" - }, - { - "width": 1280, - "height": 853, - "type": "y" - } - ] - } - }, - "date": 1575800658, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2152": { - "id": 2152, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDN354KqPwFDBSxPPFMCHcMU4hs4x1NAFmGxkuAWT8BTYkMR3kZxkEH1q3ZzlGVFzn+dStAhlm8zIRiMY9TUt2HYy5meRy7nJPNFWLuOJJyqDAwO9FCkrBYqbh15z2qV5VYYAwT1NV+1PTpVCJ7YkOJA3IPSrbEiDcScnvmqNr96r0v+oP1H86QzOdnLHcSTRWrFGhU5RT07e1FTcLH/9k=", - "width": 1280, - "height": 853 - }, - "sizes": [ - { - "width": 320, - "height": 213, - "type": "m" - }, - { - "width": 800, - "height": 533, - "type": "x" - }, - { - "width": 1280, - "height": 853, - "type": "y" - } - ] - } - }, - "date": 1575800659, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2153": { - "id": 2153, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCuHjMK465596WR1ZwSM8Ac/TH9Kh8kjB6DPerSoCQS+cDBouFioucsMdjSb+n4VcgRHmdCoAxwe9Ojs13B+Qvp60rhYoSgmYgZoq/9lKEnd1PHWijmHYW6ZWtyyfWo42UwpGo+bBJNS2wD24Dc8VVtyfN/A0kO2gHKzNuJyPQ4pVvZI+Iztj6YPNExJOaiQDzOnf8ApTsSWZrsbP3ZyR/HRVKbhiBRTSC5/9k=", - "width": 1280, - "height": 853 - }, - "sizes": [ - { - "width": 320, - "height": 213, - "type": "m" - }, - { - "width": 800, - "height": 533, - "type": "x" - }, - { - "width": 1280, - "height": 853, - "type": "y" - } - ] - } - }, - "date": 1575800660, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2154": { - "id": 2154, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDOhCl1zlfepUGwk5DH1FQqflwPTNSIf3ZoAufZZWIKIenXsarvE4kwUIP0rSiuj5ewLyqdc+1VZ8eXvyeeuKzjJvcdilIcYGOhopJDuOfeitBFh4zHIGXgY/KpIrXeDhdwJzVVZHZgCxIreiAWMADAArOUmh2KyQ+U+wtnI/L/ADilaFGhlQYAI49qiVmLyEnJouWK2rkHHFVFaAzJJw5A6ZoqxIihIyAOWFFO4j//2Q==", - "width": 1280, - "height": 853 - }, - "sizes": [ - { - "width": 320, - "height": 213, - "type": "m" - }, - { - "width": 800, - "height": 533, - "type": "x" - }, - { - "width": 1280, - "height": 853, - "type": "y" - } - ] - } - }, - "date": 1575800661, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2155": { - "id": 2155, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1078212296544616502", - "emoji": "🦜", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 64821, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1575800701, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2156": { - "id": 2156, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "можно порезать на мемасы" - } - }, - "date": 1575800703, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2157": { - "id": 2157, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Пхаха" - } - }, - "date": 1575800713, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2158": { - "id": 2158, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Супер атмосферно" - } - }, - "date": 1575801673, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2159": { - "id": 2159, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "На 50% атмосферно, на 50% размазано" - } - }, - "date": 1575801832, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2160": { - "id": 2160, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "главное, что моники и рюкзаки на переднем плане в фокусе" - } - }, - "date": 1575801904, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2161": { - "id": 2161, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Можно сделать фотовыставку «как видят мир люди с близорукостью: ч.1 вечеринка»" - } - }, - "date": 1575802205, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2162": { - "id": 2162, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "😁" - } - }, - "date": 1575802271, - "senderUserId": 860139781, - "replyToMessageId": 2161 - }, - "2163": { - "id": 2163, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "У меня -1.5!" - } - }, - "date": 1575802746, - "senderUserId": 356765513, - "replyToMessageId": 2161 - }, - "2164": { - "id": 2164, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Но главное — это стойка фотографа" - } - }, - "date": 1575802760, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2165": { - "id": 2165, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "+" - } - }, - "date": 1575802933, - "senderUserId": 860139781, - "replyToMessageId": 2164 - }, - "2166": { - "id": 2166, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDY2j0rB1GRhfSKGYAY4B9q36wdSAF+/wCB/SgBtlMwu4tzMQTjrW+QAOlc9a/8fcP++P510VABXOXxf7bJvyDu/TtXQYUNuyc/WmS28M/+tjDY796AOdjdkkV0+8DkV0quCFDcMRnFRJZW8f3IgD696l8tdwOOlAETdTweT6f/AFqReM4B568f/WoooAcpYkhcg/h/hUilxgEZ980UUAf/2Q==", - "width": 750, - "height": 930 - }, - "sizes": [ - { - "width": 258, - "height": 320, - "type": "m" - }, - { - "width": 645, - "height": 800, - "type": "x" - }, - { - "width": 750, - "height": 930, - "type": "y" - } - ] - } - }, - "date": 1575806271, - "senderUserId": 860139781, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "2167": { - "id": 2167, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Дружочки, давайте устроим вечеринку в четверг" - } - }, - "date": 1575892125, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2168": { - "id": 2168, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Меня не покидает фантазия сделать эггног" - } - }, - "date": 1575892138, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2169": { - "id": 2169, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 2, - "width": 480, - "height": 302, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAZACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDJqRI2YAgcepq7Bp52AyqNzHoTjaPWp0tI4xtjdmHfFU32GkUj5ghUk/IG6DsabMqGNWUktj5uKuXFiSjvDLuUclD1FVFOwYdFII79xRGVmDRVoqfyUc4WUAnsRgfnRW3OhcrLaXJupljUnLdSa1FHlRhev1rD0z/j+j/H+VbT/drnasUtSAukcjHaAGGCO1ZMmPOZcggHAOas6h/rk+lU5P8AWNSBh0NFOk/1jfWiqGf/2Q==", - "width": 320, - "height": 201 - } - }, - "document": { - "size": 516753, - "mimeType": "video/mp4", - "fileName": "File" - } - }, - "date": 1575892172, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2170": { - "id": 2170, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "*спойлер — я никогда не делала эггног" - } - }, - "date": 1575892191, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2171": { - "id": 2171, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я б за, но меня не будет" - } - }, - "date": 1575892278, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2172": { - "id": 2172, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ууу, очень жаль!" - } - }, - "date": 1575892293, - "senderUserId": 146686085, - "replyToMessageId": 2171 - }, - "2173": { - "id": 2173, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну опишете потом впечатления от эггнога" - } - }, - "date": 1575892314, - "senderUserId": 860139781, - "replyToMessageId": 2172 - }, - "2174": { - "id": 2174, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1078212296544616502", - "emoji": "🦜", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 64821, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1575892317, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2175": { - "id": 2175, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ром и сливки. Что может пойти не так? 🧐" - } - }, - "date": 1575892337, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2176": { - "id": 2176, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1222077027897573530", - "emoji": "😳", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 21418, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575892350, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2177": { - "id": 2177, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Дело хорошее" - } - }, - "date": 1575892358, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2178": { - "id": 2178, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Знаете ли вы, что история Эгг-ног (просто ужасное название) уходит корнями в английский напиток 14-го века, называемый Поссет (еще одно восхитительное название)? Поссет был напитком из свернувшегося горячего молока с Элем или пивом, со временем в него начали добавлять яйца; так шаг за шагом он превратился в Эгг-ног который мы знаем сейчас. В то время молоко, как и яйца были весьма недешевыми, от чего Эгг-ног быстро терял популярность. Но все изменилось, с открытием Американских колоний. Благодаря весьма сомнительным торговым операциям между тремя континентами Америкой, Африкой и Европой у нас появился Ром, которого нам так не хватало." - } - }, - "date": 1575892380, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2179": { - "id": 2179, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Если бы меня кто-то поддержал кроме Яны, которой не будет" - } - }, - "date": 1575892380, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2180": { - "id": 2180, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Которого нам так не хватало..." - } - }, - "date": 1575892387, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2181": { - "id": 2181, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 4, - "width": 480, - "height": 360, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBgm6fuWPP0qOW4JbYsRBPvWpC4EYJ7d6p3HzSmQDjNDBEEbNkFo/l3cZbkcVNvH9z9ajc42leOf6UkkjBF5wTnpQgYS/PHgLg+uaKiWWQsBuyCe9FMRcLMg2MwOOuKcvIqtC5VRjuKnhmJPIH5UCE8jzI1bJ69qbLGgUbs8d6Wa6aCXbgEHnpTheDaTsHAFAyCOOLzFKv36GipfNQnIhXI96KAP//Z", - "width": 320, - "height": 240 - } - }, - "document": { - "size": 324811, - "mimeType": "video/mp4", - "fileName": "File" - } - }, - "date": 1575892434, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2182": { - "id": 2182, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Мысленно я с вами буду!" - } - }, - "date": 1575892434, - "senderUserId": 860139781, - "replyToMessageId": 2179 - }, - "2183": { - "id": 2183, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "При рассмотрении данного вопроса, прошу учесть, что Наташи не будет с нами 20го!" - } - }, - "date": 1575892505, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2184": { - "id": 2184, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Просто режешь без ножа" - } - }, - "date": 1575892527, - "senderUserId": 860139781, - "replyToMessageId": 2183 - }, - "2185": { - "id": 2185, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1222077027897573508", - "emoji": "🙄", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 20396, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1575892532, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2186": { - "id": 2186, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А ещё 20-го не будет Антона Рослова" - } - }, - "date": 1575892550, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2187": { - "id": 2187, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Антон так вообще светит для нас только неделю 🌝" - } - }, - "date": 1575892583, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2188": { - "id": 2188, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "И в пятницу не может ☝️" - } - }, - "date": 1575892602, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2189": { - "id": 2189, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я тут узнала, что 20го у втб корпорат в таблице. Party battle!" - } - }, - "date": 1575923129, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2190": { - "id": 2190, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 3, - "width": 480, - "height": 342, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAcACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCs7kHaoyaVSTkMMGkkGGDZpV5Ynk8VBY4dqO9KO1HekIQ9KKU9KKAKkM7ibcSDkFcN05qzeWskESyiRTzghexqjGNzAGrKsfsMqk5HmA1YhLaV3k2scjFWP4qrogivAq5xt71ZPWpe40IelFKelFID/9k=", - "width": 320, - "height": 228 - } - }, - "document": { - "size": 320087, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1575923147, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2191": { - "id": 2191, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "опана!" - } - }, - "date": 1575923162, - "senderUserId": 356765513, - "replyToMessageId": 2189 - }, - "2192": { - "id": 2192, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "можем подкосить под втбшников" - } - }, - "date": 1575923172, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2193": { - "id": 2193, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Автоматизируем третий этаж" - } - }, - "date": 1575923192, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2194": { - "id": 2194, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "у меня в ртк был проект, с которым мы мутили совместную интеграцию по страхованию" - } - }, - "date": 1575923195, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2195": { - "id": 2195, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Запустим тебя первым!" - } - }, - "date": 1575923208, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2196": { - "id": 2196, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "главное надо как в прошлый раз" - } - }, - "date": 1575923216, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2197": { - "id": 2197, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "отпустить меня на пару часов, на пре-пати, чтобы я уже набрался духа" - } - }, - "date": 1575923236, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2198": { - "id": 2198, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а потом с втбшниками будем кредитки разыгрывать, пенсионные накопления в дёсна переводить" - } - }, - "date": 1575923248, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2199": { - "id": 2199, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "попросить Нику скачать дискографию сердючки" - } - }, - "date": 1575923260, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2200": { - "id": 2200, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "хотя, это будет слишком" - } - }, - "date": 1575923264, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2201": { - "id": 2201, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 3, - "width": 480, - "height": 480, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCukkTfdOcegNPBX+61VrQLhiM/jVguoG7nbnGfepKHbh/cb9KM/wCwfxNOBHWh9gk+8MkZwKQyMsf7g/76opzFeh60UAQQKsa4DEkgE5GOopTJ5HnQ7vmzwcZFLbRtMcL2UfyqvfKy3T7hjPSn1F0LEs4CjYCQR1x0qHzWLlzyfSozKWgVNx4PT29aQ4UZ5z60wLBmzOODjFFVN7j+I/nRRYVyaK5ki/1bEHjtSyhpkWSRvnLYJ9aKKGVHUiYbTtyDg46UmSW6Z9qKKBdRyx7jjYx/3RmiiigD/9k=", - "width": 320, - "height": 320 - } - }, - "document": { - "size": 1346910, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1575923480, - "senderUserId": 327556368, - "replyToMessageId": 2198 - }, - "2202": { - "id": 2202, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Твой дух всегда с тобой 💪🏻" - } - }, - "date": 1575923505, - "senderUserId": 327556368, - "replyToMessageId": 2197 - }, - "2203": { - "id": 2203, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "да" - } - }, - "date": 1575923527, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2204": { - "id": 2204, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Хмм, скажем, что мы из «Отдела по компетенциям реализации Digital проектов»" - } - }, - "date": 1575923587, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2205": { - "id": 2205, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Реализуем их компетенции полностью" - } - }, - "date": 1575923738, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2206": { - "id": 2206, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "реализуй мои компетенции себе в отдел" - } - }, - "date": 1575961387, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2207": { - "id": 2207, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вокалистка группы Roxette Мари Фредрикссон умерла в возрасте 61 года. В 2002 году у неё обнаружили опухоль головного мозга.\n\nhttps://tjournal.ru/news/130505", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 125, - "length": 31 - } - ] - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAZACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDIxU5mbyDEQCNuBx05zUYp5XKDHXJoASPzYtsyAjB4ahXYxsjPtQ/Nj1NP8zMXltgAHrTNhbscCgBiMy5KkjIwcelFOIx2ooAXYRz2qTrEPTkcUsn+q/GiP/VL/vH+lAELIVHOPzqWL5gVBAFNm6/iakg6fjQAjIcndyBRUsn3jRQB/9k=", - "width": 1200, - "height": 750 - }, - "sizes": [ - { - "width": 320, - "height": 200, - "type": "m" - }, - { - "width": 800, - "height": 500, - "type": "x" - }, - { - "width": 1200, - "height": 750, - "type": "y" - } - ] - } - }, - "date": 1575981617, - "senderUserId": 356765513, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "2208": { - "id": 2208, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "😭😭😭😭" - } - }, - "date": 1575981673, - "senderUserId": 860139781, - "replyToMessageId": 2207 - }, - "2209": { - "id": 2209, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Люблю эту группу :(" - } - }, - "date": 1575981684, - "senderUserId": 860139781, - "replyToMessageId": 2207 - }, - "2210": { - "id": 2210, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "так" - } - }, - "date": 1575981834, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2211": { - "id": 2211, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а у кого-нибудь остался вичат?" - } - }, - "date": 1575981840, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2212": { - "id": 2212, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "О да" - } - }, - "date": 1575982720, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2213": { - "id": 2213, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "о наташа" - } - }, - "date": 1575982920, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2214": { - "id": 2214, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 10, - "width": 464, - "height": 848, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBRVm0Hz5NUwatWrcGpGW5XAHJoqrd7HQCQ9+KKYGdC37sZOTVu3fFU8Ac46U+OUYYFD0pDLNyylRk96KzJ2ZcAEiimJl6NDIMMDxTjAuCMUUVBRAY1YcpuA4zRRRVAf//Z", - "width": 175, - "height": 320 - } - }, - "document": { - "size": 1568191, - "mimeType": "video/mp4", - "fileName": "IMG_2255.MOV" - } - }, - "date": 1575984282, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2216": { - "id": 2216, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "хотя" - } - }, - "date": 1575984353, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2217": { - "id": 2217, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "норм" - } - }, - "date": 1575984354, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2218": { - "id": 2218, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "норм", - "entities": [ - { - "className": "MessageEntityUnderline", - "classType": "constructor", - "offset": 0, - "length": 4 - } - ] - } - }, - "date": 1575984370, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2219": { - "id": 2219, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Короче у меня обнаружилась тысяча рублей на счету в инвизибле и я взяла ящик игристого на чевтержок 🤷‍♀️" - } - }, - "date": 1576004947, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2220": { - "id": 2220, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вдрхновение на эггног меня покинуло, в лучшем случае я найду Крем де кассис и будем эффектно потягивать Кир Рояли, в худшем — безыдейно выпьем креман)" - } - }, - "date": 1576005042, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2221": { - "id": 2221, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А все потому что @adikmarov с моим промо кодом заказал себе что-то. Берите мой код NDZHA и будьте как Артём, чтобы я могла побольше заказывать игристого 👌", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 17, - "length": 10 - } - ] - } - }, - "date": 1576005256, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2222": { - "id": 2222, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Артем еще хочет заказать!" - } - }, - "date": 1576005280, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2223": { - "id": 2223, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Давай давай!" - } - }, - "date": 1576005286, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2224": { - "id": 2224, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Артём, будь как Артём!" - } - }, - "date": 1576005310, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2225": { - "id": 2225, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я пытаюсь" - } - }, - "date": 1576005323, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2226": { - "id": 2226, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это что за игристое по косарю за ящик?🤔" - } - }, - "date": 1576005324, - "senderUserId": 54158593, - "replyToMessageId": 2219 - }, - "2227": { - "id": 2227, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Не, скидос был тыща" - } - }, - "date": 1576005333, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2228": { - "id": 2228, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Если б там было игристое по косарю за ящик я б взяла вагон" - } - }, - "date": 1576005348, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2229": { - "id": 2229, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я тоже уже разбежалась" - } - }, - "date": 1576005361, - "senderUserId": 54158593, - "replyToMessageId": 2228 - }, - "2230": { - "id": 2230, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1244850129911939461", - "emoji": "😳", - "isAnimated": false, - "width": 320, - "height": 320, - "thumbnail": { - "width": 320, - "height": 320, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 13868, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576005377, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2231": { - "id": 2231, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вот такое лицо у меня было" - } - }, - "date": 1576005383, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2232": { - "id": 2232, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Когда увидела, что ящик игристого за косарь" - } - }, - "date": 1576005405, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2233": { - "id": 2233, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "За косарь, Вот вы там кутите" - } - }, - "date": 1576005410, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2234": { - "id": 2234, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ой, Саша, у вас там в Испании за 7 евро можно магнум кавы взять!" - } - }, - "date": 1576005444, - "senderUserId": 54158593, - "replyToMessageId": 2233 - }, - "2235": { - "id": 2235, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "В худшем случае!" - } - }, - "date": 1576005463, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2236": { - "id": 2236, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Кстати кроме шуток я как-то была на дегустации русского игристого ХОРОШЕГО, которое в Краснодаре продают за 300р. Только до мск оно с таким ценником не доезжает, кончено" - } - }, - "date": 1576005466, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2237": { - "id": 2237, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это какое" - } - }, - "date": 1576005486, - "senderUserId": 54158593, - "replyToMessageId": 2236 - }, - "2238": { - "id": 2238, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://napolke.ru/catalog/alkogolnaya_produktsiya/vino/product/napitok_el_labrador_vinny_j_gazirovanny_j_polusladkij_9-abcf4d0a-f585-4735-9435-58c2ff4ac8cb", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 156 - } - ] - } - }, - "date": 1576005499, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2239": { - "id": 2239, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "76.5 рублей!" - } - }, - "date": 1576005503, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2240": { - "id": 2240, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Белорусских?" - } - }, - "date": 1576005518, - "senderUserId": 54158593, - "replyToMessageId": 2239 - }, - "2241": { - "id": 2241, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "на косарь можно 13 бутылок взять" - } - }, - "date": 1576005522, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2242": { - "id": 2242, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну это наверн бормотуха" - } - }, - "date": 1576005524, - "senderUserId": 146686085, - "replyToMessageId": 2239 - }, - "2243": { - "id": 2243, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "русских!" - } - }, - "date": 1576005525, - "senderUserId": 356765513, - "replyToMessageId": 2240 - }, - "2244": { - "id": 2244, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А то я бы прям пила как просекко" - } - }, - "date": 1576005549, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2245": { - "id": 2245, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ща найду" - } - }, - "date": 1576005555, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2246": { - "id": 2246, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А за 300 рублей я б его пила вместо кофе прям с утра" - } - }, - "date": 1576005591, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2247": { - "id": 2247, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "хмм. Придется 162 бутылки покупать" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAASACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDYJwM9aRXz/CR9aU9Kbt9jQA7j1oLKOrAfjTcccqfzpwUY6fnQAtFFFABRRRQAUUUUAFFFFAH/2Q==", - "width": 744, - "height": 334 - }, - "sizes": [ - { - "width": 320, - "height": 144, - "type": "m" - }, - { - "width": 744, - "height": 334, - "type": "x" - } - ] - } - }, - "date": 1576005595, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2248": { - "id": 2248, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCKW5ikttq7sl8sT/F701UMv3QMA4PNRLCwVx6EHFDSeW4xlR3ANS/IZbt4gl0FfBVjtIq68MNt91zGW7gHn8qyIZmedSW53Zz9Ks3FwtzGp3EMDgnpRFPZgaN9EZYgFAzmsaaI5xsOeuc1u3SF7dwOuMisCZ2DHJ5odwQ60tPPlaMkjC5JFTNppT/lpn68VBaSOpdkJBPHFWftUo4LZ/CjUNDbqrPYW8xJZCG9QaKKYisdNCZ8t+PcVGbGX++lFFTcpH//2Q==", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1576005599, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2249": { - "id": 2249, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Хммм, не пробовала. Я посоветую ознакомиться с Лефкадией. Там не 300 рублей, но игристое отличное." - } - }, - "date": 1576005719, - "senderUserId": 54158593, - "replyToMessageId": 2248 - }, - "2250": { - "id": 2250, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Темелион называется" - } - }, - "date": 1576005876, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2251": { - "id": 2251, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Правда не знаю, где его в Москве найти, мы были в хозяйстве." - } - }, - "date": 1576005919, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2252": { - "id": 2252, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "вот, а я на дегустации русских вин, и там чувак спецом это вино привез, он сам из Краснодарского края" - } - }, - "date": 1576006040, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2253": { - "id": 2253, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDTcEqAOxzmqz30EM22WU7h1GD3qeWdYnVSCS3pTJIYmly1uj5OCxXJrOMn1GOWQS/NGQysOo/GgAEjElJDEkYMafdx27ZJ/wAacxRHC7huPQHPNNS6ASDOBk5oqn9mIlLpcTB8g7WbjGeeMUVDi+4E8qs4wQQQeCpPH6VA8NzuBW5Iz1DL1/ICp3GCAKbLcLbopKOxPHyLmr2V0BHawzW5kMj+azck5xipJCz4IG1h0brj9KIpUuCWAbAGCGGCDSpy4znH0FCV9WBA0V44YC5AU/7PIoqT7dEJPLZJFwcbinGaKlyl0QFl92w7MbscZqoblET97MEk/iwOn4UUUobgS28scsshjOcY3cd6J2ZGUkqIv4iaKKH8QET3duA5aYMo7YzjniiiitUkB//Z", - "width": 828, - "height": 828 - }, - "sizes": [ - { - "width": 320, - "height": 320, - "type": "m" - }, - { - "width": 800, - "height": 800, - "type": "x" - }, - { - "width": 828, - "height": 828, - "type": "y" - } - ] - } - }, - "date": 1576006057, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2254": { - "id": 2254, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "action": { - "text": "%user% was added to the chat" - } - }, - "date": 1576006128, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2255": { - "id": 2255, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "так" - } - }, - "date": 1576006164, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2256": { - "id": 2256, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 1, - "width": 480, - "height": 326, - "supportsStreaming": true, - "isRound": false - }, - "document": { - "size": 112414, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1576006165, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2257": { - "id": 2257, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "2 Лизы в чате" - } - }, - "date": 1576006167, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2258": { - "id": 2258, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1078212296544616505", - "emoji": "😘", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 21072, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1576006183, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2259": { - "id": 2259, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "загадывайте желание" - } - }, - "date": 1576006184, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2260": { - "id": 2260, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Краткий пересказ предыдущих серий" - } - }, - "date": 1576006191, - "senderUserId": 146686085, - "replyToMessageId": 2219 - }, - "2261": { - "id": 2261, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "мне нужно написать сообщение между ними" - } - }, - "date": 1576006193, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2262": { - "id": 2262, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Так ты и написал" - } - }, - "date": 1576006205, - "senderUserId": 146686085, - "replyToMessageId": 2261 - }, - "2263": { - "id": 2263, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Надо чтобы ровно" - } - }, - "date": 1576006211, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2264": { - "id": 2264, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "сначала @lizazhdan а потом @pseudoliza", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 8, - "length": 10 - }, - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 27, - "length": 11 - } - ] - } - }, - "date": 1576006221, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2265": { - "id": 2265, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А галицкого вино пробовал кто?" - } - }, - "date": 1576006225, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2266": { - "id": 2266, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "хочу чтобы стас Барецкий выступал на корпоративе!" - } - }, - "date": 1576006229, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2267": { - "id": 2267, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 2, - "width": 320, - "height": 240, - "supportsStreaming": true, - "isRound": false - }, - "document": { - "size": 109712, - "mimeType": "video/mp4", - "fileName": "raw.gif.mp4" - } - }, - "date": 1576006231, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2268": { - "id": 2268, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ееееееее" - } - }, - "date": 1576006234, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2269": { - "id": 2269, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Куда ровнее?" - } - }, - "date": 1576006244, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2270": { - "id": 2270, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC1c3qWe0SBmLEkbfSoDrMHaKT/AD+NM1aPfJF7A1VEMajDtjuOM1LlZ2KjC6uW/wC2Yf8AnnJ+lXoJknhWUZCt0zWBJCoBIfI+lbWmjbYxA+/8zVJ3FKNge1Wb5mkY7SRxzTDpqOR+8cYH92pbsSeWDG20g1WimlG2R5CVJx0pNK402loPfS49oHmE/hVmKIRRKgOQvrUlFNJIlyb3GECRCMkc0w26nqxP5UUU7JhdokjGEAyWx3PWnYNFFAj/2Q==", - "width": 922, - "height": 1280 - }, - "sizes": [ - { - "width": 230, - "height": 320, - "type": "m" - }, - { - "width": 576, - "height": 800, - "type": "x" - }, - { - "width": 922, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1576006250, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2271": { - "id": 2271, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "186649756741665199", - "emoji": "😏", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 18874, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1576006261, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2272": { - "id": 2272, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это уже комбо" - } - }, - "date": 1576006265, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2273": { - "id": 2273, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "надеюсь что сбудется" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAkACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCpImIoiYdoI6561Fgeh/MVJEiysqhmBxzUv2Nv+ex/KmIq/L2VvzpuParTW0gJyzY9cUq2pYZEx59v/r0AVKKluIzE4UuW4zRQA+y/1/4VolcJnqTVDTxm5/A1auLrY+1UJxSb6DsPDySKp+UE9ajiBDuh7HIqH7YwJOwgdhS29x85MnU8cUloN6kV9/rl/wB2ilvyDKhHQpRVXJIIpGicsvXGKGdmYknkmiikMBO4GAeKUSMfTr6UUUDGu5fbnsMUUUUyT//Z", - "width": 854, - "height": 756 - }, - "sizes": [ - { - "width": 320, - "height": 283, - "type": "m" - }, - { - "width": 800, - "height": 708, - "type": "x" - }, - { - "width": 854, - "height": 756, - "type": "y" - } - ] - } - }, - "date": 1576006292, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2274": { - "id": 2274, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "от души" - } - }, - "date": 1576006315, - "senderUserId": 177121435, - "replyToMessageId": 2273 - }, - "2275": { - "id": 2275, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "хотя бы на ВТБшном" - } - }, - "date": 1576006347, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2276": { - "id": 2276, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "надеюсь, ты загадал чтоб мы чудесно посидели в четвержок ❤" - } - }, - "date": 1576006354, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2277": { - "id": 2277, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я могу принести вкусни в четверг" - } - }, - "date": 1576006369, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2278": { - "id": 2278, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "если это актуально" - } - }, - "date": 1576006374, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2279": { - "id": 2279, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ОЧЕНЬ" - } - }, - "date": 1576006380, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2280": { - "id": 2280, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "принесу вкусни" - } - }, - "date": 1576006390, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2281": { - "id": 2281, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "на самом деле, если у нас была полноценная кухня с плитой и духовкой (то, что нужно в офисе), я бы давно забросила основную работу" - } - }, - "date": 1576006413, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2282": { - "id": 2282, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "у меня ситуация: вы ничего непонятное делаете в слаке, а меня точно не будет 20-го, поэтому я хочу вечериночку на этой неделе ЧТОБЫ НАВЕРНЯКА" - } - }, - "date": 1576006415, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2283": { - "id": 2283, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "и еще Антон будет в четверг!!" - } - }, - "date": 1576006420, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2284": { - "id": 2284, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "можешь договориться с нашей текущей кухней, на пол ставочки" - } - }, - "date": 1576006432, - "senderUserId": 356765513, - "replyToMessageId": 2281 - }, - "2285": { - "id": 2285, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "за завтра успеешь медкнижку оформить" - } - }, - "date": 1576006439, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2286": { - "id": 2286, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А мы 20? Вроде ж 27?" - } - }, - "date": 1576006444, - "senderUserId": 860139781, - "replyToMessageId": 2282 - }, - "2287": { - "id": 2287, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я делаю такие вкусные ребрышки, что считаю нужным всем не веганам их отведать" - } - }, - "date": 1576006445, - "senderUserId": 177121435, - "replyToMessageId": 2281 - }, - "2288": { - "id": 2288, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "НИЧЕГО НЕ ПОНЯТНО!!!" - } - }, - "date": 1576006461, - "senderUserId": 146686085, - "replyToMessageId": 2286 - }, - "2289": { - "id": 2289, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ааааааа😁😁😁" - } - }, - "date": 1576006468, - "senderUserId": 860139781, - "replyToMessageId": 2288 - }, - "2290": { - "id": 2290, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Но если что я просто бухну в четверг и 27-но" - } - }, - "date": 1576006473, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2291": { - "id": 2291, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вообще не вижу проблемы 🤷‍♀️" - } - }, - "date": 1576006483, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2292": { - "id": 2292, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Sounds like a plan" - } - }, - "date": 1576006484, - "senderUserId": 860139781, - "replyToMessageId": 2290 - }, - "2293": { - "id": 2293, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 2, - "width": 480, - "height": 368, - "supportsStreaming": true, - "isRound": false - }, - "document": { - "size": 164918, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1576006502, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2294": { - "id": 2294, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 3, - "width": 480, - "height": 360, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCHGBnNN69jV/ZGAOBSMUUcAVFyrFEqcZx+dSRr0yPxpx3MeaUkAgGrsTccF96KarIe9FAE9MIJOTj6VIKCM1kaEBQ5pGQY/wAKsbaTZ81VdisQquKKnwBRS1A//9k=", - "width": 320, - "height": 240 - } - }, - "document": { - "size": 1254120, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1576006521, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2295": { - "id": 2295, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 1, - "width": 480, - "height": 664, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBjKS454FNCOeOckjvUtTR2xnTOQBnvUxqNaGsorcq7CD82c49e9PUYUZ696mnTy5SCR61FUym5aFRilqJUsdy0ahTGSueD71AzhRu6jPSlJypAJVSc4B6UglroSysWfceSR1ximZoD7osMcupxz3FNzSGtioqSDd8pPHBJqzvP8SnPtRRVmN2hikmUttIG3HNPziiiiw7s/9k=", - "width": 231, - "height": 320 - } - }, - "document": { - "size": 302550, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1576006524, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2296": { - "id": 2296, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 19, - "width": 480, - "height": 270, - "supportsStreaming": true, - "isRound": false - }, - "document": { - "size": 1200633, - "mimeType": "video/mp4", - "fileName": "gif.mp4" - } - }, - "date": 1576006585, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2297": { - "id": 2297, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "жалко, что у нас нет отдела бухгалтерии!" - } - }, - "date": 1576006592, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2298": { - "id": 2298, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 8, - "width": 320, - "height": 256, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAgACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCBQDjA6DrUhIKY3HPpiotxVSSMYqD7W47KahGki2cHrRgAGo45g4z0NSdQaBDMUU8cUUAV1lWRD83OKpU5lKnB/Sm1SViW7jlcqcir0M6OMd8VWhSNkbcRn609YFDArKBSY0WyPlBBoppKgY3j86KWo3Y//9k=", - "width": 320, - "height": 256 - } - }, - "document": { - "size": 243888, - "mimeType": "video/mp4", - "fileName": "663.gif.mp4" - } - }, - "date": 1576006631, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2299": { - "id": 2299, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А разве вся эта фирма это не отдел бухгалтерии?🤔" - } - }, - "date": 1576006653, - "senderUserId": 54158593, - "replyToMessageId": 2297 - }, - "2300": { - "id": 2300, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 5, - "width": 480, - "height": 268, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAWACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCiVUAep9ai6tjb+NT3E/2jbiIKQP4RTUjfP3G/KgBoSkKVa8tTGOcue2KhYH+6fyoTuBCSF5xRSMrEcg9fSigZ0CIqjCqBSsAwKkZBooqQKz87VwMjHNIVG7nrRRTAVo0x0/SiiimI/9k=", - "width": 320, - "height": 179 - } - }, - "document": { - "size": 383527, - "mimeType": "video/mp4", - "fileName": "File" - } - }, - "date": 1576006656, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2301": { - "id": 2301, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "прочитала “ферма”" - } - }, - "date": 1576006663, - "senderUserId": 177121435, - "replyToMessageId": 2299 - }, - "2302": { - "id": 2302, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Это наш отдел бухгалтерии." - } - }, - "date": 1576006663, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2303": { - "id": 2303, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ну да" - } - }, - "date": 1576006666, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2304": { - "id": 2304, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ЯЯМЫБУХГАЛТЕРИЯ" - } - }, - "date": 1576006690, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2305": { - "id": 2305, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "502972616328347710", - "emoji": "👍", - "isAnimated": false, - "width": 512, - "height": 148 - }, - "document": { - "size": 6046, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576006693, - "senderUserId": 327556368, - "replyToMessageId": 2299 - }, - "2306": { - "id": 2306, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ну каммон, у нас какая-то нетрадиционная бухгалтерия: ни одной фрау за 45" - } - }, - "date": 1576006727, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2307": { - "id": 2307, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ля ребята мне так надо работать, а тут с одной стороны вы, с другой — бутылка ркацетели, которая манит отмечать, что мне пока не надо пить антибиотики (но это не точно)" - } - }, - "date": 1576006755, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2308": { - "id": 2308, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Уже второй раз за день высказываешь этот консерн, ничего не хочу сказать, но уже сказала" - } - }, - "date": 1576006759, - "senderUserId": 327556368, - "replyToMessageId": 2306 - }, - "2309": { - "id": 2309, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCBLjMnf86SecTMvGKdFaYlUlsjPIpslrtkwCeDU6blakcr+VjHOars5c5Y1amgJAweRUQgA+/1ouhWZok+nWmvKByTgnrU0cKlOSSfrUUnXGOQazfZGi7jGzKoZWHHY96iJ4+ZT+WacQQSepqykyNGFcZK+tPmsK1xASrFBwOuKbJtUZPrRRQtwKzSHt0pKKK1SsB//9k=", - "width": 956, - "height": 1276 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 599, - "height": 800, - "type": "x" - }, - { - "width": 956, - "height": 1276, - "type": "y" - } - ] - } - }, - "date": 1576006788, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2310": { - "id": 2310, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я поделала немножко крисмас шопинга и очень устала" - } - }, - "date": 1576006801, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2311": { - "id": 2311, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 1, - "width": 320, - "height": 192, - "supportsStreaming": true, - "isRound": false - }, - "document": { - "size": 42057, - "mimeType": "video/mp4", - "fileName": "file_2018-09-19_22-00-35.gif.mp4" - } - }, - "date": 1576006806, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2312": { - "id": 2312, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "пусть будет" - } - }, - "date": 1576006814, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2313": { - "id": 2313, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ой тоже надо" - } - }, - "date": 1576006830, - "senderUserId": 177121435, - "replyToMessageId": 2310 - }, - "2314": { - "id": 2314, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а я так многим людям хочу столько всего подарить" - } - }, - "date": 1576006839, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2315": { - "id": 2315, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "что тяжко" - } - }, - "date": 1576006843, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2316": { - "id": 2316, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Мужчина мечты белоруски😁" - } - }, - "date": 1576006847, - "senderUserId": 54158593, - "replyToMessageId": 2311 - }, - "2317": { - "id": 2317, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Потратила все деньги, даже с пропуска таблицы" - } - }, - "date": 1576006871, - "senderUserId": 54158593, - "replyToMessageId": 2310 - }, - "2318": { - "id": 2318, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а на нем деньги лежат?" - } - }, - "date": 1576006884, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2319": { - "id": 2319, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Основную часть денег я потратила на себя, так что как насчёт получить немножко моей любви и принятия на Новый год?" - } - }, - "date": 1576006898, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2320": { - "id": 2320, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "тут вам не Яндекс" - } - }, - "date": 1576006898, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2321": { - "id": 2321, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "звучит прекрасно" - } - }, - "date": 1576006913, - "senderUserId": 177121435, - "replyToMessageId": 2319 - }, - "2322": { - "id": 2322, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Кто знает..." - } - }, - "date": 1576006916, - "senderUserId": 54158593, - "replyToMessageId": 2318 - }, - "2323": { - "id": 2323, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "УЖЕ НЕТ" - } - }, - "date": 1576006929, - "senderUserId": 146686085, - "replyToMessageId": 2318 - }, - "2324": { - "id": 2324, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "так вот почему всякие Иваны постоянно пропуска теряют 🤔" - } - }, - "date": 1576006957, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2325": { - "id": 2325, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ля помните старый мем про Ивана?" - } - }, - "date": 1576006973, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2326": { - "id": 2326, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "нет" - } - }, - "date": 1576006978, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2327": { - "id": 2327, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "🙁" - } - }, - "date": 1576006982, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2328": { - "id": 2328, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Нет" - } - }, - "date": 1576006982, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2329": { - "id": 2329, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Нет" - } - }, - "date": 1576006986, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2330": { - "id": 2330, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "сами знаете, чей ответ" - } - }, - "date": 1576006988, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2331": { - "id": 2331, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ты тут главный мемолог" - } - }, - "date": 1576006996, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2332": { - "id": 2332, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "оох, обожаю чат" - } - }, - "date": 1576006997, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2333": { - "id": 2333, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "скоро будут вопросы в стиле 150 + 150" - } - }, - "date": 1576007005, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2334": { - "id": 2334, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я удивилась, что на вино за 300 никто не стриггерился" - } - }, - "date": 1576007024, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2335": { - "id": 2335, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAdACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDTeaMowEgyRVfHIPmqcDuenSrUwBibJIHXpmo44lcpIGJIAHTFA07EHp86j0+bp0/+vRjhh5qgYwADUpt2XcxfjnoKQ+WzxfvPmI+X5ePWlYfMyZZogoHmDgUUsUYjXAopkkOoSyRWxMQ+b1IyABz/AEqvp13NPId2GjI4KjoRj/Grt1CLi3eIsVDdxUNjZCzDBZGYNg89qALIPJz0rPt5Xj1A2oOY0BxnrWlWRGT/AG3jjlj0Ht/9agDXopqnJIPaigD/2Q==", - "width": 1258, - "height": 908 - }, - "sizes": [ - { - "width": 320, - "height": 231, - "type": "m" - }, - { - "width": 800, - "height": 577, - "type": "x" - }, - { - "width": 1258, - "height": 908, - "type": "y" - } - ] - } - }, - "date": 1576007028, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2336": { - "id": 2336, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "там где просто поп орет ИВАААН" - } - }, - "date": 1576007039, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2337": { - "id": 2337, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Да, чот взгрустнулось" - } - }, - "date": 1576007065, - "senderUserId": 146686085, - "replyToMessageId": 2334 - }, - "2338": { - "id": 2338, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "типа\nскрин из ассасина\nИВАААН СЛЕЗЬ С КОЛОКОЛЬНИ ОКОЯННЫЙ" - } - }, - "date": 1576007076, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2339": { - "id": 2339, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ладна" - } - }, - "date": 1576007082, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2340": { - "id": 2340, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Лиза, это больше грустно, чем весело" - } - }, - "date": 1576007097, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2341": { - "id": 2341, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "102120784561964351", - "emoji": "😞", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 16864, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576007110, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2342": { - "id": 2342, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "2112768758786293799", - "emoji": "😰", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 19364, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576007118, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2343": { - "id": 2343, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 2, - "width": 316, - "height": 320, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACcDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDIbBY7RgZ4zT5cnDZzj5SQe4qxcWIUFon3YOGBGCPSoIV3SGJyFDcHPY0k09UFhiruOMgcdTUhVWYneoB7AdKQLtJUnacEENT8gMMuh/CrRLI2wCADniihwD824EnsKKYF+AyvbwlMnDYb+lXEtEO5pEG/uRzWXZ3n2ZGUqWB5FaNnfJP8p4fuPWs0i29ChqEEiSb3U7PuhvWqe1uTg49cV0k0g2YABzVC4leFd4QMM9u1DdtASvqZI9KKvG5t3HzQgn2FFO4WRQ7ZpyuyFWU4K9CKKKBFo6hMQMhM+tOhvWXPmjOPSiiiwXFd7OXk5Qn0GKKKKVh3P//Z", - "width": 316, - "height": 320 - } - }, - "document": { - "size": 107667, - "mimeType": "video/mp4", - "fileName": "oie_oie_glitters (1).gif.mp4" - } - }, - "date": 1576007139, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2344": { - "id": 2344, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "в копилку @lizazhdan", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 10, - "length": 10 - } - ] - } - }, - "date": 1576007152, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2345": { - "id": 2345, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 3, - "width": 320, - "height": 220, - "supportsStreaming": true, - "isRound": false - }, - "document": { - "size": 35801, - "mimeType": "video/mp4", - "fileName": "oj-oj-oj.gif.mp4" - } - }, - "date": 1576007166, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2346": { - "id": 2346, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "пасиба" - } - }, - "date": 1576007167, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2347": { - "id": 2347, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "всё, я ушла работать, а то у меня всё горит" - } - }, - "date": 1576007202, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2348": { - "id": 2348, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "всес чмоки" - } - }, - "date": 1576007213, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2349": { - "id": 2349, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "муа" - } - }, - "date": 1576007214, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2350": { - "id": 2350, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "У меня тож все горит и однако я здесь" - } - }, - "date": 1576007244, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2351": { - "id": 2351, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "мне кажется, если я к завтра не сделаю то, что должна, меня попрут ссанными тряпками" - } - }, - "date": 1576007280, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2352": { - "id": 2352, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а тебя" - } - }, - "date": 1576007283, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2353": { - "id": 2353, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "?" - } - }, - "date": 1576007284, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2354": { - "id": 2354, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "вот вот" - } - }, - "date": 1576007286, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2355": { - "id": 2355, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ой ой иди тогда" - } - }, - "date": 1576007296, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2356": { - "id": 2356, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "На всякий цитирую Наташу из слака: \nhttps://ooosome.slack.com/archives/CA39G3BUM/p1576065259269300\n\nДрузья, в холодильник отправился ящик игристого, который я предлагаю уничтожить завтра вечером. \n\nОриентировочно в 18.30-19.00: провожаем @anton в Сингапур, едим вкусняшки от @Liza Zhdanovskikh и решаем вселенскую проблему правильного дня новогодней вечеринки под предводительством @Natasha Asaul\n\nЕсли вы уезжаете скоро и не уверены что вы или ваш адресат будете 20-го или 27-го, приносите свои подарки Secret Santa\nну или просто выпить-потрещать", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 36, - "length": 62 - }, - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 238, - "length": 6 - }, - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 382, - "length": 8 - } - ] - } - }, - "date": 1576072324, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2357": { - "id": 2357, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а я повторюсь тогда и тут: принимаю заявки на вкусняшки, только не что-то шибко сложное, а то я херово себя чувствую мальца(" - } - }, - "date": 1576072386, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2358": { - "id": 2358, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я отправляю заявку на звоночек мне во время попойки, хотя б на 2 минутки! Чтоб мне не так скучно было дома лежать и болеть😁" - } - }, - "date": 1576072577, - "senderUserId": 860139781, - "replyToMessageId": 2357 - }, - "2359": { - "id": 2359, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://meduza.io/amp/shapito/2019/12/11/v-kaliningrade-politseyskie-v-shutku-razoslali-prikaz-s-trebovaniem-vyrezat-snezhinki-v-nakazanie-oni-vyrezali-snezhinki-dlya-vsego-mvd?utm_source=twitter&utm_medium=main&__twitter_impression=true", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 237 - } - ] - } - }, - "date": 1576088528, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2360": { - "id": 2360, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Мой болеющий мозг захотел поделиться с вами новостью про снежинки" - } - }, - "date": 1576088557, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2361": { - "id": 2361, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1181259883509448740", - "emoji": "❄️", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 29066, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576088580, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2362": { - "id": 2362, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "У меня дома такой же стул, как в таблице. Я потрес его, похлопал сидушку, и вот что получилось" - } - }, - "date": 1576137009, - "senderUserId": 2676926, - "replyToMessageId": null - }, - "2363": { - "id": 2363, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABcDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDI5o5qUxSsciIj2ApRBP8A88z+VAEQyaKuRQTIdzQ5B7BqKAH7pPUUGaQdWFR4b0pNjH+E0ASi6fpvH5UUxYQeqUUhl2+gWAqUyM+tPs4lkjJZNxHviiimItLDb52lNp9CTRRRQB//2Q==", - "width": 720, - "height": 1280 - }, - "sizes": [ - { - "width": 180, - "height": 320, - "type": "m" - }, - { - "width": 450, - "height": 800, - "type": "x" - }, - { - "width": 720, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1576137012, - "senderUserId": 2676926, - "replyToMessageId": null - }, - "2364": { - "id": 2364, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABMDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCpeuJLklTkYFRRLmQClunV7hnTO0+tT6equ7b1JPbjIpDKzxkuSAMUVseSv90UUrjsUjaYRncdO2elWrNlUbAuATSfOkoSUYBGD9Kljixnvg9qq1yW7FjbRTqKkoYTvPzYNOFFFFxC0UUUAf/Z", - "width": 605, - "height": 1280 - }, - "sizes": [ - { - "width": 151, - "height": 320, - "type": "m" - }, - { - "width": 378, - "height": 800, - "type": "x" - }, - { - "width": 605, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1576137031, - "senderUserId": 2676926, - "replyToMessageId": null - }, - "2365": { - "id": 2365, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вот теперь, когда сидите в таблице, вы будете знать ;)" - } - }, - "date": 1576137059, - "senderUserId": 2676926, - "replyToMessageId": null - }, - "2366": { - "id": 2366, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "272479773299573681", - "emoji": "😳", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 31184, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576137155, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2367": { - "id": 2367, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Пипец" - } - }, - "date": 1576137159, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2368": { - "id": 2368, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "That’s a drama......" - } - }, - "date": 1576137455, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2369": { - "id": 2369, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://www.the-village.ru/village/food/food-news/369709-profsouyz", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 66 - } - ] - } - }, - "date": 1576160540, - "senderUserId": 177121435, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": 27803002, - "origin": { - "senderUserId": 27803002 - } - } - }, - "2370": { - "id": 2370, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Так" - } - }, - "date": 1576162322, - "senderUserId": 146686085, - "replyToMessageId": 2369 - }, - "2371": { - "id": 2371, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 3, - "width": 480, - "height": 360, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCHGBnNN69jV/ZGAOBSMUUcAVFyrFEqcZx+dSRr0yPxpx3MeaUkAgGrsTccF96KarIe9FAE9MIJOTj6VIKCM1kaEBQ5pGQY/wAKsbaTZ81VdisQquKKnwBRS1A//9k=", - "width": 320, - "height": 240 - } - }, - "document": { - "size": 1254120, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1576162332, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2372": { - "id": 2372, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "плывет" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwA0vDROp6g1c8oA8dKp2ME0SNlSGPSpw0wPLfpSKtYkNuMk9qa1umARTw+BjOc0q5KjnmgQ5JBs6/So3Jc84+tVlDfgOlKzuCTUtjRJJFuIO9gR3zT1kVRhzgjuRjNRrLkYz+dP3IQM8/WhAypu24wSPXFG880UU7CuGfzoLmiimB//2Q==", - "width": 956, - "height": 1276 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 599, - "height": 800, - "type": "x" - }, - { - "width": 956, - "height": 1276, - "type": "y" - } - ] - } - }, - "date": 1576165382, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2373": { - "id": 2373, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1014850808690245757", - "emoji": "😆", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 32984, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576165424, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2374": { - "id": 2374, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 2, - "width": 480, - "height": 360, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDT3ilDCq6k08GrsZk+4U0sKjz70hNFguSbhRUDMRRTsBXjuRgBh+Ip4lHY5qkmDVhQMYqpRRKk0WJn27do+tJHJu471X8pAelPUlGyMZqOV9ylNbNDppSCQF/E0UzcJJWBUcAGirjtqTLfQ//Z", - "width": 320, - "height": 240 - } - }, - "document": { - "size": 489286, - "mimeType": "video/mp4", - "fileName": "giphy.mp4" - } - }, - "date": 1576165424, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2375": { - "id": 2375, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Дружочки пирожочки, с вами было вчера чудесно! Спасибо всем кто скинул мне баблец за шампанское! Кто ещё не скинул но очень хочет, номер Карты 5321 3046 8801 7638 \n500 рэ\n💚" - } - }, - "date": 1576223469, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2376": { - "id": 2376, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вам спасибо" - } - }, - "date": 1576223578, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2377": { - "id": 2377, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1078212296544616505", - "emoji": "😘", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 21072, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1576223581, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2378": { - "id": 2378, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCu0AB5JphiX+8fzq5fKBHuRgwHcVmGQ0rDuT7EHc/nR8o71X3MaMtRqBp/YLgKQAAD/tCqv2aSS4eE7QyjOM1fy57ms65d45zIjdeCaSY2rBDatMWAZVK8HJqb+zWxzJH+dQWbEu59s077a2eE/WjUWhrpeWchATbk9ttUL+AyOqwhQqj8/wDOaKKTdmUlcNOH2Zn8xQSeKqXCvNKXWEKD2QcUUUJhY//Z", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1576224392, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2379": { - "id": 2379, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCqjcYNSNGPLDdQe9Qo6KPmBLU97jeMAYUnp6UACyuVKBjjpn0FCoQp+tNgK7uQc5GfzqZJFEZIXgucd6ACWP52lcEKScYFV0G89gO/PSty6AaIpgdOKxZfLhG1Sxc9c9KlO5TQCIpJjenryaJVMaKrnBzng1EzcCpY7hAgEhzjjmmI1ZpNxJHNY0mXnY47miioiVIjc/NzUeKKK0IP/9k=", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1576224393, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2380": { - "id": 2380, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwByuTweParJk3Wz5x0OayEuGB+c7gKDO8jYB49KVh3JxGVhMhHDHrSwQiXJyR+FK9xuEcQXgCrEMgjXiiQIxu340biPu8DGKsSxJHbnBJPFVu4yeOlFwJY3IdR26Vahd2jB6mm2zpEkj7QwAAI+tSSlIDzna3IxSbuOxQDsV2liV9KfDEJHYYOAjHj1Aoooegi3BblLKUyMFLFSo9cVDckPjBPFFFLqM//Z", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1576224397, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2381": { - "id": 2381, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "368147511233216721", - "emoji": "🐱", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 19044, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576224424, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2382": { - "id": 2382, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Безудержное веселье!!!" - } - }, - "date": 1576229303, - "senderUserId": 146686085, - "replyToMessageId": 2378 - }, - "2383": { - "id": 2383, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Мало фоток = трули безудержное))" - } - }, - "date": 1576229500, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2384": { - "id": 2384, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ребятки, знает кто, где можно в Москве купить вкусный чай? без всяких там фруктов и трав, просто хороший черный или зеленый чай? и чтобы не стоил совсем как крыло от самолёта. Или любой хороший чай будет стоить как крыло…" - } - }, - "date": 1576243509, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2385": { - "id": 2385, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Новая серия из жизни президента Туркменистана Гурбангулы Бердымухамедова подъехала, готовьте сладкую булочку и чай", - "entities": [ - { - "className": "MessageEntityBold", - "classType": "constructor", - "offset": 46, - "length": 26 - } - ] - }, - "video": { - "duration": 92, - "width": 816, - "height": 464, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAXACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCNjhjUit83+faoZD81LHIqhRtJcnoKztcq+haWXgHPFKZAY1IIIx/SoyrGBwIHU9ASvSo3VooUEi4b1zxQ42GpEoYGXPpRVZHy/UUUgYFS6FeFFMSN4G8xHG7B7UUU72EPW7u1yBIPypxM1wm2WVmB5xRRQ2CQ37Kg7sfxooopXYz/2Q==", - "width": 320, - "height": 182 - } - }, - "document": { - "size": 9188083, - "mimeType": "video/mp4", - "fileName": "IMG_4173 (online-video-cutter.com).mp4" - } - }, - "date": 1576507315, - "senderUserId": 356765513, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "2386": { - "id": 2386, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://music.yandex.ru/album/4434084/track/35526360", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 52 - } - ] - } - }, - "date": 1576507486, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2387": { - "id": 2387, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Какой новогодний мотивчик!" - } - }, - "date": 1576518215, - "senderUserId": 327556368, - "replyToMessageId": 2386 - }, - "2388": { - "id": 2388, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "action": { - "text": "%user% was added to the chat" - } - }, - "date": 1576580395, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2389": { - "id": 2389, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "welcome!" - } - }, - "date": 1576580403, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2390": { - "id": 2390, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Велком!" - } - }, - "date": 1576580740, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "2391": { - "id": 2391, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Всем привет 🤘" - } - }, - "date": 1576580807, - "senderUserId": 88888263, - "replyToMessageId": null - }, - "2392": { - "id": 2392, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3323402743993703", - "emoji": "👋", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 20711, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1576580842, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2393": { - "id": 2393, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Привет и велком" - } - }, - "date": 1576580851, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2394": { - "id": 2394, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "828321890853453889", - "emoji": "👍", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 22310, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576580878, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2395": { - "id": 2395, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "action": { - "text": "%user% was added to the chat" - } - }, - "date": 1576581076, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2396": { - "id": 2396, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1360886329340072505", - "emoji": "👋", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 13178, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1576581098, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2397": { - "id": 2397, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "welcome tozhe" - } - }, - "date": 1576581156, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2398": { - "id": 2398, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "👋👋👋" - } - }, - "date": 1576581199, - "senderUserId": 802771524, - "replyToMessageId": null - }, - "2399": { - "id": 2399, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Раз уж мы тут все активизировались, приходите в б6 за чашкой чаю если хотите минут через 5 принесу" - } - }, - "date": 1576581206, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2400": { - "id": 2400, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Так говорят \n\nhttps://incrussia.ru/news/mat-na-rabote/", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 14, - "length": 40 - } - ] - } - }, - "date": 1576588229, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2401": { - "id": 2401, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "action": { - "text": "%user% was added to the chat" - } - }, - "date": 1576662980, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2402": { - "id": 2402, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "¡Hola!" - } - }, - "date": 1576662990, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2403": { - "id": 2403, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "30651055582740949", - "emoji": "👋", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 38478, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576663074, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2404": { - "id": 2404, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "источники приближенные к коворкингу сказали, что 25го на третьем этаже уапще ничего не планируется, так что 🎅🏻🤶🏻" - } - }, - "date": 1576669895, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2405": { - "id": 2405, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "806062690265989140", - "emoji": "🌧", - "isAnimated": false, - "width": 512, - "height": 120 - }, - "document": { - "size": 5016, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576681649, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2406": { - "id": 2406, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "^ офигенный стикерпак" - } - }, - "date": 1576681658, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2407": { - "id": 2407, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "806062690265989158", - "emoji": "🙏", - "isAnimated": false, - "width": 512, - "height": 296 - }, - "document": { - "size": 2538, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576681668, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2408": { - "id": 2408, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "806062690265989150", - "emoji": "🇱🇻", - "isAnimated": false, - "width": 320, - "height": 135, - "thumbnail": { - "width": 320, - "height": 135, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 7386, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576681676, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2409": { - "id": 2409, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "хорошо!" - } - }, - "date": 1576681683, - "senderUserId": 177121435, - "replyToMessageId": 2408 - }, - "2410": { - "id": 2410, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "806062690265989154", - "emoji": "🍕", - "isAnimated": false, - "width": 512, - "height": 132 - }, - "document": { - "size": 5812, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576681759, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "2411": { - "id": 2411, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "806062690265989187", - "emoji": "👍", - "isAnimated": false, - "width": 320, - "height": 172, - "thumbnail": { - "width": 320, - "height": 172, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 5036, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576681760, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "2412": { - "id": 2412, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "582458961895096470", - "emoji": "👌", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 20814, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576681769, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "2413": { - "id": 2413, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Кажется у меня появился второй любимый стикер пак" - } - }, - "date": 1576681780, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "2414": { - "id": 2414, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "884547634142912994", - "emoji": "😊", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 32112, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576682341, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2415": { - "id": 2415, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "В Москве у метро «Новослободская» появился первый филиал Сбербанка, совмещённый с «Макдоналдсом».\n\nНа самом деле там стоит одна кофе-машина, а еду, судя по всему, будут доставлять из соседнего ресторана в 300 метрах от банка.\n\nhttps://tjournal.ru/moscow/132076", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 227, - "length": 33 - } - ] - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAXACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCERgcvx7VZhiXcrr2NVJXIKJgZ2gmrNpOvCdzyKQ+hLOxWY4OMelK4jcIwBPvjGTUFw/75znoAcUjTiNgpK44PNAi20SS7U2sMDGfSio1u/k/drn1P5f40UxFIOqhNw6rtz7/5NTwKiKGIBPODRRSK6DZFYyFlIBPB4pn2UOwZjk4oooAlizbxKOCKKKKQj//Z", - "width": 1200, - "height": 675 - }, - "sizes": [ - { - "width": 320, - "height": 180, - "type": "m" - }, - { - "width": 800, - "height": 450, - "type": "x" - }, - { - "width": 1200, - "height": 675, - "type": "y" - } - ] - } - }, - "date": 1576828386, - "senderUserId": 356765513, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "2416": { - "id": 2416, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Зацените что у нас на первом этаже замутили" - } - }, - "date": 1576828397, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2417": { - "id": 2417, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 4, - "width": 200, - "height": 100, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAUACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBvmBM5wCD0JqaWRRbE5wWHFVSjSynOOepNLcgMsY3dBSKHrtD+W2Vf0NQXMeJB9KT5pblcSAuMc/StTyo3GSoYijYRmxwK/Q4OKKueXE0W9U2/hRUspNGUZGMhUnjNTyMdxooqiRlqxabJ64rRjlZRxiiihgOLHye3SiiikB//2Q==", - "width": 200, - "height": 100 - } - }, - "document": { - "size": 65692, - "mimeType": "video/mp4", - "fileName": "200w.mp4" - } - }, - "date": 1576828477, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2418": { - "id": 2418, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "157133981274342170", - "emoji": "😨", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 24366, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576830829, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2419": { - "id": 2419, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "@alexanderbalashov возвращайся, тут и бигмаг затащил, и пенсию перевел", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 0, - "length": 18 - } - ] - } - }, - "date": 1576830905, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2420": { - "id": 2420, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Хлопнул бургер, как говорится" - } - }, - "date": 1576830929, - "senderUserId": 54158593, - "replyToMessageId": 2419 - }, - "2421": { - "id": 2421, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "у фейса?" - } - }, - "date": 1576830941, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2422": { - "id": 2422, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Не совсем" - } - }, - "date": 1576830956, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2423": { - "id": 2423, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 37, - "width": 464, - "height": 848, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCSRdsoPHDd6nd4/JCgZ/qaZc4AJ/Wokkjjk+d0HHFJDY8WwIywyaKsZySAQSOoFFMRSgffYMxOSM9arM8TYZ0LYHY0lo4+zTLU0UGbeN8DvyaQxbWUvM5QAZH8RxRULTurYUR8egop6jVirE2N2TgYq3CnmWqfvDweh6UUUm7CRYigQDITdnu3eiiiuV15XK5Uf//Z", - "width": 175, - "height": 320 - } - }, - "document": { - "size": 5697250, - "mimeType": "video/mp4", - "fileName": "IMG_0078.MOV" - } - }, - "date": 1576831028, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2424": { - "id": 2424, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Няяяяяяяя" - } - }, - "date": 1576831177, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2425": { - "id": 2425, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3323402743993745", - "emoji": "☺️", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 23491, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1576831196, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2426": { - "id": 2426, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "643524467607209995", - "emoji": "🤝", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 43072, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576831271, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2427": { - "id": 2427, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAcACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDW74pcH2pB94UEgOMtj2oGLg+1GD7Ur42nJx70KQQCDmgLje+KKD940UAA4akYAtkMBSmjAoAONmNwz603bg8SD9f8adgUYFAWD+KigUUAf//Z", - "width": 757, - "height": 531 - }, - "sizes": [ - { - "width": 320, - "height": 224, - "type": "m" - }, - { - "width": 757, - "height": 531, - "type": "x" - } - ] - } - }, - "date": 1576833788, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2428": { - "id": 2428, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ахахах" - } - }, - "date": 1576833808, - "senderUserId": 54158593, - "replyToMessageId": 2427 - }, - "2429": { - "id": 2429, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Во сколько у нас рождественский сикрет Санта? Часа в четыре?" - } - }, - "date": 1576844804, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2430": { - "id": 2430, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "О_О 25 декабря же?" - } - }, - "date": 1576844833, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "2431": { - "id": 2431, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "почти: 25 декабря" - } - }, - "date": 1576844835, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2432": { - "id": 2432, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Время" - } - }, - "date": 1576844841, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2433": { - "id": 2433, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А не дата" - } - }, - "date": 1576844846, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2434": { - "id": 2434, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "только не в 4, давайте хотя бы в 5, я с 7 до 16 работаю из дома в чатах, и в офисе смогу быть в 5" - } - }, - "date": 1576844880, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2435": { - "id": 2435, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я только за. Мне главное чтобы не раньше трёх =)" - } - }, - "date": 1576844922, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2436": { - "id": 2436, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "B7" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCLS0Ee6V8hjwK0laN16ZBqgXMdsq7M554pbeZ1ZVxhPWpvqOxpeYAOKiaYDsaiZ23kDpijeNuetNgQPeQsc+XIT7LRVlSDRSukNNoqD50xupjo2RtojOKe3J6kEUgHR5EeCTnoaeOmKai4Xqaf2oAbnbgc0Uj80UAf/9k=", - "width": 1280, - "height": 960 - }, - "sizes": [ - { - "width": 320, - "height": 240, - "type": "m" - }, - { - "width": 800, - "height": 600, - "type": "x" - }, - { - "width": 1280, - "height": 960, - "type": "y" - } - ] - } - }, - "date": 1576845005, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2437": { - "id": 2437, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "570116660405469204", - "emoji": "😐", - "isAnimated": false, - "width": 320, - "height": 320, - "thumbnail": { - "width": 320, - "height": 320, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 18150, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576845037, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2438": { - "id": 2438, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "570116660405469205", - "emoji": "😟", - "isAnimated": false, - "width": 320, - "height": 320, - "thumbnail": { - "width": 320, - "height": 320, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 17384, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576845039, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2439": { - "id": 2439, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "675168768736887083", - "emoji": "🙂", - "isAnimated": false, - "width": 128, - "height": 103, - "thumbnail": { - "width": 128, - "height": 103, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 31310, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576845124, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2440": { - "id": 2440, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "кто-то пьет, а кто-то спит, кто-то секси (я про Сталина), кто-то вышел на дело" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB04zcvj1pQvFP27pWJPenyBFiYg/MBUsZX2EnAGaZdJmJVxznpUiSOMgP+IGKjaRXdQGyQDn160lLWwNECTupO9zkjIzTpEnlf7wwBnINNktpBE0jr0HFVJ18uQgcU1qBOu8zBCxzkD6UwExyMCN2OMio04b52KjHUVMsY6t9BVCLBMsyGNCST2zUc0UglMkqEjHrRRUbMroWVtLZ0DbTkjrk002cr+ijt70UVQj//2Q==", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1576845317, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2441": { - "id": 2441, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вы там болтайте болтайте, я посплю" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDRAFRXQ/0Z/wAP50SybI8jrkAUy7kAt3GemM1D2GVIoDJ3AHvQUKHmmo7bVQHkDOaXJLZzkd6hxSRSHqPeilFFc7GF0zOoRMbgQevqaoSzyPIwDHBIzj2pshkHXPPc0kMRdZGDAbBnB712ogmaTbKCOQMfjTZro+YQvAHSmLGxQNxj0pgw5+biiyYaomE8g53de1FMYq5GSeOOlFHIuwrl6SOP7h+cep61YhWOOIARj/Giik2XuU5Ufedse1OwFVJWCXB24K5z60UU4hMNh7A0UUVZkf/Z", - "width": 1280, - "height": 1273 - }, - "sizes": [ - { - "width": 320, - "height": 318, - "type": "m" - }, - { - "width": 800, - "height": 796, - "type": "x" - }, - { - "width": 1280, - "height": 1273, - "type": "y" - } - ] - } - }, - "date": 1576845611, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2442": { - "id": 2442, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAkACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCdR8wqlLM4lcBzjJ71JdSMX8tePWo1hTyzuzu6g0thvUR5Xz1GMDqB6VYhy8RAxkgfzNVcJ0Ytn2q1BgRHbnoP5mmIQxkR7/fGKKc7lhg0VKuUPdMS5AyG60FR6DHeiRCfmB+amRuWchwM+lDQ1sQtEWk6EDHXFTRcRkHjjv8AWpPlXJAwKaGV1LHpTuTYQiioHnJbCce9FFh3LYOc0hQMwJHIoopsSEb7wFQjJJyTz7/SiikgIHG1gR3GaKKKaEz/2Q==", - "width": 500, - "height": 450 - }, - "sizes": [ - { - "width": 320, - "height": 288, - "type": "m" - }, - { - "width": 500, - "height": 450, - "type": "x" - } - ] - } - }, - "date": 1576845631, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2443": { - "id": 2443, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я за то, чтоб отставить разговоры" - } - }, - "date": 1576845632, - "senderUserId": 327556368, - "replyToMessageId": 2436 - }, - "2444": { - "id": 2444, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1360886329340072497", - "emoji": "✊", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 12369, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1576846265, - "senderUserId": 860139781, - "replyToMessageId": 2443 - }, - "2445": { - "id": 2445, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А че, отчёт с корпората втб будет ваще?" - } - }, - "date": 1576850777, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2446": { - "id": 2446, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "там шумно" - } - }, - "date": 1576850809, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2447": { - "id": 2447, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "119412984320622620", - "emoji": "💃", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 27778, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576850821, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2448": { - "id": 2448, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "954082055153516571", - "emoji": "🐊", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 45080, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576850824, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2449": { - "id": 2449, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Они пока драмы разминают" - } - }, - "date": 1576850887, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2450": { - "id": 2450, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Там группа с барабанами" - } - }, - "date": 1576850895, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2451": { - "id": 2451, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я просто надеюсь на вас, котята, что вы выпьете их бухло и утанцуете их сотрудниц" - } - }, - "date": 1576850925, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2452": { - "id": 2452, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "442315385912426582", - "emoji": "✋", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 23300, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576850933, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2453": { - "id": 2453, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "582458961895096488", - "emoji": "🤝", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 42802, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576850949, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2454": { - "id": 2454, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "60854042997295645", - "emoji": "✈️", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 29242, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576850970, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2455": { - "id": 2455, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "не знаю, зачем, но говорю\nесли что, я в профсоюзе в двух шагах\nесли кто хочет, велком" - } - }, - "date": 1576869807, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2456": { - "id": 2456, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "тут пиво, вино, коктейли и радость души" - } - }, - "date": 1576869863, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2457": { - "id": 2457, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3664822579234188", - "emoji": "☺️", - "isAnimated": false, - "width": 320, - "height": 320, - "thumbnail": { - "width": 320, - "height": 320, - "type": "m", - "dataUri": "data:image/jpeg;base64,UklGRvIaAABXRUJQVlA4IOYaAADQogCdASpAAUABPlEij0YjoaOnplCqGPAKCWdtB5PkQEjGK9kcVkQjaCw4g6SnrDrn2GdoXbSvF8a6s/HdpuCUiSWtfQA6YHGepK6EimT/rJtZPrH2D+kB6HP6kkuSn/V45mJOESuGJCXwltNeFx45Yf5VC1Msc0DsNGeh+9FSLT7gMlo5ZjCm/wPQVlRMDDjXKEeM+8l+RyzK9XGCrKXC2+ded/jouD15dKD+oKsUivBuQFa1jZGcLdi+vWAo9tblTn29rX8SEjDoZOo9u7Mp1IEAURS7jW/z3sJEVyb1IuNQiYrKPi3h7i8yssWuTglBsu42HCxvDz9YFNfs943yXyUh9qxsK4SpdyMMcUihDyvmq3h8d2PF/UPmsx0AOB1vno2cU4Qa9OyTe+xs+eoHoUKjhdUPK40Icxdz0qcVQD/mi4a1iKlIAj2CRqJfASKpAlmJ83abxf4FhYZ2gIBBEVxPSQpXOUO5pFfQfUyM678ITjkoYgpP0R3NWwzzajk4MeGmcSN53RAYw1IfMu9j8D5qCQ9K1zaUyfyH9iYWG/2cjnLQkXt47HVLk3l6Gt7IIPVhKAfvv4u0zwByh4HtgqlezEkXZufJyaxUJ+feqHxjCy5Qq99qVSUe8DqxKfbjFy2ZbTyPPtkLoRkWKLcQHyoWDAZRySW2xxURqUlHYNwwY4h3IO7GYQSf2tAKynGxZK71x7EDWAiQQXn0ycVjKypcNzc+Ga1/5kcYGxGGltL+DxNCYbGMyKw03mhMFqAU+EugEECHpEFZEgI+W50p4keoH6RTxHiQMyad6pGURVL7x4Ko/dovCmmWZkQf32SdPaPJROED5wWwXeU39DREfZUenm0SDwqRCsI/mOlYtX+64EC+IM68IhqcQ/BFowcZt79egeLDNrEKx/752pBQuXmF8Kdn31UlS07WniY99xvMhxrwvmakc04hBKjW5BvFHUydN6yT2vvlGkaK7H/N7I7O8tMBv3E6r25YelbTY6GkEVFBQFJURYT0fvJzfixJhMQmRces9K905nkTPsmnkSF4BdnBP8pAU6rYIr59O+H3zgsW7En2S0TI/UWNii6NSCvoa7wwqLjWG/gbX454M8o4NfbFmqiqfRhyMxAwEX5vHrJ+SJO9iBMD4NOGilGeipd57Sje39zomv9LQFwWvUEvc6RnPF7l6dZjsWV0FkN02S7VY0WZus/OSJB5rjH7bUwrnYzFxZbxqzyHPXImN8gNCGzIJUrlB30bDqu3RKg2JVnd+5fpHyWDoD1p+KSO4LJoFldftkakaZpXMYrps31pI3oDo4eVNZPusQ1H5tY7Ri9j1AOse+J7lkSGyjqPJk2Olb3hyJemmWuEo4guaXC0TNQ/9s4BWmZpls/2D/5Rwo4MZVqnu61dnvmMqBSLAnI9gveQpAN1MPI7+lquWSRGwDAtRpV28qBvQyiQfS4QCVMA5Pg9ENtKNjB3EQlQ2Viv+VigG224tUwms1mHctMP1d6xuCmwHdbb43KhHXDKzwN9IcvHuIYGn/FVLhBmWyBO+wNDaZBK3PTOqkfUQAQqAXlPY81AowoHbKilh+GNNBu/w9bAheIGV2eSZgZ77AyKKItFyWLjnCFqxoGyidsSxhDP6rg951/nZH7n9lrdbRG2BkEB6ll6MGJKyLHgWjwlwfLcU8me3bLcALDrottt2jnJ8x/S6/HpmHl8s7GDlin8WzuYH6yi5WkMrongMr6ZH7H57N5HXvfnMsAA/v6BS30OFfP+2eVh9I6UrWP8gBMmMJIhV0R4w2L0C3FgmPoGHkrMPqqM4YEkOTl7k8vEUSBrn89qRfTOJQhSM+sTY/PTuOi2jmkuR38H7oINDRNsn9ncZE0pF9V+JaGzsD8VRKtvDvLUiKU40cNjg/Fb1fwima7++qEdypk+uGcvWVK9Hcto6k8KoG6W7aqNQ8tdZNbIluKCjaHfM9vq47KNfLZ5Vf4RDYGMuFVOZR1DCvxncyk6ZfC7uFg7Bxu2oS7oTEdL52E/3FnHZFEfBwnpcTepJUc6APRRJ9ZYZH8QO1U7oXomPSE+7RHRMjLiOvqO2Z60ofaxfGeADzx1WyUStVElM83B1z4j220dP7Ev6uyUbbo0iSy3jWkqE552WbgZ0a8avPxPara0+u/dZYbiH3a4hSu7rtNvF5LlehG0Hx/XPY6wzZoz17pcoMr+ZvxWesWNzFNk/5KpQDa5R0EINpEEZaynY0ZLbEWXA9Hllff+m7CeMys/i3uiaoVChA3FV7jFgHvj5nsfaRTlve7hH3P5WBZVV6QYqcEQ8Hy2h0HCh8aFKV5mR0DKvfEQ1tIEwXLIN6y2P3R65lzMoQt26zTwSbu48JkE4ltCRaBppjl17y9TtBJ/k2nkHyvYiVb04CMceNyevQDATKsmxbygFoRf1thxTgXuNE0A0RbvFe899PseNwIjL41xgRSWV+iod7aAetB3u9A2pV8VmjFw1gqDl1CHFWywH5k8C9nmexnZpUAHVpYW6d1nDYUw30ydpCCiVYermpogRwh/1A6iAvzuL1CFCQVcKMIT/SVmZYwZy3N31qd5N99OH6uAOhvuDolZOTlZJnton9r4ToskHy8eAHr7ibtiEmCQdlocTscxj9zPDWiUEncmUqy98HtPKwatvI51oAdpf9qAQZ3NrUswtKOwkOF3NZMln7DrAedUrkcPxa71VsV4N8sAU/i7TR4i664kaqP7BvYDqRGv/y0I5Pq7/NRdkEXP2MdjUrtSgkS0rvhlhk5i6LEYCfMhUUrmZ1RzAPoqum7/CNeLnjcmJ0z7mnV6UKKsfgY5LHP+t5XcQbhZKA01/8jRfZ5rCU6NHFuxcOxLQfOjYQVpWVp8BS4Pm4ZmxdoNqhDbH2/Ngipyd4MqjpYjDucYOquy2HCgId0WywwX86z/GnqDf+/+T//YOueRWwqswncBX0NeYJmJ4dGvlP/wd8o1VsOGLs98cX5XBOxkiM0bwS0z8/cBEDu4Xzxw327FxXpfNMeDvUSIN3yAHfmlFQaUlGhbtAW1liRAPZQZub8mezztNnSm8HJqOSKFRGbOuOcN7+O4IJmwMcumCwgFlfjgEg0V0UqySNSUJSDjzm+K73AA/sOR8ebUsT60m7ZcX9rctnN1RfsOejzV1Wx+d9Il0JxrP/cPevEljkS+aqd5GJshZYvb/nhksbbyYCKpCEAOH0cptXjCaNNylu2PSBHjzc09X3U9oXVtNAXem4aGVEeez6FI/T8QEi/g8/YEosfDVBZhpk6HaphB7hGzXWFECwLJdWpZ9R0/hvioiL1/JQN2p3m4zeE4mIoY9f9juRIP0aCsLsVsiSoM6IG2nDIE/BiI/4rc1YyvloiHu8KfPqTbxd1/TO42wWNkfznySwenRO5PZLJX4la0rCCpG+MzhhrF+R7CRzRQf/xShbxAVf4gWi0X+2guPQ3TPk9YRiVLketLuPSvz0WJkc1JTCtcbbJPBMSGqhtBbjmYqx3kKsp09+v5nClL7tLoE4SksObyRbkVUIjDA8n0s66U9JP+xYSGA5Xw9DyzblBic9UZto+ql329PzVpamyLE3CD+zyI0OnsJjDzjjqRH4cQUeBvD/TCK/KVYhcl7N7c7dyPeyclsyaGQGF1kQSBBmTU5+YMqXhiuzqTFlZ9BfGDghk+tvTiJuhX2O+2/0P9obXk2aCbdnCDaXsKL/qQUU3qc1bFtAdWsiHpqDIlURFwH8qx2yNicvqbh79vtpoZ+OZGvgk8O3Em7LFK/LTQ6bRiBjSgJzH3a+RcApVncJIF10WfrC8PPniuM3I8OzaCIiEo7lXLjk/VINv/MJ1yZDKxYTVUA9Sy9x5/zOi2o2Jy+zWPjrhTmI1eJF5dqOvvidXSpz+hOhEz+1v/GTmLg4FtURgcrKLinbN4dJKug/qAn0rICZ6SArNNTj8j3wWns8fV07ohS7ytyPOVm4mOUWxX8PPN2PAuDjDh9SSf0Q+aFqayuSX5Dokw9X9wD+ZZGr38nlaeUNSFzWDtrK3LuKoEiyk5sr5tDCmvpWjt3ZLaJklEmCcVu83Oy5s+DPfFPdd05lgQkIB0GKp/005dLya4Jios02baxw9bsCT1QtO4Wt5HM8K2zpEMNC/w5NqZeDJIl1JO/vtmy169eNNTHqLeJFfPjGliTQsqOrJaE1yFnPj5a5dWlts1VNU0Kesy6CmZLFDmxP2iuK4AKZoGOLGQ9WmWpYGcjBDmxM4krI0og4OTQJzJb6VmBHbKVCf5SnQcgCXSV2s4Ju2l+o/l0fT5XHuU1fgIUPkmL7i8nfs5reNWpEJS1GvM9VxXB8iySz8c3nESQBSMKjhxvLkC9bSMPqAqYy+qylHX8VekNBSWkZxYAd0/Dp5zWpQrsxxZE3ut27RuzGzKsFFoarGsWcsRs0XgjchKrDNo89KAe0azUOgISLYkVBXED8LUBmOyCyUCYBSm3PdsuvRaoRaHqx3g8A1G6f3CoWorfU6h5/h7bS33UJP1UJr67VLJB9eFmPr5KEuh8qubsXl5IDXztTV2o8/VcwlQwl+VUMi1QKkdjhjf6RwtbT9GmnVTO1ZmR4WqYWv99hvgT5X0rf/HJf44X18q+MvroHbauDk45ADL7q2LinvV5iCImaTWWnz/z/9Nj4XgnGeX3X8TdYZXIx38Lr/IuGPeVfd+buPIe1/I99cvmo3f8oxRY033bcmH6fJOZXe7legJ4TsH+THmIRz6CDkTwqafrOZ3Xto09f7r3TEHss/ZU/HT5d4gWAHl47FFPV8uwYp8y0EzT1wr59XF6llZLeVfo3j6b/WGi37Yx7karmuPZ3Zvx/60M9IC1i92psM4MTfWLyz2e9i4frkPskrXqW/+6+P/wFdUjqViv2s0wdGS7PupHK8sMxyy3dtqksS8R/Kjc//Tf5De+iueSaAixqAB+szoNTJMDMY7mx1Va+LPbbxTv1+JRT4XzYeEsn2ROQbiScqk7dteSb07HhwdsWstPJaJ1MpCKCxppgoSY+NzNAAJIMEVKd0F89IQ2wiXBRFL6Z3DiqQpp5WE+G22lea5F/xPm9ynk24euVPspADgxkTv9xZtesuQeWPNdXf0FPHiqQXntx7Rfor4AqYrqujUOog6ur2OnekZA7M33oUQDqPthlbMImVsz6pyBfXhMiCvkMr5LK/nv+lbGGj11EXz7W9M2aZlePXX7TdpenhCnrPzw7ftixn1g7cv8+yeMIozYw+WzCGHoEnhWEDVfiigtnfX2II+Al1D5m/yGF4PW9/HV7XXR08ItyaWtperBDCpdIgVCaX4p8SYRmWMX+e3D3LYhNvYsDPG44KmWHGSVaKFnjU/LON36jziGMkGGYm8ls52xxxrC68LZH0pI/2JryrLeyTySt1c+dpepUM4nuvwRj8khwlGBkDDkT04JWI+HNs7veVvlHmjAeO3IGOPDE0cUVz4mVAIRThLQzUgFMPTaKVV9NVGzLVVZZgtPjLEG4dBKrmW+4981Tl+JQk97d26imFN04C4xeTXwH0B6v0n4+rTbTGpTJkvJMDnen3r9adfP/uDtomHxfbrwpqRdxvV6tfQ/rpnYHovh+Hd9YhYKiqx6kguCNzutCcapRgAYmtuYaLPHfraENA9VKKI4wOq0XzzjZFdmJ3VX75gmKzmLXUT8RHovIpr2mv/CWCHu13Omv0gKPXm1DvDjx62+riwIoV8+sIdefrVY9nMLjSUvIpPi6tbri+fowhyAOnAw0wZEfKAPxcmWeSFg0C3iSckfq94u1i9PypcBfy7bb/UyDRg0rDyUvhu2EYQugQzjT+QI9Wr4ZDl6WQrbzMFQ6ojdM9BXKYjKeQFyyc4a4zb1/xz5loG5sBmqr/GMWKIYA36o7B77a7o5HYHBxtXecYcCzX/u48O78AotnXlB0uBj0i8IWkN94APvNN8jcGT2Yn5n3sIiHwYzeuhIj/sfW8yehRxAGqkbhG+hNM4JKYrSkxbeAWNdLZp9adcPOoQzcWU9KBr7ybtwn2+YEXtGWs3yvlnQ1xjoE/WZCdZbkZIQydFxa3jQ6CTobDElDgZJ07HTRxurUwdREZKpTNWwy1COdIfIkhraytVzmWodex5rQD0V+0f7m00bcxTp36KijO5cHOAzcX8EidjycemqYwX/rzuArUhuLOSPjeFDKMm4vMXAejBmDOJ5Wa2DRq9FsHn+A9nfDFzHEKamUSdFD2QkaujLQiV4fftw8Jw7xoKEFE4db2m6mVJ/w144szv2eno7kH8SdldF9oygokpEHyDT7jZ0CzqdgRlXaLDGoFk1I2qyeNl00IHC5F/MXl0QRxVpGZwh4RcZkDcxFx0Or3H8IbU0x2ythzpRyuJIiGBSBkZJ48YLXX4ogr0X7Eqd6+fjNZyUXgGFB/oNTPBCVozHDeoTAjj6brPGLelHxENeqG2+Yc6KAp4Lh0vw5Wrf0/dn4L3TmF10Q3zDRJDZhlMow2p5IZJGzhjhC5XYm0hFRk6a6ntnDvsKKWunyE4MuxTFkzdsxkCEZ3Uzf74eE+oVJSgN2lqF/nHcHAZGwkm6mqMGzpl7xuViUj11ZPb6UXRosjUp5GE23lqPAYLLnh/gXgbXhUJEwnT5Saf9yewTfLkUK1LXJGquJdNrilx4RxRGteTqO269vij0vS0Dfwt6CywdIm+ssvr9oJm02rjVZ0e1TvJgnBe2Ygdtey/mqPQD07C7MGwv7uIiT4DaAXL+7PVJQjbrFuBpmKu5CHgv8h00rqgqXpP4/+cy1fcs9PRKCkBmqK7zLolLBbTNON1DLT32sGjhHjJ+jl33M3LoOiaQlzV8LkJfIefP99GFR7Qjtd+57xaZcvAHZZ8kRkTCWbYg0t3rFOvY6fv+FzJ7HzYp7my9z5O/W1hBPKo5aIPHSZZg/SthjJojGvPqTisEogQt6hdsBnt+pv448fv/LcNwUo4oLZIrfEWtacZ7XBYZjwh/A9FEnRJ+ursf5DE0Dsyq8f6LUSd7mUdM5ncS7rcyCrkJJYUfN+3h/5VHajKy9AvIez0evCrBfnfDrR+djmoYxF6sCiQTvG1ZTJS2W2jOB0F1wLUjT+/DCvXu6JKyu0OE5Hbfs2km6FCJaLZqevwegRL9Lt7mYx74BEpoyGdLY6fiUIYDz8EhMur2SGv1m6orEwrk5cYaHN+t6cBA9wU2H6x+GVC4G4I1u6HtTHpvZW5dpm7uq0OmITAHL2ow7W9AoPOgGFhxSu+jcQN2HjA6AAMyt+UA6msBBsU11BEiroIVeRY3qSWJ71KhE6EHnRovcX1iB+mhwErjCb1q6aNnKzWthu6tWZ/l8qLqoeau+0oEhPJKNqdEumilm8ZuA99lQK0RrQNgZnAyPGIz3NCb1W58x1lHTZPahOHgJLiCiDGQmG4u67v1hprhZH8tJzArbbJ8rvEEziljeoX4/73Bxx107STYlJhZWoiwJ0HlcZF9HqVeqAdK3ZWoh8ZjMoXiMfLHZ8b/oKhQH6LBR1CD9votOu0xfOztW6Q2OSX4A9YOAg8jYFJEOwEEhAnZXDejzMpTJUbJbtW6BI2O3mBnhtsuZ2ESsWb4HP1hVF2vWispeE+AkosBUSOh1RwuCK1Sqj70tXZ2rrL91H2Oc/Iseyp9QxYiqopuD3X2NDPUrWhZVX/LvARQP0ZknvIhGJceN+NRI/rG2xdGnBH1T4nTAh/GnfcZAdEjUZcnsHe1bq2xCbScjhPrJy8usYwmw9JE5FpTqOJmw/+c8fM4eCruUyUoWM0cd6dAo239BpQB5vzQWOph1n95QWbhej/DdWY7yzfnNccYWmiZRa5+4vcM+cJxw2KuLam9iyR7wuznRG8JFfUGMuz4Xy2S9CsnckFLizMDr+nWEetFNuqlj115P8UQfgLjfVqB7+TjiDXgMjwoL5OfnO0Mf77DYBNS08xSbV3UTLCqUaovdEIZBe/B0bitzfxfIpAh/PGI3x7vfVQVzCVVUcmmokp8x9Oh544oyF2+qwLqZ7DhGXDMSBzBQHXze9iWBOcjdzMG1KJ153sajbJJPaLh1cclg6JjKGUgWmckkFxcL5R/cb76WlitG865zRc370cT0w50lnmYKlVNI9gmNKz0I6ufCxLVztxhuh4VYqwbUC4WYeS2HWFwECwzZj8xz3k0IkMwcb7R2WrgS2tj1cJfA/9ubPRYTqhw4yJ2I5l04IYt11+M02BG2clC7Gy/N9Nb6lGEQ2IofJpEogg8agZcLnuTyl0jdQqD+zux51FHVQgNl19DdhKcZR6YwFuGiDXRuug6QNCGWPS8cE4bMtHtmGesimciTtBy8jZdblhW+JRmLM+B6BKmGZnYoD1BQ61GMmc9knG2Va+qHptGprZxaWlyvhB+lxbMtBQ8hVIuzalre+pjDMBKa33FsDjV1+CVc0yZ+I9nAABIAc/2K4XKfh/56DoNgvwT+B9Z5j0MQpmerM5bx1UcqIK9NbyxbVD+GeK/niqNd1o8mcha/RDfbPAYZHlgXIXHgZS7aRoHH3UJV0CPdPxmo50QRLH+wfySSCxuAg0Gmsi1MFDNJM8e+0K6jYiSWXhDsTh6e8kS8H/m7EZBw9u+lsegvgkzPzgTIvmxjGIZm9r1pI2XzBQbohsuf72Kj16q3XXdi0x6S3VJWPaVAIitM9AOOzpDd7IlDq76ql+PbSpGrTaWOmnVuXdWmFb73OgZ1v2YMF9A+cX/AtGt+ue7CFleYkWBXwGApkXbUJ9BXsKwR572Lzjf7wjbp5w1xf7a713iVdQ2X3WdSyzYUQ0TirKo/fpOYiAbQLXEnHVnwmcIqU638GIJgQleuf1W3JrdHv9bavbjo4kPREDAHp3kuRWXFuz30tJZIXsQ1UV/BaRaWCBX4YaRsNgwhRmcZql6ZD5QOSXmNmuPSgZQ1KZxDhLenYRk/JLhSQfhEpAo3jwFGzhZ4LXInwWC0H5dxpuEZ2gAL546sXJqlZ49PmJP5tbrXIbLCkgg94y+/SMEdGjW4V9p/wVKCtTBgaujNvXH9wLGDRjX9/UFD/uUuevg0Td5uX3Rmr5mOtihmitPMdKHlTwK3bpUS7Z8FPVtSNDxiKNZSXGe80l5WBdh3W12jkptR/3Bsee9VCtnr9q0yMADAFyWVUmISzLlyOgJd/QbrTVfXusaL4fajpLklUTZzRAPJYsqZSHyAAA" - } - }, - "document": { - "size": 14682, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576869866, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2458": { - "id": 2458, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Норм там?))" - } - }, - "date": 1576869985, - "senderUserId": 141185012, - "replyToMessageId": 2455 - }, - "2459": { - "id": 2459, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "да" - } - }, - "date": 1576870099, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2460": { - "id": 2460, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "там много баров" - } - }, - "date": 1576870106, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2461": { - "id": 2461, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "и вот\nберёшь, что хочешь" - } - }, - "date": 1576870120, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2462": { - "id": 2462, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "и хорошо" - } - }, - "date": 1576870129, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2463": { - "id": 2463, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "нашла два бара со вкусными коктейлями" - } - }, - "date": 1576870157, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2464": { - "id": 2464, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "и один бар с вином" - } - }, - "date": 1576870172, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2465": { - "id": 2465, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3664822579234188", - "emoji": "☺️", - "isAnimated": false, - "width": 320, - "height": 320, - "thumbnail": { - "width": 320, - "height": 320, - "type": "m", - "dataUri": "data:image/jpeg;base64,UklGRvIaAABXRUJQVlA4IOYaAADQogCdASpAAUABPlEij0YjoaOnplCqGPAKCWdtB5PkQEjGK9kcVkQjaCw4g6SnrDrn2GdoXbSvF8a6s/HdpuCUiSWtfQA6YHGepK6EimT/rJtZPrH2D+kB6HP6kkuSn/V45mJOESuGJCXwltNeFx45Yf5VC1Msc0DsNGeh+9FSLT7gMlo5ZjCm/wPQVlRMDDjXKEeM+8l+RyzK9XGCrKXC2+ded/jouD15dKD+oKsUivBuQFa1jZGcLdi+vWAo9tblTn29rX8SEjDoZOo9u7Mp1IEAURS7jW/z3sJEVyb1IuNQiYrKPi3h7i8yssWuTglBsu42HCxvDz9YFNfs943yXyUh9qxsK4SpdyMMcUihDyvmq3h8d2PF/UPmsx0AOB1vno2cU4Qa9OyTe+xs+eoHoUKjhdUPK40Icxdz0qcVQD/mi4a1iKlIAj2CRqJfASKpAlmJ83abxf4FhYZ2gIBBEVxPSQpXOUO5pFfQfUyM678ITjkoYgpP0R3NWwzzajk4MeGmcSN53RAYw1IfMu9j8D5qCQ9K1zaUyfyH9iYWG/2cjnLQkXt47HVLk3l6Gt7IIPVhKAfvv4u0zwByh4HtgqlezEkXZufJyaxUJ+feqHxjCy5Qq99qVSUe8DqxKfbjFy2ZbTyPPtkLoRkWKLcQHyoWDAZRySW2xxURqUlHYNwwY4h3IO7GYQSf2tAKynGxZK71x7EDWAiQQXn0ycVjKypcNzc+Ga1/5kcYGxGGltL+DxNCYbGMyKw03mhMFqAU+EugEECHpEFZEgI+W50p4keoH6RTxHiQMyad6pGURVL7x4Ko/dovCmmWZkQf32SdPaPJROED5wWwXeU39DREfZUenm0SDwqRCsI/mOlYtX+64EC+IM68IhqcQ/BFowcZt79egeLDNrEKx/752pBQuXmF8Kdn31UlS07WniY99xvMhxrwvmakc04hBKjW5BvFHUydN6yT2vvlGkaK7H/N7I7O8tMBv3E6r25YelbTY6GkEVFBQFJURYT0fvJzfixJhMQmRces9K905nkTPsmnkSF4BdnBP8pAU6rYIr59O+H3zgsW7En2S0TI/UWNii6NSCvoa7wwqLjWG/gbX454M8o4NfbFmqiqfRhyMxAwEX5vHrJ+SJO9iBMD4NOGilGeipd57Sje39zomv9LQFwWvUEvc6RnPF7l6dZjsWV0FkN02S7VY0WZus/OSJB5rjH7bUwrnYzFxZbxqzyHPXImN8gNCGzIJUrlB30bDqu3RKg2JVnd+5fpHyWDoD1p+KSO4LJoFldftkakaZpXMYrps31pI3oDo4eVNZPusQ1H5tY7Ri9j1AOse+J7lkSGyjqPJk2Olb3hyJemmWuEo4guaXC0TNQ/9s4BWmZpls/2D/5Rwo4MZVqnu61dnvmMqBSLAnI9gveQpAN1MPI7+lquWSRGwDAtRpV28qBvQyiQfS4QCVMA5Pg9ENtKNjB3EQlQ2Viv+VigG224tUwms1mHctMP1d6xuCmwHdbb43KhHXDKzwN9IcvHuIYGn/FVLhBmWyBO+wNDaZBK3PTOqkfUQAQqAXlPY81AowoHbKilh+GNNBu/w9bAheIGV2eSZgZ77AyKKItFyWLjnCFqxoGyidsSxhDP6rg951/nZH7n9lrdbRG2BkEB6ll6MGJKyLHgWjwlwfLcU8me3bLcALDrottt2jnJ8x/S6/HpmHl8s7GDlin8WzuYH6yi5WkMrongMr6ZH7H57N5HXvfnMsAA/v6BS30OFfP+2eVh9I6UrWP8gBMmMJIhV0R4w2L0C3FgmPoGHkrMPqqM4YEkOTl7k8vEUSBrn89qRfTOJQhSM+sTY/PTuOi2jmkuR38H7oINDRNsn9ncZE0pF9V+JaGzsD8VRKtvDvLUiKU40cNjg/Fb1fwima7++qEdypk+uGcvWVK9Hcto6k8KoG6W7aqNQ8tdZNbIluKCjaHfM9vq47KNfLZ5Vf4RDYGMuFVOZR1DCvxncyk6ZfC7uFg7Bxu2oS7oTEdL52E/3FnHZFEfBwnpcTepJUc6APRRJ9ZYZH8QO1U7oXomPSE+7RHRMjLiOvqO2Z60ofaxfGeADzx1WyUStVElM83B1z4j220dP7Ev6uyUbbo0iSy3jWkqE552WbgZ0a8avPxPara0+u/dZYbiH3a4hSu7rtNvF5LlehG0Hx/XPY6wzZoz17pcoMr+ZvxWesWNzFNk/5KpQDa5R0EINpEEZaynY0ZLbEWXA9Hllff+m7CeMys/i3uiaoVChA3FV7jFgHvj5nsfaRTlve7hH3P5WBZVV6QYqcEQ8Hy2h0HCh8aFKV5mR0DKvfEQ1tIEwXLIN6y2P3R65lzMoQt26zTwSbu48JkE4ltCRaBppjl17y9TtBJ/k2nkHyvYiVb04CMceNyevQDATKsmxbygFoRf1thxTgXuNE0A0RbvFe899PseNwIjL41xgRSWV+iod7aAetB3u9A2pV8VmjFw1gqDl1CHFWywH5k8C9nmexnZpUAHVpYW6d1nDYUw30ydpCCiVYermpogRwh/1A6iAvzuL1CFCQVcKMIT/SVmZYwZy3N31qd5N99OH6uAOhvuDolZOTlZJnton9r4ToskHy8eAHr7ibtiEmCQdlocTscxj9zPDWiUEncmUqy98HtPKwatvI51oAdpf9qAQZ3NrUswtKOwkOF3NZMln7DrAedUrkcPxa71VsV4N8sAU/i7TR4i664kaqP7BvYDqRGv/y0I5Pq7/NRdkEXP2MdjUrtSgkS0rvhlhk5i6LEYCfMhUUrmZ1RzAPoqum7/CNeLnjcmJ0z7mnV6UKKsfgY5LHP+t5XcQbhZKA01/8jRfZ5rCU6NHFuxcOxLQfOjYQVpWVp8BS4Pm4ZmxdoNqhDbH2/Ngipyd4MqjpYjDucYOquy2HCgId0WywwX86z/GnqDf+/+T//YOueRWwqswncBX0NeYJmJ4dGvlP/wd8o1VsOGLs98cX5XBOxkiM0bwS0z8/cBEDu4Xzxw327FxXpfNMeDvUSIN3yAHfmlFQaUlGhbtAW1liRAPZQZub8mezztNnSm8HJqOSKFRGbOuOcN7+O4IJmwMcumCwgFlfjgEg0V0UqySNSUJSDjzm+K73AA/sOR8ebUsT60m7ZcX9rctnN1RfsOejzV1Wx+d9Il0JxrP/cPevEljkS+aqd5GJshZYvb/nhksbbyYCKpCEAOH0cptXjCaNNylu2PSBHjzc09X3U9oXVtNAXem4aGVEeez6FI/T8QEi/g8/YEosfDVBZhpk6HaphB7hGzXWFECwLJdWpZ9R0/hvioiL1/JQN2p3m4zeE4mIoY9f9juRIP0aCsLsVsiSoM6IG2nDIE/BiI/4rc1YyvloiHu8KfPqTbxd1/TO42wWNkfznySwenRO5PZLJX4la0rCCpG+MzhhrF+R7CRzRQf/xShbxAVf4gWi0X+2guPQ3TPk9YRiVLketLuPSvz0WJkc1JTCtcbbJPBMSGqhtBbjmYqx3kKsp09+v5nClL7tLoE4SksObyRbkVUIjDA8n0s66U9JP+xYSGA5Xw9DyzblBic9UZto+ql329PzVpamyLE3CD+zyI0OnsJjDzjjqRH4cQUeBvD/TCK/KVYhcl7N7c7dyPeyclsyaGQGF1kQSBBmTU5+YMqXhiuzqTFlZ9BfGDghk+tvTiJuhX2O+2/0P9obXk2aCbdnCDaXsKL/qQUU3qc1bFtAdWsiHpqDIlURFwH8qx2yNicvqbh79vtpoZ+OZGvgk8O3Em7LFK/LTQ6bRiBjSgJzH3a+RcApVncJIF10WfrC8PPniuM3I8OzaCIiEo7lXLjk/VINv/MJ1yZDKxYTVUA9Sy9x5/zOi2o2Jy+zWPjrhTmI1eJF5dqOvvidXSpz+hOhEz+1v/GTmLg4FtURgcrKLinbN4dJKug/qAn0rICZ6SArNNTj8j3wWns8fV07ohS7ytyPOVm4mOUWxX8PPN2PAuDjDh9SSf0Q+aFqayuSX5Dokw9X9wD+ZZGr38nlaeUNSFzWDtrK3LuKoEiyk5sr5tDCmvpWjt3ZLaJklEmCcVu83Oy5s+DPfFPdd05lgQkIB0GKp/005dLya4Jios02baxw9bsCT1QtO4Wt5HM8K2zpEMNC/w5NqZeDJIl1JO/vtmy169eNNTHqLeJFfPjGliTQsqOrJaE1yFnPj5a5dWlts1VNU0Kesy6CmZLFDmxP2iuK4AKZoGOLGQ9WmWpYGcjBDmxM4krI0og4OTQJzJb6VmBHbKVCf5SnQcgCXSV2s4Ju2l+o/l0fT5XHuU1fgIUPkmL7i8nfs5reNWpEJS1GvM9VxXB8iySz8c3nESQBSMKjhxvLkC9bSMPqAqYy+qylHX8VekNBSWkZxYAd0/Dp5zWpQrsxxZE3ut27RuzGzKsFFoarGsWcsRs0XgjchKrDNo89KAe0azUOgISLYkVBXED8LUBmOyCyUCYBSm3PdsuvRaoRaHqx3g8A1G6f3CoWorfU6h5/h7bS33UJP1UJr67VLJB9eFmPr5KEuh8qubsXl5IDXztTV2o8/VcwlQwl+VUMi1QKkdjhjf6RwtbT9GmnVTO1ZmR4WqYWv99hvgT5X0rf/HJf44X18q+MvroHbauDk45ADL7q2LinvV5iCImaTWWnz/z/9Nj4XgnGeX3X8TdYZXIx38Lr/IuGPeVfd+buPIe1/I99cvmo3f8oxRY033bcmH6fJOZXe7legJ4TsH+THmIRz6CDkTwqafrOZ3Xto09f7r3TEHss/ZU/HT5d4gWAHl47FFPV8uwYp8y0EzT1wr59XF6llZLeVfo3j6b/WGi37Yx7karmuPZ3Zvx/60M9IC1i92psM4MTfWLyz2e9i4frkPskrXqW/+6+P/wFdUjqViv2s0wdGS7PupHK8sMxyy3dtqksS8R/Kjc//Tf5De+iueSaAixqAB+szoNTJMDMY7mx1Va+LPbbxTv1+JRT4XzYeEsn2ROQbiScqk7dteSb07HhwdsWstPJaJ1MpCKCxppgoSY+NzNAAJIMEVKd0F89IQ2wiXBRFL6Z3DiqQpp5WE+G22lea5F/xPm9ynk24euVPspADgxkTv9xZtesuQeWPNdXf0FPHiqQXntx7Rfor4AqYrqujUOog6ur2OnekZA7M33oUQDqPthlbMImVsz6pyBfXhMiCvkMr5LK/nv+lbGGj11EXz7W9M2aZlePXX7TdpenhCnrPzw7ftixn1g7cv8+yeMIozYw+WzCGHoEnhWEDVfiigtnfX2II+Al1D5m/yGF4PW9/HV7XXR08ItyaWtperBDCpdIgVCaX4p8SYRmWMX+e3D3LYhNvYsDPG44KmWHGSVaKFnjU/LON36jziGMkGGYm8ls52xxxrC68LZH0pI/2JryrLeyTySt1c+dpepUM4nuvwRj8khwlGBkDDkT04JWI+HNs7veVvlHmjAeO3IGOPDE0cUVz4mVAIRThLQzUgFMPTaKVV9NVGzLVVZZgtPjLEG4dBKrmW+4981Tl+JQk97d26imFN04C4xeTXwH0B6v0n4+rTbTGpTJkvJMDnen3r9adfP/uDtomHxfbrwpqRdxvV6tfQ/rpnYHovh+Hd9YhYKiqx6kguCNzutCcapRgAYmtuYaLPHfraENA9VKKI4wOq0XzzjZFdmJ3VX75gmKzmLXUT8RHovIpr2mv/CWCHu13Omv0gKPXm1DvDjx62+riwIoV8+sIdefrVY9nMLjSUvIpPi6tbri+fowhyAOnAw0wZEfKAPxcmWeSFg0C3iSckfq94u1i9PypcBfy7bb/UyDRg0rDyUvhu2EYQugQzjT+QI9Wr4ZDl6WQrbzMFQ6ojdM9BXKYjKeQFyyc4a4zb1/xz5loG5sBmqr/GMWKIYA36o7B77a7o5HYHBxtXecYcCzX/u48O78AotnXlB0uBj0i8IWkN94APvNN8jcGT2Yn5n3sIiHwYzeuhIj/sfW8yehRxAGqkbhG+hNM4JKYrSkxbeAWNdLZp9adcPOoQzcWU9KBr7ybtwn2+YEXtGWs3yvlnQ1xjoE/WZCdZbkZIQydFxa3jQ6CTobDElDgZJ07HTRxurUwdREZKpTNWwy1COdIfIkhraytVzmWodex5rQD0V+0f7m00bcxTp36KijO5cHOAzcX8EidjycemqYwX/rzuArUhuLOSPjeFDKMm4vMXAejBmDOJ5Wa2DRq9FsHn+A9nfDFzHEKamUSdFD2QkaujLQiV4fftw8Jw7xoKEFE4db2m6mVJ/w144szv2eno7kH8SdldF9oygokpEHyDT7jZ0CzqdgRlXaLDGoFk1I2qyeNl00IHC5F/MXl0QRxVpGZwh4RcZkDcxFx0Or3H8IbU0x2ythzpRyuJIiGBSBkZJ48YLXX4ogr0X7Eqd6+fjNZyUXgGFB/oNTPBCVozHDeoTAjj6brPGLelHxENeqG2+Yc6KAp4Lh0vw5Wrf0/dn4L3TmF10Q3zDRJDZhlMow2p5IZJGzhjhC5XYm0hFRk6a6ntnDvsKKWunyE4MuxTFkzdsxkCEZ3Uzf74eE+oVJSgN2lqF/nHcHAZGwkm6mqMGzpl7xuViUj11ZPb6UXRosjUp5GE23lqPAYLLnh/gXgbXhUJEwnT5Saf9yewTfLkUK1LXJGquJdNrilx4RxRGteTqO269vij0vS0Dfwt6CywdIm+ssvr9oJm02rjVZ0e1TvJgnBe2Ygdtey/mqPQD07C7MGwv7uIiT4DaAXL+7PVJQjbrFuBpmKu5CHgv8h00rqgqXpP4/+cy1fcs9PRKCkBmqK7zLolLBbTNON1DLT32sGjhHjJ+jl33M3LoOiaQlzV8LkJfIefP99GFR7Qjtd+57xaZcvAHZZ8kRkTCWbYg0t3rFOvY6fv+FzJ7HzYp7my9z5O/W1hBPKo5aIPHSZZg/SthjJojGvPqTisEogQt6hdsBnt+pv448fv/LcNwUo4oLZIrfEWtacZ7XBYZjwh/A9FEnRJ+ursf5DE0Dsyq8f6LUSd7mUdM5ncS7rcyCrkJJYUfN+3h/5VHajKy9AvIez0evCrBfnfDrR+djmoYxF6sCiQTvG1ZTJS2W2jOB0F1wLUjT+/DCvXu6JKyu0OE5Hbfs2km6FCJaLZqevwegRL9Lt7mYx74BEpoyGdLY6fiUIYDz8EhMur2SGv1m6orEwrk5cYaHN+t6cBA9wU2H6x+GVC4G4I1u6HtTHpvZW5dpm7uq0OmITAHL2ow7W9AoPOgGFhxSu+jcQN2HjA6AAMyt+UA6msBBsU11BEiroIVeRY3qSWJ71KhE6EHnRovcX1iB+mhwErjCb1q6aNnKzWthu6tWZ/l8qLqoeau+0oEhPJKNqdEumilm8ZuA99lQK0RrQNgZnAyPGIz3NCb1W58x1lHTZPahOHgJLiCiDGQmG4u67v1hprhZH8tJzArbbJ8rvEEziljeoX4/73Bxx107STYlJhZWoiwJ0HlcZF9HqVeqAdK3ZWoh8ZjMoXiMfLHZ8b/oKhQH6LBR1CD9votOu0xfOztW6Q2OSX4A9YOAg8jYFJEOwEEhAnZXDejzMpTJUbJbtW6BI2O3mBnhtsuZ2ESsWb4HP1hVF2vWispeE+AkosBUSOh1RwuCK1Sqj70tXZ2rrL91H2Oc/Iseyp9QxYiqopuD3X2NDPUrWhZVX/LvARQP0ZknvIhGJceN+NRI/rG2xdGnBH1T4nTAh/GnfcZAdEjUZcnsHe1bq2xCbScjhPrJy8usYwmw9JE5FpTqOJmw/+c8fM4eCruUyUoWM0cd6dAo239BpQB5vzQWOph1n95QWbhej/DdWY7yzfnNccYWmiZRa5+4vcM+cJxw2KuLam9iyR7wuznRG8JFfUGMuz4Xy2S9CsnckFLizMDr+nWEetFNuqlj115P8UQfgLjfVqB7+TjiDXgMjwoL5OfnO0Mf77DYBNS08xSbV3UTLCqUaovdEIZBe/B0bitzfxfIpAh/PGI3x7vfVQVzCVVUcmmokp8x9Oh544oyF2+qwLqZ7DhGXDMSBzBQHXze9iWBOcjdzMG1KJ153sajbJJPaLh1cclg6JjKGUgWmckkFxcL5R/cb76WlitG865zRc370cT0w50lnmYKlVNI9gmNKz0I6ufCxLVztxhuh4VYqwbUC4WYeS2HWFwECwzZj8xz3k0IkMwcb7R2WrgS2tj1cJfA/9ubPRYTqhw4yJ2I5l04IYt11+M02BG2clC7Gy/N9Nb6lGEQ2IofJpEogg8agZcLnuTyl0jdQqD+zux51FHVQgNl19DdhKcZR6YwFuGiDXRuug6QNCGWPS8cE4bMtHtmGesimciTtBy8jZdblhW+JRmLM+B6BKmGZnYoD1BQ61GMmc9knG2Va+qHptGprZxaWlyvhB+lxbMtBQ8hVIuzalre+pjDMBKa33FsDjV1+CVc0yZ+I9nAABIAc/2K4XKfh/56DoNgvwT+B9Z5j0MQpmerM5bx1UcqIK9NbyxbVD+GeK/niqNd1o8mcha/RDfbPAYZHlgXIXHgZS7aRoHH3UJV0CPdPxmo50QRLH+wfySSCxuAg0Gmsi1MFDNJM8e+0K6jYiSWXhDsTh6e8kS8H/m7EZBw9u+lsegvgkzPzgTIvmxjGIZm9r1pI2XzBQbohsuf72Kj16q3XXdi0x6S3VJWPaVAIitM9AOOzpDd7IlDq76ql+PbSpGrTaWOmnVuXdWmFb73OgZ1v2YMF9A+cX/AtGt+ue7CFleYkWBXwGApkXbUJ9BXsKwR572Lzjf7wjbp5w1xf7a713iVdQ2X3WdSyzYUQ0TirKo/fpOYiAbQLXEnHVnwmcIqU638GIJgQleuf1W3JrdHv9bavbjo4kPREDAHp3kuRWXFuz30tJZIXsQ1UV/BaRaWCBX4YaRsNgwhRmcZql6ZD5QOSXmNmuPSgZQ1KZxDhLenYRk/JLhSQfhEpAo3jwFGzhZ4LXInwWC0H5dxpuEZ2gAL546sXJqlZ49PmJP5tbrXIbLCkgg94y+/SMEdGjW4V9p/wVKCtTBgaujNvXH9wLGDRjX9/UFD/uUuevg0Td5uX3Rmr5mOtihmitPMdKHlTwK3bpUS7Z8FPVtSNDxiKNZSXGe80l5WBdh3W12jkptR/3Bsee9VCtnr9q0yMADAFyWVUmISzLlyOgJd/QbrTVfXusaL4fajpLklUTZzRAPJYsqZSHyAAA" - } - }, - "document": { - "size": 14682, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1576870174, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2466": { - "id": 2466, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Есть предложение сходить покурить кальяна, тут за углом в мяте.\nГде-то после 19\nесть желающие?" - } - }, - "date": 1577193985, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2467": { - "id": 2467, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я очень желаю, но не могу сегодня :(" - } - }, - "date": 1577194196, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2468": { - "id": 2468, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я смогу к 20" - } - }, - "date": 1577194309, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "2469": { - "id": 2469, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я смогу, часов до 20:30~21)" - } - }, - "date": 1577194581, - "senderUserId": 56240484, - "replyToMessageId": null - }, - "2470": { - "id": 2470, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "можно будет тогда где то в 19:30 выйти и до 21 точно закончим" - } - }, - "date": 1577194649, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2471": { - "id": 2471, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "+" - } - }, - "date": 1577194931, - "senderUserId": 860139781, - "replyToMessageId": 2467 - }, - "2472": { - "id": 2472, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Отпишите все, кто не могут, мы поплачем вместе с вами" - } - }, - "date": 1577196074, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2473": { - "id": 2473, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "есть у кого жвачка?" - } - }, - "date": 1577196081, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2474": { - "id": 2474, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "675168768736887048", - "emoji": "🙂", - "isAnimated": false, - "width": 128, - "height": 98, - "thumbnail": { - "width": 128, - "height": 98, - "type": "m", - "dataUri": "data:image/jpeg;base64,UklGRqYGAABXRUJQVlA4WAoAAAAQAAAAfwAAYQAAQUxQSDUAAAABN6CobRuo57Maf2aDFhHxR82ForaNpDkwDJETyQyEXf48+l5tRP8nYBbczgXv/7/3mwe4AgBWUDggSgYAAJApAJ0BKoAAYgA+TR6LRCKhoRqK1awoBMSygGCpK24PW4onBtGIYWwK0KRDAlWuYMZGnXZTx7/JbuOTn/5u3dTIt8hnhOPAOFX9UcBBgnt1YWwYYiOeciG1WEQAsdmY+nKNbZU/GaRulPtbzV4dk59xyb+KsvMWYmCbMA9ka5KytMtlRWsOvLova8QQfSyH+YR9CvkTP6yyTrZmUk5zmSo9UyfX3QKOkw3xmvNB7twvnIYYdprAWycx50qGzU9KgYgZPQlxHlTeBTzovSo5nTfo3A0+/lVnRxYsYUiLMtzo5RbIjoah5vXOpNRbzco7nXBibyKejgH6LuEXKYfQF4T8JVz0ueFomSX/4LE4MPWTPItaMG69l7fsX8Bk16UwRjzwxglVRekBLNLBLGKFUV5cAmByNP86/UXUK4ZZZpUkEgOcjLjwKjAL1fFbC59dEhUA2N6kAP6vnwoeabFXJwgmvoU/8fh8n/lPqXv+SyXuf/1/GA2cZPOdeP5RZC1rEeGXbqRYXhd4qK0zMXnu0yjdcIGJuGr7OrQtHy9TU+aVhEpCejEOUbL5oFfCIm3+SY/Qhg8SR3zh9XpYE8fKSyL1+gaiumysVqlAONl9ct0w76+VLCT6pfvE5/FXBN9o/4bUjywAc1TJrPSwww/aA6pPEFj0o88JIqlc3vePDce+SmNq5v5MdWab+zaVTiFV3Xr82k9c0M6vCXF/DG6jtzo9H1v90w05Aa2bMkgi1U/LvBTEE4W3F8kvBPadvIFt9EZcLuunrQkmPiKn6j/nMSEEYb9sOy8urheEcz6bS9xNPvJZ7qotlQR/hz5CJ+++b/3mbVTurHZIWMJauQ06VpmyIwNM8CyANMpRS8k3X/wmvaCfKRB3+J9l/1NvppZRHS0mtW0R7Z6ugrMVP8m0Utr+SYH47c6G/gYFyPJpKoIH3aGZSpfC8gwfuqM2UfIp+GeweCkbbsyxTJ3rL+8kl0IiJUyumP8hFDG+VnlAETd06zNkXbBAutXC/ZZA3RNJSiH1pg33IX/zMVohQOC6LS4u4yCHqdaRo+19ZVthCxqDKbibqG/0idGW/A6tf0ct+ypJv5cJo/i/trqNQYLeIJJdOTqte0M64S8qAYn4hsYX/1NSIIQBMN2AXFSakqtURpx2gHne22YSmcPm2QQsX8QhgXOUopxGA5vIsAfy8uCIGf98/AdxB7znxk5n/KQzxAglndYaG93kk359/MEIwE/uydmHChPBFx3uMs38gPY06rEPico/JhljHlKi5AdJRqRno7FXirczbyCfpg7UCY0WUmdARgdQsCDXKmYyMju5VVIesmObiOEF/a5PV/yc2hzlcdiYuget8SoBqIrOeh2bCn8mUs16JnpYCXp3LGWl/KZxcgjM0AUsXMaCMcEu9Nj0s3+xBRg57KnKSZb/Rkw3Ak/GglUjKraPbn/kUEkkampp+2hNlLCPx4/V2x8QAYczBTTRN7Q2mGtf+fPN4mvrEUWqLZGYo2D21UzcUpjapnODBkIWCbjQ5gn03F41snqb7R8ucoGYTeJrB5imSTdNmpCoo9O0mhmu3vUgIad6f9SR33o8kohQOIYfVdsUWQVGveoUnhU7j4nM+WYne+lrkdLOpJr5cmZywXF1AFM2xW5yyzjy2zBsluzACzKXHPRJ4bW4EnABkh7/lHbrmW0PsAZmWyjPQuRMzOQutq8MvSFKPeoUIx8EJq3EM7Q0IBGURYLAu/1rpUPGBgFKVcBR6J28J75tqEpQxlAeMFFwwUEYBL5pKtFbcbk/V3orjY8BwVVBA/tJeNUWPcizX6iJQK06boFhrZkDLJO049p3UEdXd7XTjzC395XQO8D/EBtRPbwvBlhduQg7B+3DxAzuzRdl/vjOnHFd4gtGbWDmg5IZZqDqNypc8VVK3bmWNOyaTib+JnmQ3UPPyir+oD6xH3ztMmcBUH7PxPVuGERdSow80vVFm/tq/xUY/zf2FpQZyu9MxcJP5ojFFL9OKyzFcWreIMRZVbQDejZRVKwp28/1c5Hi3vXrbOyHFbOyGo/zosjPbnIiunUp4C7KKfD4ER6ExIzXdgRbcpsvt3MHADzgru8LKvk4ZqaB3lQv6R7sx5H5fEIFfACopSHKWAhYKKQnwhh/YAAA" - } - }, - "document": { - "size": 9530, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577196086, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2475": { - "id": 2475, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "заходи" - } - }, - "date": 1577196092, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2476": { - "id": 2476, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "мерси" - } - }, - "date": 1577196144, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2477": { - "id": 2477, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "если б пошли прям щас, я бы да" - } - }, - "date": 1577196413, - "senderUserId": 177121435, - "replyToMessageId": 2466 - }, - "2478": { - "id": 2478, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Че такой говнистый?🤔😁" - } - }, - "date": 1577196415, - "senderUserId": 860139781, - "replyToMessageId": 2472 - }, - "2479": { - "id": 2479, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1048388279864393831", - "emoji": "👋", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 21669, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1577196487, - "senderUserId": 141185012, - "replyToMessageId": 2472 - }, - "2480": { - "id": 2480, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ну шо вы там" - } - }, - "date": 1577204160, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2481": { - "id": 2481, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3323402743994165", - "emoji": "☕️", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 21255, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1577204163, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2482": { - "id": 2482, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Не могу" - } - }, - "date": 1577204256, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2483": { - "id": 2483, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1112358875685716016", - "emoji": "👁", - "isAnimated": false, - "width": 128, - "height": 22, - "thumbnail": { - "width": 128, - "height": 22, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 8840, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577204258, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2484": { - "id": 2484, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "288465753244434475", - "emoji": "😁", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 18244, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577204348, - "senderUserId": 860139781, - "replyToMessageId": 2482 - }, - "2485": { - "id": 2485, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Еще сидите?" - } - }, - "date": 1577206920, - "senderUserId": 3412850, - "replyToMessageId": 2466 - }, - "2486": { - "id": 2486, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Да" - } - }, - "date": 1577206934, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2487": { - "id": 2487, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Зашли только по факту" - } - }, - "date": 1577206941, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2488": { - "id": 2488, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "@sashashakun @vponomarev @lizazhdan за кальную вчера отдали 1700 на 5-х по 340 с человека\n5536 9137 6690 0399 тинек", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 0, - "length": 12 - }, - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 13, - "length": 11 - }, - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 25, - "length": 10 - } - ] - } - }, - "date": 1577258003, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2489": { - "id": 2489, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ушло)" - } - }, - "date": 1577258082, - "senderUserId": 56240484, - "replyToMessageId": null - }, - "2490": { - "id": 2490, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAYACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCuiM5wqkn2qRIZAcmEn8Km05S0j49K0PLb0rKdSSdkhpJmWY3KgeQRTDBJ2iYVq7f3m3bz607y29Kn2s+w+VGKyMhwwIPvRVrUVKumfSit4NyV3oQ7XHaWwEz5IGVrTZwOhB/GiigY3f8AT8xSq+euB+NFFAGbqrAypgg4FFFFNCP/2Q==", - "width": 1125, - "height": 690 - }, - "sizes": [ - { - "width": 320, - "height": 196, - "type": "m" - }, - { - "width": 800, - "height": 491, - "type": "x" - }, - { - "width": 1125, - "height": 690, - "type": "y" - } - ] - } - }, - "date": 1577259219, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "2491": { - "id": 2491, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "дан" - } - }, - "date": 1577259496, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2492": { - "id": 2492, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "348891755506040995", - "emoji": "❤️", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 20786, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577259516, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2493": { - "id": 2493, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Разработчик из Нидерландов запрограммировал гирлянду и светящиеся шары, чтобы сыграть в классическую «Змейку» прямо на рождественской ёлке. Теперь в его планах — такой же «новогодний» Tetris.\n\nhttps://tjournal.ru/internet/132851", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 193, - "length": 35 - } - ] - }, - "video": { - "duration": 31, - "width": 720, - "height": 1280, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwAuD5cTFSTjoTVG1kIk2nOGqzfEeSAD1PWqCna6nPSkM0G60UhIIBz1oqBlBnLKMngdqaeRmlcYxj0pvpWhJZScLGA2c/Siq3JopWHcueWO4496b5S+lFFRcoPLWiiincD/2Q==", - "width": 180, - "height": 320 - } - }, - "document": { - "size": 3329149, - "mimeType": "video/mp4", - "fileName": "043203be-b9bb-4719-b9cc-3d09dcacd187.mp4" - } - }, - "date": 1577277545, - "senderUserId": 177121435, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "2494": { - "id": 2494, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "с наступающим :3" - } - }, - "date": 1577277553, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2495": { - "id": 2495, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1685141920508018866", - "emoji": "🙈", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 10682, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577277574, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2496": { - "id": 2496, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Мой знакомый только чат-ботов для секс игрушек писал" - } - }, - "date": 1577278971, - "senderUserId": 356765513, - "replyToMessageId": 2493 - }, - "2497": { - "id": 2497, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "типа вибратор разговаривал азбукой морзе?" - } - }, - "date": 1577279060, - "senderUserId": 141185012, - "replyToMessageId": 2496 - }, - "2498": { - "id": 2498, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Типа пишешь вибратору: «сильнее»" - } - }, - "date": 1577279073, - "senderUserId": 356765513, - "replyToMessageId": 2497 - }, - "2499": { - "id": 2499, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "вот это одиночество..." - } - }, - "date": 1577279613, - "senderUserId": 54158593, - "replyToMessageId": 2498 - }, - "2500": { - "id": 2500, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "2112768758786293804", - "emoji": "☹️", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 29482, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577291168, - "senderUserId": 2317363, - "replyToMessageId": 2498 - }, - "2501": { - "id": 2501, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Оттащите садюгу от пульта пожалуйста" - } - }, - "date": 1577300154, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2502": { - "id": 2502, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Постараюсь" - } - }, - "date": 1577300873, - "senderUserId": 356765513, - "replyToMessageId": 2501 - }, - "2503": { - "id": 2503, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ребята" - } - }, - "date": 1577301758, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2504": { - "id": 2504, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А дайте карту ароматного мира" - } - }, - "date": 1577301765, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2505": { - "id": 2505, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Да лана, весело же(" - } - }, - "date": 1577301815, - "senderUserId": 290281303, - "replyToMessageId": 2501 - }, - "2506": { - "id": 2506, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Все кто сидит на 4ом этаже, посвящается эта песня" - } - }, - "date": 1577302970, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2507": { - "id": 2507, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Мы вас любим и помним" - } - }, - "date": 1577303024, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2508": { - "id": 2508, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Хоть давно не живу уже с вами" - } - }, - "date": 1577303057, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2509": { - "id": 2509, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну вы поняли" - } - }, - "date": 1577303070, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2510": { - "id": 2510, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Шалость удалась" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCf+KlBzJj0qMzIsqIeWPSlbJkJA4I61V0KzKssu24cRdSaegkxuK845NQCN0uTnGccGr0AL4+bgjkVmzRBuj9aKb9lT/LUVFkMbGIpXBGCR3qO6Z4rmNEfCsB/OrMYgRcohz7CqupOnmRlGBZeorVaoh6MrecTJvZiTnFX7QkuBjGO+ays85NWo7vZ0H60mgTNH7K3+TRVL+0X96KOVjuT/wDLKTkEHgAc5rKZsuaKKIhIKMc0UVRJb8hf7i/99/8A16KKKVwP/9k=", - "width": 749, - "height": 911 - }, - "sizes": [ - { - "width": 263, - "height": 320, - "type": "m" - }, - { - "width": 658, - "height": 800, - "type": "x" - }, - { - "width": 749, - "height": 911, - "type": "y" - } - ] - } - }, - "date": 1577307515, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2511": { - "id": 2511, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "(с)" - } - }, - "date": 1577307561, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2512": { - "id": 2512, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "☺️" - } - }, - "date": 1577307575, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2513": { - "id": 2513, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "посебо" - } - }, - "date": 1577307801, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2514": { - "id": 2514, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCuL1wSNq0ovJO4WqZWQk/K2fpTwkuPuN+VAi8Lx/LK8VA9xID9/wDQVGI5sHCHNMME56o1Fxk0LF5lUMVQ5ANXFEasoxnbwQf4qrRW7+cvGEU9fWr5Q5yFyKTeoW0KZZVcrh81HISfu7gKszRxpyyZY571CAn9wfrSUUO7LafKnYgVKJ487d2D6Giik0WiK4iMuCvaq7QOO1FFCYmj/9k=", - "width": 828, - "height": 1104 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 828, - "height": 1104, - "type": "y" - } - ] - } - }, - "date": 1577353060, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2515": { - "id": 2515, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ТЕПЕРЬ Я ЗНАЮ КТО ТЫ))" - } - }, - "date": 1577353123, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2516": { - "id": 2516, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "642449759415567212", - "emoji": "❤️", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 50752, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1577353124, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2517": { - "id": 2517, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "128866271763628532", - "emoji": "🐝", - "isAnimated": false, - "width": 128, - "height": 94, - "thumbnail": { - "width": 128, - "height": 94, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 17738, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577353233, - "senderUserId": 141185012, - "replyToMessageId": 2514 - }, - "2518": { - "id": 2518, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "640414812500656510", - "emoji": "❤", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 33422, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577353253, - "senderUserId": 54158593, - "replyToMessageId": 2515 - }, - "2519": { - "id": 2519, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Всем привет!\n\nМы с @aleksProsk вчера пару раз ходили за винчиком, плюс пиццы заказывали. Вышло все примерно на 13700.\n\nПредлагаю как взрослые и самодостаточные люди скинуться примерно по 1000 (нас было около 13 человек) на номер карты:\n5536 9138 1895 1812\n\nИли по номеру: +79774116966", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 19, - "length": 11 - }, - { - "className": "MessageEntityPhone", - "classType": "constructor", - "offset": 272, - "length": 12 - } - ] - } - }, - "date": 1577354353, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2520": { - "id": 2520, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Тинькофф удобно?" - } - }, - "date": 1577355091, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2521": { - "id": 2521, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Да, удобно все. Кроме лешкоинов" - } - }, - "date": 1577355108, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2522": { - "id": 2522, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAmACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDXLYPVfxNG7pyvPvSFULZOM0eWnYd89aAHfN7Unz+1LuHqKWgAGcc9aKKKAI23bj8gI9c0nz8ZiGcjvUmTntS0AJtHoKWiigAooooAYYlZskZNHkoOgx070UUAPooooAKKKKAP/9k=", - "width": 364, - "height": 346 - }, - "sizes": [ - { - "width": 320, - "height": 304, - "type": "m" - }, - { - "width": 364, - "height": 346, - "type": "x" - } - ] - } - }, - "date": 1577355131, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2523": { - "id": 2523, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "помотала меня жизнь" - } - }, - "date": 1577355158, - "senderUserId": 356765513, - "replyToMessageId": 2522 - }, - "2524": { - "id": 2524, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "✅" - } - }, - "date": 1577355177, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2525": { - "id": 2525, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "сейчас скину" - } - }, - "date": 1577355418, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2526": { - "id": 2526, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "@adikmarov 💸💸💸", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 0, - "length": 10 - } - ] - } - }, - "date": 1577355427, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2527": { - "id": 2527, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "отправил)" - } - }, - "date": 1577355454, - "senderUserId": 56240484, - "replyToMessageId": null - }, - "2528": { - "id": 2528, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Перевела" - } - }, - "date": 1577358113, - "senderUserId": 802771524, - "replyToMessageId": null - }, - "2530": { - "id": 2530, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Кофелюбы )) у меня вопрос, сраный кофе будете пить? Или взять обычного?" - } - }, - "date": 1577380642, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2531": { - "id": 2531, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Для непросвещённых - https://ru.m.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BF%D0%B8-%D0%BB%D1%83%D0%B2%D0%B0%D0%BA", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 21, - "length": 87 - } - ] - } - }, - "date": 1577380712, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2532": { - "id": 2532, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "В сортах дерьма не разбираемся 😂😂😂" - } - }, - "date": 1577380773, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2533": { - "id": 2533, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я тоже, по этому и советуюсь)" - } - }, - "date": 1577380859, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2534": { - "id": 2534, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "\"Копи Лувак — один из самых дорогих сортов кофе в мире: его стоимость порядка 550 евро / 700 долларов за килограмм.\" кажется ответ очевиден) бери" - } - }, - "date": 1577383223, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2535": { - "id": 2535, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Так себе кофе, кстати :)" - } - }, - "date": 1577383517, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2536": { - "id": 2536, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Будем жрать дорогое дерьмо )" - } - }, - "date": 1577383831, - "senderUserId": 105945096, - "replyToMessageId": 2534 - }, - "2537": { - "id": 2537, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вот я тоже слышал )" - } - }, - "date": 1577383845, - "senderUserId": 105945096, - "replyToMessageId": 2535 - }, - "2538": { - "id": 2538, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Но раз один псих нашелся, возьму попробовать )" - } - }, - "date": 1577383858, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2539": { - "id": 2539, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "дорохо-бохато)" - } - }, - "date": 1577383872, - "senderUserId": 205688700, - "replyToMessageId": 2536 - }, - "2540": { - "id": 2540, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ага)" - } - }, - "date": 1577383890, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2541": { - "id": 2541, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Все как мы любим" - } - }, - "date": 1577383894, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2542": { - "id": 2542, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а это не тот кофе, который нужно под губу закидывать?" - } - }, - "date": 1577384206, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2543": { - "id": 2543, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Антон, если ты на Бали и хочешь привезти хороший кофе, лучше заедь в Seniman Coffee в Убуде" - } - }, - "date": 1577384645, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2544": { - "id": 2544, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "И там купи чего-нибудь местного лёгкой обжарки" - } - }, - "date": 1577384669, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2545": { - "id": 2545, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вот это будет збс" - } - }, - "date": 1577384678, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2546": { - "id": 2546, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну и пока там, сядь, съешь шакшуку и колбасками — она охуенная" - } - }, - "date": 1577384735, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2547": { - "id": 2547, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я, конечно, не была на Бали и ничего не знаю, но послушала бы Лешу и не пила б кофе из каках🤔" - } - }, - "date": 1577384855, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2548": { - "id": 2548, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "http://maximilyahov.ru/generator-new-year/", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 42 - } - ] - } - }, - "date": 1577385341, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2549": { - "id": 2549, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3664822579234143", - "emoji": "😌", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 27108, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577385378, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2550": { - "id": 2550, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Не, ну он нормальный, на самом деле. Просто неинтересный. Это больше развлекуха для туристов. На Бали настолько богатая кофейная культура, что на эту фигню даже жалко время тратить 🙂" - } - }, - "date": 1577389164, - "senderUserId": 3247289, - "replyToMessageId": 2547 - }, - "2551": { - "id": 2551, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вот вот" - } - }, - "date": 1577389941, - "senderUserId": 860139781, - "replyToMessageId": 2550 - }, - "2552": { - "id": 2552, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Кстати, чуваки, так что Ведьмака-то смотреть?" - } - }, - "date": 1577390246, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2553": { - "id": 2553, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а то только только чеканные монеты все обсуждают" - } - }, - "date": 1577390263, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2554": { - "id": 2554, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Слушай, средней консистенции говно если честно" - } - }, - "date": 1577390282, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2555": { - "id": 2555, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ясн, спасибо 🙂" - } - }, - "date": 1577390291, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2556": { - "id": 2556, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "а то рейтинг 8.7 удивил" - } - }, - "date": 1577390303, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2557": { - "id": 2557, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "кстати, 4 сезон мистера робота — очень добротно" - } - }, - "date": 1577390329, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2558": { - "id": 2558, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "прям хорошо я бы даже сказал" - } - }, - "date": 1577390342, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2559": { - "id": 2559, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "только начала 4 сезон, кстати\nуже нравится, я скучала" - } - }, - "date": 1577390384, - "senderUserId": 177121435, - "replyToMessageId": 2557 - }, - "2560": { - "id": 2560, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну это от любви, наверное. Но игра плохая, мотивация персонажей проработана на троечку, и вся славянская хтонь проебана. Это такие польские недели в Макдональдс с ровным и бесхарактерным сиджиаем" - } - }, - "date": 1577390395, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2561": { - "id": 2561, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "меня напрягает именно сам Геральт\nвидно, как актёр ПЫТАЕТСЯ ИГРАТЬ" - } - }, - "date": 1577390426, - "senderUserId": 177121435, - "replyToMessageId": 2560 - }, - "2562": { - "id": 2562, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "прям вот не верю я ему как-то хз" - } - }, - "date": 1577390437, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2563": { - "id": 2563, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Он ужасный. Ну то есть это боль, потому что по-хорошему я смотреть начала именно чтобы на бёдра Кавилла пялиться, но прям больно за то что он с ролью делает" - } - }, - "date": 1577390472, - "senderUserId": 146686085, - "replyToMessageId": 2561 - }, - "2564": { - "id": 2564, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "эти его вечные ХМММ КХМММ" - } - }, - "date": 1577390483, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2565": { - "id": 2565, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Очень хуево играет, прям удивительно хуево" - } - }, - "date": 1577390491, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2566": { - "id": 2566, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну ещё когда он сопит кстати ничего 😂" - } - }, - "date": 1577390521, - "senderUserId": 146686085, - "replyToMessageId": 2564 - }, - "2567": { - "id": 2567, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "никто:\nабсолютно никто:\nГеральт: https://youtu.be/Wdi-VDtQ8gY", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 33, - "length": 28 - } - ] - } - }, - "date": 1577390525, - "senderUserId": 177121435, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": 177121435, - "origin": { - "senderUserId": 177121435 - } - } - }, - "2568": { - "id": 2568, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Там просто диалоги ещё супер пафосные, без игры это получается такая какашка" - } - }, - "date": 1577390563, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2569": { - "id": 2569, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "но мне пока все же интересно" - } - }, - "date": 1577390575, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2570": { - "id": 2570, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну мне тоже остался последний эпизод" - } - }, - "date": 1577390589, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2571": { - "id": 2571, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Нормальный в Польше Макдональдс. Только что из него" - } - }, - "date": 1577390605, - "senderUserId": 194771934, - "replyToMessageId": 2560 - }, - "2572": { - "id": 2572, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Оказывается, я многое могу перенести чтобы пялиться на красивого мужика 🤷‍♀️" - } - }, - "date": 1577390615, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2573": { - "id": 2573, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3664822579234188", - "emoji": "☺️", - "isAnimated": false, - "width": 320, - "height": 320, - "thumbnail": { - "width": 320, - "height": 320, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 14682, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577390637, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2574": { - "id": 2574, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCISEPtzU8DFxknHt3qkVLTYP3c1Ys2xGRxnPb6UgJbqQ+YgB4xS/agZfLwQOmahuObiIfT+dR3X7u5JXB70FFyQ/LRVdpg6dSD6UUCJhawA53CmyRxxpmNuc9BV7I9BVa/ZRbEdyeMDvQBUZt8qN1wKgkbfIzdeag3Yb5gT7ZxTjKCCNp+u6mIN2GoqPPNFAHRAjuap3SSSP8AIcr6GiikBUktn6kL+FQNA4I44PeiimA14ypOe1FFFAI//9k=", - "width": 1280, - "height": 1273 - }, - "sizes": [ - { - "width": 320, - "height": 318, - "type": "m" - }, - { - "width": 800, - "height": 796, - "type": "x" - }, - { - "width": 1280, - "height": 1273, - "type": "y" - } - ] - } - }, - "date": 1577390658, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2575": { - "id": 2575, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А я начал смотреть и пока норм :D" - } - }, - "date": 1577390707, - "senderUserId": 290281303, - "replyToMessageId": null - }, - "2576": { - "id": 2576, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Еще положительный отзыв от Зиннура, вроде, слышал" - } - }, - "date": 1577390733, - "senderUserId": 290281303, - "replyToMessageId": null - }, - "2577": { - "id": 2577, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я не сразу вдуплила, где там ЧЕКАННАЯ монета, тому шо в оригинале смотрела\nсижу и думаю, ДА КТО ТАКАЯ ЭТА ВАША МОНЕТА НАХУЙ" - } - }, - "date": 1577390802, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2578": { - "id": 2578, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ахаха да я тоже))" - } - }, - "date": 1577391121, - "senderUserId": 146686085, - "replyToMessageId": 2577 - }, - "2579": { - "id": 2579, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Может надо было в переводе смотреть, тогда не так плохо?))" - } - }, - "date": 1577391168, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2580": { - "id": 2580, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "и гореть, что Геральта озвучивает не Кузнецов!" - } - }, - "date": 1577391416, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2581": { - "id": 2581, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1222077027897573503", - "emoji": "😳", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 40142, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577391419, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2582": { - "id": 2582, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я на его месте все время The Hound представляю. И все реплики обретают смысл" - } - }, - "date": 1577391446, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2583": { - "id": 2583, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 2, - "width": 480, - "height": 224, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAATACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDMHFTwsHXafvDoarGnwvscHuDTJLJUljtBOKhDZLcgYpzsdx2sApPTNRHGeD9aASHHoD60UArsHPNFAiGgUUUFBRRRQACiiigR/9k=", - "width": 320, - "height": 149 - } - }, - "document": { - "size": 154959, - "mimeType": "video/mp4", - "fileName": "File" - } - }, - "date": 1577391483, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2584": { - "id": 2584, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "@akulichevskiy шакшуки больше нет! что делать?", - "entities": [ - { - "className": "MessageEntityMention", - "classType": "constructor", - "offset": 0, - "length": 14 - } - ] - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCvDCWG9unapxvWLG0devtUmMgAc56VOqKsJDAEgd+a5k3Jmr0KTyGQg9hxTTnParqWsRRTg8jmq95GsUihRwVzzWvLYV0FnJ++WP0BJqyXfLDkrg1R07/XE/7NWkdyZNxJUqdtOMbEtllR+7Tp0qnqfDx844q1Gf3KfSq+ogFYz16iqYkVLCREdi7BeO5q6ZodnDx5A45oopDHxTxCFAZlBx2NRX0sckShHDENRRQB/9k=", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1577428840, - "senderUserId": 122196269, - "replyToMessageId": 2546 - }, - "2585": { - "id": 2585, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Шакшука это эгг стайл!" - } - }, - "date": 1577428899, - "senderUserId": 146686085, - "replyToMessageId": 2584 - }, - "2586": { - "id": 2586, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "не, говорят, убрали из меню" - } - }, - "date": 1577428962, - "senderUserId": 122196269, - "replyToMessageId": 2585 - }, - "2587": { - "id": 2587, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ну бери ранчерос" - } - }, - "date": 1577429000, - "senderUserId": 146686085, - "replyToMessageId": 2586 - }, - "2588": { - "id": 2588, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "таки взял, а шо еще оставалось" - } - }, - "date": 1577429036, - "senderUserId": 122196269, - "replyToMessageId": 2587 - }, - "2589": { - "id": 2589, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Провал!" - } - }, - "date": 1577429124, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2590": { - "id": 2590, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я в Сайгоне, а вьетнам вроде как на третьем месте по экспорту кофе в мир." - } - }, - "date": 1577439832, - "senderUserId": 105945096, - "replyToMessageId": 2543 - }, - "2591": { - "id": 2591, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "https://www.meme-arsenal.com/memes/3fe6dbdb91fbdc15b42c6f726f2ece9f.jpg", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 0, - "length": 71 - } - ] - } - }, - "date": 1577440263, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2592": { - "id": 2592, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Про Вьетнамский кофе ничего не знаю 🙂" - } - }, - "date": 1577441532, - "senderUserId": 3247289, - "replyToMessageId": 2590 - }, - "2593": { - "id": 2593, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "У кого есть 8к прямо сейчас? Альфа померла" - } - }, - "date": 1577450909, - "senderUserId": 63238467, - "replyToMessageId": null - }, - "2594": { - "id": 2594, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Хелп" - } - }, - "date": 1577450964, - "senderUserId": 63238467, - "replyToMessageId": null - }, - "2595": { - "id": 2595, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Дай номер" - } - }, - "date": 1577450981, - "senderUserId": 56240484, - "replyToMessageId": null - }, - "2596": { - "id": 2596, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Наличкой" - } - }, - "date": 1577450987, - "senderUserId": 63238467, - "replyToMessageId": null - }, - "2597": { - "id": 2597, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "А 🤷‍♂️" - } - }, - "date": 1577450994, - "senderUserId": 56240484, - "replyToMessageId": null - }, - "2598": { - "id": 2598, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ожидаемая шутка, есть но в ульске)" - } - }, - "date": 1577451055, - "senderUserId": 205688700, - "replyToMessageId": 2593 - }, - "2599": { - "id": 2599, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "В нске)" - } - }, - "date": 1577451081, - "senderUserId": 56240484, - "replyToMessageId": null - }, - "2600": { - "id": 2600, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Спикер российского МИДа Мария Захарова зажгла на корпоративе с каким-то дядькой.\n\nТраволта и Турман нервно курят в сторонке\n\nВидео: mzakharovamid/Instagram" - }, - "video": { - "duration": 18, - "width": 540, - "height": 540, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBiyEcHOMninedlTgHHFQCRT04OaV3O1TkDsMd6QEvmjycEYBIOTSrOPMBVRnpioSyM23PTqaQME/iHSiwycO0DAhTz60VVactIDnI96KLBciDKBznPbFSqd+0kdyaLuARMCvQ09LdzGpweR60xELRyhiwXGBu/CmtE/PHQc4q75R2gFO2OtQyptjPy4B44NAFZAMEsCQPSinujRpgZwRzRRYLl+6QyR8DvxUyfdAPWiigBSuc+1QXIHlc88iiigQRrmNQ4GQMUUUUAf//Z", - "width": 320, - "height": 320 - } - }, - "document": { - "size": 5437621, - "mimeType": "video/mp4", - "fileName": "video_2019-12-27_18-16-48.mp4" - } - }, - "date": 1577460959, - "senderUserId": 356765513, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": null, - "origin": { - "senderUserId": null - } - } - }, - "2601": { - "id": 2601, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вот это я понимаю корпорат!" - } - }, - "date": 1577461800, - "senderUserId": 356765513, - "replyToMessageId": 2600 - }, - "2602": { - "id": 2602, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "It's a usual thing for her, personal experience :)" - } - }, - "date": 1577469488, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2603": { - "id": 2603, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "всем хороших выходных и чудесных праздников\nпусть у всех всё сбудется" - } - }, - "date": 1577469712, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2604": { - "id": 2604, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Чот люблю вас очень, ребят ❤️" - } - }, - "date": 1577469720, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2605": { - "id": 2605, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "я вас люблю" - } - }, - "date": 1577469722, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2606": { - "id": 2606, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "186649756741665171", - "emoji": "😍", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 10397, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1577469731, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2607": { - "id": 2607, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "И яяяяя" - } - }, - "date": 1577469786, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2608": { - "id": 2608, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "848105717104813", - "emoji": "❤", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 15388, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577469797, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2609": { - "id": 2609, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "правда, я тут встретила очень хороших людей\nвы замечательные" - } - }, - "date": 1577469871, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2610": { - "id": 2610, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "И я чот довольно сильно" - } - }, - "date": 1577470151, - "senderUserId": 141185012, - "replyToMessageId": 2604 - }, - "2611": { - "id": 2611, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вы чудесные. ❤️ А ещё я всем благодарен за то что создали настоящий крутой праздник в среду. Мне очень тепло и круто работать и отдыхать с вами." - } - }, - "date": 1577472492, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2612": { - "id": 2612, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "675168768736887073", - "emoji": "🙂", - "isAnimated": false, - "width": 128, - "height": 106, - "thumbnail": { - "width": 128, - "height": 106, - "type": "m", - "dataUri": "data:image/jpeg;base64,UklGRkQLAABXRUJQVlA4WAoAAAAQAAAAfwAAaQAAQUxQSCQAAAABHyAgIXKA//O8iohYgpq2DRiSLX8k4w6CRvR/AmQ6o/+NjgZWUDgg+goAADAvAJ0BKoAAagA+USSORKOiISEokzxIcAoJZgDNCbT/Afjd3vW+Ozea9Wv7tuohpO3n9t91XzT/zPqc/OfsAfp50qv259Qn7J/uV7yP+69Tf+l9Qz+3f6rrS/Qd8t/2gv3S9LjNeOy/k8ZgFxv0sfdf1zz275fifqBevu/32fmh/5T/geoF7MfUf+X4UfxR6m/X3Wi+N3uAfy7+r/9z1A/+3/Q+fH6Z/8X+T+Ar+b/2T/r+uF7Ev2+9m79gEJlOL9NdThcRvf1GoWT39eimtkcQthsaRPZHTXTAHf43kd4TPl6PVkh3kHIRdSR8cVMFFT42rV6XIwL6xQwBOhy9xsnUXX8x7S/gRj2xa9hf8b5IDswRNFVxpn58ki0MjgTLInNyQzRGg9ewZ67sh5fi3JUILiCCxlp3msM0KG1LTufRM4mjkIJ/5Z3ArJzTnsByietVay6hQmj0GForleMnVlHm1jbCQObZQpLMct1JaEo0mahdHl5u0QPkQsdz/PuAsHVQAP765RSLR1eBwf3f8p/lO2wLBv2vTFK+GV38/eQwjBXa9rZL1r7vj1ju/xAvv0RdJc++PSX0V7CkTZXroUbO7+Yweeimme0GRZ/3B93KVsdakqLoOAnI6b8LEprZ31mTjHHWplejB2lhlFq0KMmjxuwl+WCBsGXDW0tYaKNtRFQ4XF3ukP58HcD/PW5gNEVnPTHU9OnP+x4wzmVM0sRVaDYdr0ok2c7C3uG6jQDZrzcUYX3gHYvBOI3IFH6tywSUQ9cM84Mlc+wKxQgnSmMf11l5KCcCjNuqvaMSc22assndEIwi/lVe/GObZxlfhncvYJMZkMB6jXoYk9GiTbiIwwOAa4fv6OE2gKn3szxm/5uO3N4HAfdOCQB/w9aru++6KILwEyxFMQ72BoDjC02Lk4BBl4VDN6UtiOTUVqvOyuU+xUs0Yo8ajI7dQTpwKSpxKds+3zVU3i0QHsQqGUNihcKyklBFwnJr1vWR04MUpIXv2iy3u/dAuIwy+9G1C30AT66Y1GRD3hjfkCwcEqNXRoEdhoZAP1+hQGxnRB/Sc7lxPvmNK+i0x6/nnenjrzfZRH1el1I+mQph8u5YMq9+fCndZP9/TdzXmYnLX+AQmF8CyEZ98gKmS6XY/uREisaC7/oeLaXTFokDtuPuIrg+MhUdemsxKNCqIXdTXH588pjYoWOiIRDF/+06Qtd9nb0lxLaXIzsM2+CN4ztzQrSBpCVTaVM5hEzDCGoJ7afZur0/uhATa7fNEd5cxUDIDVpb9tHnxd3qfn8ub+Z2BN5DY2jqXTQ5vFrn8fu2CZCWWE9Wk7ZRTZM0MTq6zRqtW88yBlv577rkEgyB79ihocW4OOyBnadjM8QFUPEHZBYdQlbTOcN4Pwxro5+z2oyPigIk0nKNn/7D8CsL0YtpSKrvvTzPSdgWV0bbCim829pQNn90Z8rTPdSf5Zz9zm7I0+IRb0j5nRDVVm8rOi84zRrHkLtX7wu401nHdJD4nni/RavtY+uu0wK8Zk/57kB2uxXzlTQKLlJZHzP3nXDhTp+pVgGiklze8wLuvQDR7pezTNBw+c90Qxr9OCV0A/Z2Q7y1UJOQ1eH6b6ldhtkp09aM9P1L3kJuKn2QQHefUtlDU8VXswTPk1/BM6RfU4zl4Wncl8J1EcRvG7DnHBxRb1S+F1/VvffT7VtBPzR5C8+2ofs9HNsZQmyCRbYn/MpDrCHpHQEFAcWe5oFeNQU0msZJiW2BGiXmIjulVvinqQHzQrIUs1DuS9jp2TEseZbwKAaZEuiQOk+Ax8D1pt1gNA+63sS9RzqMTVBpEwkRycd4w0W9Hs+VC6KS7nAfmN5tOrIC0ybnbjtDpudmerBMCaRVgKO5JUr141lK15iPX06QdXd/VYeGpHGdLn6CE9vtPZmx8ei0z18njUXuwm8O6Jksl2qpoQl54+9DoDoW3tkPhFT675D/FJIYEaWGX116pZgi6evrQNZj3Y6bSgMO4JqP+FQyPBU0Mkht2cSAv0i3SBMr324qTCiG8qEHMZNivTBV13CrbmSMHuq5aQAkpzhuB7QfQJW5gr76NWZW9JA5Wjk4WFvETPmTYCQbA/Evi1YkEhQrg8Q7dBtj/ZJ2FgOsmQ16Uoe2uziD2K7Wggb7cVBpoQGAOQoKAAcZ08/WJHb3vAaEx3+b81HO2uUw2L3yDNqIpZWjOHvIbnjbyx0szCDMHLWKw1m9xaCAxJ27xbAf4po1g5mWzEvCd7qPyDnzk9kjRvuhXwHbnrIWJZSTEPpiR07K7bAtvgu5vZTgHl0duT++BnpnvC1oyP+GXvnl22KjeCEOKGxwu5sCUjxOCTE3pY65F14WwhvRSXxCjLWkJCX/H8H9DkdKPddSC59rMNmO+hb59+DIBPjEORgwW4e7O+/AfIM+toplk6I3Ks7avJsMlHVPVUJrNT8XUV9EA3k0NjYA4txyK+cY4/ZmE7nF8rKXqrWIQmvT3i+fknLzFs7dzsfAyXUlp3KDVLwp32KJ29P6KbjcTrrlRLqk6YAcvH9E/gJ4yvmZOZsGYcsiD78YPA/v7Ppn5E0uaKXm4zJaZw6eMV6y9WwZ6PehPBttlmYycw1Qaps93lRy20UWsgWDt/VLBDDxwUP7/PNzftOqSrZYXT/IlQIb5UfJxgWHHsD78oSRupEjuyzRGLqjYc2XbFjeFdKkU/GbrEex+kOWsZdpebYim5BiKO4DYgKI+IasL3Q9Alul5IDLqXjoWoHH0kpI6zl8Lqy8Uh6XZHeb8J+xPSNXnoc7H3WXTKxK14m1ItpINwGKqWaf6jDhScr0JyPu51WC4Rf3AMGudcPDpZucs7jcklxUCPaaXoK9N1wCTIXbDEepznI/llS7jnsJhI0tO401k63B8W30VdD9zWzw3/ulw9cRA236aPGh86K5kgx+Ltf2xvz3pAD7zvtts46OLC/Xb4OLhSAW5myI87J1jDub/6KC6Pm5mfXMP1NDTP5+xmb2oINWj0w3hqr33MgIZoPrb8HlHM0i11zB1vXi4K8Mhv5EuOuPk/64AVGMFH4n3Cy2OHIka8HcrPQiqSDNhcv3/5Qf5ANxSoALyOH7r6mkFneLXNYa+1ClIvnhOaNGRJWvjXWCG0KQ4nTxGHkDfBd9efcrZ9K1V+gS5oUaEGR4f4dkRnl1LQZlrxrYEgWPCesWPKsrlhXcUmX2bDvtBfUenMAVYc/WGju953LIM4Gppeu9onVilsdMojLxfrh0YKZ7sgByOMoqlwiQmLBHwvHgJWlRIKjBNhpWRlzwDiOvAftmmjGZWuJwKdIwpf6RYAy/8u+yFtUicdT9NCIomZ2XpBlLw8MKzCekcUIJJd6/iBTnUBUCUlj3s9X0KTK9vlLllc00QQ6Znh+ODzc4bitqcaP5I/jaX1whm5txCPPjcB7LDE+ei3G2KWyhiGXF4Vu9/PIAQTqMEaGLeuwYMftnNCMeBBUyZ/fHoGE1aYE3fiX4Sdm3QQFR8218uCIr05VouQCSbBLWlY8RomaLXnyBWw2ZCw6avtWgXDYkob/E53HCBneRNc3SV5ggqcjjuZVZwyJWml7TyTK2ks4SsuTqdlUSrrdXMgaXYoApxbgsovyRgBEVkVBqUgVHyR0PH4Q4A2a8Y4O4PLAj1eKiFdtTzRDPfDfnGh2pzh+L639gxNqsDOm8ivM0P4rjnPydoMyi63TEGpFXzLLAv3ifATWiSKnPZFxph5w/QWY8liAA" - } - }, - "document": { - "size": 16396, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577472564, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2613": { - "id": 2613, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "810555256122377070", - "emoji": "❤", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 26970, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577472615, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2614": { - "id": 2614, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "уиуиуи" - }, - "video": { - "duration": 2, - "width": 464, - "height": 848, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDSxjvTN3LAEEj0qEyiG3ZsE7egzWfFdSI7F8jdnqOlIo2BsUZZh+dFYm4lyDk8ZHtRSCxZuGLwso4HXNUPMdyoLFsHpmrkpyjD1FVYYX8wEjaBzzTQmEqPG24A7W7mirb7Su0nAzmigYpUMKXaT3oopAKYye1FFFAH/9k=", - "width": 175, - "height": 320 - } - }, - "document": { - "size": 419567, - "mimeType": "video/mp4", - "fileName": "IMG_8007.MOV" - } - }, - "date": 1577484592, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2615": { - "id": 2615, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С наступающим, йо :)" - } - }, - "date": 1577807314, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2616": { - "id": 2616, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Новый год уже шагает по стране) с наступающим!" - } - }, - "date": 1577807597, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2617": { - "id": 2617, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С наступающим друзья ;)" - } - }, - "date": 1577808453, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "2618": { - "id": 2618, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCmBU0Nu8pwo6daRVq9BDLEhblc+gzWspWQ0rkJsZEGSOPbmoGQA4HNaiySBypHHWqctu0k7NGvHU1kptu5ooq1mVSMUU51Kkg8EUVspJmbTRNagNMgPStXaKxoJNkqt6VrLKCoOeDWU9wQNkd6qzTmM4QgeuamlkCoSTwKy33vmUnjP51Ba8wmbdkk5JoqJmyKKEhtkixyGIuFytOhneLAzlB2ooqpvUqmk9B81yx4jwB6kVTJPAzRRUJ3ZU4pLQARj3oooqzI/9k=", - "width": 1080, - "height": 1080 - }, - "sizes": [ - { - "width": 320, - "height": 320, - "type": "m" - }, - { - "width": 800, - "height": 800, - "type": "x" - }, - { - "width": 1080, - "height": 1080, - "type": "y" - } - ] - } - }, - "date": 1577808483, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "2619": { - "id": 2619, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Всех с наступающим!!! )))" - } - }, - "date": 1577809272, - "senderUserId": 802771524, - "replyToMessageId": null - }, - "2620": { - "id": 2620, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С наступающим, котики" - } - }, - "date": 1577809298, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2621": { - "id": 2621, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1078212296544616505", - "emoji": "😘", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,UklGRiwOAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSBoFAAABoLz//5rIYZVTvSd3d/kHenXvWN3b9d1j3d3d3XVwGOaXhOzAJDM/IGXJsCQNC8s8KX3arKZy+o588yNkMiw9NSIguJGkSEpLeTjaXIYnAMBXASQIAAIASAA7AovIvj+iKL7Th/SLohgSRTEiium+vr4L5nJhH3J5X1/flawJV/Ux7OeP2gyIDQw7AOCtuXCAEABQWBNUYDi5B0w2m92cQ7K5OawJj83lw2x2NJfL/ZjL5SK5XDqXy43N/x5PGM5ms8M//fTKgpdLrDJZVQcGHa1BSt0+f7v3ejAYjNn2Ntu2R2zbnrDtqs2g2radtG17j21PBoPBZb4sHgDy0DENoAoA9/Vyybj3vSAIUUHgMpkMcTPMsSYiCAlBEJ66adZ+PiykBQAcuEMAQGdNOL5Xi+RORpblHyVJikkSJ8uyJDMMy7KckqSR+WGOCZIk5WRZ/joef9U/ZTmKAphuLmwVQHNM0AAqgBkAE105O9wxLMtKWZY1ZllVy7L+3MGQtCxL3rGjuGPHjsQOdALFHVjJsvgDZgV9UNJ8tcEBUndZwHoKLAPApp4rfBtpnud/4vkkz0B4ng/xSJzn+e/xjDDP88M8PgHHGsLzEZ7n71jgygCA3KZaHRwG7arm+KHnCqU0QhGJUvozpTSaz9N8Ph+mlCYozeTz+RBl+JFSGqdUpthkHpmglBJKJ/L5/Occxx3qdYmA/O0s5usex/Ne+3Knxhp2eFeNaZqJFrLdNM2IaZpCq/Vbq9VKmqYptlpb0QSGeKvVGm+5o+C5MdM0Dwt4rM9RgUDgJlw7AABYBZ5VyVm9Vs59CXl+3axHCSFRQlIc9jPHJbk2vkdr3EngQSFCyIZ1664NeKrd5z6wUAXzhTUBxF4sKxVFGVYUJaEokoIlFCX3y6ywwvCzoihpxbWUggmK8vVCluSiuAX5oRtnRb1ejzUajXSjUWlgQqNRqtfrkQayrV6vRxuNxuaGa2MNrFCvh4+etd+CFoPZ7nUnoOoIAaQIAKt6rawkhHxHCPmBkDTB4oREHWsShITxEjJM3HNsdGy7aeGKIe8o1ud+xNsfeq2sVFU1rKpqYmqqoGJbVDWrqmp5iiGkquqo2pH5YeN46u0+OYx5sXpX04Cs6rZZqet6VNf1lK6XdIZJvY2IrusZzbWtmqZFNE2jOrLx5JNPXuaPIoA0nBM6fN5jFQcAh/RSWeF41I7NP8g74AnfEiRKCImQjvzsGJckJO7YeN9DD93geUGbAnZ1rMTaWADsd4CRnilLTj755Ls1TUtrmqK1UdGQqt4xXtO0sIakNU2L4q0jU1NT1wQ8wX7f6ZLnxQEyCQC3dc0MVKvVkWpVqVQqU1WvVFj4SqUSriKkWq1Gq8hopVJZfTpylKfFg1cq7e8jbfwBCA9IuPfJtYSQnwhJoYf/joUJkmS9RifsuYxVMceaFCGfPjbrbP8cRqANAzAXNQHYLoBxABjqbTJoGEbaMLbUarW40THNaOPXmjuGYeiGYcQMw1BrtXStVuvz8DBfEQBgj+OH7paBcrmcLJdpuVyOlnwlUi6XC+VyslQq3Xv+LI+e9/xYSAYAlu3748njfpj4SpygD1OijhfyTz333I1eHOZH44D9C/Bdj5KhaURrNpvbp/0o3Ww2U81mszY9ndo+6yKXBY7DfFsirjEAuLoLpb+ISAW/ihUKhUihUJCLxWixWLzMVS0GzB96kJyyapG4Z9Wqm1etWnV8YNH73//8J0gAVlA4IOwIAADwLwCdASqAAIAAPlEijkSjoiEVijYAOAUEoA0fZGYB6ldsH6Z9S70R4A5hcwfYh+s+4j6M+jXzBv1M/zvVP8w/6zfsl7p3+w9b3oAfzr+8daR6BX7Z+mN+0/ww+T5mjv9A/EDwV/s343/tp63+RP0L7d8jBm7+R/rn7WeyPgT8NP7D1AvV3+Y3tEAH5B/U+JL67eVt6df63xa/q/+U9gD+K/2b/v+n7/w+ar6w/8/uH/zX+4/9bgIEWN55+MZwd/DjiLCBfmaPaQOSWPum0ifeh2LsgyLLSjLxLSNFNVuEcT043kSBSND6F/WDTziB/KgaYhWrv1y7qY+BfhIPqaEcNJoWC/nr1lwJIF7aGg/fyLfxieGR1Nydmvfa4Znj4W8eBMDDDdGT6j+orSdNU475mxdQYqEuoQWRHfAGsfpXiWaUPnAr5DOeIRLp+R/OsdL703nf4DoS1pR+VZHfmLbJxeAcCz0T6PLvGGI5HrH0u0Okn0NiXS+STrPiwklfcUsd3jwTJY+RgAD+7/6Q8sH/6GQ48qq+2FCp3nPG7RSdBScp58Hb/Wiw3MCRISwah1vsRNPnpuKrNqoAyxavQ+azqhjUMCmqydjotCjUiRAcVZX1KS6shPnWAmAQ/AvngwFAGExs2iQc/MnkbyVygWBaHeVCSACGZVIKPOMfF2GmAT1xRvLRrzHadXQ7DRUtxvjrOlg3FwyjP0zp6XH1XoATVo3TQwUv7zyejSA1InhWcRaChxDB5Jf7ak56sH5qT3g14ew9faqt4DUolxUoKcDLMYrpT+/h6SxcNm+iYxL59nkeMKs8ztKul2LurciNOgazJnpJ0UuHvNZRgNvClzZNG2YIKS31T34ziMFKCWVz16rm1lvDD8/NiaypddJhbigORWtY7vvy27c17oY9NEKm3K3O9aeuW8VEtmigc//eS46/eKxN+fCDULVRyYJTbt+v81vkZdDWpn1lvt3bpH5k50iO513/iBkwzr5BVQpi7dTyK+1tc5LTzk1N2H4R2ygfCvg/dqOJwufDNT2VKVzbBnNt2HA50UNLBLgmua7n6UCVhOCGwK5CJIgWENYcpWyHuYDAyutZbUBKgxTA7oZeaZS5rM+duxwa8E6GfwlD6y6Z9iRFfB1ICh4J9IoRWd7x0uDLiYYNqoGSkHPGlNwOAl46cNZi/uk3J4ZaAFsG3+3PBMR6h+Xy9gITOQFQdSOkuHHfmkm7QGJpTgHkHR2gwgaC1GrUlfQtgsS9mcIlHjDCD9VL0zV4bYkggJ9drCZ3tN0pEFPEqpKrjcZEIVBMcxuY2r1M/s31JHWT9KFFqowbdoI17sismRqKafLZ3xYxvfsYJfrJ8zlJTqRyxmF72asDUH4DRcpSvr0nmkb2cBTI6V9SqHt/E3ScNEwGytl/qtqnW9G43mNVdPgxrrLfylmqCIxqI31B//uwNgIYUoaIcWeBVhbnQLo0ok7xuLlgWPXmHFT5+HGwNZGtGu9cRLvm/LVNZ3b82m95U5SLhKhhsHBEm1cU6Z8ve9mLTYDZPd7JFVV/9w7x4NTr7/D2CZfec0bkiP2Bg3tKcUHD5UzWsWChztSI/fiZK9ximEj8IUUN18R9nbL2mkMG5IaYkRgZ+DQDYgu14/xHOg3bEL/DT+DdyDOP/+NreL9yNlJp/5qa+xLy7J2VuuErGrOSjnLsx4DRVe9zJUWo8L1i3yPxWj46TUWfOntLivw1AycM2RD0PvRtdXwtWXyseQs1vWQ7kQidGEkHs5/kaYbpd6MN8sm5ZNUOOTW9c6orIvsAyNM0vrYDcJ/1e/wtzU1YcDl4qU/52QrxuSdrzjcclumi80858iYY4kPLhWHs2B+9c6rxr4Rtu3EIpAYoRBGlsyqagZBx+vXu+o9Tj8tjUvp9sw9wnaXa//QPCNuSHaEURxfJH3syEnigw94zAGWvAEKLpKOUfLokcVRoHUl8B9tSSzYlfJRVo3Xiy6295wuzEFLMxpt5bGTNJIbyszZD6saJYthyfTtLytPsx6XZ13TWbC+ab2p2NEO+ufQ+BHvL8nXj3+nb8QF7whskOVd3OPL/SL9jDk81t3gSEMsXs9eWNvrW/QFQroed1a62XF5UA7JpC4Kignkcth/R/oUbtapi1D0sguAsP3ugRLI2lAPNNjllvM//4PP7jmPq+VHjBFT6yNI9UB2rxivYAd2LCsj5W97Pf0e3GNP3awingbVRcK+36zVFY6gxbJPTWcs2E/XAryRCxclDmqgY0MX4W2OYL1yeORwfBMcDCgKP/7PEHsbQGPWUGA5cfh6qTbhfuZLkxorkL9RTU52R+FT8CRx40EOKk/ySyOdkQkcME5gKdpjmgY5d9tYT6Wwf2/m/Mffg8rFq6DNIOZwL7YNUJ6hH9RoeHs/Szk31I54YoVR7LkdagGNXC91tRXLwMUFcKHN3PgOAGv8DYNcthxdo/ZnCm+33NidyQkBZWpz4NZMPidoVoMzH2/yNiuHCEw8BJuWyeu0ulMfX0OLfLW65qn1nzwRzUHvuzjr/OoYUuQh8v1SCzOyGGJ4xXLMtK15/4SCsUMjf+R6Tlhhcc6Jpfzd83Se0cH76E4iJip0oT9tQf2lYBEiBgVUAke/gjiIYcVvgQFmeiQs0TFYvrj1OaX4dlvoIA/Ykd+eTdd7sNWDHj6cVKdQpTHJP6szL2syYkwpf8sYx7jXitkOq0aPoaU2qvWaa8K0NcQ/B2uQue0eTpI5B3nOaXXdqDKlMfXN1btpR00Jp3Fb0hZshHhhNcpoZwm10VADy5m2Rb/51Hu5bqA7TSLWkwCbzsGXGRmQ2rtlP1kwCJnNyzWrwDmjln2LnAlrIDt/zhrfDx25f0KZPdyLn8nAgVhqIkXiQWBfP9P4PdiGeobgfY5ZNTLATRSxAMwHUcV3bkH9a37rnLk76O3UqyNajfvmpyvtMZgkmIHhaOaYmsQhzNZgwD2hZNEbqEwLvtHOPT/Ph0sMRKf/vnattqI9/nXXq2+CuyXgRc5g4Go7pZdxoCzHNz/dD/9FYAAAAAAAAAAAA" - } - }, - "document": { - "size": 21072, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1577809300, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2622": { - "id": 2622, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С Наступающим!" - } - }, - "date": 1577810643, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2623": { - "id": 2623, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "311503369409659028", - "emoji": "❤️", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 27436, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577810654, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2624": { - "id": 2624, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С Новым годом!) у меня уже 2020 🕺🏻" - } - }, - "date": 1577811804, - "senderUserId": 56240484, - "replyToMessageId": null - }, - "2625": { - "id": 2625, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Люди, поздравляю вас с наступившим(у меня) и наступающим(не у меня) новым годом. Вы самая крутая команда с которой мне доводилось работать! \n\nСчастья и развития вас в новом году!" - } - }, - "date": 1577815702, - "senderUserId": 105945096, - "replyToMessageId": null - }, - "2626": { - "id": 2626, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "3664822579234188", - "emoji": "☺️", - "isAnimated": false, - "width": 320, - "height": 320, - "thumbnail": { - "width": 320, - "height": 320, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 14682, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577815802, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2627": { - "id": 2627, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Люблю вас, ребят! Вы классные очень, спасибо за все в этом году и следующий, чувствую, будет тоже классный!" - } - }, - "date": 1577817564, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2628": { - "id": 2628, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "186649756741665171", - "emoji": "😍", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 10397, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1577818076, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2629": { - "id": 2629, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "вы очень классные\nвсех с наступающим и кого-то уже с наступившим) пусть в 2020 всё сбудется\nпростите, если где-то обидела в 2019 \nлюблю вас ❤️" - } - }, - "date": 1577818381, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2630": { - "id": 2630, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С наступающим, ребят) Osome - это семья❤️" - } - }, - "date": 1577819842, - "senderUserId": 143235707, - "replyToMessageId": null - }, - "2631": { - "id": 2631, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Всех с наступающим!!!" - } - }, - "date": 1577819887, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "2632": { - "id": 2632, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ребята, вы реально классные! Желаю вам самого лучшего в наступающем году! 🎁🎉🎊❤️" - } - }, - "date": 1577820056, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2633": { - "id": 2633, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С наступающим!" - } - }, - "date": 1577821644, - "senderUserId": 165916816, - "replyToMessageId": null - }, - "2634": { - "id": 2634, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Да, вы и правда ничего так ;)" - } - }, - "date": 1577822453, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2635": { - "id": 2635, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Шучу, вы огонь ♥️♥️♥️" - } - }, - "date": 1577822467, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2636": { - "id": 2636, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Всех с Наступающим!\nВы все невероятно крутые и я желаю всем всего всего самого лучшего! :3" - } - }, - "date": 1577822550, - "senderUserId": 290281303, - "replyToMessageId": null - }, - "2637": { - "id": 2637, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С Новым Годом всех! 🍾🎄🎁" - } - }, - "date": 1577826243, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2638": { - "id": 2638, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С новым годом! 🎊" - } - }, - "date": 1577826275, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2639": { - "id": 2639, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "368147511233217011", - "emoji": "😌", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 13396, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577826280, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2640": { - "id": 2640, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С Новым Годом всех! 🍾🎄🎁" - } - }, - "date": 1577826283, - "senderUserId": 63238467, - "replyToMessageId": null - }, - "2641": { - "id": 2641, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Вы все очень крутые, давайте зажигать в 2020 году!" - } - }, - "date": 1577826292, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2642": { - "id": 2642, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDHoxUkce6pxb+qmmkK5UxRirxtgOqGorhY+DGpUe5zTsFx9ps2nd17c1orJAVxtYds5/8Ar1iBsVIJj/eP86lDNmQxGP5d4z7npWfdqqIoHJzUImfsw/KmSyO+M/pVXFYgpaKKkYUuT60UUAf/2Q==", - "width": 956, - "height": 1276 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 599, - "height": 800, - "type": "x" - }, - { - "width": 956, - "height": 1276, - "type": "y" - } - ] - } - }, - "date": 1577826309, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "2643": { - "id": 2643, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "405317292084167861", - "emoji": "👍", - "isAnimated": false, - "width": 480, - "height": 512 - }, - "document": { - "size": 40132, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577826323, - "senderUserId": 860139781, - "replyToMessageId": 2641 - }, - "2644": { - "id": 2644, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С Новым годом!🎉🍾🎈" - } - }, - "date": 1577826416, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2645": { - "id": 2645, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С Новым Годом!!! 🍾🥂🎄" - } - }, - "date": 1577826655, - "senderUserId": 802771524, - "replyToMessageId": null - }, - "2646": { - "id": 2646, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С НГ, РЕБЯТА" - }, - "video": { - "duration": 6, - "width": 464, - "height": 848, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCxLKsaZY8Cs+SdXkBGePWn37ESIuMg1TmBRxwQOoBqSy6rZGaKqrJtGTzntnpRSsFy5dx7lBXJ54zVVoyfvk/SrqyCPJk6MeB6UyR0kPbgE9KB2M7jH9KKac9uaKokusTKfehVIR8+lFFIa3K+BiiiikM//9k=", - "width": 175, - "height": 320 - } - }, - "document": { - "size": 836471, - "mimeType": "video/mp4", - "fileName": "IMG_8072.MOV" - } - }, - "date": 1577826741, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2647": { - "id": 2647, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С Новым Годом!! 😎" - } - }, - "date": 1577827287, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2648": { - "id": 2648, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "video": { - "duration": 3, - "width": 464, - "height": 848, - "supportsStreaming": true, - "isRound": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwByjNOlXDAfQ/pUasQfapbpgJPwH8qzNbEZNFRNKBRQKzF81duD3pZGBT5cE98mq+3IyTSK2eCKLFKXUaSWbnpRTgAOlFMhybYE/JxTQx9BRRTFcXdgYooooEf/2Q==", - "width": 175, - "height": 320 - } - }, - "document": { - "size": 464547, - "mimeType": "video/mp4", - "fileName": "IMG_0081.MOV" - } - }, - "date": 1577827296, - "senderUserId": 327556368, - "replyToMessageId": 2641 - }, - "2649": { - "id": 2649, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDIopcVJboXnQAd/TNMC9BaKbQo7bS/P5VnSRtHIUbqPStx/vZ3bR0+lVby3Erb1HzZ5x60gKshZoEXyVUL/EByaW2MaSZkIHoeeK0CoJII4xzVMRwhyc554BqVItxLW4FTtJ2v6GpYI8pwufU4/wAKhjAWNdgztzUzyFEXaSD3zTIM6W9dlAXhT+tR+YGI3rnHoaKKVkilJk8UqqeQQg6VLbTq4xL8vHBzRRTFuz//2Q==", - "width": 958, - "height": 1278 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 958, - "height": 1278, - "type": "y" - } - ] - } - }, - "date": 1577827608, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2650": { - "id": 2650, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "уиии" - } - }, - "date": 1577827664, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2651": { - "id": 2651, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBjDFRMasOM+1V5PkOCM1JVhtOztGBzSR/M2MVZ+xyH+E0ANTByD1B71Fc4BGBz3xUsREi7h3qvc7kA44pdS38JLYlRMC+MVuLIjDKsCK5gMRyKmiuJguVLY9RVGYy1n8sgHof0qS6mG7HUEUUUW1KvoU88Vdhfy4F25BPJoooYo7n/2Q==", - "width": 960, - "height": 1278 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 601, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1278, - "type": "y" - } - ] - } - }, - "date": 1577827962, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2652": { - "id": 2652, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Much fun!" - } - }, - "date": 1577827964, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2653": { - "id": 2653, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCKR8ptz1IqQxxCPoPrUV2AgXH86coQxgjofeoZoRxMQ5QHIpxcHmm8C4FNbhse9dNOKa2MZtpitIAcHrRTCC0/TOP0op1Iwg0NNsSYYY561NZnIYZIqqWLgkmnwsFIBzyO1cxY4KS5IPQ1KinIDc+hp0SDysjr1pVO+T0CmqjNrYTj3EWIBiecmipjRQ5N6tjSSP/Z", - "width": 1280, - "height": 959 - }, - "sizes": [ - { - "width": 320, - "height": 240, - "type": "m" - }, - { - "width": 800, - "height": 599, - "type": "x" - }, - { - "width": 1280, - "height": 959, - "type": "y" - } - ] - } - }, - "date": 1577828075, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2654": { - "id": 2654, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Май фан из фанниар зэн ерз!" - } - }, - "date": 1577828079, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2655": { - "id": 2655, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Всех с Новым годом, чуваки!" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCC2ga6G+WRgD0Ap8Uj29yIZDlW6Gm2uREpaTapHAFJdKViRvM3MrDBqC7aFqUZZfTOKftBHODSS5GMDPOacuNo4qI7ilsZlvIFOw568Yp8zh5FGSADmk2DPHUU4hd5IGB6VrYz9r7pcMiOBjj60j3CQ4DHafTFVSd42g8GpjH5ijK5YewqWkgpyctGRQL5sqoO5pJV2SsnpRRV9SEvdI8bXIz3qxHKUGC350UUWuiG2ndH/9k=", - "width": 958, - "height": 1278 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 958, - "height": 1278, - "type": "y" - } - ] - } - }, - "date": 1577828407, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2657": { - "id": 2657, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1395202765847790103", - "emoji": "🥂", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 21808, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577828423, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2658": { - "id": 2658, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С Новым годом!" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDJqaAjeARk9s1KbZT0pht2BypqSixKkbQM207hmqSoz/dUn6CrtoHZ8PzWioSNdqKAPahAygChoOOxqln2q3b2zP8ANKSij1pWDcmgwOlWQagMC4zDJlh2NOil3LzTApYljlGBhge9XAjy8ysc47UUUpaBDUZK5gCoTu9G9KrJLlmOSATmiihDe5//2Q==", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1577830498, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2659": { - "id": 2659, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1395202765847790103", - "emoji": "🥂", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 21808, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577830564, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2660": { - "id": 2660, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "884547634142909749", - "emoji": "😊", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 47516, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577831002, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2661": { - "id": 2661, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Как там в 2020 году?" - } - }, - "date": 1577831744, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2662": { - "id": 2662, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Чего ждать?" - } - }, - "date": 1577831750, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2663": { - "id": 2663, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "1000 за 20 минут такси 😂" - } - }, - "date": 1577831782, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2664": { - "id": 2664, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Наших, конечно))" - } - }, - "date": 1577831791, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2665": { - "id": 2665, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Лешкоинов?" - } - }, - "date": 1577831805, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2666": { - "id": 2666, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Их 1,000,000🌚" - } - }, - "date": 1577831847, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2667": { - "id": 2667, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Слишком дорогое удовольствие" - } - }, - "date": 1577831866, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2668": { - "id": 2668, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Метро работает" - } - }, - "date": 1577833362, - "senderUserId": 860139781, - "replyToMessageId": 2663 - }, - "2669": { - "id": 2669, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С Яндекс плюс от Ильи я могу позволить себе побыть королевой!" - } - }, - "date": 1577833441, - "senderUserId": 327556368, - "replyToMessageId": null - }, - "2670": { - "id": 2670, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Фигасе" - } - }, - "date": 1577833790, - "senderUserId": 860139781, - "replyToMessageId": null - }, - "2671": { - "id": 2671, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "бесплатно даже, вроде\nне?" - } - }, - "date": 1577834363, - "senderUserId": 177121435, - "replyToMessageId": 2668 - }, - "2672": { - "id": 2672, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Не знаю, через часок другой выясню" - } - }, - "date": 1577834382, - "senderUserId": 860139781, - "replyToMessageId": 2671 - }, - "2673": { - "id": 2673, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1395202765847790100", - "emoji": "😀", - "isAnimated": false, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,UklGRu4NAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSGoCAAABj8OgbSRHn5nrz5/v7BcOEZEXMdWJFj0yEQpPM+a9O6J8ZH49NAYxzZTIFJ3GtBAlYmI67ijELSKiQbYk2aZt9Vz37LWN62Pbtm3btvr/X47P2WOO+XjjRvQ/8Q9WKK+2qiBl4Gps6o6vF9Nd1YUpA7cysmvHb/nxxURlCM4kxq/4pcfNnr8GLpTdMo29+gDUlz8wvYNiWPIglbhlug9NHqx8g9QcBXqhuZgiQwGoDR9QZj8TSr1ZSj1UQKU3SLmHCmjspeRDJvSVUHbXgzb/hMJ10FZP6QsfytYpXgldccqPQFcz5Y+ga50WQtD0izZqoKmVNtagaYRWYlC0Qyv50BN6pJVi6KmhnSLoWaCdXKiJ085jCGpaaGcLeuZppwd61mgnB3r2aeUmA3pOaWUZis5opR+KjmilFoq2aSUORSu0sQ5N07TRDE3ttBGHphxaGIWqjEeK30ega53iB1DWQvFDKItT/Bra1ii9A23FDxSegbouCpdBnTdA2R9Q2EHR71DoHVPyDzSOUDILGrso+RsKzQYlk1BYStGf0Gd2KToZh7pSSl8sj3V3VuaGDZSYXVo7XOyrLUgZ2K6i9cP57tr8GKwlrqjkcnm4rSRmIB7epLLD+foAJEOrVLgWhlx0lSrXwxDym66odMmDhN90Tr11SN+UnlDzVRRp+vV7VD6DtPymc+rPwtf9pnO6sGvwRb/pnI5U4Ut+4zmduQji80DjOV0axafFB3SsGB/HZujcrsEHXsMtHSzF+9Asndw1eJu1T0dL8Zq1Rmf3A3jupcvdeKbTtwk80e0FPNHxUtDxkyBdH+V//wFWUDggXgsAALAyAJ0BKoAAgAA+USSORSOiIRQJhhQ4BQSzgGq6V98JYS2W57zTQJ8W/C/ww/qnhb4qvX3tl6++dO0T+Tfar8J+avsr4Z/EzUL/IP5b/eOC7AJ9RP8X+cPn9aw28B7m/+w9av9H/VfJI8o9gD+Y/27/g/dj8dH+Z/pv3R/2nuY+mf+d/l/gH/kP9M/0n9r/eT/Cf/////db69P209jP9Rj5d1STCUeaimKWfzJYePtkQ2dUcm637Xkb01EupoDi4YdUhNaQarYV7W18Sng7IDmy9McQ3P8P/04xK+CKzcMRgyhe2vjhSIAtpxMSEoRJcdSkagV//+ONV1gRIpM9n2VGfy9/ayFL2TbHT1r50U5SNYR9NBBlP+s30MbyQvy0GW0ZEDEa0bNOutn9WOQj6pZ5JR+TAOc4AjoroqRH4oW0kUFVPMbko9tVPhyWjtXQVPN3XTymHx1PMdcKllSLh0BmtGRr5Q00WliRYdNSCPXCSZnRlxXuxKFLbxx0T5yEHERDjEspSYxDXjOiaG6HQxVeYwOkZe/syaztsw0oAAD+/gbQrEBf/7xv8/RwQUD2PFK2VvWfxxGYkUSgnkApJmtP9onRGfE8VozReEqk+0nbAAFgFiBzxwwQMUCEAEGEKpSSKylzRjeWUadXUHOZGfLmoWKNtLXXLqLGIz+lOKeV12K09yH/V88Rfl+BN1u77E8DXhK7b5ENirNNMe6AjLeXXvld5GkW0uNHPkmkCfvgdKirMoPhJdk5zj5PJEVNA92Yw25kaPOYnZZA+iLI2QysYpHbhiXs8XZzGdlO3/sTqrR/8lVHjv+eF7F37Zgcy61sZWfaNbWF11khL1Oh8BAiAwcJyEMBqfFRcVX7fCITkUb1xHbr2rtJjVDp6RTAJg9O3Of6dRSAkSVTbNc0iKkG5klOw05svXsI7b1P1vWuPVRjb6Ffx4zde7nydvI6Ombkp1JInTGjmGbwjiDsS5u8IcfpMwIrbdEeZNV2ITMeeVPBXF3ubeFMiniIxu8Wy6TDy31NOrvKlvq9obamLbrno/MaBNoY5Cyxd8S7I+BovRfjGgpVO5MCdNG0/5sDD3pFBuK7/ErWIQFrQBBQTZd7Qj5duPhAm2bOt9Jmsvuhx1KxPhJigVlfWmtrLen2SX80L3AG3jJ1N4NS36/ZIUSTSVcU/N/pfnJkJwfxxb0NTnhghUHQT0YK5mH0LSSduSI9sx2sVYaqPbHgiULI4NX4UwcWls/aRl9SEpKNUoAQFgqbJNBtf8RqkwjmiWmL85FVBc5L0oUI0QJ7g+c124LnecpiH69ObEJP9CAGsF8uKcArXCApwpPvjYT2wV3HGttBaBDdAKTeKcl7p0uiPVvqizec1itfH1gUFOJyaCt5AKTQDbN6sZnP6o+4tdC2d1SGPih7awgiNYs6N+9rU6iM7qrr8r4saMn7b+XVHHb+EagAGxAlHp+WQbZt4keXu5z9pc7fMUMUiTzZgzy9WsP7kTaO2cTrWstMQKTcVXm6Ygjd/qLQIKN+UCah3NnFyvqWyQdRQAFaoFwfbiKf3wfcdRiIaH3DHVHsfnxF520cP50SulJ5+iqVY+zHJMYfSdQ3Sp+kazUZxTG275V9T6dnTWh2dp5r45ITrkFr2sef9OztnFiGMPyw7wPcmQGcEQcVKmkNHiPJM79WCnAdbZE9IcuyKdt1H00VqbA+TJT+YZPB5BLPV5oRXPwEsQ7yrr+kzSmkPiudhwKehkYcWAhFTaWdfC2CDI8QJScG3eDJJWjpNyNOSfNOTLgtsZfzpAII7dIaNJFX6RjChrOpoHtZSFh4e8XvTw2zwHcKK2rnP1A2QO18uP9LAdRv1g6m/vJ+A3plNK7+KlPaobw+OW4l6c8Up5MU2N5y8IRq5O0B4JlIjPn7UscG6fxxGYkXNkDZa97XH5ZdMCZvw1QBkfMyImBcUuNcn5EAzAgwHnV1A1OXN+m5sZuizA66rEYzKy7EJrC/3FgUpnCv2JwqsKU5JcV1YhifV7xNqhgCsOgIPPOXqpEBBVHY6UgHbZTfMn4v6B51MtjcEGLAladpRXIzQdqJetBJZ/sZDyWWZPryJEAIPRGSLJSOXC+8+u3TsyJ/fFYK5NeR+o1KSjVVnP4wUBMuxRNxPAlz1j58l1ei3n4TRhEcpAC/spJUor8FyyJ7lKwOzazN8SgxwgQ6rXydiMa77HICAXVkJoIQVMjylAfF8uEw8J+cB9ZNTyJjdNpAtHxo8bAaE4kGuvgY5xJmRcZWtV/0TbNto1WC4sxs7wGb5Bdwfi8JSpP/wYjFXwt2ktv7X9YiIeqYlevLta33MFMv+hg0xQUrIqM1V3lXemFsAZ/GnwhYT6/4lOw2+8V39DbKFsecrFC8n/743+fo4IK9ST2y3B8bS4z4IwyWrtFfFyPDnWsrBGh0YwHRTA+f/dLzfggnWIOB1x5XGSSO+t3MJlmaq2DxwjUNs9nmlTa7v8bLfuH7hZyQoEL3zg6KnK3cfMm6/8t8OzHY9tKYqYw2ODbbWagYuNsB/ISfjiMxIvHdlL/41+vidT+BKmtAg6K90wxsoNFGxj3h/yj2Nmj+fBWL3rIQ3VlIZReIzaHp1250iu+7oZe9XXf/XmtVAPeHU/rRxHcoxfv1zXZNv3a/hPFhch7SGiVZwEqafoLzvGBs0FqPpViNkYQoehKSd2DtBZsybtrKMsngVi0i+m/2bgBh4xoIQhe6hrRp++XVoVAjcZhlKWjUzz1qqz6gVruZE1958KhJ0SMP7UZln1NLUvmLcSf4nrUsBV6u8guGx+K+4h+/x013hB/AVzOwRzklsftqQdYuauacevc1zVjVjHrDOJcuu/Od/1a2i22I7IfDku8546+UqGMk56Hn08pwGbzVAmURJwGVSKnZB5g390mgTE1iLxF15GHV67Eo3QmOrznZcquJmyWWwmv4ESQMbZxpCit1jyQGuKPHCoLGYHwrNygWbzH+LceAB1isbHrID0mWpXKgnCpV4Bpzwpj9sbA72y8PjMhrnKFLIcuL8P8WvXqoDPAMqe8UrLNsAVtIhVBHuq0Xo21nbj/dZ1QCO7jKmjD8a2qlZ4VZukOsbm1v9OtTXyVMcFcdDIA6+u2NSYTyqg17nuSR4qFXZrWmatZ50++LFJIHZp2DmFqcdlkaowF6lzRqbssHNtvQQYHmrTzzBN0EBPxHtGw3VadnpcRujNcW5HD0V2EjgO+WhnQfdsXyzhTfDvTnt/Ptv+iNzUOppV7KaIkMJJr7WDMzGSkNop+nK77+8gsJEYi8Kr8R2gl128hZFaxZRwiMgr9HM3K7Z9nb8vmlKU2288gmKi7u3Lyb1cJD6aTLc8msDGY0f4uHxvpA8x8PW+loDlM7kCtH8yVxCyPW4a4aspKgggueWqA7sy6ukpk+VVGqxUj4YY2xHA16mlQd+8bkqKBTPUKL4BEgDUiQoIgHaaPKSsJ+jhzGNc7uSI3uusO+d8HKAmytoelsa1anYW54R1YOcm11HGYG6RxHa8PVNPbTBRyTBqpoq/v56FJkeNFiKCrZcM55GpWI24CQK0JkXLxk9m30GzavMrqXBCnbr7G+H0iFZRfCDOgfHTdFkdwzNN2brJp+4qc9mdy7mi7us7GbVBWJNpEhkJWS/Zzx3+LrcMNkun30ypXh30byZgL+jzDkS0fUfeeAebanDrFZMySXrPZLyiaysPjG6Sn//KZsp+TOYqyNJpSe2bx2B7D5c1wzddqzjFUlgYmZwc1+KvavRpjClahpI3wuWJoK8qm/An92XTskCUNzuOPFIO8UVmHPm41vXn3iFj7CAqoXKrQJd1qm+ckfirT9fkIMtTt1ZCsHIzf9PsLRqouqD6WTS0CBCwFthuTAAA==" - } - }, - "document": { - "size": 17018, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577834387, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2674": { - "id": 2674, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Боже, Прага божественна в Новый Год" - } - }, - "date": 1577837391, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2675": { - "id": 2675, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С Новым годом дорогие люблю вас всех оч" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDKPWrkTssKYOBiqsw2yuPQkVatyrQhDnJ4B/GhgSxTMZlU4IPtUF/j7SQBjAFSWIL3Iz24qK9GbqQe9LqMivOLmX/eNLGJHAEaMwXngVdaK2lkYkrx1ZmIqpHIYg6xvwW4+lFwJYpfs8+Yj1/vCoWcvKztjLHJ9KQfNuZm+Yc0negC+Y4V4CFifemOieWVCYPqRiiipTKaKi8NyKkCo3aiimxI/9k=", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1577837392, - "senderUserId": 141185012, - "replyToMessageId": null - }, - "2676": { - "id": 2676, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Метро бесплатное" - } - }, - "date": 1577840330, - "senderUserId": 860139781, - "replyToMessageId": 2671 - }, - "2678": { - "id": 2678, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "884547634142912956", - "emoji": "😍", - "isAnimated": false, - "width": 512, - "height": 512 - }, - "document": { - "size": 45684, - "mimeType": "image/webp", - "fileName": "sticker.webp" - } - }, - "date": 1577842466, - "senderUserId": 327556368, - "replyToMessageId": 2675 - }, - "2679": { - "id": 2679, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "2562980648230846522", - "emoji": "😊", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 10174, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1577842508, - "senderUserId": 327556368, - "replyToMessageId": 2674 - }, - "2680": { - "id": 2680, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Как этот жест называется" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCknPTvUqg5qNR5jnHU808xkAHNQdV0kTxvirdvMoDbmxWcD0xx7VfsljKM0g5zjmla4p2sVbGB2O75RGOCWq6iZ3JIg2Z+V+mSfas6N3B/dMQScbRnmtUCQlAw5BzwOKZEkVJJ4LfKwxDcR94nNU4rh4Adv3TVm9tWEzuOhORSWUbHfnGPQ0AmreYlq0MEjySN8ykhVxTHvpWn8wNt9B2xRRQVFX3Jrm7SaJWR9kuOV9RUFjceVuLHO7miiixOzP/Z", - "width": 960, - "height": 1280 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 600, - "height": 800, - "type": "x" - }, - { - "width": 960, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1577992560, - "senderUserId": 63238467, - "replyToMessageId": null, - "forwardInfo": { - "fromChatId": 63238467, - "origin": { - "senderUserId": 63238467 - } - } - }, - "2681": { - "id": 2681, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Дэб?" - } - }, - "date": 1577992597, - "senderUserId": 290281303, - "replyToMessageId": null - }, - "2682": { - "id": 2682, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "ага" - } - }, - "date": 1577992652, - "senderUserId": 177121435, - "replyToMessageId": 2681 - }, - "2683": { - "id": 2683, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "❤️" - } - }, - "date": 1577992671, - "senderUserId": 63238467, - "replyToMessageId": null - }, - "2684": { - "id": 2684, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "меня программистом назвали 😂" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAGACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDV8vPcf98ijyz6j/vkUUUAHln1H/fIo8s/3h/3yKKKBB5Z9R/3yKKKKBn/2Q==", - "width": 695, - "height": 103 - }, - "sizes": [ - { - "width": 320, - "height": 47, - "type": "m" - }, - { - "width": 695, - "height": 103, - "type": "x" - } - ] - } - }, - "date": 1578550427, - "senderUserId": 165916816, - "replyToMessageId": null - }, - "2685": { - "id": 2685, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "один раз не считается" - } - }, - "date": 1578550647, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2686": { - "id": 2686, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "кинь всю статью)" - } - }, - "date": 1578552351, - "senderUserId": 205688700, - "replyToMessageId": 2684 - }, - "2687": { - "id": 2687, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "это не статья) https://en.planet.wikimedia.org/", - "entities": [ - { - "className": "MessageEntityUrl", - "classType": "constructor", - "offset": 15, - "length": 32 - } - ] - } - }, - "date": 1578552939, - "senderUserId": 165916816, - "replyToMessageId": null - }, - "2688": { - "id": 2688, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Класс, молодец)\n\nчитаю на странице Osmose как Osome", - "entities": [ - { - "className": "MessageEntityCode", - "classType": "constructor", - "offset": 35, - "length": 6 - }, - { - "className": "MessageEntityCode", - "classType": "constructor", - "offset": 46, - "length": 5 - } - ] - } - }, - "date": 1578554066, - "senderUserId": 205688700, - "replyToMessageId": 2687 - }, - "2689": { - "id": 2689, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ого!!! Круто круто!!))) Красавчик!" - } - }, - "date": 1578554873, - "senderUserId": 332648262, - "replyToMessageId": 2684 - }, - "2690": { - "id": 2690, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "congrats!" - } - }, - "date": 1578556772, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2691": { - "id": 2691, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAVACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDVVRtXCKeKT/tmv+fwpf8AlmOOwpAq4OR16/L/APWoAUAfxIo+gz/SnYX+7+lN2rg9fypVUDpn8qABlXYflHT0opW+430ooAhEwKAFM8etKJVGAIxxRRQAvn/7P60ef/s/rRRQAjT/ACH5e3rRRRTEf//Z", - "width": 810, - "height": 424 - }, - "sizes": [ - { - "width": 320, - "height": 168, - "type": "m" - }, - { - "width": 800, - "height": 419, - "type": "x" - }, - { - "width": 810, - "height": 424, - "type": "y" - } - ] - } - }, - "date": 1578557526, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2692": { - "id": 2692, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "document": { - "size": 846584, - "mimeType": "image/jpeg", - "fileName": "IMG_2901.PNG" - } - }, - "date": 1578897171, - "senderUserId": 54158593, - "replyToMessageId": null - }, - "2693": { - "id": 2693, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "sticker": { - "id": "1896515373021265956", - "emoji": "😭", - "isAnimated": true, - "width": 128, - "height": 128, - "thumbnail": { - "width": 128, - "height": 128, - "type": "m", - "dataUri": "data:image/jpeg;base64,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" - } - }, - "document": { - "size": 17348, - "mimeType": "application/x-tgsticker", - "fileName": "AnimatedSticker.tgs" - } - }, - "date": 1578898706, - "senderUserId": 149266234, - "replyToMessageId": 2692 - }, - "2694": { - "id": 2694, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Рокет живет в сердцах !" - } - }, - "date": 1578898724, - "senderUserId": 149266234, - "replyToMessageId": null - }, - "2695": { - "id": 2695, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "мою знакомую бывшую сотрдуницу Рокета тоже так выкинули. Она тоже с крымской пропиской" - } - }, - "date": 1578907090, - "senderUserId": 177121435, - "replyToMessageId": 2692 - }, - "2696": { - "id": 2696, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "очень грустно" - } - }, - "date": 1578907121, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2697": { - "id": 2697, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "С другой стороны представьте сценарий, если ничего не сделать. Киви попадает под санкции, пропадает возможность привлекать капитал, в компании начинаются проблемы, в результате гулять отправляются все" - } - }, - "date": 1578907534, - "senderUserId": 3247289, - "replyToMessageId": null - }, - "2698": { - "id": 2698, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "да, так и есть" - } - }, - "date": 1578907578, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2699": { - "id": 2699, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "но в любом случае грустно, что страдают в итоге обычные люди" - } - }, - "date": 1578907630, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2700": { - "id": 2700, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "у меня сестра двоюродная живет в Севастополе, рассказывала мне истории, как она не могла нигде счет открыть, кроме какого-то местного банка" - } - }, - "date": 1578907666, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2701": { - "id": 2701, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Добро пожаловать в Россию!" - } - }, - "date": 1578908312, - "senderUserId": 63238467, - "replyToMessageId": 2700 - }, - "2702": { - "id": 2702, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Всем привет! Я редкостный растяпа и перевел деньги не на тот Тинькофф, но не могу вспомнить чей это конкретно😞 если кто-то из вас обогатился на 2200 прошу вернуть, буду очень благодарен и с меня пиво или шоколадка ( кому как больше нравится ) 😉\n\nНомер карты как видно из скрина заканчивается на 7511" - }, - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC99iiJIO/j3o+wwj+9+dWMEt1OKdQgK32GI92/OirNFABRSd//AK9LQBHub0P5UVJRWfI+47lP+0rPP+s/8dNO/tK0/wCe3/jp/wAKKK0ERR6lD82+dT8xxhT0/KiiigD/2Q==", - "width": 640, - "height": 1280 - }, - "sizes": [ - { - "width": 160, - "height": 320, - "type": "m" - }, - { - "width": 400, - "height": 800, - "type": "x" - }, - { - "width": 640, - "height": 1280, - "type": "y" - } - ] - } - }, - "date": 1578915450, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2703": { - "id": 2703, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Чот не хотят признаваться" - } - }, - "date": 1578919552, - "senderUserId": 860139781, - "replyToMessageId": 2702 - }, - "2704": { - "id": 2704, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Да уж( я на этот номер всего один раз до этого переводил деньги 14 октября 185 р. Я уже с вами работал и кажется это было после \"типичной пятницы\" в Осом ))" - } - }, - "date": 1578920364, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2705": { - "id": 2705, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Может, этот кто-то ещё в отпуске? Офис полупустой" - } - }, - "date": 1578920523, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2706": { - "id": 2706, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Хз хз, буду ждать и надеяться на сознательность этого человека" - } - }, - "date": 1578920612, - "senderUserId": 53759108, - "replyToMessageId": null - }, - "2707": { - "id": 2707, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Я свои карты посмотрел, это не мои точно" - } - }, - "date": 1578920618, - "senderUserId": 3412850, - "replyToMessageId": null - }, - "2708": { - "id": 2708, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "И не моя 🙌 можем метолом исключения попробовать" - } - }, - "date": 1578920637, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2709": { - "id": 2709, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "не моя" - } - }, - "date": 1578920647, - "senderUserId": 177121435, - "replyToMessageId": null - }, - "2710": { - "id": 2710, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "-" - } - }, - "date": 1578920883, - "senderUserId": 356765513, - "replyToMessageId": null - }, - "2711": { - "id": 2711, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Не моя" - } - }, - "date": 1578921166, - "senderUserId": 332648262, - "replyToMessageId": null - }, - "2712": { - "id": 2712, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "-" - } - }, - "date": 1578922216, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2713": { - "id": 2713, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "-" - } - }, - "date": 1578922266, - "senderUserId": 194771934, - "replyToMessageId": null - }, - "2714": { - "id": 2714, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "-" - } - }, - "date": 1578922309, - "senderUserId": 290281303, - "replyToMessageId": null - }, - "2715": { - "id": 2715, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "- также просмотрел телегу, и слак на предмет этого числа — нигде такого не использовал" - } - }, - "date": 1578922518, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2716": { - "id": 2716, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "не получал" - } - }, - "date": 1578925278, - "senderUserId": 310552513, - "replyToMessageId": null - }, - "2717": { - "id": 2717, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "photo": { - "has_stickers": false, - "thumbnail": { - "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCpFgnDnBPpU/2dP75qnbj96Ca0Ac8VCSKZUuYdiBgSRnFVsVeu+YiPQiqeMUbASQf6wVeSqcWBMqjk1bHFNAyO6/1R/CqWatznMTVSzQwRJEdjhjUxuR6/pRRQgZHJOGQgZ5qDvRRQB//Z", - "width": 956, - "height": 1276 - }, - "sizes": [ - { - "width": 240, - "height": 320, - "type": "m" - }, - { - "width": 599, - "height": 800, - "type": "x" - }, - { - "width": 956, - "height": 1276, - "type": "y" - } - ] - } - }, - "date": 1579002967, - "senderUserId": 205688700, - "replyToMessageId": null - }, - "2718": { - "id": 2718, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "4476 2461 3295 0946" - } - }, - "date": 1579003132, - "senderUserId": 165916816, - "replyToMessageId": null - }, - "2719": { - "id": 2719, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "595" - } - }, - "date": 1579003152, - "senderUserId": 2317363, - "replyToMessageId": null - }, - "2720": { - "id": 2720, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ушло 750" - } - }, - "date": 1579003181, - "senderUserId": 56240484, - "replyToMessageId": null - }, - "2721": { - "id": 2721, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "480" - } - }, - "date": 1579003253, - "senderUserId": 88888263, - "replyToMessageId": null - }, - "2722": { - "id": 2722, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "658" - } - }, - "date": 1579003280, - "senderUserId": 290281303, - "replyToMessageId": null - }, - "2723": { - "id": 2723, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "350" - } - }, - "date": 1579003812, - "senderUserId": 802771524, - "replyToMessageId": null - }, - "2724": { - "id": 2724, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Ушла слюна" - } - }, - "date": 1579003917, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2725": { - "id": 2725, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "Хоть бы звали!" - } - }, - "date": 1579003922, - "senderUserId": 146686085, - "replyToMessageId": null - }, - "2726": { - "id": 2726, - "chatId": -1186709966, - "isOutgoing": false, - "content": { - "text": { - "text": "перестали принимать много карточек?" - } - }, - "date": 1579005939, - "senderUserId": 310552513, - "replyToMessageId": null - } - }, - "listedIds": [ - 1718, - 1719, - 1720, - 1721, - 1722, - 1723, - 1724, - 1725, - 1726, - 1727, - 1728, - 1729, - 1730, - 1731, - 1732, - 1733, - 1734, - 1735, - 1736, - 1737, - 1738, - 1739, - 1740, - 1741, - 1742, - 1743, - 1744, - 1745, - 1746, - 1747, - 1748, - 1749, - 1750, - 1751, - 1752, - 1753, - 1754, - 1755, - 1756, - 1757, - 1758, - 1759, - 1760, - 1761, - 1762, - 1763, - 1764, - 1765, - 1766, - 1767, - 1768, - 1769, - 1770, - 1771, - 1772, - 1773, - 1774, - 1775, - 1776, - 1777, - 1778, - 1779, - 1780, - 1781, - 1782, - 1783, - 1784, - 1785, - 1786, - 1787, - 1788, - 1789, - 1790, - 1791, - 1792, - 1793, - 1794, - 1795, - 1796, - 1797, - 1798, - 1799, - 1800, - 1801, - 1802, - 1803, - 1804, - 1805, - 1806, - 1807, - 1808, - 1809, - 1810, - 1811, - 1812, - 1813, - 1814, - 1815, - 1816, - 1817, - 1818, - 1819, - 1820, - 1821, - 1822, - 1823, - 1824, - 1825, - 1826, - 1827, - 1828, - 1829, - 1830, - 1831, - 1832, - 1833, - 1834, - 1835, - 1836, - 1837, - 1838, - 1839, - 1840, - 1841, - 1842, - 1843, - 1844, - 1845, - 1846, - 1847, - 1848, - 1849, - 1850, - 1851, - 1852, - 1853, - 1854, - 1855, - 1856, - 1857, - 1858, - 1859, - 1860, - 1861, - 1862, - 1863, - 1864, - 1865, - 1866, - 1867, - 1868, - 1869, - 1870, - 1871, - 1872, - 1873, - 1874, - 1875, - 1876, - 1877, - 1878, - 1879, - 1880, - 1881, - 1882, - 1883, - 1884, - 1885, - 1886, - 1887, - 1888, - 1889, - 1890, - 1891, - 1892, - 1893, - 1894, - 1895, - 1896, - 1897, - 1898, - 1899, - 1900, - 1901, - 1902, - 1903, - 1904, - 1905, - 1906, - 1907, - 1908, - 1909, - 1910, - 1911, - 1912, - 1913, - 1914, - 1915, - 1916, - 1917, - 1918, - 1919, - 1920, - 1921, - 1922, - 1923, - 1924, - 1925, - 1926, - 1927, - 1928, - 1929, - 1930, - 1931, - 1932, - 1933, - 1934, - 1935, - 1936, - 1937, - 1938, - 1939, - 1940, - 1941, - 1942, - 1943, - 1944, - 1945, - 1946, - 1947, - 1948, - 1949, - 1950, - 1951, - 1952, - 1953, - 1954, - 1955, - 1956, - 1957, - 1958, - 1959, - 1960, - 1961, - 1962, - 1963, - 1964, - 1965, - 1966, - 1967, - 1968, - 1969, - 1970, - 1971, - 1972, - 1973, - 1974, - 1975, - 1976, - 1977, - 1978, - 1979, - 1980, - 1981, - 1982, - 1983, - 1984, - 1985, - 1986, - 1987, - 1988, - 1989, - 1990, - 1991, - 1992, - 1993, - 1994, - 1995, - 1996, - 1997, - 1998, - 1999, - 2000, - 2001, - 2002, - 2003, - 2004, - 2005, - 2006, - 2007, - 2008, - 2009, - 2010, - 2011, - 2012, - 2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026, - 2027, - 2028, - 2029, - 2030, - 2031, - 2032, - 2033, - 2034, - 2035, - 2036, - 2037, - 2039, - 2040, - 2041, - 2042, - 2043, - 2044, - 2045, - 2046, - 2047, - 2048, - 2049, - 2050, - 2051, - 2052, - 2053, - 2054, - 2055, - 2056, - 2057, - 2058, - 2059, - 2060, - 2061, - 2062, - 2063, - 2064, - 2065, - 2066, - 2067, - 2068, - 2069, - 2070, - 2071, - 2072, - 2073, - 2074, - 2075, - 2076, - 2077, - 2078, - 2079, - 2080, - 2081, - 2082, - 2083, - 2084, - 2085, - 2086, - 2087, - 2088, - 2089, - 2090, - 2091, - 2092, - 2093, - 2094, - 2095, - 2096, - 2099, - 2101, - 2102, - 2103, - 2104, - 2105, - 2106, - 2107, - 2108, - 2109, - 2110, - 2111, - 2112, - 2113, - 2114, - 2115, - 2116, - 2117, - 2118, - 2119, - 2120, - 2121, - 2122, - 2123, - 2124, - 2125, - 2126, - 2127, - 2128, - 2129, - 2130, - 2131, - 2132, - 2133, - 2135, - 2136, - 2137, - 2138, - 2139, - 2140, - 2141, - 2142, - 2143, - 2144, - 2145, - 2146, - 2147, - 2148, - 2149, - 2150, - 2151, - 2152, - 2153, - 2154, - 2155, - 2156, - 2157, - 2158, - 2159, - 2160, - 2161, - 2162, - 2163, - 2164, - 2165, - 2166, - 2167, - 2168, - 2169, - 2170, - 2171, - 2172, - 2173, - 2174, - 2175, - 2176, - 2177, - 2178, - 2179, - 2180, - 2181, - 2182, - 2183, - 2184, - 2185, - 2186, - 2187, - 2188, - 2189, - 2190, - 2191, - 2192, - 2193, - 2194, - 2195, - 2196, - 2197, - 2198, - 2199, - 2200, - 2201, - 2202, - 2203, - 2204, - 2205, - 2206, - 2207, - 2208, - 2209, - 2210, - 2211, - 2212, - 2213, - 2214, - 2216, - 2217, - 2218, - 2219, - 2220, - 2221, - 2222, - 2223, - 2224, - 2225, - 2226, - 2227, - 2228, - 2229, - 2230, - 2231, - 2232, - 2233, - 2234, - 2235, - 2236, - 2237, - 2238, - 2239, - 2240, - 2241, - 2242, - 2243, - 2244, - 2245, - 2246, - 2247, - 2248, - 2249, - 2250, - 2251, - 2252, - 2253, - 2254, - 2255, - 2256, - 2257, - 2258, - 2259, - 2260, - 2261, - 2262, - 2263, - 2264, - 2265, - 2266, - 2267, - 2268, - 2269, - 2270, - 2271, - 2272, - 2273, - 2274, - 2275, - 2276, - 2277, - 2278, - 2279, - 2280, - 2281, - 2282, - 2283, - 2284, - 2285, - 2286, - 2287, - 2288, - 2289, - 2290, - 2291, - 2292, - 2293, - 2294, - 2295, - 2296, - 2297, - 2298, - 2299, - 2300, - 2301, - 2302, - 2303, - 2304, - 2305, - 2306, - 2307, - 2308, - 2309, - 2310, - 2311, - 2312, - 2313, - 2314, - 2315, - 2316, - 2317, - 2318, - 2319, - 2320, - 2321, - 2322, - 2323, - 2324, - 2325, - 2326, - 2327, - 2328, - 2329, - 2330, - 2331, - 2332, - 2333, - 2334, - 2335, - 2336, - 2337, - 2338, - 2339, - 2340, - 2341, - 2342, - 2343, - 2344, - 2345, - 2346, - 2347, - 2348, - 2349, - 2350, - 2351, - 2352, - 2353, - 2354, - 2355, - 2356, - 2357, - 2358, - 2359, - 2360, - 2361, - 2362, - 2363, - 2364, - 2365, - 2366, - 2367, - 2368, - 2369, - 2370, - 2371, - 2372, - 2373, - 2374, - 2375, - 2376, - 2377, - 2378, - 2379, - 2380, - 2381, - 2382, - 2383, - 2384, - 2385, - 2386, - 2387, - 2388, - 2389, - 2390, - 2391, - 2392, - 2393, - 2394, - 2395, - 2396, - 2397, - 2398, - 2399, - 2400, - 2401, - 2402, - 2403, - 2404, - 2405, - 2406, - 2407, - 2408, - 2409, - 2410, - 2411, - 2412, - 2413, - 2414, - 2415, - 2416, - 2417, - 2418, - 2419, - 2420, - 2421, - 2422, - 2423, - 2424, - 2425, - 2426, - 2427, - 2428, - 2429, - 2430, - 2431, - 2432, - 2433, - 2434, - 2435, - 2436, - 2437, - 2438, - 2439, - 2440, - 2441, - 2442, - 2443, - 2444, - 2445, - 2446, - 2447, - 2448, - 2449, - 2450, - 2451, - 2452, - 2453, - 2454, - 2455, - 2456, - 2457, - 2458, - 2459, - 2460, - 2461, - 2462, - 2463, - 2464, - 2465, - 2466, - 2467, - 2468, - 2469, - 2470, - 2471, - 2472, - 2473, - 2474, - 2475, - 2476, - 2477, - 2478, - 2479, - 2480, - 2481, - 2482, - 2483, - 2484, - 2485, - 2486, - 2487, - 2488, - 2489, - 2490, - 2491, - 2492, - 2493, - 2494, - 2495, - 2496, - 2497, - 2498, - 2499, - 2500, - 2501, - 2502, - 2503, - 2504, - 2505, - 2506, - 2507, - 2508, - 2509, - 2510, - 2511, - 2512, - 2513, - 2514, - 2515, - 2516, - 2517, - 2518, - 2519, - 2520, - 2521, - 2522, - 2523, - 2524, - 2525, - 2526, - 2527, - 2528, - 2530, - 2531, - 2532, - 2533, - 2534, - 2535, - 2536, - 2537, - 2538, - 2539, - 2540, - 2541, - 2542, - 2543, - 2544, - 2545, - 2546, - 2547, - 2548, - 2549, - 2550, - 2551, - 2552, - 2553, - 2554, - 2555, - 2556, - 2557, - 2558, - 2559, - 2560, - 2561, - 2562, - 2563, - 2564, - 2565, - 2566, - 2567, - 2568, - 2569, - 2570, - 2571, - 2572, - 2573, - 2574, - 2575, - 2576, - 2577, - 2578, - 2579, - 2580, - 2581, - 2582, - 2583, - 2584, - 2585, - 2586, - 2587, - 2588, - 2589, - 2590, - 2591, - 2592, - 2593, - 2594, - 2595, - 2596, - 2597, - 2598, - 2599, - 2600, - 2601, - 2602, - 2603, - 2604, - 2605, - 2606, - 2607, - 2608, - 2609, - 2610, - 2611, - 2612, - 2613, - 2614, - 2615, - 2616, - 2617, - 2618, - 2619, - 2620, - 2621, - 2622, - 2623, - 2624, - 2625, - 2626, - 2627, - 2628, - 2629, - 2630, - 2631, - 2632, - 2633, - 2634, - 2635, - 2636, - 2637, - 2638, - 2639, - 2640, - 2641, - 2642, - 2643, - 2644, - 2645, - 2646, - 2647, - 2648, - 2649, - 2650, - 2651, - 2652, - 2653, - 2654, - 2655, - 2657, - 2658, - 2659, - 2660, - 2661, - 2662, - 2663, - 2664, - 2665, - 2666, - 2667, - 2668, - 2669, - 2670, - 2671, - 2672, - 2673, - 2674, - 2675, - 2676, - 2678, - 2679, - 2680, - 2681, - 2682, - 2683, - 2684, - 2685, - 2686, - 2687, - 2688, - 2689, - 2690, - 2691, - 2692, - 2693, - 2694, - 2695, - 2696, - 2697, - 2698, - 2699, - 2700, - 2701, - 2702, - 2703, - 2704, - 2705, - 2706, - 2707, - 2708, - 2709, - 2710, - 2711, - 2712, - 2713, - 2714, - 2715, - 2716, - 2717, - 2718, - 2719, - 2720, - 2721, - 2722, - 2723, - 2724, - 2725, - 2726 - ] - } - } - }, - "scheduledMessages": {}, - "authRememberMe": true, - "authIsSessionRemembered": false, - "connectionState": "connectionStateReady", - "authState": "authorizationStateReady", - "authIsLoading": false, - "authPhoneNumber": "+7 915 094-23-95", - "isLoggingOut": false -} diff --git a/dist/0.c66dcd2dcbc1482a0d6f.css b/dist/0.21ca60653ccd8108472e.css similarity index 81% rename from dist/0.c66dcd2dcbc1482a0d6f.css rename to dist/0.21ca60653ccd8108472e.css index 0d0d623f9..303b1abcd 100644 --- a/dist/0.c66dcd2dcbc1482a0d6f.css +++ b/dist/0.21ca60653ccd8108472e.css @@ -1 +1 @@ -.Transition{position:relative}.Transition>*{width:100%;height:100%;animation-fill-mode:forwards!important;transition:background-color .2s}.Transition>.from,.Transition>.to{position:absolute;top:0;left:0}.Transition>:not(.active):not(.from):not(.to){display:none!important}.Transition.scroll-slide{width:100%;height:100%;overflow:hidden;display:flex;flex-wrap:nowrap}.Transition.scroll-slide>*{position:static;flex-shrink:0}.Transition.scroll-slide>:not(.active):not(.from):not(.to){display:block!important;transform:scale(0)}.Transition.scroll-slide>:not(.active):not(.from):not(.to).through{display:none!important}.Transition.slide>.to{transform:translateX(100%)}.Transition.slide.animating>.from{animation:slide-out var(--slide-transition)}.Transition.slide.animating>.to{animation:slide-in var(--slide-transition)}.Transition.slide.backwards>.to{transform:translateX(-100%)}.Transition.slide.backwards.animating>.from{animation:slide-in-backwards var(--slide-transition)}.Transition.slide.backwards.animating>.to{animation:slide-out-backwards var(--slide-transition)}.Transition.slide-reversed>.to{transform:translateX(-100%)}.Transition.slide-reversed.animating>.from{animation:slide-out var(--slide-transition)}.Transition.slide-reversed.animating>.to{animation:slide-in var(--slide-transition)}.Transition.slide-reversed.backwards>.to{transform:translateX(100%)}.Transition.slide-reversed.backwards.animating>.from{animation:slide-in-backwards var(--slide-transition)}.Transition.slide-reversed.backwards.animating>.to{animation:slide-out-backwards var(--slide-transition)}.Transition.mv-slide>*>div{animation-fill-mode:forwards!important}.Transition.mv-slide>.to>div{transform:translateX(100vw)}.Transition.mv-slide.animating>.from>div{animation:mv-slide-out .4s ease}.Transition.mv-slide.animating>.to>div{animation:mv-slide-in .4s ease}.Transition.mv-slide.backwards>.to>div{transform:translateX(-100vw)}.Transition.mv-slide.backwards.animating>.from>div{animation:mv-slide-in-backwards .4s ease}.Transition.mv-slide.backwards.animating>.to>div{animation:mv-slide-out-backwards .4s ease}.Transition.slide-fade>.from{transform-origin:left;transform:translateX(0);opacity:1}.Transition.slide-fade>.to{transform-origin:left;transform:translateX(1.5rem);opacity:0}.Transition.slide-fade.animating>.from{animation:fade-out-opacity var(--slide-transition),slide-fade-out-move var(--slide-transition)}.Transition.slide-fade.animating>.to{animation:fade-in-opacity var(--slide-transition),slide-fade-in-move var(--slide-transition)}.Transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.Transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.Transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity var(--slide-transition),slide-fade-in-backwards-move var(--slide-transition)}.Transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity var(--slide-transition),slide-fade-out-backwards-move var(--slide-transition)}.Transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.Transition.zoom-fade>.to{transform-origin:center;opacity:0}.Transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.Transition.zoom-fade.animating>.to{animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.Transition.zoom-fade.backwards>.from{transform:scale(1)}.Transition.zoom-fade.backwards>.to{transform:scale(.95)}.Transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.Transition.zoom-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.Transition.fade>.from{opacity:1}.Transition.fade>.to{opacity:0}.Transition.fade.animating>.from{animation:fade-out-opacity .15s ease}.Transition.fade.animating>.to{animation:fade-in-opacity .15s ease}.Transition.slide-layers{--background-color:var(--color-background);background:#000}.Transition.slide-layers>div{background:var(--background-color)}.Transition.slide-layers>.to{transform:translateX(100%)}.Transition.slide-layers.animating>.from{animation:slide-layers-out var(--layer-transition)}.Transition.slide-layers.animating>.to{animation:slide-in var(--layer-transition)}.Transition.slide-layers.backwards>.to{transform:translateX(-20%);opacity:.75}.Transition.slide-layers.backwards.animating>.from{animation:slide-in-backwards var(--layer-transition)}.Transition.slide-layers.backwards.animating>.to{animation:slide-layers-out-backwards var(--layer-transition)}.Transition.push-slide>div{background:var(--color-background)}.Transition.push-slide>.from{transform-origin:center;transform:scale(1);opacity:1}.Transition.push-slide>.from .custom-scroll{scrollbar-color:transparent!important}.Transition.push-slide>.from .custom-scroll::-webkit-scrollbar-thumb{background-color:initial!important}.Transition.push-slide>.to{transform:translateX(100%)}.Transition.push-slide.animating>.from{animation:push-out .3s ease-in-out}.Transition.push-slide.animating>.to{animation:slide-in-200 .3s ease-in-out}.Transition.push-slide.backwards>.to{transform:scale(.7)}.Transition.push-slide.backwards.animating>.from{animation:slide-in-200-backwards .3s ease-in-out}.Transition.push-slide.backwards.animating>.to{animation:push-out-backwards .3s ease-in-out}.Transition.reveal>.to{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}.Transition.reveal.animating>.to{animation:reveal-in .35s ease-in}.Transition.reveal.backwards>.from{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}.Transition.reveal.backwards>.to{-webkit-clip-path:none;clip-path:none}.Transition.reveal.backwards.animating>.from{animation:reveal-in-backwards .35s ease-out}.Transition.reveal.backwards.animating>.to{animation:none}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes slide-in{0%{transform:translateX(100%)}to{transform:translateX(0)}}@keyframes slide-out{0%{transform:translateX(0)}to{transform:translateX(-100%)}}@keyframes slide-in-backwards{0%{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-out-backwards{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes mv-slide-in{0%{transform:translateX(100vw)}to{transform:translateX(0)}}@keyframes mv-slide-out{0%{transform:translateX(0)}to{transform:translateX(-100vw)}}@keyframes mv-slide-in-backwards{0%{transform:translateX(0)}to{transform:translateX(100vw)}}@keyframes mv-slide-out-backwards{0%{transform:translateX(-100vw)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-layers-out{0%{transform:translateX(0);opacity:1}to{transform:translateX(-20%);opacity:calc(1 - var(--layer-blackout-opacity))}}@keyframes slide-layers-out-backwards{0%{transform:translateX(-20%);opacity:calc(1 - var(--layer-blackout-opacity))}to{transform:translateX(0);opacity:1}}@keyframes push-out{0%{transform:scale(1);opacity:1}to{transform:scale(.7);opacity:0}}@keyframes push-out-backwards{0%{transform:scale(.7);opacity:0}to{transform:scale(1);opacity:1}}@keyframes slide-in-200{0%{transform:translateX(200%)}to{transform:translateX(0)}}@keyframes slide-in-200-backwards{0%{transform:translateX(0)}to{transform:translateX(200%)}}@keyframes reveal-in{0%{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}to{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}}@keyframes reveal-in-backwards{0%{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}to{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}}.Avatar{--color-user:var(--color-primary);flex:none;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;background:linear-gradient(var(--color-white) -125%,var(--color-user));color:#fff;font-weight:700;display:flex;white-space:nowrap}.Avatar,.Avatar img:not(.emoji){border-radius:50%}.Avatar .emoji{width:1rem;height:1rem}.Avatar i{font-size:2.5rem}.Avatar.size-micro{width:1rem;height:1rem;font-size:.5125rem}.Avatar.size-micro .emoji{width:.5625rem;height:.5625rem}.Avatar.size-tiny{width:2rem;height:2rem;font-size:.875rem}.Avatar.size-tiny .emoji{width:.875rem;height:.875rem}.Avatar.size-small{width:2.125rem;height:2.125rem;font-size:.875rem}.Avatar.size-small .emoji{width:.875rem;height:.875rem}.Avatar.size-medium{width:2.75rem;height:2.75rem;font-size:1.1875rem}.Avatar.size-medium .emoji{width:1rem;height:1rem}.Avatar.size-large{font-size:1.3125rem}.Avatar.size-large i{font-size:3.5rem}.Avatar.size-large .emoji{width:1.3125rem;height:1.3125rem}.Avatar.size-jumbo{width:7.5rem;height:7.5rem;font-size:3.5rem}.Avatar.size-jumbo i{font-size:6rem}.Avatar.size-jumbo .emoji{width:3.5rem;height:3.5rem}.Avatar.online{position:relative}.Avatar.online:after{content:"";display:block;position:absolute;bottom:.05rem;right:.05rem;width:.875rem;height:.875rem;border-radius:50%;border:2px solid var(--color-background);background-color:#0ac630;flex-shrink:0}.Avatar.interactive{cursor:pointer}.Avatar img:not(.emoji){width:100%;height:100%}.ProgressSpinner{position:relative;z-index:1;width:3.375rem;height:3.375rem;background:rgba(0,0,0,.25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIHN0cm9rZT0iI0ZGRiIgc3Ryb2tlLXdpZHRoPSIuNzUiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=) no-repeat 49% 49%;border-radius:50%;cursor:pointer}.ProgressSpinner.no-cross{background:transparent!important;pointer-events:none}.ProgressSpinner.square{background-image:none}.ProgressSpinner.square:after{content:"";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:#fff;left:50%;top:50%;transform:translate3d(-50%,-50%,0)}.ProgressSpinner.size-m,.ProgressSpinner.size-s{width:auto;height:auto;background:transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIHN0cm9rZT0iI0ZGRiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%}.ProgressSpinner.size-m.square,.ProgressSpinner.size-s.square{background-image:none;width:.75rem;height:.75rem}.ProgressSpinner.size-xl{width:3.25rem;height:3.25rem}.ProgressSpinner.size-xl svg{width:3rem;height:3rem;margin:.125rem}.ProgressSpinner.size-xl circle{stroke-width:3px}.ProgressSpinner.transparent{background-color:initial!important}.ProgressSpinner svg{display:block;transform:rotate(-90deg);transform-origin:50% 50%;animation:ProgressSpinnerAnimation 4s linear 0s infinite}.ProgressSpinner circle{transition:stroke-dashoffset .5s}@keyframes ProgressSpinnerAnimation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.Modal{position:relative;z-index:var(--z-modal)}.Modal.confirm .modal-dialog,.Modal.delete .modal-dialog,.Modal.error .modal-dialog,.Modal.pin .modal-dialog,.Modal.unpin-all .modal-dialog{max-width:23rem}.Modal.narrow .modal-dialog{max-width:20rem}.Modal .modal-container{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;justify-content:center;align-items:center}.Modal .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-1;background-color:rgba(0,0,0,.25)}.Modal.transparent-backdrop .modal-backdrop{background-color:initial}.Modal .modal-dialog{position:relative;display:inline-flex;flex-direction:column;width:100%;max-width:35rem;min-width:17.5rem;margin:2rem auto;background-color:var(--color-background);box-shadow:0 .25rem .5rem .125rem var(--color-default-shadow);border-radius:var(--border-radius-default);transform:translate3d(0,-1rem,0);transition:transform .2s ease,opacity .2s ease}body.animation-level-0 .Modal .modal-dialog{transition:none;transform:none!important}@media (max-width:450px){.Modal .modal-dialog{max-width:calc(100vw - 3rem)!important}}.Modal.open .modal-dialog{transform:translateZ(0)}.Modal.closing .modal-dialog{transform:translate3d(0,1rem,0)}.Modal .modal-header,.Modal .modal-header-condensed{padding:1rem 1rem 0;display:flex;align-items:center;flex-shrink:0}.Modal .modal-title{font-size:1.25rem;font-weight:500;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}.Modal .modal-title:not(:only-child){margin:0 1.3125rem}.Modal .modal-header-condensed{padding:.5rem 1.25rem 0 .9375rem!important}.Modal .modal-header-condensed .modal-action-button{font-size:.875rem;height:2.25rem;width:auto;line-height:1.625rem;margin-left:auto;padding-left:1.25rem;padding-right:1.25rem;min-width:5rem}.Modal .modal-content{width:100%;flex-grow:1;padding:1rem;overflow-y:auto}.Modal .modal-content b,.Modal .modal-content strong{word-break:break-word}.Modal .modal-content,.Modal .modal-content>p,.Modal .modal-title{unicode-bidi:plaintext;text-align:initial}.Modal .dialog-buttons{display:flex;align-items:flex-end}.Modal .dialog-buttons .confirm-dialog-button+.confirm-dialog-button{margin-left:1rem}.Modal .confirm-dialog-button{width:auto;height:auto;margin-left:auto;text-align:right;font-weight:500}.ListItem{position:relative}.ListItem .ListItem-button{width:100%;background-color:var(--background-color);border:none!important;box-shadow:none!important;outline:none!important;display:flex;padding:1rem;position:relative;overflow:hidden;line-height:1.5rem;white-space:nowrap;color:var(--color-text);border-radius:var(--border-radius-default);--ripple-color:rgba(0,0,0,0.08)}.ListItem .ListItem-button>i{font-size:1.5rem;margin-right:2rem;color:var(--color-text-secondary)}.ListItem .group-status,.ListItem .subtitle,.ListItem .title,.ListItem .user-status{text-align:initial;unicode-bidi:plaintext}.ListItem.multiline .ListItem-button>i{position:relative;top:.25rem}.ListItem.disabled{pointer-events:none}.ListItem.disabled .ListItem-button{opacity:.5}.ListItem:not(.disabled):not(.is-static) .ListItem-button{cursor:pointer}.ListItem:not(.disabled):not(.is-static) .ListItem-button:focus,body:not(.is-ios) .ListItem:not(.disabled):not(.is-static) .ListItem-button:hover{--background-color:var(--color-chat-hover)}@media (min-width:600px){.ListItem:not(.has-ripple):not(.is-static) .ListItem-button:active,body.animation-level-0 .ListItem .ListItem-button:active{--background-color:var(--color-item-active)!important}}.ListItem.has-menu-open .ListItem-button{--background-color:var(--color-chat-hover)}.ListItem.narrow{margin-bottom:.75rem}.ListItem.narrow .ListItem-button{padding:.5rem 1rem}.ListItem.inactive{pointer-events:none}.ListItem.focus{--background-color:var(--color-chat-hover)}.ListItem.destructive .ListItem-button{color:var(--color-error)}.ListItem.destructive .ListItem-button i{color:inherit}.ListItem-context-menu{position:absolute}.ListItem-context-menu .bubble{width:auto}.ListItem-context-menu .bubble .MenuItem button{padding-left:1rem!important;padding-right:2rem!important}.ListItem.chat-item-clickable{margin:0 -.5rem}.ListItem.chat-item-clickable .ListItem-button{padding:.5625rem .6975rem .5625rem .5625rem}.ListItem.chat-item-clickable .Avatar{flex-shrink:0;margin-right:.5rem}.ListItem.chat-item-clickable .info{flex-grow:1;overflow:hidden}.ListItem.chat-item-clickable .subtitle,.ListItem.chat-item-clickable .title{overflow:hidden;display:flex;justify-content:flex-start;align-items:center}.ListItem.chat-item-clickable .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status,.ListItem.chat-item-clickable h3{font-size:1rem;line-height:1.6875rem;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:initial}.ListItem.chat-item-clickable .title h3{font-weight:500}.ListItem.chat-item-clickable .title .VerifiedIcon{width:1.25rem;height:1.25rem;margin-left:.25rem}.ListItem.chat-item-clickable .title .emoji{vertical-align:text-bottom;background-position:0 0;flex-shrink:0}.ListItem.chat-item-clickable .contact-phone,.ListItem.chat-item-clickable .contact-username{font-size:.875rem;line-height:1.25rem;color:var(--color-text-secondary)}.ListItem.chat-item-clickable .ChatInfo{display:flex;align-items:center;flex-grow:1;overflow:hidden}.ListItem.chat-item-clickable .ChatInfo .status,.ListItem.chat-item-clickable .ChatInfo .typing-status{font-size:.875rem;line-height:1.25rem;color:var(--color-text-secondary);display:inline-block}.ListItem.chat-item-clickable .ChatInfo .status.online,.ListItem.chat-item-clickable .ChatInfo .typing-status.online{color:var(--color-primary)}.ListItem.chat-item-clickable .ChatInfo .status[dir=auto],.ListItem.chat-item-clickable .ChatInfo .status[dir=rtl],.ListItem.chat-item-clickable .ChatInfo .typing-status[dir=auto],.ListItem.chat-item-clickable .ChatInfo .typing-status[dir=rtl]{text-align:initial;width:100%}.ListItem.chat-item-clickable .ChatInfo .status .group-status:only-child,.ListItem.chat-item-clickable .ChatInfo .status .user-status:only-child,.ListItem.chat-item-clickable .ChatInfo .typing-status .group-status:only-child,.ListItem.chat-item-clickable .ChatInfo .typing-status .user-status:only-child{display:flow-root}.ListItem.chat-item-clickable .contact-phone,.ListItem.chat-item-clickable .contact-username,.ListItem.chat-item-clickable .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status,.ListItem.chat-item-clickable h3{text-align:initial;unicode-bidi:plaintext}.ListItem.chat-item-clickable[dir=rtl] .ListItem-button{padding:.5625rem .5625rem .5625rem .6975rem}.ListItem.chat-item-clickable[dir=rtl] .Avatar{margin-left:.5rem;margin-right:0}.ListItem.chat-item-clickable[dir=rtl] .info>.status{width:100%}.ListItem.search-result-message .title{padding-right:.15rem}.ListItem.search-result-message h3{max-width:80%}.ListItem.search-result-message .subtitle,.ListItem.search-result-message h3{font-size:1rem;line-height:1.5rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:left}.ListItem.search-result-message .LastMessageMeta{margin-left:auto;margin-right:0}.ListItem.search-result-message .subtitle{color:var(--color-text-secondary);margin-right:2rem}.ListItem.search-result-message .subtitle .matching-text-highlight{color:var(--color-text);background:#cae3f7;border-radius:.25rem;padding:0 .125rem}.ListItem.search-result-message[dir=rtl] .LastMessageMeta{margin-left:0;margin-right:auto}.ListItem.search-result-message[dir=rtl] .subtitle{margin-right:0;display:block}.ListItem.picker-list-item{margin:0}.ListItem.picker-list-item .ListItem-button{padding-left:0;display:flex;align-items:center}.ListItem.picker-list-item .Avatar{width:3rem;height:3rem}.ListItem.picker-list-item .Checkbox{flex-shrink:0;height:1.5rem;margin:0;padding-left:4rem}.ListItem.picker-list-item[dir=rtl] .Checkbox{padding-left:0;padding-right:4rem}.ListItem .multiline-item{white-space:normal;overflow:hidden}.ListItem .multiline-item .subtitle,.ListItem .multiline-item .title{display:block;text-align:initial}.ListItem .multiline-item .title{line-height:1.25rem;overflow:hidden;text-overflow:ellipsis}.ListItem .multiline-item .subtitle{font-size:.875rem;line-height:1.5rem;color:var(--color-text-secondary)}.ListItem .multiline-item .subtitle+.subtitle{margin-top:-.25rem}.ListItem .multiline-item .subtitle.black{color:var(--color-text)}.ListItem[dir=rtl] .ListItem-button>i{margin-left:2rem;margin-right:0}.VerifiedIcon{display:inline-block;flex-shrink:0;width:1.5rem;height:1.5rem;background-image:url(icon-verified.a2a4fb48197a45cb301b64e39d1a8427.svg);background-repeat:no-repeat;background-size:100%;background-position:50%}.typing-status{display:flex;align-items:baseline}.typing-status .sender-name:after{content:"\00a0";color:var(--color-text-secondary)}.typing-status .ellipsis{display:flex;width:1rem;overflow:hidden}.typing-status .ellipsis:after{content:"...";animation:typing-animation 1s steps(4,start) infinite}html[lang=ar] .typing-status .ellipsis:after,html[lang=fa] .typing-status .ellipsis:after{animation-name:typing-animation-rtl}@keyframes typing-animation{0%{transform:translateX(-1rem)}}@keyframes typing-animation-rtl{0%{transform:translateX(1rem)}}.Notification-container{position:relative;width:24rem;max-width:100vw;margin:.25rem auto;z-index:var(--z-notification)}@media (min-width:1276px){.Notification-container{transition:transform var(--layer-transition)}body.is-right-column-shown .Notification-container{transform:translate3d(calc(var(--right-column-width)/-2),0,0)}}.Notification-container:first-of-type{margin-top:4.25rem}.has-header-tools .Notification-container:first-of-type{margin-top:7.375rem}.Notification{background:rgba(32,32,32,.8) url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+") no-repeat .9375rem 50%;background-size:1.5rem;border-radius:var(--border-radius-default);padding:.9375rem .9375rem .9375rem 3.375rem;color:#fff;margin:0 .5rem}.Notification .text-entity-link,.Notification .text-entity-link:active,.Notification .text-entity-link:hover{color:#fff!important;text-decoration:underline}.Notification .content{line-height:1.25;word-break:break-word;font-size:.9375rem}.Tab{flex:1 1 auto;-webkit-appearance:none;appearance:none;background:none;width:auto;margin:0;border:none;padding:.625rem .25rem;font-weight:500;color:var(--color-text-secondary);cursor:pointer;border-top-left-radius:var(--border-radius-messages-small);border-top-right-radius:var(--border-radius-messages-small)}.Tab,.Tab:active,.Tab:focus{outline:none}.Tab.active{pointer-events:none;cursor:default;color:var(--color-primary)}.Tab.active i{opacity:1}.Tab:not(.active):hover{background:var(--color-interactive-element-hover)}.Tab>span{position:relative;display:inline-flex;align-items:center}.Tab .badge{min-width:1.25rem;height:1.25rem;margin-inline-start:.5rem;background:var(--color-gray);border-radius:.75rem;padding:0 .3125rem;color:#fff;font-size:.875rem;line-height:1.3125rem;font-weight:500;text-align:center;flex-shrink:0}.Tab .badge.active{background:var(--color-primary)}.Tab i{position:absolute;bottom:calc(-.625rem - 1px);left:0;opacity:0;background-color:var(--color-primary);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:initial;transform-origin:left}.Tab i.animate{transition:transform var(--slide-transition)}body.animation-level-0 .Tab i.animate{transition:none!important}.TabList{position:sticky;top:0;flex-shrink:0;display:flex;justify-content:space-between;align-items:flex-end;font-size:.875rem;flex-wrap:nowrap;box-shadow:0 2px 2px var(--color-light-shadow);background-color:var(--color-background);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;scrollbar-color:transparent}.TabList.big{font-size:1rem;--border-radius-messages-small:0}.TabList::-webkit-scrollbar{height:0}.TabList::-webkit-scrollbar-thumb{background-color:transparent}.DeleteChatModal .modal-dialog{max-width:20rem}.DeleteChatModal .modal-header{padding:1.125rem 1.25rem 0}.DeleteChatModal .modal-title:not(:only-child){margin:0 0 0 .75rem}.DeleteChatModal .modal-content{padding:.5rem 1.25rem}.DeleteChatModal .confirm-dialog-button{margin-right:-.625rem}.SearchInput{position:relative;width:100%;color:rgba(var(--color-text-secondary-rgb),.5);background-color:var(--color-chat-hover);border:2px solid var(--color-chat-hover);border-radius:1.375rem;transition:border-color .15s ease}.SearchInput.with-picker-item{display:flex}.SearchInput.with-picker-item .icon-search{display:none}.SearchInput.with-picker-item input{padding-left:.5rem}.SearchInput.with-picker-item[dir=rtl] input{padding-right:.5rem;padding-left:0}.SearchInput.has-focus{border-color:var(--color-primary);caret-color:var(--color-primary);background-color:var(--color-background)}.SearchInput.has-focus input+i{color:var(--color-primary)}.SearchInput input{height:2.5rem;margin-bottom:0;border:none!important;border-radius:1.375rem;background-color:initial!important;box-shadow:none!important;padding:calc(.4375rem - var(--border-width)) calc(2.625rem - var(--border-width)) calc(.5rem - var(--border-width)) calc(2.625rem - var(--border-width))}.SearchInput input::placeholder{color:var(--color-placeholders)}.SearchInput>i{position:absolute;top:.5rem;left:.75rem;font-size:1.5rem}.SearchInput .Loading{position:absolute;top:.5rem;right:.5rem;height:1.5rem}.SearchInput .Loading .Spinner{--spinner-size:1.5rem}.SearchInput .Button{position:absolute;top:.125rem;right:.125rem;font-size:1rem}@media (max-width:600px){.SearchInput input{height:2.5rem;border-radius:1.25rem;padding-left:calc(2.625rem - var(--border-width))}.SearchInput i{top:.5rem}}.SearchInput[dir=rtl] input{direction:rtl}.SearchInput[dir=rtl]>i{left:auto;right:.75rem}.SearchInput[dir=rtl] .Loading{left:.5rem;right:auto}.SearchInput[dir=rtl] .Button{left:.125rem;right:auto}.PickerSelectedItem{display:flex;align-items:center;background:var(--color-chat-hover);height:2rem;min-width:2rem;margin-left:.5rem;margin-bottom:.5rem;padding-right:1rem;border-radius:1rem;cursor:pointer;position:relative;overflow:hidden;flex-shrink:1;transition:background-color .15s ease;max-width:calc(50% - .5rem)}.PickerSelectedItem.minimized{padding-right:0}.PickerSelectedItem:hover{background-color:var(--color-item-active)}.PickerSelectedItem.closeable:hover{background-color:rgba(var(--color-error-rgb),.16)}.PickerSelectedItem.closeable:hover .item-remove{opacity:1}.PickerSelectedItem.closeable:hover .Avatar,.PickerSelectedItem.closeable:hover .item-icon{opacity:0}.PickerSelectedItem.search-date .item-remove{background:var(--color-primary)}.PickerSelectedItem.search-date:hover{background:var(--color-chat-hover)}.PickerSelectedItem.search-date .item-name{font-size:.875rem}.SearchInput .PickerSelectedItem{flex:1 0 auto;position:relative;top:.25rem;left:-.125rem;color:var(--color-text-secondary)}.PickerSelectedItem .Avatar,.PickerSelectedItem .item-icon{width:2rem;height:2rem;opacity:1;flex-shrink:0;transition:opacity .15s ease}.PickerSelectedItem .Avatar i,.PickerSelectedItem .item-icon i{font-size:2rem}.PickerSelectedItem .item-icon{display:flex;align-items:center;justify-content:center;padding:.375rem;border-radius:50%;background-color:var(--color-primary);color:#fff}.PickerSelectedItem .item-icon i{font-size:1.25rem;position:relative;top:-1px}.PickerSelectedItem .item-name{margin-left:.5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.PickerSelectedItem .item-name .emoji.emoji-small{width:1.125rem;height:1.125rem;background-size:1.125rem;vertical-align:-2px}.PickerSelectedItem .item-remove{position:absolute;left:0;top:0;width:2rem;height:2rem;border-radius:50%;display:flex;align-items:center;justify-content:center;background-color:var(--color-error);font-size:1.5rem;color:#fff;opacity:0;transition:opacity .15s ease}.PickerSelectedItem[dir=rtl]{padding-left:1rem;padding-right:0}.PickerSelectedItem[dir=rtl].minimized{padding-right:0;padding-left:0}.SearchInput .PickerSelectedItem[dir=rtl]{left:auto;right:-.125rem}.PickerSelectedItem[dir=rtl] .item-name{margin-left:0;margin-right:.5rem}.PickerSelectedItem[dir=rtl] .item-remove{left:auto;right:0}.MessageOutgoingStatus{position:relative;width:1.19rem;height:1.19rem;overflow:hidden;display:inline-block;line-height:1;font-size:1.1875rem}.MessageOutgoingStatus i{background:var(--background-color)}.MessageOutgoingStatus .icon-message-succeeded{padding-left:.13rem}.MessageOutgoingStatus .Transition{width:100%;height:100%}.LastMessageMeta{margin-right:.2rem;padding:.3rem 0 .15rem;flex-shrink:0;font-size:.75rem;line-height:1;display:flex;align-items:center}.LastMessageMeta .MessageOutgoingStatus{color:var(--color-text-meta-colored);margin-right:.1rem;font-size:1.15rem}.LastMessageMeta .time{color:var(--color-text-meta);line-height:1.15rem}.Badge-transition{transform:scale(1);opacity:1;transition:transform .3s cubic-bezier(.34,1.56,.64,1)}.Badge-transition:not(.open){transform:scale(0);opacity:0}.Badge-transition:not(.shown){display:none}.Badge-transition.closing{transition:transform .2s ease-out,opacity .2s ease-out}.Badge-wrapper{display:flex;margin-left:1.5rem}.Badge-wrapper .Badge{margin-left:.5rem}.Badge{min-width:1.5rem;height:1.5rem;background:var(--color-gray);border-radius:.75rem;padding:0 .4375rem;color:#fff;font-size:.875rem;line-height:1.5625rem;font-weight:500;text-align:center;flex-shrink:0}.Badge.mention,.Badge.unread:not(.muted){background:var(--color-green);color:var(--color-white)}.Badge.pinned:not(.unread){color:var(--color-pinned);background:transparent;width:1.5rem;padding:0}.Badge.pinned:not(.unread) i{font-size:1.5rem}.Badge.mention{width:1.5rem;padding:.25rem}.Badge.mention i{font-size:1rem;vertical-align:super}.Chat{--background-color:var(--color-background);position:absolute;top:0;left:0;margin:0;width:100%}.Chat.animate-opacity{will-change:opacity;transition:opacity .2s ease-out}.Chat.animate-transform{will-change:transform;transition:transform .2s ease-out}.Chat.ListItem.has-menu-open .Avatar.online:after,.Chat:hover .Avatar.online:after{border-color:var(--color-chat-hover)}.Chat.selected,.Chat.selected:hover{--background-color:var(--color-chat-active)!important}.Chat.selected .Avatar.online:after,.Chat.selected:hover .Avatar.online:after{border-color:var(--color-chat-active)!important;background:var(--color-white)}.Chat.selected .ListItem-button,.Chat.selected:hover .ListItem-button{--background-color:var(--color-chat-active)!important;--color-text:var(--color-white);--color-text-meta-colored:var(--color-white);--color-text-meta:var(--color-white);--color-text-secondary:var(--color-white);--color-error:var(--color-white);--color-pinned:var(--color-white)}.Chat.selected .icon-muted-chat,.Chat.selected:hover .icon-muted-chat{color:var(--color-white)!important}.Chat.selected .Badge:not(.pinned),.Chat.selected:hover .Badge:not(.pinned){background:var(--color-white);color:var(--color-chat-active)}.Chat .status{position:relative;flex-shrink:0}.Chat .info .subtitle,.Chat .info .title{padding-right:.125rem}.Chat .info h3{width:auto;max-width:80%}.Chat .info .icon-muted-chat{font-size:1.25rem;margin-left:.25rem;margin-top:-.0625rem;color:#c6c8ca}.Chat .info .LastMessageMeta{margin-left:auto}.Chat .info .last-message,.Chat .info .typing-status{padding-right:.25rem;flex-grow:1;color:var(--color-text-secondary);unicode-bidi:plaintext}.Chat .info .last-message[dir=ltr],.Chat .info .typing-status[dir=ltr]{text-align:left}.Chat .info .last-message .sender-name,.Chat .info .typing-status .sender-name{color:var(--color-text)}.Chat .info .last-message .draft,.Chat .info .typing-status .draft{color:var(--color-error)}.Chat .info .last-message .draft:after{content:": "}.Chat .info .last-message .colon{margin-inline-end:.25rem}.Chat .info .last-message .media-preview{position:relative}.Chat .info .last-message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-.25rem;margin-inline-end:.25rem}.Chat .info .last-message img.round{border-radius:.625rem}.Chat .info .last-message .emoji-small{width:1rem;height:1rem;vertical-align:-.125rem}.Chat .info .last-message .icon-play{font-size:.75rem;color:#fff;position:absolute;top:.1875rem;margin-inline-start:-1.25rem}.Chat[dir=rtl] .info .LastMessageMeta{margin-left:0;margin-right:auto}.Chat[dir=rtl] .info .subtitle,.Chat[dir=rtl] .info .title{padding-left:.15rem;padding-right:0}.Chat[dir=rtl] .info .icon-muted-chat{margin-left:0;margin-right:.25rem}.Chat[dir=rtl] .info .last-message,.Chat[dir=rtl] .info .typing-status{padding-left:.5rem;padding-right:0;text-align:right;unicode-bidi:plaintext}.DropTarget{border-radius:var(--border-radius-default);background:var(--color-background);padding:1.25rem;flex:1 1 auto;width:100%;max-width:43.75rem;margin-left:auto;margin-right:auto;margin-bottom:.3125rem;display:flex;color:#a4acb3;box-shadow:0 1px 2px var(--color-default-shadow)}@media (max-height:350px){.DropTarget{padding:.75rem}}.DropTarget.hovered .target-content{color:var(--color-primary);background-image:var(--drag-target-border-hovered)}.DropTarget+.DropTarget{margin-top:.3125rem}.DropTarget:last-child{margin-bottom:0}.DropTarget .target-content{pointer-events:none;background-image:var(--drag-target-border);border-radius:.5rem;flex:1 1 100%;display:flex;flex-direction:column;align-items:center;justify-content:center;transition:color .2s,background .2s}.DropTarget .icon{font-size:6.25rem;line-height:4.6875rem;margin-bottom:2.25rem}@media (max-height:520px){.DropTarget .icon{font-size:4.25rem;line-height:3.5rem;margin-bottom:1rem}}@media (max-height:450px){.DropTarget .icon{font-size:2rem;line-height:1rem;margin-bottom:.5rem;margin-top:.25rem}}.DropTarget .title{font-size:1.3125rem;font-weight:500;letter-spacing:-.18px}@media (max-height:450px){.DropTarget .title{font-size:1rem}}.DropTarget .description{font-size:1rem;letter-spacing:.3px}@media (max-height:450px){.DropTarget .description{font-size:.875rem}}.DropArea{position:absolute;top:0;right:0;left:0;height:100vh;z-index:var(--z-drop-area);padding:80px 20px 20px;display:flex;flex-direction:column}#Main.right-column-open .DropArea{max-width:calc(100% - var(--right-column-width))}.File{--secondary-color:var(--color-text-secondary);display:flex;align-items:center}.Message.own .File{--secondary-color:var(--color-text-green)}.content-inner .File{min-width:14rem}.File .file-icon-container{position:relative}.File .file-icon,.File .file-preview,.File .file-progress{width:3.375rem;height:3.375rem;margin-inline-end:.75rem;border-radius:var(--border-radius-messages-small);background:var(--color-primary);display:flex;align-items:center;justify-content:center}.File .file-progress{position:absolute;top:0;left:0}.File .file-icon{padding:1rem .75rem .5rem;align-items:flex-end;flex-shrink:0;position:relative;color:#fff}.File .file-icon .file-ext{font-size:1rem;font-weight:500;transition:opacity .15s}.File .file-icon:after{content:"";display:block;position:absolute;top:0;right:0;border-bottom-left-radius:.25rem;background:rgba(0,0,0,.25);border-left:0 solid var(--background-color);border-bottom:1.125rem solid transparent;border-right:1.125rem solid var(--background-color);border-top:0 solid transparent;transition:border-width .15s ease-in}.File .file-preview{background:transparent;overflow:hidden}.File .file-preview+.file-progress,.File .file-preview+.icon-download{background:rgba(0,0,0,.5);border-radius:var(--border-radius-messages-small)}.File .file-preview img{object-fit:cover}.File .icon-download{color:#fff;font-size:1.5rem;position:absolute;top:0;start:0;width:3.375rem;height:3.375rem;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.File.interactive .file-icon-container{cursor:pointer}.File.interactive .file-icon-container:hover .file-icon:after{border-width:0}.File.interactive .file-icon-container:hover .icon-download{opacity:1}.File.interactive .file-icon-container:hover .file-ext,.File.interactive .file-icon-container:hover .icon-download.hidden{opacity:0}.File .file-info{margin-top:.1875rem;margin-right:.125rem;white-space:nowrap;overflow:hidden;flex-grow:1}.File .file-info+.Link{font-size:.75rem;color:var(--color-text-secondary);padding-left:1rem;white-space:nowrap}.File .file-title{font-size:1rem;line-height:1.5rem;font-weight:500;overflow:hidden;text-overflow:ellipsis}.File .file-title .emoji{vertical-align:-4px}.File .file-subtitle{font-size:.875rem;line-height:.9375rem;color:var(--secondary-color);max-width:100%;overflow:hidden;text-overflow:ellipsis}.File .file-subtitle span+span:before{content:"\00a0\2022\00a0"}.File.smaller{--background-color:var(--color-background);--border-radius-messages-small:.3125rem}.File.smaller .file-icon,.File.smaller .file-preview,.File.smaller .file-progress,.File.smaller .icon-download{width:3rem;height:3rem}.File.smaller .file-icon{padding-bottom:.375rem}.File.smaller .file-icon:after{border-width:0 1rem 1rem 0}.File.smaller .file-info{margin-top:-.125rem}.File.smaller .file-title{font-weight:400}.File.smaller .file-subtitle{line-height:1rem}.File:dir(rtl) .file-icon,.File:dir(rtl) .file-preview,.File:dir(rtl) .file-progress,.File[dir=rtl] .file-icon,.File[dir=rtl] .file-preview,.File[dir=rtl] .file-progress{margin-left:.75rem;margin-right:0}.File:dir(rtl) .file-info,.File[dir=rtl] .file-info{text-align:right}.File:dir(rtl) .file-info+.Link,.File[dir=rtl] .file-info+.Link{padding-left:0;padding-right:1rem}.File:dir(rtl) .icon-download,.File[dir=rtl] .icon-download{left:auto;right:0}.File .file-icon.red,.File .file-progress.red{background-color:var(--color-error)}.File .file-icon.orange,.File .file-progress.orange{background-color:var(--color-warning)}.File .file-icon.green,.File .file-progress.green{background-color:var(--color-text-green)}.Audio{display:flex;align-items:flex-start}.Audio.media-inner{overflow:visible}.Audio.own{--color-text-secondary:var(--accent-color);--color-interactive-active:var(--color-text-green);--color-interactive-inactive:rgba(var(--color-text-green-rgb),0.4);--color-interactive-buffered:rgba(var(--color-text-green-rgb),0.4)}.theme-dark .Audio.own{--color-text-green-rgb:255,255,255;--color-text-green:var(--color-white)}.Audio.own .Button{--color-primary:var(--color-text-green);--color-primary-shade:var(--color-green);--color-primary-shade-darker:var(--color-green-darker);--color-white:var(--color-background-own)}.theme-dark .Audio.own .Button{--color-primary-shade:#fff;--color-primary-shade-darker:#fff}.Audio .toggle-play{margin-inline-end:.5rem}.Audio .toggle-play.smaller{width:3rem;height:3rem;margin-inline-end:.75rem}.Audio .toggle-play.smaller i{font-size:1.625rem;margin-top:-.025rem}.Audio .toggle-play i{position:absolute}.Audio .toggle-play i.icon-play{margin-left:.125rem}@media (max-width:600px){.Audio .toggle-play i.icon-play{margin-left:.0625rem}}.Audio .toggle-play .icon-pause,.Audio .toggle-play .icon-play{opacity:1;transform:scale(1);transition:opacity .4s,transform .6s cubic-bezier(.34,1.56,.64,1)}.Audio .toggle-play.loading .icon-pause,.Audio .toggle-play.loading .icon-play,.Audio .toggle-play.pause .icon-play,.Audio .toggle-play.play .icon-pause{opacity:0;transform:scale(.5)}.Audio .content{align-self:center;min-width:0;flex-grow:1;text-align:initial}.Audio .content-row{display:flex;justify-content:space-between}.Audio .title{font-weight:500;margin:0;line-height:1.25;overflow:hidden;text-overflow:ellipsis}.Audio .voice-duration{margin:.25rem 0 0;font-size:.875rem;color:var(--color-text-secondary)}.Audio .voice-duration span{margin-left:.25rem;font-size:1.5rem;line-height:.875rem;vertical-align:middle}.Audio:not(.own) .voice-duration span{color:var(--color-primary)}.Audio .waveform{cursor:pointer;margin-left:1px}.Audio .date,.Audio .meta,.Audio .performer{font-size:.875rem;line-height:1;color:var(--color-text-secondary);margin:0}.Audio .duration{margin:.1875rem 0 0;font-size:.875rem;color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.Audio .seekline{width:calc(100% - 2px);padding-left:6px;margin-bottom:.3125rem;height:12px;position:relative;margin-left:-6px;top:1px;cursor:pointer}.Audio .seekline:before{content:"";position:absolute;width:100%;left:6px;top:6px;height:2px;background-color:var(--color-interactive-inactive);border-radius:2px}.Audio .seekline-buffered-progress,.Audio .seekline-play-progress{position:absolute;height:2px;border-radius:2px;overflow:hidden;width:100%;top:6px;left:6px}.Audio .seekline-buffered-progress i,.Audio .seekline-play-progress i{position:absolute;width:100%;background-color:var(--color-interactive-active);height:2px;border-radius:2px;right:100%}.Audio .seekline-buffered-progress i{background-color:var(--color-interactive-buffered)!important}.Audio .seekline-thumb{position:absolute;width:100%;top:7px;left:0}.Audio .seekline-thumb i{pointer-events:none;position:absolute;width:100%;right:100%}.Audio .seekline-thumb i:after{content:"";position:absolute;top:-6px;right:-12px;width:12px;height:12px;border-radius:6px;background:var(--color-interactive-active)}.Audio.bigger .content{margin-top:.1875rem}.Audio.bigger .title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:400;line-height:1.5rem}.Audio.bigger .date,.Audio.bigger .meta,.Audio.bigger .performer{line-height:1.0625rem}.Audio.bigger .seekline{top:2px;margin-bottom:.5rem}.Audio.bigger .duration{line-height:1rem}.Audio.bigger .media-loading{top:.1875rem;left:.1875rem}.Audio.bigger[dir=rtl] .media-loading{left:auto!important;right:0}.Audio .ProgressSpinner.size-s svg{width:2.25rem;height:2.25rem}.Audio[dir=rtl] .toggle-play{margin-left:.5rem;margin-right:0}.Audio[dir=rtl] .toggle-play.smaller{margin-left:.75rem;margin-right:0}.Audio[dir=rtl] .content,.Audio[dir=rtl] .duration{text-align:right}.AnimatedEmoji{margin-bottom:.75rem}.AnimatedEmoji img{width:100%;height:100%}.Radio{display:block;position:relative;padding-left:4.5rem;text-align:left;margin-bottom:1.5rem;line-height:1.5rem;cursor:pointer}.Radio.disabled{pointer-events:none;opacity:.5}.Radio.hidden-widget{cursor:default}.Radio.hidden-widget .Radio-main:after,.Radio.hidden-widget .Radio-main:before{visibility:hidden}.Radio>input{position:absolute;z-index:var(--z-below);opacity:0}.Radio .Radio-main:after,.Radio .Radio-main:before{content:"";display:block;position:absolute;left:1.0625rem;top:50%;width:1.25rem;height:1.25rem;transform:translateY(-50%)}.Radio .Radio-main:before{border:2px solid var(--color-borders);border-radius:50%;background-color:var(--color-white);opacity:1;transition:border-color .1s ease,opacity .1s ease}.Radio .Radio-main:after{left:1.375rem;width:.625rem;height:.625rem;border-radius:50%;background:var(--color-primary);opacity:0;transition:opacity .1s ease}.Radio .Radio-main .label{display:block;word-break:break-word;unicode-bidi:plaintext;text-align:left}.Radio .Radio-main .subLabel{display:block;font-size:.875rem;line-height:1rem;color:var(--color-text-secondary);unicode-bidi:plaintext}.Radio input:checked~.Radio-main:before{border-color:var(--color-primary)}.Radio input:checked~.Radio-main:after{opacity:1}.Radio.loading .Radio-main:after,.Radio.loading .Radio-main:before{opacity:0!important}.Radio.loading .Spinner{position:absolute;left:1.0625rem;top:50%;transform:translateY(-50%);opacity:0;animation:fade-in .2s ease forwards;--spinner-size:1.25rem}.Radio[dir=rtl]{padding-left:0;padding-right:4.5rem}.Radio[dir=rtl] .Radio-main{text-align:right}.Radio[dir=rtl] .Radio-main:before{left:auto;right:1.0625rem}.Radio[dir=rtl] .Radio-main:after{left:auto;right:1.375rem}.Radio[dir=rtl] .label,.Radio[dir=rtl] .subLabel{text-align:right}.Radio[dir=rtl].loading .Spinner{left:auto;right:1.0625rem}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.TextFormatter{transform:translate(-50%,-3.25rem)}.TextFormatter,.TextFormatter-link-control{position:absolute;background:var(--color-background);border-radius:var(--border-radius-messages);padding:.5rem .375rem;box-shadow:0 1px 2px var(--color-default-shadow)}.TextFormatter-link-control{left:0;top:0;opacity:0;pointer-events:none;transition:opacity .3s ease}@media (max-width:600px){.TextFormatter-link-control{max-width:calc(100vw - var(--text-formatter-left) + 3rem)}}.TextFormatter-link-control input{border:none!important;outline:none!important;width:100%;color:var(--color-text);background-color:var(--color-background)}.TextFormatter-buttons,.TextFormatter-link-url-confirm{display:flex;flex-wrap:nowrap;align-items:center}.TextFormatter-divider{width:1px;height:1.75rem;margin:0 .25rem;background-color:var(--color-borders)}.TextFormatter-link-url-input-wrapper{width:20rem;position:relative}@media (max-width:600px){.TextFormatter-link-url-input-wrapper{max-width:90vw}}.TextFormatter-link-url-input-wrapper:after,.TextFormatter-link-url-input-wrapper:before{content:"";display:block;position:absolute;top:0;bottom:0;width:1rem;z-index:2;opacity:0;transition:opacity .2s ease}.TextFormatter-link-url-input-wrapper:before{left:0;background:linear-gradient(90deg,var(--color-background) .25rem,transparent 1rem)}.TextFormatter-link-url-input-wrapper:after{right:0;background:linear-gradient(270deg,var(--color-background) .25rem,transparent 1rem)}.TextFormatter-link-url-input-wrapper.mask-left:before,.TextFormatter-link-url-input-wrapper.mask-right:after{opacity:1}.TextFormatter-link-url-confirm{flex-shrink:0;opacity:0;transition:opacity .3s ease}.TextFormatter-link-url-confirm.shown{opacity:1}.TextFormatter.link-control-shown .TextFormatter-link-control{opacity:1;pointer-events:all}.TextFormatter .Button{width:2rem;height:2rem;padding:.25rem;font-size:1.5rem;margin:0 .125rem;border-radius:var(--border-radius-messages-small);flex-shrink:0;cursor:pointer}.TextFormatter .Button.active{background-color:var(--color-primary)!important;color:#fff}.TextFormatter .Button.disabled{opacity:.5;pointer-events:none}.Media{height:0;padding-bottom:100%;overflow:hidden;position:relative;cursor:pointer}.Media .video-duration{position:absolute;left:.25rem;top:.25rem;background:rgba(0,0,0,.25);color:#fff;font-size:.75rem;padding:0 .3125rem;border-radius:.1875rem;line-height:1.125rem}.Media img{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover}.WebLink{min-height:3rem;padding:.25rem 0 0 3.75rem;font-size:.875rem;line-height:1.125rem;position:relative}.WebLink+.WebLink{margin-top:1.5rem}.WebLink.without-photo:before{content:attr(data-initial);background-color:var(--color-webpage-initial-background);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:var(--border-radius-messages-small);text-transform:uppercase;font-weight:500;font-size:1.5rem}.WebLink .Media,.WebLink.without-photo:before{width:3rem;height:3rem;position:absolute;left:0;top:0}.WebLink .Media{cursor:default!important;padding-bottom:unset!important;border-radius:var(--border-radius-messages-small)!important}.WebLink .site-description,.WebLink .site-name,.WebLink .site-title{word-break:break-word;text-align:initial}.WebLink .site-name{display:block;color:var(--color-links);font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.WebLink .site-title{font-size:1rem;font-weight:400;margin-bottom:.0625rem;line-height:1.3125rem}.WebLink .sender-name,.WebLink .site-description{margin-bottom:0;color:var(--color-text-secondary);line-height:1.125rem;max-height:2.25rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.WebLink .sender-name{margin-top:.25rem}.WebLink .site-description .emoji{width:1rem!important;height:1rem!important}.WebLink[dir=rtl]{padding:.25rem 3.75rem 0 0}.WebLink[dir=rtl] .Media,.WebLink[dir=rtl].without-photo:before{left:auto;right:0}.WebLink[dir=rtl] .content{text-align:right}.NothingFound{display:flex;align-items:center;justify-content:center;color:var(--color-text-meta)}.NothingFound.with-description{flex-direction:column}.NothingFound .AnimatedSticker{margin:0 auto}.NothingFound .description{color:var(--color-text-secondary);font-size:.875rem;text-align:center;margin:1rem 0 0;unicode-bidi:plaintext} \ No newline at end of file +.Transition{position:relative}.Transition>*{width:100%;height:100%;animation-fill-mode:forwards!important;transition:background-color .2s}.Transition>.from,.Transition>.to{position:absolute;top:0;left:0}.Transition>:not(.active):not(.from):not(.to){display:none!important}.Transition.scroll-slide{width:100%;height:100%;overflow:hidden;display:flex;flex-wrap:nowrap}.Transition.scroll-slide>*{position:static;flex-shrink:0}.Transition.scroll-slide>:not(.active):not(.from):not(.to){display:block!important;transform:scale(0)}.Transition.scroll-slide>:not(.active):not(.from):not(.to).through{display:none!important}.Transition.slide>.to{transform:translateX(100%)}.Transition.slide.animating>.from{animation:slide-out var(--slide-transition)}.Transition.slide.animating>.to{animation:slide-in var(--slide-transition)}.Transition.slide.backwards>.to{transform:translateX(-100%)}.Transition.slide.backwards.animating>.from{animation:slide-in-backwards var(--slide-transition)}.Transition.slide.backwards.animating>.to{animation:slide-out-backwards var(--slide-transition)}.Transition.slide-reversed>.to{transform:translateX(-100%)}.Transition.slide-reversed.animating>.from{animation:slide-out var(--slide-transition)}.Transition.slide-reversed.animating>.to{animation:slide-in var(--slide-transition)}.Transition.slide-reversed.backwards>.to{transform:translateX(100%)}.Transition.slide-reversed.backwards.animating>.from{animation:slide-in-backwards var(--slide-transition)}.Transition.slide-reversed.backwards.animating>.to{animation:slide-out-backwards var(--slide-transition)}.Transition.mv-slide>*>div{animation-fill-mode:forwards!important}.Transition.mv-slide>.to>div{transform:translateX(100vw)}.Transition.mv-slide.animating>.from>div{animation:mv-slide-out .4s ease}.Transition.mv-slide.animating>.to>div{animation:mv-slide-in .4s ease}.Transition.mv-slide.backwards>.to>div{transform:translateX(-100vw)}.Transition.mv-slide.backwards.animating>.from>div{animation:mv-slide-in-backwards .4s ease}.Transition.mv-slide.backwards.animating>.to>div{animation:mv-slide-out-backwards .4s ease}.Transition.slide-fade>.from{transform-origin:left;transform:translateX(0);opacity:1}.Transition.slide-fade>.to{transform-origin:left;transform:translateX(1.5rem);opacity:0}.Transition.slide-fade.animating>.from{animation:fade-out-opacity var(--slide-transition),slide-fade-out-move var(--slide-transition)}.Transition.slide-fade.animating>.to{animation:fade-in-opacity var(--slide-transition),slide-fade-in-move var(--slide-transition)}.Transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.Transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.Transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity var(--slide-transition),slide-fade-in-backwards-move var(--slide-transition)}.Transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity var(--slide-transition),slide-fade-out-backwards-move var(--slide-transition)}.Transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.Transition.zoom-fade>.to{transform-origin:center;opacity:0}.Transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.Transition.zoom-fade.animating>.to{animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.Transition.zoom-fade.backwards>.from{transform:scale(1)}.Transition.zoom-fade.backwards>.to{transform:scale(.95)}.Transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.Transition.zoom-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.Transition.fade>.from{opacity:1}.Transition.fade>.to{opacity:0}.Transition.fade.animating>.from{animation:fade-out-opacity .15s ease}.Transition.fade.animating>.to{animation:fade-in-opacity .15s ease}.Transition.slide-layers{--background-color:var(--color-background);background:#000}.Transition.slide-layers>div{background:var(--background-color)}.Transition.slide-layers>.to{transform:translateX(100%)}.Transition.slide-layers.animating>.from{animation:slide-layers-out var(--layer-transition)}.Transition.slide-layers.animating>.to{animation:slide-in var(--layer-transition)}.Transition.slide-layers.backwards>.to{transform:translateX(-20%);opacity:.75}.Transition.slide-layers.backwards.animating>.from{animation:slide-in-backwards var(--layer-transition)}.Transition.slide-layers.backwards.animating>.to{animation:slide-layers-out-backwards var(--layer-transition)}.Transition.push-slide>div{background:var(--color-background)}.Transition.push-slide>.from{transform-origin:center;transform:scale(1);opacity:1}.Transition.push-slide>.from .custom-scroll{scrollbar-color:transparent!important}.Transition.push-slide>.from .custom-scroll::-webkit-scrollbar-thumb{background-color:initial!important}.Transition.push-slide>.to{transform:translateX(100%)}.Transition.push-slide.animating>.from{animation:push-out .3s ease-in-out}.Transition.push-slide.animating>.to{animation:slide-in-200 .3s ease-in-out}.Transition.push-slide.backwards>.to{transform:scale(.7)}.Transition.push-slide.backwards.animating>.from{animation:slide-in-200-backwards .3s ease-in-out}.Transition.push-slide.backwards.animating>.to{animation:push-out-backwards .3s ease-in-out}.Transition.reveal>.to{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}.Transition.reveal.animating>.to{animation:reveal-in .35s ease-in}.Transition.reveal.backwards>.from{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}.Transition.reveal.backwards>.to{-webkit-clip-path:none;clip-path:none}.Transition.reveal.backwards.animating>.from{animation:reveal-in-backwards .35s ease-out}.Transition.reveal.backwards.animating>.to{animation:none}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes slide-in{0%{transform:translateX(100%)}to{transform:translateX(0)}}@keyframes slide-out{0%{transform:translateX(0)}to{transform:translateX(-100%)}}@keyframes slide-in-backwards{0%{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-out-backwards{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes mv-slide-in{0%{transform:translateX(100vw)}to{transform:translateX(0)}}@keyframes mv-slide-out{0%{transform:translateX(0)}to{transform:translateX(-100vw)}}@keyframes mv-slide-in-backwards{0%{transform:translateX(0)}to{transform:translateX(100vw)}}@keyframes mv-slide-out-backwards{0%{transform:translateX(-100vw)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-layers-out{0%{transform:translateX(0);opacity:1}to{transform:translateX(-20%);opacity:calc(1 - var(--layer-blackout-opacity))}}@keyframes slide-layers-out-backwards{0%{transform:translateX(-20%);opacity:calc(1 - var(--layer-blackout-opacity))}to{transform:translateX(0);opacity:1}}@keyframes push-out{0%{transform:scale(1);opacity:1}to{transform:scale(.7);opacity:0}}@keyframes push-out-backwards{0%{transform:scale(.7);opacity:0}to{transform:scale(1);opacity:1}}@keyframes slide-in-200{0%{transform:translateX(200%)}to{transform:translateX(0)}}@keyframes slide-in-200-backwards{0%{transform:translateX(0)}to{transform:translateX(200%)}}@keyframes reveal-in{0%{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}to{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}}@keyframes reveal-in-backwards{0%{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}to{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}}.Avatar{--color-user:var(--color-primary);flex:none;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;background:linear-gradient(var(--color-white) -125%,var(--color-user));color:#fff;font-weight:700;display:flex;white-space:nowrap}.Avatar,.Avatar img:not(.emoji){border-radius:50%}.Avatar .emoji{width:1rem;height:1rem}.Avatar i{font-size:2.5rem}.Avatar.size-micro{width:1rem;height:1rem;font-size:.5125rem}.Avatar.size-micro .emoji{width:.5625rem;height:.5625rem}.Avatar.size-tiny{width:2rem;height:2rem;font-size:.875rem}.Avatar.size-tiny .emoji{width:.875rem;height:.875rem}.Avatar.size-small{width:2.125rem;height:2.125rem;font-size:.875rem}.Avatar.size-small .emoji{width:.875rem;height:.875rem}.Avatar.size-medium{width:2.75rem;height:2.75rem;font-size:1.1875rem}.Avatar.size-medium .emoji{width:1rem;height:1rem}.Avatar.size-large{font-size:1.3125rem}.Avatar.size-large i{font-size:3.5rem}.Avatar.size-large .emoji{width:1.3125rem;height:1.3125rem}.Avatar.size-jumbo{width:7.5rem;height:7.5rem;font-size:3.5rem}.Avatar.size-jumbo i{font-size:6rem}.Avatar.size-jumbo .emoji{width:3.5rem;height:3.5rem}.Avatar.online{position:relative}.Avatar.online:after{content:"";display:block;position:absolute;bottom:.05rem;right:.05rem;width:.875rem;height:.875rem;border-radius:50%;border:2px solid var(--color-background);background-color:#0ac630;flex-shrink:0}.Avatar.interactive{cursor:pointer}.Avatar img:not(.emoji){width:100%;height:100%}.ProgressSpinner{position:relative;z-index:1;width:3.375rem;height:3.375rem;background:rgba(0,0,0,.25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIHN0cm9rZT0iI0ZGRiIgc3Ryb2tlLXdpZHRoPSIuNzUiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=) no-repeat 49% 49%;border-radius:50%;cursor:pointer}.ProgressSpinner.no-cross{background:transparent!important;pointer-events:none}.ProgressSpinner.square{background-image:none}.ProgressSpinner.square:after{content:"";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:#fff;left:50%;top:50%;transform:translate3d(-50%,-50%,0)}.ProgressSpinner.size-m,.ProgressSpinner.size-s{width:auto;height:auto;background:transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIHN0cm9rZT0iI0ZGRiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%}.ProgressSpinner.size-m.square,.ProgressSpinner.size-s.square{background-image:none;width:.75rem;height:.75rem}.ProgressSpinner.size-xl{width:3.25rem;height:3.25rem}.ProgressSpinner.size-xl svg{width:3rem;height:3rem;margin:.125rem}.ProgressSpinner.size-xl circle{stroke-width:3px}.ProgressSpinner.transparent{background-color:initial!important}.ProgressSpinner svg{display:block;transform:rotate(-90deg);transform-origin:50% 50%;animation:ProgressSpinnerAnimation 4s linear 0s infinite}.ProgressSpinner circle{transition:stroke-dashoffset .5s}@keyframes ProgressSpinnerAnimation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.Modal{position:relative;z-index:var(--z-modal)}.Modal.confirm .modal-dialog,.Modal.delete .modal-dialog,.Modal.error .modal-dialog,.Modal.pin .modal-dialog,.Modal.unpin-all .modal-dialog{max-width:23rem}.Modal.narrow .modal-dialog{max-width:20rem}.Modal .modal-container{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;justify-content:center;align-items:center}.Modal .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-1;background-color:rgba(0,0,0,.25)}.Modal.transparent-backdrop .modal-backdrop{background-color:initial}.Modal .modal-dialog{position:relative;display:inline-flex;flex-direction:column;width:100%;max-width:35rem;min-width:17.5rem;margin:2rem auto;background-color:var(--color-background);box-shadow:0 .25rem .5rem .125rem var(--color-default-shadow);border-radius:var(--border-radius-default);transform:translate3d(0,-1rem,0);transition:transform .2s ease,opacity .2s ease}body.animation-level-0 .Modal .modal-dialog{transition:none;transform:none!important}@media (max-width:450px){.Modal .modal-dialog{max-width:calc(100vw - 3rem)!important}}.Modal.open .modal-dialog{transform:translateZ(0)}.Modal.closing .modal-dialog{transform:translate3d(0,1rem,0)}.Modal .modal-header,.Modal .modal-header-condensed{padding:1rem 1rem 0;display:flex;align-items:center;flex-shrink:0}.Modal .modal-title{font-size:1.25rem;font-weight:500;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}.Modal .modal-title:not(:only-child){margin:0 1.3125rem}.Modal .modal-header-condensed{padding:.5rem 1.25rem 0 .9375rem!important}.Modal .modal-header-condensed .modal-action-button{font-size:.875rem;height:2.25rem;width:auto;line-height:1.625rem;margin-left:auto;padding-left:1.25rem;padding-right:1.25rem;min-width:5rem}.Modal .modal-content{width:100%;flex-grow:1;padding:1rem;overflow-y:auto}.Modal .modal-content b,.Modal .modal-content strong{word-break:break-word}.Modal .modal-content,.Modal .modal-content>p,.Modal .modal-title{unicode-bidi:plaintext;text-align:initial}.Modal .dialog-buttons{display:flex;align-items:flex-end}.Modal .dialog-buttons .confirm-dialog-button+.confirm-dialog-button{margin-left:1rem}.Modal .confirm-dialog-button{width:auto;height:auto;margin-left:auto;text-align:right;font-weight:500}.ListItem{position:relative}.ListItem .ListItem-button{width:100%;background-color:var(--background-color);border:none!important;box-shadow:none!important;outline:none!important;display:flex;padding:1rem;position:relative;overflow:hidden;line-height:1.5rem;white-space:nowrap;color:var(--color-text);border-radius:var(--border-radius-default);--ripple-color:rgba(0,0,0,0.08)}.ListItem .ListItem-button>i{font-size:1.5rem;margin-right:2rem;color:var(--color-text-secondary)}.ListItem .group-status,.ListItem .subtitle,.ListItem .title,.ListItem .user-status{text-align:initial;unicode-bidi:plaintext}.ListItem.multiline .ListItem-button>i{position:relative;top:.25rem}.ListItem.disabled{pointer-events:none}.ListItem.disabled .ListItem-button{opacity:.5}.ListItem:not(.disabled):not(.is-static) .ListItem-button{cursor:pointer}.ListItem:not(.disabled):not(.is-static) .ListItem-button:focus,body:not(.is-ios) .ListItem:not(.disabled):not(.is-static) .ListItem-button:hover{--background-color:var(--color-chat-hover)}@media (min-width:600px){.ListItem:not(.has-ripple):not(.is-static) .ListItem-button:active,body.animation-level-0 .ListItem .ListItem-button:active{--background-color:var(--color-item-active)!important}}.ListItem.has-menu-open .ListItem-button{--background-color:var(--color-chat-hover)}.ListItem.narrow{margin-bottom:.75rem}.ListItem.narrow .ListItem-button{padding:.5rem 1rem}.ListItem.inactive{pointer-events:none}.ListItem.focus{--background-color:var(--color-chat-hover)}.ListItem.destructive .ListItem-button{color:var(--color-error)}.ListItem.destructive .ListItem-button i{color:inherit}.ListItem-context-menu{position:absolute}.ListItem-context-menu .bubble{width:auto}.ListItem-context-menu .bubble .MenuItem button{padding-left:1rem!important;padding-right:2rem!important}.ListItem.chat-item-clickable{margin:0 -.5rem}.ListItem.chat-item-clickable .ListItem-button{padding:.5625rem .6975rem .5625rem .5625rem}.ListItem.chat-item-clickable .Avatar{flex-shrink:0;margin-right:.5rem}.ListItem.chat-item-clickable .info{flex-grow:1;overflow:hidden}.ListItem.chat-item-clickable .subtitle,.ListItem.chat-item-clickable .title{overflow:hidden;display:flex;justify-content:flex-start;align-items:center}.ListItem.chat-item-clickable .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status,.ListItem.chat-item-clickable h3{font-size:1rem;line-height:1.6875rem;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:initial}.ListItem.chat-item-clickable .title h3{font-weight:500}.ListItem.chat-item-clickable .title .VerifiedIcon{width:1.25rem;height:1.25rem;margin-left:.25rem}.ListItem.chat-item-clickable .title .emoji{vertical-align:text-bottom;background-position:0 0;flex-shrink:0}.ListItem.chat-item-clickable .contact-phone,.ListItem.chat-item-clickable .contact-username{font-size:.875rem;line-height:1.25rem;color:var(--color-text-secondary)}.ListItem.chat-item-clickable .ChatInfo{display:flex;align-items:center;flex-grow:1;overflow:hidden}.ListItem.chat-item-clickable .ChatInfo .status,.ListItem.chat-item-clickable .ChatInfo .typing-status{font-size:.875rem;line-height:1.25rem;color:var(--color-text-secondary);display:inline-block}.ListItem.chat-item-clickable .ChatInfo .status.online,.ListItem.chat-item-clickable .ChatInfo .typing-status.online{color:var(--color-primary)}.ListItem.chat-item-clickable .ChatInfo .status[dir=auto],.ListItem.chat-item-clickable .ChatInfo .status[dir=rtl],.ListItem.chat-item-clickable .ChatInfo .typing-status[dir=auto],.ListItem.chat-item-clickable .ChatInfo .typing-status[dir=rtl]{text-align:initial;width:100%}.ListItem.chat-item-clickable .ChatInfo .status .group-status:only-child,.ListItem.chat-item-clickable .ChatInfo .status .user-status:only-child,.ListItem.chat-item-clickable .ChatInfo .typing-status .group-status:only-child,.ListItem.chat-item-clickable .ChatInfo .typing-status .user-status:only-child{display:flow-root}.ListItem.chat-item-clickable .contact-phone,.ListItem.chat-item-clickable .contact-username,.ListItem.chat-item-clickable .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status,.ListItem.chat-item-clickable h3{text-align:initial;unicode-bidi:plaintext}.ListItem.chat-item-clickable[dir=rtl] .ListItem-button{padding:.5625rem .5625rem .5625rem .6975rem}.ListItem.chat-item-clickable[dir=rtl] .Avatar{margin-left:.5rem;margin-right:0}.ListItem.chat-item-clickable[dir=rtl] .info>.status{width:100%}.ListItem.search-result-message .title{padding-right:.15rem}.ListItem.search-result-message h3{max-width:80%}.ListItem.search-result-message .subtitle,.ListItem.search-result-message h3{font-size:1rem;line-height:1.5rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:left}.ListItem.search-result-message .LastMessageMeta{margin-left:auto;margin-right:0}.ListItem.search-result-message .subtitle{color:var(--color-text-secondary);margin-right:2rem}.ListItem.search-result-message .subtitle .matching-text-highlight{color:var(--color-text);background:#cae3f7;border-radius:.25rem;padding:0 .125rem}.ListItem.search-result-message[dir=rtl] .LastMessageMeta{margin-left:0;margin-right:auto}.ListItem.search-result-message[dir=rtl] .subtitle{margin-right:0;display:block}.ListItem.picker-list-item{margin:0}.ListItem.picker-list-item .ListItem-button{padding-left:0;display:flex;align-items:center}.ListItem.picker-list-item .Avatar{width:3rem;height:3rem}.ListItem.picker-list-item .Checkbox{flex-shrink:0;height:1.5rem;margin:0;padding-left:4rem}.ListItem.picker-list-item[dir=rtl] .Checkbox{padding-left:0;padding-right:4rem}.ListItem .multiline-item{white-space:normal;overflow:hidden}.ListItem .multiline-item .subtitle,.ListItem .multiline-item .title{display:block;text-align:initial}.ListItem .multiline-item .title{line-height:1.25rem;overflow:hidden;text-overflow:ellipsis}.ListItem .multiline-item .subtitle{font-size:.875rem;line-height:1.5rem;color:var(--color-text-secondary)}.ListItem .multiline-item .subtitle+.subtitle{margin-top:-.25rem}.ListItem .multiline-item .subtitle.black{color:var(--color-text)}.ListItem[dir=rtl] .ListItem-button>i{margin-left:2rem;margin-right:0}.VerifiedIcon{display:inline-block;flex-shrink:0;width:1.5rem;height:1.5rem;background-image:url(icon-verified.a2a4fb48197a45cb301b64e39d1a8427.svg);background-repeat:no-repeat;background-size:100%;background-position:50%}.typing-status{display:flex;align-items:baseline}.typing-status .sender-name:after{content:"\00a0";color:var(--color-text-secondary)}.typing-status .ellipsis{display:flex;width:1rem;overflow:hidden}.typing-status .ellipsis:after{content:"...";animation:typing-animation 1s steps(4,start) infinite}html[lang=ar] .typing-status .ellipsis:after,html[lang=fa] .typing-status .ellipsis:after{animation-name:typing-animation-rtl}@keyframes typing-animation{0%{transform:translateX(-1rem)}}@keyframes typing-animation-rtl{0%{transform:translateX(1rem)}}.Notification-container{position:relative;width:24rem;max-width:100vw;margin:.25rem auto;z-index:var(--z-notification)}@media (min-width:1276px){.Notification-container{transition:transform var(--layer-transition)}body.is-right-column-shown .Notification-container{transform:translate3d(calc(var(--right-column-width)/-2),0,0)}}.Notification-container:first-of-type{margin-top:4.25rem}.has-header-tools .Notification-container:first-of-type{margin-top:7.375rem}.Notification{background:rgba(32,32,32,.8) url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+") no-repeat .9375rem 50%;background-size:1.5rem;border-radius:var(--border-radius-default);padding:.9375rem .9375rem .9375rem 3.375rem;color:#fff;margin:0 .5rem}.Notification .text-entity-link,.Notification .text-entity-link:active,.Notification .text-entity-link:hover{color:#fff!important;text-decoration:underline}.Notification .content{line-height:1.25;word-break:break-word;font-size:.9375rem}.Tab{flex:1 1 auto;-webkit-appearance:none;appearance:none;background:none;width:auto;margin:0;border:none;padding:.625rem .25rem;font-weight:500;color:var(--color-text-secondary);cursor:pointer;border-top-left-radius:var(--border-radius-messages-small);border-top-right-radius:var(--border-radius-messages-small)}.Tab,.Tab:active,.Tab:focus{outline:none}.Tab.active{pointer-events:none;cursor:default;color:var(--color-primary)}.Tab.active i{opacity:1}.Tab:not(.active):hover{background:var(--color-interactive-element-hover)}.Tab>span{position:relative;display:inline-flex;align-items:center}.Tab .badge{min-width:1.25rem;height:1.25rem;margin-inline-start:.5rem;background:var(--color-gray);border-radius:.75rem;padding:0 .3125rem;color:#fff;font-size:.875rem;line-height:1.3125rem;font-weight:500;text-align:center;flex-shrink:0}.Tab .badge.active{background:var(--color-primary)}.Tab i{position:absolute;bottom:calc(-.625rem - 1px);left:0;opacity:0;background-color:var(--color-primary);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:initial;transform-origin:left}.Tab i.animate{transition:transform var(--slide-transition)}body.animation-level-0 .Tab i.animate{transition:none!important}.TabList{position:sticky;top:0;flex-shrink:0;display:flex;justify-content:space-between;align-items:flex-end;font-size:.875rem;flex-wrap:nowrap;box-shadow:0 2px 2px var(--color-light-shadow);background-color:var(--color-background);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;scrollbar-color:transparent}.TabList.big{font-size:1rem;--border-radius-messages-small:0}.TabList::-webkit-scrollbar{height:0}.TabList::-webkit-scrollbar-thumb{background-color:transparent}.DeleteChatModal .modal-dialog{max-width:20rem}.DeleteChatModal .modal-header{padding:1.125rem 1.25rem 0}.DeleteChatModal .modal-title:not(:only-child){margin:0 0 0 .75rem}.DeleteChatModal .modal-content{padding:.5rem 1.25rem}.DeleteChatModal .confirm-dialog-button{margin-right:-.625rem}.SearchInput{position:relative;width:100%;color:rgba(var(--color-text-secondary-rgb),.5);background-color:var(--color-chat-hover);border:2px solid var(--color-chat-hover);border-radius:1.375rem;transition:border-color .15s ease}.SearchInput.with-picker-item{display:flex}.SearchInput.with-picker-item .icon-search{display:none}.SearchInput.with-picker-item input{padding-left:.5rem}.SearchInput.with-picker-item[dir=rtl] input{padding-right:.5rem;padding-left:0}.SearchInput.has-focus{border-color:var(--color-primary);caret-color:var(--color-primary);background-color:var(--color-background)}.SearchInput.has-focus input+i{color:var(--color-primary)}.SearchInput input{height:2.5rem;margin-bottom:0;border:none!important;border-radius:1.375rem;background-color:initial!important;box-shadow:none!important;padding:calc(.4375rem - var(--border-width)) calc(2.625rem - var(--border-width)) calc(.5rem - var(--border-width)) calc(2.625rem - var(--border-width))}.SearchInput input::placeholder{color:var(--color-placeholders)}.SearchInput>i{position:absolute;top:.5rem;left:.75rem;font-size:1.5rem}.SearchInput .Loading{position:absolute;top:.5rem;right:.5rem;height:1.5rem}.SearchInput .Loading .Spinner{--spinner-size:1.5rem}.SearchInput .Button{position:absolute;top:.125rem;right:.125rem;font-size:1rem}@media (max-width:600px){.SearchInput input{height:2.5rem;border-radius:1.25rem;padding-left:calc(2.625rem - var(--border-width))}.SearchInput i{top:.5rem}}.SearchInput[dir=rtl] input{direction:rtl}.SearchInput[dir=rtl]>i{left:auto;right:.75rem}.SearchInput[dir=rtl] .Loading{left:.5rem;right:auto}.SearchInput[dir=rtl] .Button{left:.125rem;right:auto}.PickerSelectedItem{display:flex;align-items:center;background:var(--color-chat-hover);height:2rem;min-width:2rem;margin-left:.5rem;margin-bottom:.5rem;padding-right:1rem;border-radius:1rem;cursor:pointer;position:relative;overflow:hidden;flex-shrink:1;transition:background-color .15s ease;max-width:calc(50% - .5rem)}.PickerSelectedItem.minimized{padding-right:0}.PickerSelectedItem:hover{background-color:var(--color-item-active)}.PickerSelectedItem.closeable:hover{background-color:rgba(var(--color-error-rgb),.16)}.PickerSelectedItem.closeable:hover .item-remove{opacity:1}.PickerSelectedItem.closeable:hover .Avatar,.PickerSelectedItem.closeable:hover .item-icon{opacity:0}.PickerSelectedItem.search-date .item-remove{background:var(--color-primary)}.PickerSelectedItem.search-date:hover{background:var(--color-chat-hover)}.PickerSelectedItem.search-date .item-name{font-size:.875rem}.SearchInput .PickerSelectedItem{flex:1 0 auto;position:relative;top:.25rem;left:-.125rem;color:var(--color-text-secondary)}.PickerSelectedItem .Avatar,.PickerSelectedItem .item-icon{width:2rem;height:2rem;opacity:1;flex-shrink:0;transition:opacity .15s ease}.PickerSelectedItem .Avatar i,.PickerSelectedItem .item-icon i{font-size:2rem}.PickerSelectedItem .item-icon{display:flex;align-items:center;justify-content:center;padding:.375rem;border-radius:50%;background-color:var(--color-primary);color:#fff}.PickerSelectedItem .item-icon i{font-size:1.25rem;position:relative;top:-1px}.PickerSelectedItem .item-name{margin-left:.5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.PickerSelectedItem .item-name .emoji.emoji-small{width:1.125rem;height:1.125rem;background-size:1.125rem;vertical-align:-2px}.PickerSelectedItem .item-remove{position:absolute;left:0;top:0;width:2rem;height:2rem;border-radius:50%;display:flex;align-items:center;justify-content:center;background-color:var(--color-error);font-size:1.5rem;color:#fff;opacity:0;transition:opacity .15s ease}.PickerSelectedItem[dir=rtl]{padding-left:1rem;padding-right:0}.PickerSelectedItem[dir=rtl].minimized{padding-right:0;padding-left:0}.SearchInput .PickerSelectedItem[dir=rtl]{left:auto;right:-.125rem}.PickerSelectedItem[dir=rtl] .item-name{margin-left:0;margin-right:.5rem}.PickerSelectedItem[dir=rtl] .item-remove{left:auto;right:0}.MessageOutgoingStatus{position:relative;width:1.19rem;height:1.19rem;overflow:hidden;display:inline-block;line-height:1;font-size:1.1875rem}.MessageOutgoingStatus i{background:var(--background-color)}.MessageOutgoingStatus .icon-message-succeeded{padding-left:.13rem}.MessageOutgoingStatus .Transition{width:100%;height:100%}.LastMessageMeta{margin-right:.2rem;padding:.3rem 0 .15rem;flex-shrink:0;font-size:.75rem;line-height:1;display:flex;align-items:center}.LastMessageMeta .MessageOutgoingStatus{color:var(--color-text-meta-colored);margin-right:.1rem;font-size:1.15rem}.LastMessageMeta .time{color:var(--color-text-meta);line-height:1.15rem}.Badge-transition{transform:scale(1);opacity:1;transition:transform .3s cubic-bezier(.34,1.56,.64,1)}.Badge-transition:not(.open){transform:scale(0);opacity:0}.Badge-transition:not(.shown){display:none}.Badge-transition.closing{transition:transform .2s ease-out,opacity .2s ease-out}.Badge-wrapper{display:flex;margin-left:1.5rem}.Badge-wrapper .Badge{margin-left:.5rem}.Badge{min-width:1.5rem;height:1.5rem;background:var(--color-gray);border-radius:.75rem;padding:0 .4375rem;color:#fff;font-size:.875rem;line-height:1.5625rem;font-weight:500;text-align:center;flex-shrink:0}.Badge.mention,.Badge.unread:not(.muted){background:var(--color-green);color:var(--color-white)}.Badge.pinned:not(.unread){color:var(--color-pinned);background:transparent;width:1.5rem;padding:0}.Badge.pinned:not(.unread) i{font-size:1.5rem}.Badge.mention{width:1.5rem;padding:.25rem}.Badge.mention i{font-size:1rem;vertical-align:super}.Chat{--background-color:var(--color-background);position:absolute;top:0;left:0;margin:0;width:100%}.Chat.animate-opacity{will-change:opacity;transition:opacity .2s ease-out}.Chat.animate-transform{will-change:transform;transition:transform .2s ease-out}.Chat.ListItem.has-menu-open .Avatar.online:after,.Chat:hover .Avatar.online:after{border-color:var(--color-chat-hover)}.Chat.selected,.Chat.selected:hover{--background-color:var(--color-chat-active)!important}.Chat.selected .Avatar.online:after,.Chat.selected:hover .Avatar.online:after{border-color:var(--color-chat-active)!important;background:var(--color-white)}.Chat.selected .ListItem-button,.Chat.selected:hover .ListItem-button{--background-color:var(--color-chat-active)!important;--color-text:var(--color-white);--color-text-meta-colored:var(--color-white);--color-text-meta:var(--color-white);--color-text-secondary:var(--color-white);--color-error:var(--color-white);--color-pinned:var(--color-white)}.Chat.selected .icon-muted-chat,.Chat.selected:hover .icon-muted-chat{color:var(--color-white)!important}.Chat.selected .Badge:not(.pinned),.Chat.selected:hover .Badge:not(.pinned){background:var(--color-white);color:var(--color-chat-active)}.Chat .status{position:relative;flex-shrink:0}.Chat .info .subtitle,.Chat .info .title{padding-right:.125rem}.Chat .info h3{width:auto;max-width:80%}.Chat .info .icon-muted-chat{font-size:1.25rem;margin-left:.25rem;margin-top:-.0625rem;color:#c6c8ca}.Chat .info .LastMessageMeta{margin-left:auto}.Chat .info .last-message,.Chat .info .typing-status{padding-right:.25rem;flex-grow:1;color:var(--color-text-secondary);unicode-bidi:plaintext}.Chat .info .last-message[dir=ltr],.Chat .info .typing-status[dir=ltr]{text-align:left}.Chat .info .last-message .sender-name,.Chat .info .typing-status .sender-name{color:var(--color-text)}.Chat .info .last-message .draft,.Chat .info .typing-status .draft{color:var(--color-error)}.Chat .info .last-message .draft:after{content:": "}.Chat .info .last-message .colon{margin-inline-end:.25rem}.Chat .info .last-message .media-preview{position:relative}.Chat .info .last-message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-.25rem;margin-inline-end:.25rem}.Chat .info .last-message img.round{border-radius:.625rem}.Chat .info .last-message .emoji-small{width:1rem;height:1rem;vertical-align:-.125rem}.Chat .info .last-message .icon-play{font-size:.75rem;color:#fff;position:absolute;top:.1875rem;margin-inline-start:-1.25rem}.Chat[dir=rtl] .info .LastMessageMeta{margin-left:0;margin-right:auto}.Chat[dir=rtl] .info .subtitle,.Chat[dir=rtl] .info .title{padding-left:.15rem;padding-right:0}.Chat[dir=rtl] .info .icon-muted-chat{margin-left:0;margin-right:.25rem}.Chat[dir=rtl] .info .last-message,.Chat[dir=rtl] .info .typing-status{padding-left:.5rem;padding-right:0;text-align:right;unicode-bidi:plaintext}.DropTarget{border-radius:var(--border-radius-default);background:var(--color-background);padding:1.25rem;flex:1 1 auto;width:100%;max-width:43.75rem;margin-left:auto;margin-right:auto;margin-bottom:.3125rem;display:flex;color:#a4acb3;box-shadow:0 1px 2px var(--color-default-shadow)}@media (max-height:350px){.DropTarget{padding:.75rem}}.DropTarget.hovered .target-content{color:var(--color-primary);background-image:var(--drag-target-border-hovered)}.DropTarget+.DropTarget{margin-top:.3125rem}.DropTarget:last-child{margin-bottom:0}.DropTarget .target-content{pointer-events:none;background-image:var(--drag-target-border);border-radius:.5rem;flex:1 1 100%;display:flex;flex-direction:column;align-items:center;justify-content:center;transition:color .2s,background .2s}.DropTarget .icon{font-size:6.25rem;line-height:4.6875rem;margin-bottom:2.25rem}@media (max-height:520px){.DropTarget .icon{font-size:4.25rem;line-height:3.5rem;margin-bottom:1rem}}@media (max-height:450px){.DropTarget .icon{font-size:2rem;line-height:1rem;margin-bottom:.5rem;margin-top:.25rem}}.DropTarget .title{font-size:1.3125rem;font-weight:500;letter-spacing:-.18px}@media (max-height:450px){.DropTarget .title{font-size:1rem}}.DropTarget .description{font-size:1rem;letter-spacing:.3px}@media (max-height:450px){.DropTarget .description{font-size:.875rem}}.DropArea{position:absolute;top:0;right:0;left:0;height:100vh;z-index:var(--z-drop-area);padding:80px 20px 20px;display:flex;flex-direction:column}#Main.right-column-open .DropArea{max-width:calc(100% - var(--right-column-width))}.File{--secondary-color:var(--color-text-secondary);display:flex;align-items:center}.Message.own .File{--secondary-color:var(--color-text-green)}.content-inner .File{min-width:14rem}.File .file-icon-container{position:relative}.File .file-icon,.File .file-preview,.File .file-progress{width:3.375rem;height:3.375rem;margin-inline-end:.75rem;border-radius:var(--border-radius-messages-small);background:var(--color-primary);display:flex;align-items:center;justify-content:center}.File .file-progress{position:absolute;top:0;left:0}.File .file-icon{padding:1rem .75rem .5rem;align-items:flex-end;flex-shrink:0;position:relative;color:#fff}.File .file-icon .file-ext{font-size:1rem;font-weight:500;transition:opacity .15s}.File .file-icon:after{content:"";display:block;position:absolute;top:0;right:0;border-bottom-left-radius:.25rem;background:rgba(0,0,0,.25);border-left:0 solid var(--background-color);border-bottom:1.125rem solid transparent;border-right:1.125rem solid var(--background-color);border-top:0 solid transparent;transition:border-width .15s ease-in}.File .file-preview{background:transparent;overflow:hidden}.File .file-preview+.file-progress,.File .file-preview+.icon-download{background:rgba(0,0,0,.5);border-radius:var(--border-radius-messages-small)}.File .file-preview img{object-fit:cover}.File .icon-download{color:#fff;font-size:1.5rem;position:absolute;top:0;start:0;width:3.375rem;height:3.375rem;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.File.interactive .file-icon-container{cursor:pointer}.File.interactive .file-icon-container:hover .file-icon:after{border-width:0}.File.interactive .file-icon-container:hover .icon-download{opacity:1}.File.interactive .file-icon-container:hover .file-ext,.File.interactive .file-icon-container:hover .icon-download.hidden{opacity:0}.File .file-info{margin-top:.1875rem;margin-right:.125rem;white-space:nowrap;overflow:hidden;flex-grow:1}.File .file-info+.Link{font-size:.75rem;color:var(--color-text-secondary);padding-left:1rem;white-space:nowrap}.File .file-title{font-size:1rem;line-height:1.5rem;font-weight:500;overflow:hidden;text-overflow:ellipsis}.File .file-title .emoji{vertical-align:-4px}.File .file-subtitle{font-size:.875rem;line-height:.9375rem;color:var(--secondary-color);max-width:100%;overflow:hidden;text-overflow:ellipsis}.File .file-subtitle span+span:before{content:"\00a0\2022\00a0"}.File.smaller{--background-color:var(--color-background);--border-radius-messages-small:.3125rem}.File.smaller .file-icon,.File.smaller .file-preview,.File.smaller .file-progress,.File.smaller .icon-download{width:3rem;height:3rem}.File.smaller .file-icon{padding-bottom:.375rem}.File.smaller .file-icon:after{border-width:0 1rem 1rem 0}.File.smaller .file-info{margin-top:-.125rem}.File.smaller .file-title{font-weight:400}.File.smaller .file-subtitle{line-height:1rem}.File:dir(rtl) .file-icon,.File:dir(rtl) .file-preview,.File:dir(rtl) .file-progress,.File[dir=rtl] .file-icon,.File[dir=rtl] .file-preview,.File[dir=rtl] .file-progress{margin-left:.75rem;margin-right:0}.File:dir(rtl) .file-info,.File[dir=rtl] .file-info{text-align:right}.File:dir(rtl) .file-info+.Link,.File[dir=rtl] .file-info+.Link{padding-left:0;padding-right:1rem}.File:dir(rtl) .icon-download,.File[dir=rtl] .icon-download{left:auto;right:0}.File .file-icon.red,.File .file-progress.red{background-color:var(--color-error)}.File .file-icon.orange,.File .file-progress.orange{background-color:var(--color-warning)}.File .file-icon.green,.File .file-progress.green{background-color:var(--color-text-green)}.Audio{display:flex;align-items:flex-start}.Audio.media-inner{overflow:visible}.Audio.own{--color-text-secondary:var(--accent-color);--color-interactive-active:var(--color-text-green);--color-interactive-inactive:rgba(var(--color-text-green-rgb),0.4);--color-interactive-buffered:rgba(var(--color-text-green-rgb),0.4)}.theme-dark .Audio.own{--color-text-green-rgb:255,255,255;--color-text-green:var(--color-white)}.Audio.own .Button{--color-primary:var(--color-text-green);--color-primary-shade:var(--color-green);--color-primary-shade-darker:var(--color-green-darker);--color-white:var(--color-background-own)}.theme-dark .Audio.own .Button{--color-primary-shade:#fff;--color-primary-shade-darker:#fff}.Audio .toggle-play{margin-inline-end:.5rem}.Audio .toggle-play.smaller{width:3rem;height:3rem;margin-inline-end:.75rem}.Audio .toggle-play.smaller i{font-size:1.625rem;margin-top:-.025rem}.Audio .toggle-play i{position:absolute}.Audio .toggle-play i.icon-play{margin-left:.125rem}@media (max-width:600px){.Audio .toggle-play i.icon-play{margin-left:.0625rem}}.Audio .toggle-play .icon-pause,.Audio .toggle-play .icon-play{opacity:1;transform:scale(1);transition:opacity .4s,transform .6s cubic-bezier(.34,1.56,.64,1)}.Audio .toggle-play.loading .icon-pause,.Audio .toggle-play.loading .icon-play,.Audio .toggle-play.pause .icon-play,.Audio .toggle-play.play .icon-pause{opacity:0;transform:scale(.5)}.Audio .media-loading{pointer-events:none}.Audio .media-loading .interactive{pointer-events:auto}.Audio .download-button{position:absolute;width:.3rem!important;height:.3rem!important;left:1.5rem;top:1.5rem;border:2px solid var(--background-color);z-index:1}.Audio .download-button i{font-size:.8rem}.Audio.bigger .download-button{left:2rem;top:2rem;border:2px solid var(--color-background)}.Audio .content{align-self:center;min-width:0;flex-grow:1;text-align:initial}.Audio .content-row{display:flex;justify-content:space-between}.Audio .title{font-weight:500;margin:0;line-height:1.25;overflow:hidden;text-overflow:ellipsis}.Audio .voice-duration{margin:.25rem 0 0;font-size:.875rem;color:var(--color-text-secondary)}.Audio .voice-duration span{margin-left:.25rem;font-size:1.5rem;line-height:.875rem;vertical-align:middle}.Audio:not(.own) .voice-duration span{color:var(--color-primary)}.Audio .waveform{cursor:pointer;margin-left:1px}.Audio .date,.Audio .meta,.Audio .performer{font-size:.875rem;line-height:1;color:var(--color-text-secondary);margin:0}.Audio .duration{margin:.1875rem 0 0;font-size:.875rem;color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.Audio .seekline{width:calc(100% - 2px);padding-left:6px;margin-bottom:.3125rem;height:12px;position:relative;margin-left:-6px;top:1px;cursor:pointer}.Audio .seekline:before{content:"";position:absolute;width:100%;left:6px;top:6px;height:2px;background-color:var(--color-interactive-inactive);border-radius:2px}.Audio .seekline-buffered-progress,.Audio .seekline-play-progress{position:absolute;height:2px;border-radius:2px;overflow:hidden;width:100%;top:6px;left:6px}.Audio .seekline-buffered-progress i,.Audio .seekline-play-progress i{position:absolute;width:100%;background-color:var(--color-interactive-active);height:2px;border-radius:2px;right:100%}.Audio .seekline-buffered-progress i{background-color:var(--color-interactive-buffered)!important}.Audio .seekline-thumb{position:absolute;width:100%;top:7px;left:0}.Audio .seekline-thumb i{pointer-events:none;position:absolute;width:100%;right:100%}.Audio .seekline-thumb i:after{content:"";position:absolute;top:-6px;right:-12px;width:12px;height:12px;border-radius:6px;background:var(--color-interactive-active)}.Audio.bigger .content{margin-top:.1875rem}.Audio.bigger .title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:400;line-height:1.5rem}.Audio.bigger .date,.Audio.bigger .meta,.Audio.bigger .performer{line-height:1.0625rem}.Audio.bigger .seekline{top:2px;margin-bottom:.5rem}.Audio.bigger .duration{line-height:1rem}.Audio.bigger .media-loading{top:.1875rem;left:.1875rem}.Audio.bigger[dir=rtl] .media-loading{left:auto!important;right:0}.Audio .ProgressSpinner.size-s svg{width:2.25rem;height:2.25rem}.Audio[dir=rtl] .toggle-play{margin-left:.5rem;margin-right:0}.Audio[dir=rtl] .toggle-play.smaller{margin-left:.75rem;margin-right:0}.Audio[dir=rtl] .content,.Audio[dir=rtl] .duration{text-align:right}.AnimatedEmoji{margin-bottom:.75rem}.AnimatedEmoji img{width:100%;height:100%}.Radio{display:block;position:relative;padding-left:4.5rem;text-align:left;margin-bottom:1.5rem;line-height:1.5rem;cursor:pointer}.Radio.disabled{pointer-events:none;opacity:.5}.Radio.hidden-widget{cursor:default}.Radio.hidden-widget .Radio-main:after,.Radio.hidden-widget .Radio-main:before{visibility:hidden}.Radio>input{position:absolute;z-index:var(--z-below);opacity:0}.Radio .Radio-main:after,.Radio .Radio-main:before{content:"";display:block;position:absolute;left:1.0625rem;top:50%;width:1.25rem;height:1.25rem;transform:translateY(-50%)}.Radio .Radio-main:before{border:2px solid var(--color-borders);border-radius:50%;background-color:var(--color-white);opacity:1;transition:border-color .1s ease,opacity .1s ease}.Radio .Radio-main:after{left:1.375rem;width:.625rem;height:.625rem;border-radius:50%;background:var(--color-primary);opacity:0;transition:opacity .1s ease}.Radio .Radio-main .label{display:block;word-break:break-word;unicode-bidi:plaintext;text-align:left}.Radio .Radio-main .subLabel{display:block;font-size:.875rem;line-height:1rem;color:var(--color-text-secondary);unicode-bidi:plaintext}.Radio input:checked~.Radio-main:before{border-color:var(--color-primary)}.Radio input:checked~.Radio-main:after{opacity:1}.Radio.loading .Radio-main:after,.Radio.loading .Radio-main:before{opacity:0!important}.Radio.loading .Spinner{position:absolute;left:1.0625rem;top:50%;transform:translateY(-50%);opacity:0;animation:fade-in .2s ease forwards;--spinner-size:1.25rem}.Radio[dir=rtl]{padding-left:0;padding-right:4.5rem}.Radio[dir=rtl] .Radio-main{text-align:right}.Radio[dir=rtl] .Radio-main:before{left:auto;right:1.0625rem}.Radio[dir=rtl] .Radio-main:after{left:auto;right:1.375rem}.Radio[dir=rtl] .label,.Radio[dir=rtl] .subLabel{text-align:right}.Radio[dir=rtl].loading .Spinner{left:auto;right:1.0625rem}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.TextFormatter{transform:translate(-50%,-3.25rem)}.TextFormatter,.TextFormatter-link-control{position:absolute;background:var(--color-background);border-radius:var(--border-radius-messages);padding:.5rem .375rem;box-shadow:0 1px 2px var(--color-default-shadow)}.TextFormatter-link-control{left:0;top:0;opacity:0;pointer-events:none;transition:opacity .3s ease}@media (max-width:600px){.TextFormatter-link-control{max-width:calc(100vw - var(--text-formatter-left) + 3rem)}}.TextFormatter-link-control input{border:none!important;outline:none!important;width:100%;color:var(--color-text);background-color:var(--color-background)}.TextFormatter-buttons,.TextFormatter-link-url-confirm{display:flex;flex-wrap:nowrap;align-items:center}.TextFormatter-divider{width:1px;height:1.75rem;margin:0 .25rem;background-color:var(--color-borders)}.TextFormatter-link-url-input-wrapper{width:20rem;position:relative}@media (max-width:600px){.TextFormatter-link-url-input-wrapper{max-width:90vw}}.TextFormatter-link-url-input-wrapper:after,.TextFormatter-link-url-input-wrapper:before{content:"";display:block;position:absolute;top:0;bottom:0;width:1rem;z-index:2;opacity:0;transition:opacity .2s ease}.TextFormatter-link-url-input-wrapper:before{left:0;background:linear-gradient(90deg,var(--color-background) .25rem,transparent 1rem)}.TextFormatter-link-url-input-wrapper:after{right:0;background:linear-gradient(270deg,var(--color-background) .25rem,transparent 1rem)}.TextFormatter-link-url-input-wrapper.mask-left:before,.TextFormatter-link-url-input-wrapper.mask-right:after{opacity:1}.TextFormatter-link-url-confirm{flex-shrink:0;opacity:0;transition:opacity .3s ease}.TextFormatter-link-url-confirm.shown{opacity:1}.TextFormatter.link-control-shown .TextFormatter-link-control{opacity:1;pointer-events:all}.TextFormatter .Button{width:2rem;height:2rem;padding:.25rem;font-size:1.5rem;margin:0 .125rem;border-radius:var(--border-radius-messages-small);flex-shrink:0;cursor:pointer}.TextFormatter .Button.active{background-color:var(--color-primary)!important;color:#fff}.TextFormatter .Button.disabled{opacity:.5;pointer-events:none}.Media{height:0;padding-bottom:100%;overflow:hidden;position:relative;cursor:pointer}.Media .video-duration{position:absolute;left:.25rem;top:.25rem;background:rgba(0,0,0,.25);color:#fff;font-size:.75rem;padding:0 .3125rem;border-radius:.1875rem;line-height:1.125rem}.Media img{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover}.WebLink{min-height:3rem;padding:.25rem 0 0 3.75rem;font-size:.875rem;line-height:1.125rem;position:relative}.WebLink+.WebLink{margin-top:1.5rem}.WebLink.without-photo:before{content:attr(data-initial);background-color:var(--color-webpage-initial-background);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:var(--border-radius-messages-small);text-transform:uppercase;font-weight:500;font-size:1.5rem}.WebLink .Media,.WebLink.without-photo:before{width:3rem;height:3rem;position:absolute;left:0;top:0}.WebLink .Media{cursor:default!important;padding-bottom:unset!important;border-radius:var(--border-radius-messages-small)!important}.WebLink .site-description,.WebLink .site-name,.WebLink .site-title{word-break:break-word;text-align:initial}.WebLink .site-name{display:block;color:var(--color-links);font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.WebLink .site-title{font-size:1rem;font-weight:400;margin-bottom:.0625rem;line-height:1.3125rem}.WebLink .sender-name,.WebLink .site-description{margin-bottom:0;color:var(--color-text-secondary);line-height:1.125rem;max-height:2.25rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.WebLink .sender-name{margin-top:.25rem}.WebLink .site-description .emoji{width:1rem!important;height:1rem!important}.WebLink[dir=rtl]{padding:.25rem 3.75rem 0 0}.WebLink[dir=rtl] .Media,.WebLink[dir=rtl].without-photo:before{left:auto;right:0}.WebLink[dir=rtl] .content{text-align:right}.NothingFound{display:flex;align-items:center;justify-content:center;color:var(--color-text-meta)}.NothingFound.with-description{flex-direction:column}.NothingFound .AnimatedSticker{margin:0 auto}.NothingFound .description{color:var(--color-text-secondary);font-size:.875rem;text-align:center;margin:1rem 0 0;unicode-bidi:plaintext} \ No newline at end of file diff --git a/dist/0.21ca60653ccd8108472e.js b/dist/0.21ca60653ccd8108472e.js new file mode 100644 index 000000000..3cc152e63 --- /dev/null +++ b/dist/0.21ca60653ccd8108472e.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],Array(106).concat([function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(8),s=n(145),i=n(173),o=n(25),l=n(43),d=n(53),u=n(42);n(208);t.a=e=>{const{ref:t,buttonRef:n,icon:m,className:b,style:h,children:f,disabled:p,ripple:O,narrow:g,inactive:v,focus:j,destructive:E,multiline:y,isStatic:C,contextActions:N,onClick:T}=e;let w=Object(a.q)(null);t&&(w=t);const{isContextMenuOpen:M,contextMenuPosition:S,handleBeforeContextMenu:L,handleContextMenu:I,handleContextMenuClose:A,handleContextMenuHide:k}=Object(s.a)(w,!N),x=Object(a.m)(()=>w.current,[]),D=Object(a.m)(()=>w.current.closest(".custom-scroll"),[]),R=Object(a.m)(()=>w.current.querySelector(".ListItem-context-menu .bubble"),[]),{positionX:_,positionY:P,style:F}=Object(i.a)(S,x,D,R),U=Object(a.m)(e=>{!p&&T&&T(e)},[p,T]),B=Object(a.m)(e=>{v||r.l||(!N||2!==e.button&&T||L(e),0===e.button&&(T?U(e):I(e)))},[v,N,T,L,I,U]),q=Object(o.a)(),H=Object(c.a)("ListItem",b,!C&&"no-selection",O&&"has-ripple",g&&"narrow",p&&"disabled",v&&"inactive",S&&"has-menu-open",j&&"focus",E&&"destructive",y&&"multiline",C&&"is-static");return a.a.createElement("div",{ref:w,className:H,dir:q.isRtl?"rtl":void 0,style:h},a.a.createElement("div",{className:"ListItem-button",role:"button",ref:n,tabIndex:0,onClick:!v&&r.l?U:void 0,onMouseDown:B,onContextMenu:!v&&N?I:void 0},m&&a.a.createElement("i",{className:"icon-"+m}),y&&a.a.createElement("div",{className:"multiline-item"},f),!y&&f,!p&&!v&&O&&a.a.createElement(l.a,null)),N&&void 0!==S&&a.a.createElement(d.a,{isOpen:M,positionX:_,positionY:P,style:F,className:"ListItem-context-menu",autoClose:!0,onClose:A,onCloseAnimationEnd:k},N.map(e=>a.a.createElement(u.a,{key:e.title,icon:e.icon,destructive:e.destructive,disabled:!e.handler,onClick:e.handler},e.title))))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return o}));var a=n(0),r=n(9),c=n(48);function s({rootRef:e,throttleMs:t,debounceMs:n,shouldSkipFirst:s,margin:i,threshold:o,isDisabled:l},d){const u=Object(a.q)(),m=Object(a.q)(),b=Object(a.q)(),h=Object(a.q)();m.current=d;const f=Object(a.m)(()=>{b.current=!0},[]),p=Object(a.m)(()=>{b.current=!1,h.current&&(h.current(),h.current=void 0)},[]);Object(c.a)(f,p),Object(a.n)(()=>{if(!l)return()=>{u.current&&(u.current.observer.disconnect(),u.current.callbacks.clear(),u.current=void 0)}},[l]);return{observe:Object(a.m)((a,c)=>{u.current||function(){const a=new Map,c=new Map,l=()=>{const e=Array.from(c.values());e.forEach(t=>{const n=a.get(t.target);n&&n(t,e)}),m.current&&m.current(e),c.clear()},d=t?r.g:n?r.a:void 0,f=d?d(l,t||n,!s):l,p=new IntersectionObserver(e=>{e.forEach(e=>{c.set(e.target,e)}),b.current?h.current=()=>{f()}:f()},{root:e.current,rootMargin:i?i+"px":void 0,threshold:o});u.current={observer:p,callbacks:a}}();const l=u.current;return l.observer.observe(a),c&&l.callbacks.set(a,c),()=>{c&&l.callbacks.delete(a),l.observer.unobserve(a)}},[l]),freeze:f,unfreeze:p}}function i(e,t,n){Object(a.n)(()=>t?t(e.current,n):void 0,[])}function o(e,t,n){const[r,c]=Object(a.r)(!t);return i(e,t,e=>{c(e.isIntersecting),n&&n(e)}),r}},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(54),s=n(26);t.a=(e,t=!1,n=r.ApiMediaFormat.BlobUrl,i,o)=>{const l=e?c.c(e):void 0,d=Object(s.a)();return Object(a.n)(()=>{if(!t&&e&&!l){const t=Date.now();c.b(e,n).then(()=>{const e=Date.now()-t;!o||e>=o?d():setTimeout(d,o-e)})}},[t,e,l,n,i,d,o]),l}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(20),s=n(6),i=n(4),o=n(23),l=n(3),d=n(25),u=n(112),m=n(133),b=n(156);t.a=Object(a.h)(Object(r.h)((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a}=e,r=Object(s.Gb)(e,t);return{lastSyncTime:a,user:r,isSavedMessages:!n&&r&&r.isSelf,areMessagesLoaded:Boolean(Object(s.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullUser","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:r,withUsername:s,withFullInfo:l,withUpdatingStatus:h,noStatusOrTyping:f,noRtl:p,user:O,isSavedMessages:g,areMessagesLoaded:v,lastSyncTime:j,loadFullUser:E,openMediaViewer:y})=>{const{id:C}=O||{},N=Object(i.ab)(O);Object(a.n)(()=>{l&&j&&C&&E({userId:C})},[C,E,j,l]);const T=Object(a.m)((e,n)=>{O&&n&&(e.stopPropagation(),y({avatarOwnerId:O.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[O,t,y]),w=Object(d.a)();if(O)return a.a.createElement("div",{className:"ChatInfo",dir:!p&&w.isRtl?"rtl":void 0},a.a.createElement(u.a,{key:O.id,size:t,user:O,isSavedMessages:g,onClick:r?T:void 0}),a.a.createElement("div",{className:"info"},g?a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,w("SavedMessages"))):a.a.createElement("div",{className:"title"},a.a.createElement("h3",{dir:"auto"},N&&Object(o.a)(N)),O&&O.isVerified&&a.a.createElement(m.a,null)),(n||!g&&!f)&&(n?a.a.createElement("span",{className:"status",dir:"auto"},n):h&&!v?a.a.createElement("span",{className:"status",dir:"auto"},w("Updating")):O?e?a.a.createElement(b.a,{typingStatus:e}):a.a.createElement("div",{className:"status "+(Object(i.yb)(O)?"online":"")},s&&O.username&&a.a.createElement("span",{className:"handle"},O.username),a.a.createElement("span",{className:"user-status",dir:"auto"},Object(i.bb)(w,O))):void 0)))}))},function(e,t,n){"use strict";var a=n(0),r=n(55);var c=n(8),s=n(48),i=n(35),o=n(58),l=n(25),d=n(32),u=n(122);n(150);t.a=e=>{const{title:t,className:n,isOpen:m,header:b,hasCloseButton:h,noBackdrop:f,children:p,onClose:O,onCloseAnimationEnd:g,onEnter:v}=e,{shouldRender:j,transitionClassNames:E}=Object(i.a)(m,g),y=Object(a.q)(null);Object(a.n)(()=>m?Object(r.a)({onEsc:O,onEnter:v}):void 0,[m,O,v]),Object(a.n)(()=>m&&y.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const a=n.findIndex(e=>e.isSameNode(document.activeElement));let r=0;a>=0&&(r=t.shiftKey?a>0?a-1:n.length-1:a{document.removeEventListener("keydown",t,!1)}}(y.current):void 0,[m]),Object(o.a)(([e])=>(document.body.classList.toggle("has-open-dialog",m),(m||!m&&void 0!==e)&&Object(s.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[m]);const C=Object(l.a)();if(!j)return;const N=Object(c.a)("Modal",n,E,f&&"transparent-backdrop");return a.a.createElement(u.a,null,a.a.createElement("div",{ref:y,className:N,tabIndex:-1,role:"dialog"},a.a.createElement("div",{className:"modal-container"},a.a.createElement("div",{className:"modal-backdrop",onClick:O}),a.a.createElement("div",{className:"modal-dialog"},b||(t?a.a.createElement("div",{className:"modal-header"},h&&a.a.createElement(d.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:C("Close"),onClick:O},a.a.createElement("i",{className:"icon-close"})),a.a.createElement("div",{className:"modal-title"},t)):void 0),a.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(1),s=n(7),i=n(26),o=n(38),l=n(8),d=n(48);n(194);const u={slide:450,"slide-reversed":450,"mv-slide":400,"slide-fade":400,"zoom-fade":150,"scroll-slide":500,fade:150,"slide-layers":s.g?450:300,"push-slide":300,reveal:350},m=Symbol("CLEANED_UP");t.a=Object(r.h)(e=>{const{animationLevel:t}=e.settings.byKey;return{animationLevel:t}})(({ref:e,activeKey:t,name:n,direction:r="auto",renderCount:s,shouldRestoreHeight:b,shouldCleanup:h,id:f,className:p,onStart:O,onStop:g,children:v,animationLevel:j})=>{let E=Object(a.q)(null);e&&(E=e);const y=Object(a.q)({}),C=Object(o.a)(t),N=Object(a.q)(),T=Object(i.a)(),w=void 0!==C&&t!==C;!s&&w&&(y.current={[C]:y.current[C]}),y.current[t]=v,Object(a.o)(()=>{function e(){h&&(y.current={[C]:m},T())}const a=E.current,i=a.children;if(1===i.length&&!w)return void i[0].classList.add("active");const o=Array.from(a.childNodes);if(!w||!o.length)return;N.current&&(clearTimeout(N.current),N.current=void 0);const l=-1===r||"auto"===r&&C>t||"inverse"===r&&C{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),void e();if(o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("active"),e.classList.toggle("from",t===p),e.classList.toggle("through",t>p&&tv),e.classList.toggle("to",t===v))}),"scroll-slide"===n){const e=a.offsetWidth;a.scrollBy({left:v>p?e:-e,behavior:"smooth"})}j>0&&Object(d.b)(u[n]+c.c),requestAnimationFrame(()=>{a.classList.add("animating"),N.current=window.setTimeout(()=>{requestAnimationFrame(()=>{if(a.classList.remove("animating","backwards"),o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),"scroll-slide"===n&&(a.scrollLeft=t*a.offsetWidth),b){const e=a.querySelector(".active");e&&(e.style.height="auto",a.style.height=e.clientHeight+"px")}e(),g&&g()})},u[n]+c.c),O&&O()})},[t,C,w,r,n,O,g,s,b,h,j,T]),Object(a.o)(()=>{if(b){const e=E.current,t=e.querySelector(".active")||e.querySelector(".from");t&&(t.style.height="auto",e.style.height=t.clientHeight+"px",e.style.flexBasis=t.clientHeight+"px")}},[b,v]);const M=y.current,S=Object.keys(s?new Array(s).fill(void 0):M).map(Number).map(e=>{const n=M[e];return"function"==typeof n?a.a.createElement("div",{key:e},n(e===t,e===C)):void 0}),L=Object(l.a)("Transition",p,0===j&&"scroll-slide"===n?"slide":n);return a.a.createElement("div",{ref:E,id:f,className:L},S)})},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(4),i=n(49),o=n(8),l=n(23),d=n(108),u=n(114),m=n(25);n(196);t.a=Object(a.h)(({className:e,size:t="large",chat:n,user:b,text:h,withOnlineStatus:f,isSavedMessages:p,lastSyncTime:O,onClick:g})=>{const v=b&&Object(s.qb)(b);let j;p||v||(b?j=Object(s.f)(b):n&&(j=Object(s.f)(n)));const E=Object(d.a)(j,!1,r.ApiMediaFormat.DataUri,O),{shouldRenderFullMedia:y,transitionClassNames:C}=Object(u.a)(E,"slow"),N=Object(m.a)();let T="";if(p)T=a.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(v)T=a.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)T=a.a.createElement("img",{src:E,className:C+" avatar-media",alt:"",decoding:"async"});else if(b){const e=Object(s.ab)(b);T=e?Object(i.c)(e,2):void 0}else if(n){const e=Object(s.l)(N,n);T=e&&Object(i.c)(e,Object(s.mb)(n.id)?2:1)}else h&&(T=Object(i.c)(h,2));const w=!p&&b&&Object(s.yb)(b),M=Object(o.a)("Avatar size-"+t,e,"color-bg-"+Object(s.Y)(b||n),p&&"saved-messages",v&&"deleted-account",f&&w&&"online",g&&"interactive",!p&&!y&&"no-photo"),S=Object(a.m)(e=>{g&&g(e,p||y)},[g,p,y]),L=(b||n)&&(b||n).id;return a.a.createElement("div",{className:M,onClick:S,"data-test-sender-id":c.E?L:void 0},"string"==typeof T?Object(l.a)(T,["jumbo"===t?"hq_emoji":"emoji"]):T)})},function(e,t,n){"use strict";var a=n(20),r=n(0),c=n(9),s=n(155);t.a=({ref:e,className:t,onLoadMore:n,onScroll:i,onKeyDown:o,items:l,itemSelector:d=".ListItem",preloadBackwards:u=20,sensitiveArea:m=800,noScrollRestore:b=!1,noScrollRestoreOnTop:h=!1,noFastList:f,cacheBuster:p,children:O})=>{let g=Object(r.q)(null);e&&(g=e);const v=Object(r.q)({}),[j,E]=Object(r.p)(()=>n?[Object(c.a)((e=!1)=>{n({direction:a.e.Backwards,noScroll:e})},1e3,!0,!1),Object(c.a)(()=>{n({direction:a.e.Forwards})},1e3,!0,!1)]:[],[n,l]);Object(r.n)(()=>{if(!j)return;if(u>0&&(!l||l.length{const e=g.current,t=v.current;let n;if(t.listItemElements=e.querySelectorAll(d),t.currentAnchor&&Array.from(t.listItemElements).includes(t.currentAnchor)){const{scrollTop:a}=e;n=a+(t.currentAnchor.getBoundingClientRect().top-t.currentAnchorTop)}else{const e=t.listItemElements[0];e&&(t.currentAnchor=e,t.currentAnchorTop=e.getBoundingClientRect().top)}b||h&&0===e.scrollTop||(Object(s.a)(e,n),t.isScrollTopJustUpdated=!0)},[l,d,b,h,p]);const y=Object(r.m)(e=>{if(E&&j){const{listItemElements:e,isScrollTopJustUpdated:t,currentAnchor:n,currentAnchorTop:a}=v.current;if(t)return void(v.current.isScrollTopJustUpdated=!1);const r=e.length,c=g.current,{scrollTop:i,scrollHeight:o,offsetHeight:l}=c,d=i<=(r?e[0].offsetTop:0)+m,u=(r?e[r-1].offsetTop+e[r-1].offsetHeight:o)-(i+l)<=m;let b=!1;if(d){const t=e[0];if(t){const e=t.getBoundingClientRect().top,r=n&&n.offsetParent&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r>a&&(v.current.currentAnchor=t,v.current.currentAnchorTop=e,b=!0,Object(s.a)(c),E())}}if(u){const t=e[r-1];if(t){const e=t.getBoundingClientRect().top,r=n&&n.offsetParent&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r{const s=Boolean(e),i=!Object(a.q)(s).current&&!n,[o,l]=Object(a.r)(!s),{shouldRender:d,transitionClassNames:u}=Object(r.a)(s,void 0,!i,t);return Object(a.n)(()=>{d&&(i?setTimeout(()=>{l(!1)},c[t]):l(!1))},[i,d,t]),{shouldRenderThumb:o,shouldRenderFullMedia:d,transitionClassNames:u}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return l})),n.d(t,"a",(function(){return d})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return p})),n.d(t,"h",(function(){return O})),n.d(t,"k",(function(){return g})),n.d(t,"i",(function(){return v})),n.d(t,"l",(function(){return j})),n.d(t,"g",(function(){return E})),n.d(t,"e",(function(){return y}));var a=n(4),r=n(56),c=n(7),s=n(1);const i="(max-height: 640px)",o=parseInt(getComputedStyle(document.documentElement).fontSize,10),l=200,d={width:640,height:640},u={width:100,height:100};let m;function b(e,t,n){const a=t||n?1.625:0;return(function(e){const t=e?30:29;return c.g?(m||(m=Math.min(t,Math.floor(.69*window.innerWidth)/o)),m):t}(e)-a)*o}function h({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:c}){const s=t/e;return y(b(n,a,r),function(e,t){return e&&t&&t>=.75&&t<=1.25?20*o:27*o}(c,s),e,t)}function f(e,t){const n=window.matchMedia(i),{width:a,height:c}=r.a.get();let s=t&&n.matches?10:8.25;return e&&(s=n.matches?10:15),{width:a,height:c-s*o}}function p(e,t,n,r){const{width:c,height:s}=Object(a.U)(e)||u;return h({width:c,height:s,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:r})}function O(e,t,n){const{width:r,height:c}=Object(a.cb)(e)||u;return h({width:r,height:c,fromOwnMessage:t,isForwarded:n,isGif:e.isGif})}function g(){return{width:2*o,height:2*o}}function v(e){return e?{width:3*o,height:3*o}:{width:3.375*o,height:3.375*o}}function j(e){const{width:t}=e;let{height:n}=e;"1258816259753933"===e.id&&(n=t);const a=n&&t&&n/t,r=(c.g?s.wb:s.vb)*o,i=a?r*a:r;return a&&i>r?{width:Math.round(r/a),height:r}:{width:r,height:i}}function E({width:e,height:t},n,a=!1){const{width:r,height:c}=f(n,a);return y(r,c,e,t)}function y(e,t,n,a){const r=a/n,c=Math.min(n,e);return Math.round(c*r)>t?{width:Math.round(t/r),height:t}:{width:c,height:Math.round(c*r)}}},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(8),s=n(48),i=n(131);let o,l;async function d(){return o||(o=n.e(7).then(n.bind(null,193)),l=(await o).default),o}setTimeout(d,5e3);t.a=Object(a.h)(({className:e,id:t,animationData:n,play:o,playSegment:u,speed:m,noLoop:b,size:h,quality:f,isLowPriority:p,onLoad:O})=>{const[g,v]=Object(a.r)(),j=Object(a.q)(null),E=Object(a.q)(!1),y=Object(a.q)(!1),C=Object(a.q)();C.current=o;const N=Object(a.q)();N.current=u,Object(a.n)(()=>{if(g||!n)return;const e=()=>{if(!j.current)return;const e=new l(t,j.current,n,{noLoop:b,size:h,quality:f,isLowPriority:p},O);m&&e.setSpeed(m),v(e)};l?e():d().then(()=>{Object(r.b)(()=>{j.current&&e()})})},[g,n,t,p,b,O,f,h,m]),Object(a.n)(()=>()=>{g&&g.destroy()},[g]);const T=Object(a.m)((e=!1)=>{g&&(C.current||N.current)&&(N.current?g.playSegment(N.current):e?g.goToAndPlay(0):g.play())},[g]),w=Object(a.m)(()=>{g&&g.pause()},[g]),M=Object(a.m)(()=>{y.current=!0,g&&(E.current||(E.current=g.isPlaying()),w())},[g,w]),S=Object(a.m)(()=>{E.current&&T(),E.current=!1,y.current=!1},[T]),L=Object(a.m)(()=>{Object(r.b)(S)},[S]);Object(a.n)(()=>{g&&(o||u?y.current?E.current=!0:T(b):y.current?E.current=!1:w())},[g,o,u,b,T,w]),Object(s.a)(M,S),Object(i.a)(M,L);const I=Object(c.a)("AnimatedSticker",e),A=h?`width: ${h}px; height: ${h}px;`:void 0;return a.a.createElement("div",{ref:j,className:I,style:A})})},function(e,t,n){"use strict";var a=n(0),r=n(25),c=n(110),s=n(32);t.a=Object(a.h)(({isOpen:e,onClose:t,onCloseAnimationEnd:n,title:i,header:o,text:l,textParts:d,confirmLabel:u="Confirm",confirmHandler:m,confirmIsDestructive:b,isButtonsInOneRow:h})=>{const f=Object(r.a)();return a.a.createElement(c.a,{className:"confirm",title:i,header:o,isOpen:e,onClose:t,onCloseAnimationEnd:n,onEnter:m},l&&l.split("\\n").map(e=>a.a.createElement("p",null,e)),d,a.a.createElement("div",{className:h?"dialog-buttons mt-2":""},a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:m,color:b?"danger":"primary"},u),a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:t},f("Cancel"))))})},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(35),s=n(23),i=n(25);n(249);t.a=Object(a.h)(({text:e="Nothing found.",description:t})=>{const n=Object(i.a)(),{transitionClassNames:o}=Object(c.a)(!0);return a.a.createElement("div",{className:Object(r.a)("NothingFound",o,t&&"with-description")},e,t&&a.a.createElement("p",{className:"description"},Object(s.a)(n(t),["br"])))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(51),c=n(26);function s(e,t){const n=void 0===t,s=Object(a.q)(n),i=Object(a.q)(),o=Object(c.a)();return Object(r.a)(()=>{n||(s.current=!1,i.current&&(clearTimeout(i.current),i.current=void 0))},e),Object(a.n)(()=>{if(n||s.current)return;const e=()=>{s.current=!0,o()};t>0?i.current=window.setTimeout(e,t):e()},e),s.current}},function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(5),s=n(9),i=n(54),o=n(26);t.a=(e,t=!1,n=c.ApiMediaFormat.BlobUrl,l,d)=>{const u=e?i.c(e):void 0,m=n===c.ApiMediaFormat.Stream||r.i&&n===c.ApiMediaFormat.Progressive,b=Object(o.a)(),[h,f]=Object(a.r)(u&&!m?1:0),p=Object(a.q)(),O=Object(a.p)(()=>Object(s.g)(e=>{(!d||Date.now()-p.current>d)&&f(e)},500,!0),[d]);return Object(a.n)(()=>{!t&&e&&(u?m&&setTimeout(()=>{f(.75)},1500):(f(0),p.current&&i.a(O),p.current=Date.now(),i.b(e,n,O).then(()=>{const e=Date.now()-p.current;p.current=void 0,!d||e>=d?b():setTimeout(b,d-e)})))},[t,e,u,n,l,b,m,d,O]),Object(a.n)(()=>{t&&p.current&&(i.a(O),f(0))},[O,t]),{mediaData:u,downloadProgress:h}}},function(e,t,n){"use strict";var a=n(0),r=n(8);n(219);const c={s:22,m:25,l:28,xl:20};t.a=Object(a.h)(({progress:e=0,size:t="l",square:n,transparent:s,noCross:i,onClick:o})=>{const l=c[t],d=l-4,u=l-1,m=2*d*Math.PI,b=Object(a.q)(null);Object(a.n)(()=>{if(!b.current)return;const t=b.current.firstElementChild,n=m-Math.min(Math.max(.05,e),1)*m;t?t.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):b.current.innerHTML=`\n \n `},[b,m,u,d,e]);const h=Object(r.a)("ProgressSpinner size-"+t,s&&"transparent",n&&"square",i&&"no-cross");return a.a.createElement("div",{ref:b,className:h,onClick:o})})},function(e,t,n){"use strict";var a=n(0),r=n(66);t.a=({containerId:e,className:t,children:n})=>{const c=Object(a.q)(document.createElement("div"));return Object(a.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const a=c.current;return t&&a.classList.add(t),n.appendChild(a),()=>{r.a.render(void 0,a),n.removeChild(a)}},[t,e]),r.a.render(n,c.current)}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(20),s=n(4),i=n(6),o=n(23),l=n(3),d=n(25),u=n(112),m=n(133),b=n(156);t.a=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=Object(i.f)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?Object(i.n)(e,a):void 0,areMessagesLoaded:Boolean(Object(i.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullChat","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withUsername:r,withFullInfo:i,withUpdatingStatus:l,withChatType:h,noRtl:f,chat:p,onlineCount:O,areMessagesLoaded:g,lastSyncTime:v,loadFullChat:j,openMediaViewer:E})=>{const y=p&&Object(s.ob)(p),{id:C,isMin:N,isRestricted:T}=p||{};Object(a.n)(()=>{C&&!N&&i&&v&&j({chatId:C})},[C,N,v,i,j,y]);const w=Object(a.m)((e,n)=>{p&&n&&(e.stopPropagation(),E({avatarOwnerId:p.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[p,t,E]),M=Object(d.a)();if(p)return a.a.createElement("div",{className:"ChatInfo",dir:!f&&M.isRtl?"rtl":void 0},a.a.createElement(u.a,{key:p.id,size:t,chat:p,onClick:n?w:void 0}),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",{dir:"auto"},Object(o.a)(Object(s.l)(M,p))),p.isVerified&&a.a.createElement(m.a,null)),function(){if(l&&!g&&!T)return a.a.createElement("span",{className:"status",dir:"auto"},M("Updating"));if(!p)return;if(e)return a.a.createElement(b.a,{typingStatus:e});if(h)return a.a.createElement("div",{className:"status",dir:"auto"},M(Object(s.m)(p)));const t=r?p.username:void 0,n=function(e,t){const n=e(Object(s.m)(t)),{membersCount:a}=t;if(t.isRestricted)return"Channel"===n?"channel is inaccessible":"group is inaccessible";if(!a)return n;return e("Channel"===n?"Subscribers":"Members",a,"i")}(M,p),c=O?", "+M("OnlineCount",O,"i"):void 0;return a.a.createElement("div",{className:"status"},t&&a.a.createElement("span",{className:"handle"},t),a.a.createElement("span",{className:"group-status"},n),c&&a.a.createElement("span",{className:"online-status"},c))}()))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return l}));var a=n(20),r=n(48),c=n(9),s=n(61);let i=!1;function o(e,t,n,o=0,l=1500,d,u,m){if(d===a.b.Static)return void t.scrollIntoView({block:n});const{offsetTop:b}=t;if(void 0===d){const t=b-e.scrollTop;t<-l?e.scrollTop+=t+l:t>l&&(e.scrollTop+=t-l)}else d===a.b.Up?e.scrollTop=b+l:d===a.b.Down&&(e.scrollTop=Math.max(0,b-l));i=!0,Object(c.b)(()=>{!function(e,t,n,a=0,c,o){const{offsetTop:l,offsetHeight:d}=t,{scrollTop:u,offsetHeight:m,scrollHeight:b}=e,h=!o&&e.dataset.normalHeight?Number(e.dataset.normalHeight):m;let f;switch(n){case"start":f=l-a-u;break;case"end":f=l+d+a-(u+h);break;case"nearest":case"center":f=d0){const e=b-(u+h);f=Math.min(f,e)}const p=e.scrollTop+f,O=c||250+Math.abs(f)/1500*350,g=Date.now();Object(r.b)(O),Object(s.b)(()=>{const t=Math.min((Date.now()-g)/O,1),n=f*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollTop=Math.round(p-n),i=t<1,i})}(e,t,n,o,u,m)})}function l(){return i}},,function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(25),s=n(21);n(226);var i=Object(a.h)(({id:e,label:t,subLabel:n,value:i,name:o,checked:l,disabled:d,hidden:u,isLoading:m,onChange:b})=>{const h=Object(c.a)(),f=Object(r.a)("Radio",d&&"disabled",u&&"hidden-widget",m&&"loading");return a.a.createElement("label",{className:f,dir:h.isRtl?"rtl":void 0},a.a.createElement("input",{type:"radio",name:o,value:i,id:e,checked:l,onChange:b,disabled:d||u}),a.a.createElement("div",{className:"Radio-main"},a.a.createElement("span",{className:"label",dir:h.isRtl?"auto":void 0},t),n&&a.a.createElement("span",{className:"subLabel",dir:h.isRtl?"auto":void 0},n)),m&&a.a.createElement(s.a,null))});t.a=Object(a.h)(({id:e,name:t,options:n,selected:r,disabled:c,loadingOption:s,onChange:o})=>{const l=Object(a.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]);return a.a.createElement("div",{id:e,className:"radio-group"},n.map(e=>a.a.createElement(i,{name:t,label:e.label,subLabel:e.subLabel,value:e.value,checked:e.value===r,hidden:e.hidden,disabled:c,isLoading:s?s===e.value:void 0,onChange:l})))})},function(e,t,n){"use strict";var a=n(0),r=n(20),c=n(3),s=n(26),i=n(38);function o(e,t=0,n,a){const{length:c}=e,s=e.indexOf(t),i=n===r.e.Forwards?s:s+1||c,o=Math.max(0,i-a),l=i+a-1,d=e.slice(Math.max(0,o),l+1);let u,m;switch(n){case r.e.Forwards:u=i>0,m=o>=0;break;case r.e.Backwards:u=i{const u=Object(a.q)(),m=Object(a.q)((()=>{if(!t||u.current)return;const{newViewportIds:e}=o(t,t[0],r.e.Forwards,l);return e})()),b=Object(s.a)(),h=Object(i.a)(t),f=Object(i.a)(n);if(t&&!n&&(t!==h||n!==f)){const{offsetId:e=t[0],direction:n=r.e.Forwards}=u.current||{},{newViewportIds:a}=o(t,e,n,l);m.current&&Object(c.a)(m.current,a)||(m.current=a)}Object(a.n)(()=>{if(t&&!n&&e&&d){const t=m.current;e({offsetId:t[t.length-1]})}},[t,n,e,d]);const p=Object(a.m)(({direction:n,noScroll:a})=>{const s=m.current,i=s?n===r.e.Backwards?s[s.length-1]:s[0]:void 0;if(!t)return void(e&&e({offsetId:i}));a||(u.current={...u.current,direction:n,offsetId:i});const{newViewportIds:d,areSomeLocal:h,areAllLocal:f}=o(t,i,n,l);!h||s&&Object(c.a)(s,d)||(m.current=d,b()),!f&&e&&e({offsetId:i})},[t,l,e,b]);return n?[t]:[m.current,p]}},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(115),i=n(107),o=n(108),l=n(114),d=n(34),u=n(116);n(224);t.a=({sticker:e,isInline:t=!1,observeIntersection:n,lastSyncTime:m})=>{const b=Object(a.q)(null),[h,f]=Object(d.a)(),p="sticker"+e.id,O=Object(i.b)(b,n),g=Object(o.a)(p+"?size=m",!O,r.ApiMediaFormat.BlobUrl,m),{transitionClassNames:v}=Object(l.a)(g,"slow"),j=Object(o.a)(p,!O,r.ApiMediaFormat.Lottie,m),E=Boolean(j),[y,C]=Object(a.r)(String(Math.random())),N=Object(a.m)(()=>{C(String(Math.random()))},[]);let T;T=t?.5*Object(s.l)(e).width:c.Bb;const w=`width: ${T}px; height: ${T}px;`;return a.a.createElement("div",{ref:b,className:"AnimatedEmoji media-inner",style:w,onClick:N},g&&!h&&a.a.createElement("img",{src:g,className:v,alt:""}),E&&a.a.createElement(u.a,{key:p,id:p,animationData:j,size:T,quality:1,play:O&&y,noLoop:!0,onLoad:f}))}},function(e,t,n){"use strict";function a(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),a=document.createRange();e.lastChild&&e.lastChild.nodeValue?(a.setStart(e.lastChild,e.lastChild.nodeValue.length),n.removeAllRanges(),n.addRange(a)):e.focus()}n.d(t,"a",(function(){return a}))},,function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},function(e,t,n){"use strict";let a;n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return r})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Left=2]="Left",e[e.Right=3]="Right"}(a||(a={}));function r(e,t){let n,r,c=!1;function s(e){t.excludedClosestSelector&&(e.target.matches(t.excludedClosestSelector)||e.target.closest(t.excludedClosestSelector))||(n=e,"mousedown"===e.type?(document.addEventListener("mousemove",o),document.addEventListener("mouseup",i)):"touchstart"===e.type&&(document.addEventListener("touchmove",o),document.addEventListener("touchend",i),document.addEventListener("touchcancel",i),"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY))),document.body.classList.add("no-selection"),t.withCursor&&document.body.classList.add("cursor-grabbing"),t.onCapture&&t.onCapture(e))}function i(e){n&&(t.withCursor&&document.body.classList.remove("cursor-grabbing"),document.body.classList.remove("no-selection"),document.removeEventListener("mouseup",i),document.removeEventListener("mousemove",o),document.removeEventListener("touchcancel",i),document.removeEventListener("touchend",i),document.removeEventListener("touchmove",o),n=void 0,c?t.onRelease&&t.onRelease(e):t.onClick&&t.onClick(e)),c=!1,r=void 0}function o(e){if(n){"touchmove"===e.type&&"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY));const s=e.pageX-n.pageX,i=e.pageY-n.pageY;(Math.abs(s)>=15||Math.abs(i)>=15)&&(c=!0),t.onDrag&&(e.preventDefault(),t.onDrag(e,n,{dragOffsetX:s,dragOffsetY:i})),t.onSwipe&&function(e,n,c){if(!r){const e=Math.abs(n),t=Math.abs(c);if(n&&c){if(Math.max(e,t)/Math.min(e,t)<2)return}e>=50?r="x":t>=50&&(r="y")}!function(e,t,n,r,c){"x"===t?c(e,n<0?a.Left:a.Right):"y"===t&&c(e,r<0?a.Up:a.Down)}(e,r,n,c,t.onSwipe)}(e,s,i)}}return e.addEventListener("mousedown",s),e.addEventListener("touchstart",s,{passive:!0}),()=>{e.removeEventListener("mousedown",s),e.removeEventListener("touchstart",s)}}},function(e,t,n){"use strict";var a=n(0);n(203);t.a=()=>a.a.createElement("span",{className:"VerifiedIcon"})},function(e,t,n){"use strict";function a(e,t){return t-Math.floor(t/e)*e}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(38);function r(e,t=!1,n=!1){const r=Object(a.a)(e,t);return n||null!=e?e:r}},function(e,t,n){"use strict";var a=n(1);t.a=e=>{e.play().catch(e=>{a.p&&console.warn(e)})}},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(158);t.a=(e=!1)=>{const[t,n]=Object(a.r)(!e),[s,i]=Object(a.r)(0),o=Object(a.p)(()=>Object(r.a)(n,200,!1,!0),[]),l=Object(a.m)(e=>{const t=e.currentTarget;Object(c.a)(t)||(t.buffered.length&&i(t.buffered.end(0)/t.duration),o(t.readyState>=3||t.currentTime>0))},[o]);return{isBuffered:t,bufferedProgress:s,bufferingHandlers:{onLoadedData:l,onPlaying:l,onLoadStart:l,onPause:l,onTimeUpdate:l,onProgress:l},checkBuffering(e){o(e.readyState>=3)}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(5),r=n(7);const c={B:a.ApiMessageEntityTypes.Bold,STRONG:a.ApiMessageEntityTypes.Bold,I:a.ApiMessageEntityTypes.Italic,EM:a.ApiMessageEntityTypes.Italic,U:a.ApiMessageEntityTypes.Underline,S:a.ApiMessageEntityTypes.Strike,STRIKE:a.ApiMessageEntityTypes.Strike,DEL:a.ApiMessageEntityTypes.Strike,CODE:a.ApiMessageEntityTypes.Code,PRE:a.ApiMessageEntityTypes.Pre,BLOCKQUOTE:a.ApiMessageEntityTypes.Blockquote};function s(e){const t=document.createElement("div");t.innerHTML=function(e){let t=e.slice(0);t=r.d?t.replace(/([^<]*)<\/span>/g,"$1"):t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1");return t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),t=t.replace(/]*)?>/g,"\n"),t=t.replace(/<\/div>(\s*)
/g,"\n"),t=t.replace(/
/g,"\n"),t=t.replace(/<\/div>/g,""),t=t.replace(/^`{3}(.*[\n\r][^]*?^)`{3}/gm,"
$1
"),t=t.replace(/[`]{3}([^`]+)[`]{3}/g,"
$1
"),t=t.replace(/[`]{1}([^`\n]+)[`]{1}/g,"$1"),t=t.replace(/[*]{2}([^*\n]+)[*]{2}/g,"$1"),t=t.replace(/[*]{1}([^*\n]+)[*]{1}/g,"$1"),t=t.replace(/[~]{2}([^~\n]+)[~]{2}/g,"$1"),t}(e);const n=t.innerText.trim().replace(/\u200b+/g,"").slice(0,4096);let s=0,i=0;const o=[];function l(e){const{index:t,entity:r}=function(e,t,n){const r=function(e){if(c[e.nodeName])return c[e.nodeName];if("A"===e.nodeName){const t=e;return t.dataset.entityType===a.ApiMessageEntityTypes.MentionName?a.ApiMessageEntityTypes.MentionName:t.href.startsWith("mailto:")?a.ApiMessageEntityTypes.Email:t.href.startsWith("tel:")?a.ApiMessageEntityTypes.Phone:t.href!==t.textContent?a.ApiMessageEntityTypes.TextUrl:a.ApiMessageEntityTypes.Url}if("SPAN"===e.nodeName)return e.dataset.entityType;return}(e);if(!r||!e.textContent)return{index:n,entity:void 0};const s=t.indexOf(e.textContent,n),i=s>=0?s:n,o=t.substring(0,i).length,{length:l}=t.substring(i,i+e.textContent.length);let d,u;r===a.ApiMessageEntityTypes.TextUrl&&(d=e.href);r===a.ApiMessageEntityTypes.MentionName&&(u=Number(e.dataset.userId));return{index:i,entity:{type:r,offset:o,length:l,...d&&{url:d},...u&&{userId:u}}}}(e,n,s);r?(s=t,o.push(r)):e.textContent&&(s+=e.textContent.length),e.hasChildNodes()&&i<=3&&(i+=1,Array.from(e.childNodes).forEach(l))}return Array.from(t.childNodes).forEach(e=>{i=1,l(e)}),{text:n,entities:o.length?o:void 0}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var a=n(0),r=n(35),c=n(8),s=n(47),i=n(38),o=n(34);n(214);var l=Object(a.h)(({isQuick:e,onFileSelect:t})=>{const[n,r,s]=Object(o.a)(),i=Object(c.a)("DropTarget",n&&"hovered");return a.a.createElement("div",{className:i,onDrop:t,onDragEnter:()=>{r()},onDragLeave:e=>{const{relatedTarget:t}=e;t&&e.stopPropagation(),s()}},a.a.createElement("div",{className:"target-content"},a.a.createElement("div",{className:"icon icon-"+(e?"photo":"document")}),a.a.createElement("div",{className:"title"},"Drop files here to send them"),a.a.createElement("div",{className:"description"},e?"in a quick way":"without compression")))});n(215);let d;!function(e){e.None="none",e.Document="document",e.QuickFile="quick_file"}(d||(d={}));t.b=Object(a.h)(({isOpen:e,withQuick:t,onHide:n,onFileSelect:o})=>{const d=Object(a.q)(null),u=Object(i.a)(t),{shouldRender:m,transitionClassNames:b}=Object(r.a)(e);Object(a.n)(()=>e?Object(s.a)(n):void 0,[e,n]);const h=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!1))},[o,n]),f=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!0))},[o,n]),p=Object(a.m)(e=>{e.stopPropagation();const{target:t,relatedTarget:a}=e;t.matches(".DropTarget, .DropArea")&&!a&&(d.current=window.setTimeout(()=>{n()},150))},[n]);if(!m)return;const O=Object(c.a)("DropArea",b);return a.a.createElement("div",{className:O,onDragLeave:p,onDragOver:()=>{d.current&&window.clearTimeout(d.current)},onDrop:n},a.a.createElement(l,{onFileSelect:h}),(t||u)&&a.a.createElement(l,{onFileSelect:f,isQuick:!0}))})},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(23),o=n(8),l=n(25),d=n(112);n(197);t.a=Object(a.h)(Object(r.h)((e,{chatOrUserId:t})=>{if(!t)return{};return{chat:t?Object(c.f)(e,t):void 0,user:Object(s.mb)(t)?Object(c.Gb)(e,t):void 0}})(({icon:e,title:t,isMinimized:n,canClose:r,onClick:c,clickArg:u,chat:m,user:b,className:h})=>{const f=Object(l.a)();let p,O;if(e&&t)p=a.a.createElement("div",{className:"item-icon"},a.a.createElement("i",{className:"icon-"+e})),O=t;else if(m||b){p=a.a.createElement(d.a,{chat:m,user:b,size:"small",isSavedMessages:b&&b.isSelf});const e=!m||b&&!b.isSelf?Object(s.Z)(b):Object(s.l)(f,m,b);O=e?Object(i.a)(e):void 0}const g=Object(o.a)("PickerSelectedItem",h,n&&"minimized",r&&"closeable");return a.a.createElement("div",{className:g,onClick:()=>c(u),title:n?O:void 0,dir:f.isRtl?"rtl":void 0},p,!n&&a.a.createElement("div",{className:"item-name",dir:"auto"},O),r&&a.a.createElement("div",{className:"item-remove"},a.a.createElement("i",{className:"icon-close"})))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(9),r=n(61),c=n(7);function s(e,t){c.e?Object(a.b)(()=>{!function(e,t){const{scrollLeft:n,offsetWidth:a,scrollWidth:c}=e;let s=t-n;if(s<0){const e=-n;s=Math.max(s,e)}else if(s>0){const e=c-(n+a);s=Math.min(s,e)}const i=e.scrollLeft+s,o=Date.now();Object(r.a)(()=>{const t=Math.min((Date.now()-o)/450,1),n=s*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(i-n),t<1})}(e,t)}):e.scrollTo({left:t,behavior:"smooth"})}},function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>{if(e)return e.addEventListener("wheel",t,{passive:!0}),()=>{e.removeEventListener("wheel",t)};function t(t){t.deltaX||(e.scrollLeft+=t.deltaY/4)}},[e,t])}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(9);t.a=(e,t,n,s)=>{const{loadMessage:i}=Object(r.d)(),o=Object(a.p)(()=>{const n=Object(c.g)(i,500,!0);return()=>{n({chatId:e,messageId:t,replyOriginForId:s})}},[i,e,t,s]);Object(a.n)(()=>{t&&!n&&o()})}},function(e,t,n){"use strict";var a=n(0),r=n(7);let c=0;t.a=(e,t,n)=>{const[s,i]=Object(a.r)(!1),[o,l]=Object(a.r)(void 0),d=Object(a.m)(e=>{t||2!==e.button||document.body.classList.add("no-selection")},[t]),u=Object(a.m)(e=>{document.body.classList.remove("no-selection"),t||n&&e.target.matches("a.text-entity-link[href]")||(e.preventDefault(),o||(document.body.classList.remove("no-selection"),0===c&&document.body.classList.add("has-context-menu"),c++,i(!0),l({x:e.clientX,y:e.clientY})))},[t,n,o]),m=Object(a.m)(()=>{i(!1)},[]),b=Object(a.m)(()=>{l(void 0),document.body.classList.remove("no-selection"),setTimeout(()=>{c--,0===c&&document.body.classList.remove("has-context-menu")},200)},[]);return Object(a.n)(()=>{if(t||!r.l)return;const n=e.current;if(!n)return;let a;const c=()=>{a&&(clearTimeout(a),a=void 0)},s=e=>{t||r.g&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(c(),a=window.setTimeout(()=>(e=>{c();const{clientX:t,clientY:a}=e.touches[0];o||(n.addEventListener("touchend",(function e(t){n.removeEventListener("touchend",e,!0),t.stopImmediatePropagation(),t.preventDefault(),t.stopPropagation()}),!0),document.body.classList.add("no-selection"),i(!0),l({x:t,y:a}))})(e),250))};return n.addEventListener("touchstart",s,{passive:!0}),n.addEventListener("touchcancel",c,!0),n.addEventListener("touchend",c,!0),n.addEventListener("touchmove",c,{passive:!0}),()=>{c(),n.removeEventListener("touchstart",s),n.removeEventListener("touchcancel",c,!0),n.removeEventListener("touchend",c,!0),n.removeEventListener("touchmove",c)}},[o,t,e]),{isContextMenuOpen:s,contextMenuPosition:o,handleBeforeContextMenu:d,handleContextMenu:u,handleContextMenuClose:m,handleContextMenuHide:b}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return m}));var a=n(0),r=n(2),c=n(5),s=n(4),i=n(23),o=n(76),l=n(57);function d(e,t,n){const a=e.content.text;if(!a||!a.text){const t=Object(s.P)(e);return t?[t]:void 0}const{text:r,entities:c}=a;return m(r,c,t,n)}function u(e){const t=new Set,n=[];return e.forEach((a,r)=>{if(t.has(r))return;const c=function e(t,n,a,r){const{offset:c,length:s}=t,i=new Set([n]);if(r.has(n))return;const o=a.filter((e,t)=>t>n&&e.offset>=c&&e.offsete(t,a.indexOf(t),a,r)).filter(Boolean);return o.forEach(e=>e.organizedIndexes.forEach(e=>i.add(e))),{entity:t,organizedIndexes:i,nestedEntities:o}}(a,r,e,t);c&&(c.organizedIndexes.forEach(e=>{t.add(e)}),n.push(c))}),n}function m(e,t,n,r,s){if(!t||!t.length)return b(e,n,r,s);const d=[];let m=!1;const O=u(t);function g(t,d,u,O){const v=[],{entity:j,nestedEntities:E}=u,{offset:y,length:C,type:N}=j;let T=e.substring(t,y);const w=T.length;T&&(m&&T.length>0&&"\n"===T[0]&&(T=T.substr(1),m=!1),T&&v.push(...b(T,n,r,s)));const M=t+w,S=M+C;let L=e.substring(y,y+C);const I=[];if(m&&L.length>0&&"\n"===L[0]&&(L=L.substr(1),m=!1),N===c.ApiMessageEntityTypes.Pre&&(m=!0),E.length){let e=M;E.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(e,S,t,n===E.length-1);I.push(...a),e=r})}const A=s?function(e,t,n){const a="string"==typeof t&&t,r=n.length?n.join(""):Object(i.a)(t,["emoji_html","br_html"]).join("");if(!a)return r;switch(e.type){case c.ApiMessageEntityTypes.Bold:return`${r}`;case c.ApiMessageEntityTypes.Italic:return`${r}`;case c.ApiMessageEntityTypes.Underline:return`${r}`;case c.ApiMessageEntityTypes.Code:return`${r}`;case c.ApiMessageEntityTypes.Pre:return`\`\`\`
${r}
\`\`\``;case c.ApiMessageEntityTypes.Strike:return`${r}`;case c.ApiMessageEntityTypes.MentionName:return`${r}`;case c.ApiMessageEntityTypes.Url:case c.ApiMessageEntityTypes.TextUrl:return`${r}`;default:return r}}(j,L,I):function(e,t,n){const r="string"==typeof t&&t,s=n.length?n:t;if(!r)return b(s);switch(e.type){case c.ApiMessageEntityTypes.Bold:return a.a.createElement("strong",null,b(s));case c.ApiMessageEntityTypes.Blockquote:return a.a.createElement("blockquote",null,b(s));case c.ApiMessageEntityTypes.BotCommand:return a.a.createElement("a",{onClick:f,className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Hashtag:case c.ApiMessageEntityTypes.Cashtag:return a.a.createElement("a",{onClick:p,className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Code:return a.a.createElement("code",{className:"text-entity-code"},b(s));case c.ApiMessageEntityTypes.Email:return a.a.createElement("a",{href:"mailto:"+r,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Italic:return a.a.createElement("em",null,b(s));case c.ApiMessageEntityTypes.MentionName:return a.a.createElement(o.a,{userId:e.userId},b(s));case c.ApiMessageEntityTypes.Mention:return a.a.createElement(o.a,{username:r},b(s));case c.ApiMessageEntityTypes.Phone:return a.a.createElement("a",{href:"tel:"+r,className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Pre:return a.a.createElement("pre",{className:"text-entity-pre"},b(s));case c.ApiMessageEntityTypes.Strike:return a.a.createElement("del",null,b(s));case c.ApiMessageEntityTypes.TextUrl:case c.ApiMessageEntityTypes.Url:return a.a.createElement(l.a,{url:h(r,e),text:r},b(s));case c.ApiMessageEntityTypes.Underline:return a.a.createElement("ins",null,b(s));default:return b(s)}}(j,L,I);if(Array.isArray(A)?v.push(...A):v.push(A),O&&S0&&"\n"===t[0]&&(t=t.substring(1)),t&&v.push(...b(t,n,r,s))}return{renderResult:v,entityEndIndex:S}}let v=0;return O.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(v,e.length,t,n===O.length-1);d.push(...a),v=r}),d}function b(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach(e=>{r.push(...b(e,t,n,a))}),r}if(a)return Object(i.a)(e,["escape_html","emoji_html","br_html"]);const r=n?"hq_emoji":"emoji";return t?Object(i.a)(e,[r,"br","highlight"],{highlight:t}):Object(i.a)(e,[r,"br"])}function h(e,t){const{type:n,url:a}=t;return n===c.ApiMessageEntityTypes.TextUrl&&a?a:e}function f(e){Object(r.d)().sendBotCommand({command:e.currentTarget.innerText})}function p(e){Object(r.d)().setLocalTextSearchQuery({query:e.currentTarget.innerText}),Object(r.d)().searchTextMessagesLocal()}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var a=n(0),r=n(9);function c(e,t){Object(a.n)(()=>{const t=e.current;return()=>{t&&Object(r.b)(()=>{t.pause(),t.src="",t.load()})}},t)}},,,function(e,t,n){},,,function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"c",(function(){return s})),n.d(t,"b",(function(){return i}));var a=n(1);const r=navigator.clipboard&&window.ClipboardItem,c=document.createElement("textarea");c.setAttribute("readonly",""),c.tabIndex=-1,c.className="visually-hidden";const s=e=>{c.value=e,document.body.appendChild(c);const t=document.getSelection();if(t){const e=t.rangeCount>0&&t.getRangeAt(0);c.select(),document.execCommand("copy"),e&&(t.removeAllRanges(),t.addRange(e))}document.body.removeChild(c)},i=e=>{const t=document.createElement("canvas"),n=t.getContext("2d"),a=new Image;a.onload=e=>{if(n&&e.currentTarget){const a=e.currentTarget;t.width=a.width,t.height=a.height,n.drawImage(a,0,0,a.width,a.height),t.toBlob(o,"image/png",1)}},a.src=e};async function o(e){if(e&&r)try{await navigator.clipboard.write([new window.ClipboardItem({[e.type]:e})])}catch(e){a.p&&console.error(e)}}},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(34),s=n(25),i=n(16),o=n(32);n(195);t.a=Object(a.h)(({ref:e,children:t,parentContainerClassName:n,value:l,inputId:d,className:u,focused:m,isLoading:b,placeholder:h,disabled:f,autoComplete:p,canClose:O,onChange:g,onReset:v,onFocus:j,onBlur:E})=>{let y=Object(a.q)(null);e&&(y=e);const[C,N,T]=Object(c.a)(m);Object(a.n)(()=>{y.current&&(m?y.current.focus():y.current.blur())},[m,h]);const w=Object(s.a)();const M=Object(a.m)(e=>{if("ArrowDown"===e.key){const e=document.querySelector(`.${n} .ListItem-button`);e&&e.focus()}},[n]);return a.a.createElement("div",{className:Object(r.a)("SearchInput",u,C&&"has-focus"),dir:w.isRtl?"rtl":void 0},t,a.a.createElement("input",{ref:y,id:d,type:"text",dir:"auto",placeholder:h||w("Search"),className:"form-control",value:l,disabled:f,autoComplete:p,onChange:function(e){const{currentTarget:t}=e;g(t.value)},onFocus:function(){N(),j&&j()},onBlur:function(){T(),E&&E()},onKeyDown:M}),a.a.createElement("i",{className:"icon-search"}),b&&a.a.createElement(i.a,null),!b&&(l||O)&&v&&a.a.createElement(o.a,{round:!0,size:"tiny",color:"translucent",onClick:v},a.a.createElement("span",{className:"icon-close"})))})},function(e,t,n){"use strict";var a=n(7);t.a=(e,t)=>{a.e&&(e.style.overflow="hidden"),void 0!==t&&(e.scrollTop=t),a.e&&(e.style.overflow="")}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(23),o=n(25);n(204);t.a=Object(a.h)(Object(r.h)((e,{typingStatus:t})=>{if(!t.userId)return{};return{typingUser:Object(c.Gb)(e,t.userId)}})(({typingStatus:e,typingUser:t})=>{const n=Object(o.a)(),r=t&&!t.isSelf&&Object(s.Z)(t);return a.a.createElement("p",{className:"typing-status",dir:n.isRtl?"rtl":"auto"},r&&a.a.createElement("span",{className:"sender-name",dir:"auto"},Object(i.a)(r)),n(e.action).replace("{user}","").trim(),a.a.createElement("span",{className:"ellipsis"}))}))},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(3),o=n(25),l=n(23),d=n(112),u=n(110),m=n(32);n(207);t.a=Object(a.h)(Object(r.h)((e,{chat:t})=>{const n=Object(s.mb)(t.id),a=Object(c.P)(e,t.id),r=n&&!a,i=t&&Object(s.mb)(t.id)?Object(s.Z)(Object(c.Gb)(e,Object(s.V)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isChannel:Object(s.kb)(t),isBasicGroup:Object(s.jb)(t),isSuperGroup:Object(s.ob)(t),canDeleteForAll:r,contactName:i}},(e,t)=>Object(i.l)(t,["leaveChannel","deleteHistory","deleteChannel"]))(({isOpen:e,chat:t,isChannel:n,isPrivateChat:r,isChatWithSelf:c,isBasicGroup:i,isSuperGroup:b,canDeleteForAll:h,contactName:f,onClose:p,leaveChannel:O,deleteHistory:g,deleteChannel:v})=>{const j=Object(o.a)(),E=Object(s.l)(j,t),y=Object(a.m)(()=>{g({chatId:t.id,shouldDeleteForAll:!0}),p()},[g,t.id,p]),C=Object(a.m)(()=>{r||i?g({chatId:t.id,shouldDeleteForAll:!1}):!n&&!b||t.isCreator?(n||b)&&t.isCreator&&v({chatId:t.id}):O({chatId:t.id}),p()},[r,i,n,b,t.isCreator,t.id,p,g,O,v]);return a.a.createElement(u.a,{isOpen:e,onClose:p,className:"DeleteChatModal",header:a.a.createElement("div",{className:"modal-header",dir:j.isRtl?"rtl":void 0},a.a.createElement(d.a,{size:"tiny",chat:t,isSavedMessages:c}),a.a.createElement("h3",{className:"modal-title"},j(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"ChannelDelete":i||b?"Group.LeaveGroup":"DeleteChatUser")))},n&&t.isCreator?a.a.createElement("p",null,Object(l.a)(j("ChatList.DeleteAndLeaveGroupConfirmation",E),["simple_markdown"])):n&&!t.isCreator||i||b?a.a.createElement("p",null,Object(l.a)(j("ChannelLeaveAlertWithName",E),["simple_markdown"])):a.a.createElement("p",null,Object(l.a)(j("ChatList.DeleteChatConfirmation",f),["simple_markdown"])),h&&a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:y},f?j("ChatList.DeleteForEveryone",f):j("DeleteForAll")),a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:C},j(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"Chat.Input.Delete":i||b?"Group.LeaveGroup":h?"ChatList.DeleteForCurrentUser":"Delete")),a.a.createElement(m.a,{className:"confirm-dialog-button",isText:!0,onClick:p},j("Cancel")))}))},function(e,t,n){"use strict";function a(e){e.dataset.patchedForSafari||(e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",(function n(){e.buffered.length&&(e.dataset.patchForSafariInProgress="true",e.currentTime=e.duration-1,e.addEventListener("progress",()=>{delete e.dataset.patchForSafariInProgress,e.currentTime=t,e.paused&&e.play()},{once:!0}),e.removeEventListener("progress",n))}))},{once:!0}),e.dataset.patchedForSafari="true")}function r(e){return Boolean(e.dataset.patchForSafariInProgress)}n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";var a=n(0),r=n(38);t.a=(e,t)=>{const n=Object(r.a)(t);return Object(a.o)(()=>{e(n||[])},t)}},function(e,t,n){"use strict";var a=n(0),r=n(59),c=n(4),s=n(107),i=n(120),o=n(108),l=n(178),d=n(179);t.a=Object(a.h)(({message:e,observeIntersection:t,smaller:n,uploadProgress:u,withDate:m,datetime:b,className:h,sender:f,isSelected:p,isSelectable:O,onCancelUpload:g,onDateClick:v})=>{const j=Object(a.q)(null),E=e.content.document,y=Object(r.b)(E)||"",{fileName:C,size:N,timestamp:T}=E,w=Object(s.b)(j,t),[M,S]=Object(a.r)(!1),{mediaData:L,downloadProgress:I}=Object(i.a)(Object(c.E)(e,"download"),!M),{isUploading:A,isTransferring:k,transferProgress:x}=Object(c.s)(e,u||I,M),D=Object(r.c)(E),R=D?Object(c.F)(e):void 0,_=D?E.previewBlobUrl:void 0,P=Object(o.a)(Object(c.E)(e,"pictogram"),!w),F=Object(a.m)(()=>{A?g&&g():S(e=>!e)},[A,g]),U=Object(a.m)(()=>{v(e.id,e.chatId)},[v,e.id,e.chatId]);return Object(a.n)(()=>{M&&L&&(Object(l.a)(L,C),S(!1))},[C,L,M]),a.a.createElement(d.a,{ref:j,name:C,extension:y,size:N,timestamp:m?b||T:void 0,thumbnailDataUri:R,previewData:_||P,smaller:n,isTransferring:k,isUploading:A,transferProgress:x,className:h,sender:f,isSelectable:O,isSelected:p,onClick:F,onDateClick:v?U:void 0})})},function(e,t,n){"use strict";var a=n(0),r=n(11),c=n(17);t.a=Object(a.h)(e=>{const{isOpen:t}=e,n=Object(c.a)(r.a.Extra,"StickerSetModal",!t);return n?a.a.createElement(n,e):void 0})},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(0),r=n(163),c=n(26),s=n(7);function i(e,t=!1,n){const i=Object(a.q)(null),o=Object(c.a)();return Object(a.n)(()=>{const a=i.current;if(!e||!a||t)return;const c=new Image,o=()=>{a.width=c.width,a.height=c.height;const e=a.getContext("2d",{alpha:!1});s.c&&(e.filter="blur(2px)"),e.drawImage(c,-4,-4,a.width+8,a.height+8),s.c||Object(r.a)(e,0,0,a.width,a.height,2,2)};c.onload=()=>{n?requestAnimationFrame(o):o()},c.src=e},[i,e,o,t,n]),i}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],r=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function c(e,t,n,c,s,i,o){if(Number.isNaN(i)||i<1)return;i|=0,Number.isNaN(o)&&(o=1),(o|=0)>3&&(o=3),o<1&&(o=1);const l=e.getImageData(t,n,c,s),d=l.data;let u,m,b,h,f,p,O,g,v,j,E,y,C=c-1,N=s-1,T=i+1,w=[],M=[],S=[],L=a[i],I=r[i],A=[],k=[];for(;o-- >0;){for(y=E=0,f=0;fC?C:p)<<2),u+=d[O++],m+=d[O++],b+=d[O++];for(h=0;h0?O<<2:0),g=y+A[h],v=y+k[h],u+=d[g++]-d[v++],m+=d[g++]-d[v++],b+=d[g++]-d[v++],E++;y+=c<<2}for(h=0;hN?0:c,u+=w[j],m+=M[j],b+=S[j];for(E=h<<2,f=0;f>>I,d[E+1]=m*L>>>I,d[E+2]=b*L>>>I,0==h&&(A[f]=((O=f+T)0?O*c:0),g=h+A[f],v=h+k[f],u+=w[g]-w[v],m+=M[g]-M[v],b+=S[g]-S[v],E+=c<<2}}e.putImageData(l,t,n)}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(8),s=n(47),i=n(35),o=n(79),l=n(34),d=n(25),u=n(32);n(239);const m={B:"bold",STRONG:"bold",I:"italic",EM:"italic",U:"underline",DEL:"strikethrough",CODE:"monospace"};t.a=Object(a.h)(({isOpen:e,anchorPosition:t,selectedRange:n,onClose:b})=>{const h=Object(a.q)(null),f=Object(a.q)(null),{shouldRender:p,transitionClassNames:O}=Object(i.a)(e),[g,v,j]=Object(l.a)(),[E,y]=Object(a.r)(""),[C,N]=Object(a.r)(!1),[T,w]=Object(a.r)(),[M,S]=Object(a.r)({});Object(a.n)(()=>e?Object(s.a)(b):void 0,[e,b]),Object(o.a)(e,h,b),Object(a.n)(()=>{g?f.current.focus():(y(""),N(!1))},[g]),Object(a.n)(()=>{p||(j(),S({}),w(void 0))},[j,p]),Object(a.n)(()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.v;){const e=m[a.tagName];e&&(t[e]=!0),a=a.parentElement}S(t)},[e,n,v]);const L=Object(a.m)(()=>{if(n)return n.toString()},[n]),I=Object(a.m)(()=>{if(n)return n.commonAncestorContainer.parentElement},[n]);function A(){const e=f.current;if(!e)return;const{offsetWidth:t,scrollWidth:n,scrollLeft:a}=e;if(n<=t)return void w(void 0);let r="";a0&&(r+=" mask-left"),w(r)}function k(e){if(M[e])return"active";if("monospace"===e||"strikethrough"===e){if(Object.keys(M).some(t=>t!==e&&!!M[t]))return"disabled"}else if(M.monospace||M.strikethrough)return"disabled"}const x=Object(a.m)(()=>{S(e=>(document.execCommand(e.bold?"removeFormat":"bold"),Object.keys(e).forEach(t=>{"italic"!==t&&"underline"!==t||!e[t]||document.execCommand(t)}),{...e,bold:!e.bold}))},[]),D=Object(a.m)(()=>{document.execCommand("italic"),S(e=>({...e,italic:!e.italic}))},[]),R=Object(a.m)(()=>{document.execCommand("underline"),S(e=>({...e,underline:!e.underline}))},[]),_=Object(a.m)(()=>{if(M.strikethrough){const e=I();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void S(e=>({...e,strikethrough:!1}))}const e=L();document.execCommand("insertHTML",!1,`${e}`),b()},[I,L,b,n,M.strikethrough]),P=Object(a.m)(()=>{if(M.monospace){const e=I();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void S(e=>({...e,monospace:!1}))}const e=L();document.execCommand("insertHTML",!1,`${e}`),b()},[I,L,b,n,M.monospace]);function F(){const e=E.includes("://")?E:"http://"+E;if(C){const t=I();if(!t||"A"!==t.tagName)return;return t.href=e,void b()}const t=L();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),b()}const U=Object(a.m)(e=>{const t={KeyK:v,KeyB:x,KeyU:R,KeyI:D,KeyM:P,KeyS:_}[e.code];!e.altKey&&(e.ctrlKey||e.metaKey)&&t&&(e.preventDefault(),e.stopPropagation(),t())},[x,D,R,P,_,v]);Object(a.n)(()=>(e&&document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)),[e,U]);const B=Object(d.a)();if(!p)return;const q=Object(c.a)("TextFormatter",O,g&&"link-control-shown"),H=Object(c.a)("TextFormatter-link-url-confirm",!!E.length&&"shown"),$=t?`left: ${t.x}px; top: ${t.y}px;--text-formatter-left: ${t.x}px;`:"";return a.a.createElement("div",{ref:h,className:q,style:$,onKeyDown:function(e){"Enter"===e.key&&g&&(F(),e.preventDefault())}},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(u.a,{color:"translucent",ariaLabel:"Bold text",className:k("bold"),onClick:x},a.a.createElement("i",{className:"icon-bold"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Italic text",className:k("italic"),onClick:D},a.a.createElement("i",{className:"icon-italic"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Underlined text",className:k("underline"),onClick:R},a.a.createElement("i",{className:"icon-underlined"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Strikethrough text",className:k("strikethrough"),onClick:_},a.a.createElement("i",{className:"icon-strikethrough"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Monospace text",className:k("monospace"),onClick:P},a.a.createElement("i",{className:"icon-monospace"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(u.a,{color:"translucent",ariaLabel:B("TextFormat.AddLinkTitle"),onClick:v},a.a.createElement("i",{className:"icon-link"}))),a.a.createElement("div",{className:"TextFormatter-link-control"},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(u.a,{color:"translucent",ariaLabel:B("Cancel"),onClick:j},a.a.createElement("i",{className:"icon-arrow-left"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement("div",{className:Object(c.a)("TextFormatter-link-url-input-wrapper",T)},a.a.createElement("input",{ref:f,className:"TextFormatter-link-url-input",type:"text",value:E,placeholder:"Enter URL...",autoComplete:"off",inputMode:"url",dir:"auto",onChange:function(e){y(e.target.value),A()},onScroll:A})),a.a.createElement("div",{className:H},a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(u.a,{color:"translucent",ariaLabel:B("Save"),className:"color-primary",onClick:F},a.a.createElement("i",{className:"icon-check"}))))))})},function(e,t,n){"use strict";var a=n(0),r=n(36),c=n(4),s=n(108),i=n(114);n(247);t.a=Object(a.h)(({message:e,idPrefix:t="shared-media",onClick:n})=>{const o=Object(a.m)(()=>{n(e.id,e.chatId)},[e.id,e.chatId,n]),l=Object(c.F)(e),d=Object(s.a)(Object(c.E)(e,"pictogram")),{shouldRenderThumb:u,shouldRenderFullMedia:m,transitionClassNames:b}=Object(i.a)(d,"slow"),h=Object(c.Q)(e);return a.a.createElement("div",{id:`${t}${e.id}`,className:"Media scroll-item",onClick:n?o:void 0},u&&a.a.createElement("img",{src:l,alt:""}),m&&a.a.createElement("img",{src:d,className:b+" full-media",alt:""}),h&&a.a.createElement("span",{className:"video-duration"},h.isGif?"GIF":Object(r.e)(h.duration)))})},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(7),s=n(36),i=n(4);var o=n(8),l=n(23);var d=n(120),u=n(35),m=n(137),b=n(176),h=n(180),f=n(25),p=n(32),O=n(121),g=n(27);n(221);const v=c.g?20:25,j=c.g?50:75;function E(e,t,{handleStartSeek:n,handleSeek:r,handleStopSeek:c}){return a.a.createElement("div",{className:"seekline no-selection",onMouseDown:n,onMouseMove:r,onMouseUp:c},a.a.createElement("span",{className:"seekline-buffered-progress"},a.a.createElement("i",{style:`transform: translateX(${100*t}%)`})),a.a.createElement("span",{className:"seekline-play-progress"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})),a.a.createElement("span",{className:"seekline-thumb"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})))}t.a=Object(a.h)(Object(r.h)(e=>({theme:e.settings.byKey.theme}))(({theme:e,message:t,senderTitle:n,uploadProgress:r,renderingFor:y,date:C,lastSyncTime:N,className:T,isSelectable:w,isSelected:M,onPlay:S,onReadMedia:L,onCancelUpload:I,onDateClick:A})=>{const{content:{audio:k,voice:x},isMediaUnread:D}=t,R=Boolean(x),_=Object(a.q)(!1),P=Object(f.a)(),[F,U]=Object(a.r)(!1),B=N,{mediaData:q,downloadProgress:H}=Object(d.a)(Object(i.E)(t,"inline"),!B,Object(i.D)(t,"inline"));const{isBuffered:$,bufferedProgress:K,bufferingHandlers:V,checkBuffering:Y}=Object(m.a)(),{isPlaying:G,playProgress:W,playPause:z,setCurrentTime:X,duration:Q}=Object(b.a)(Object(i.B)(t),Object(i.r)(t),q,V,Y,F,(function(){U(!0),S(t.id,t.chatId)}),Object(i.tb)(t));Object(a.n)(()=>{U(G)},[G]);const{isDownloadStarted:J,downloadProgress:Z,handleDownloadClick:ee}=Object(h.a)(Object(i.E)(t,"download"),Object(i.v)(t)),te=F&&!$,{isUploading:ne,isTransferring:ae,transferProgress:re}=Object(i.s)(t,J?Z:r||H,te||J),{shouldRender:ce,transitionClassNames:se}=Object(u.a)(ae),ie=Object(a.m)(()=>{ne?I&&I():(G||S(t.id,t.chatId),U(!F),z())},[G,ne,t.id,t.chatId,I,S,z,F]);Object(a.n)(()=>{G&&L&&D&&L()},[G,D,L]);const oe=Object(a.m)(e=>{if(_.current){const t=e.currentTarget.closest(".seekline,.waveform");if(t){const{width:n,left:a}=t.getBoundingClientRect();X(Q*((e.clientX-a)/n))}}},[Q,X]),le=Object(a.m)(e=>{_.current=!0,oe(e)},[oe]),de=Object(a.m)(()=>{_.current=!1},[]),ue=Object(a.m)(()=>{A(t.id,t.chatId)},[A,t.id,t.chatId]);const me={handleStartSeek:le,handleSeek:oe,handleStopSeek:de},be=Object(i.ub)(t),he=Object(a.p)(()=>x&&function(e,t=0,n=!1,{handleStartSeek:r,handleSeek:c,handleStopSeek:s},i){const{waveform:o,duration:l}=e;if(!o)return;const d="dark"===i?"#494B75":"#CBCBCB",u="dark"===i?"#C69C85":"#B0DEA6",m="dark"===i?"#868DF5":"#54a3e6",b="dark"===i?"#FFFFFF":"#53ad53",h=Math.min(l/30,1),f=Math.round(v+(j-v)*h),p=function(e){const t=8*e.length,n=Math.floor(t/5);if(!n)return[];const a=Array(n),r=e;for(let e=0,t=n-1;e!==t;++e){const t=Math.floor(5*e/8),n=Math.floor(5*e%8),c=r[t]+(r[t+1]<<8);a[e]=c>>n&31}const c=Math.floor(5*(n-1)/8),s=Math.floor(5*(n-1)%8),i=r[c]+(r[c+1]<<8);return a[n-1]=i>>s&31,a}(new Uint8Array(o)),{data:O,peak:g}=function(e,t){let n=0;const a=new Array(t),r=e.length/t,c=e[0],s=e[e.length-1];for(let d=0;d{i.globalAlpha=s/e.length>=t?.5:1,i.fillStyle=t>s/e.length?r:a;const o=Math.max(2,c/Math.max(1,n)*23);!function(e,t,n,a,r,c){a<2*c&&(c=a/2);r<2*c&&(c=r/2);e.beginPath(),e.moveTo(t+c,n),e.arcTo(t+a,n,t+a,n-r,c),e.arcTo(t+a,n-r,t,n-r,c),e.arcTo(t,n-r,t,n,c),e.arcTo(t,n,t+a,n,c),e.closePath()}(i,4*s,23,2,o,1),i.fill()}),{src:s.toDataURL(),width:c,height:23}}(O,t,{peak:g,fillStyle:n?u:d,progressFillStyle:n?b:m});return a.a.createElement("img",{src:E,alt:"",width:y,height:C,className:"waveform",draggable:!1,onMouseDown:r,onMouseMove:c,onMouseUp:s})}(x,W,be,me,e),[x,W,be,me,e]),fe=Object(o.a)("Audio media-inner",T,be&&!y&&"own",y&&"bigger",M&&"audio-is-selected"),pe=["toggle-play"];te?pe.push("loading"):G?pe.push("pause"):G||pe.push("play");const Oe=G||W>0&&W<1,ge=Object(o.a)("content",Oe&&"with-seekline");return a.a.createElement("div",{className:fe,dir:P.isRtl?"rtl":void 0},w&&a.a.createElement("div",{className:"message-select-control"},M&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement(p.a,{round:!0,ripple:!c.g,size:y?"smaller":"tiny",className:pe.join(" "),ariaLabel:G?"Pause audio":"Play audio",onClick:ie,isRtl:P.isRtl},a.a.createElement("i",{className:"icon-play"}),a.a.createElement("i",{className:"icon-pause"})),ce&&a.a.createElement("div",{className:Object(o.a)("media-loading",se,te&&"interactive")},a.a.createElement(O.a,{progress:re,transparent:!0,size:y?"m":"s",onClick:te?ie:void 0,noCross:!te})),k&&a.a.createElement(p.a,{round:!0,size:"tiny",className:"download-button",ariaLabel:J?"Cancel download":"Download",onClick:ee},a.a.createElement("i",{className:J?"icon-close":"icon-arrow-down"})),"searchResult"===y&&a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:ge},a.a.createElement("div",{className:"content-row"},a.a.createElement("p",{className:"title",dir:"auto"},Object(l.a)(function(){if(R)return n||"Voice";const{title:e,fileName:t}=k;return e||t}())),a.a.createElement("div",{className:"message-date"},C&&a.a.createElement(g.a,{className:"date",onClick:ue},Object(s.g)(P,1e3*C)))),Oe&&E(W,K,me),!Oe&&a.a.createElement("p",{className:"duration",dir:"auto"},W>0?Object(s.e)(Q*W)+" / ":void 0,function(){if(R)return Object(s.e)(x.duration);const{performer:e}=k;return a.a.createElement(a.a.Fragment,null,e&&Object(l.a)(e),e&&n&&a.a.createElement("span",null,"•"),n&&Object(l.a)(n))}()))),"searchResult"!==y&&k&&function(e,t,n,r,c,i,o,d){const{title:u,performer:m,duration:b,fileName:h}=t,f=n||r>0&&r<1;return a.a.createElement("div",{className:"content"},a.a.createElement("p",{className:"title",dir:"auto"},Object(l.a)(u||h)),f&&E(r,c,i),!f&&a.a.createElement("div",{className:"meta",dir:"auto"},a.a.createElement("span",{className:"performer"},Object(l.a)(m||"Unknown")),o&&a.a.createElement(a.a.Fragment,null," ","•"," ",a.a.createElement(g.a,{className:"date",onClick:d},Object(s.d)(e,1e3*o)))),a.a.createElement("p",{className:"duration",dir:"auto"},r>0?Object(s.e)(b*r)+" / ":void 0,Object(s.e)(b)))}(P,k,G,W,K,me,C,A?ue:void 0),"searchResult"!==y&&x&&function(e,t,n){return a.a.createElement("div",{className:"content"},t,a.a.createElement("p",{className:"voice-duration",dir:"auto"},Object(s.e)(e.duration),n&&a.a.createElement("span",null,"•")))}(x,he,D))}))},function(e,t,n){"use strict";var a=n(0),r=n(142),c=n(38),s=n(143),i=n(25),o=n(8);n(201);var l=Object(a.h)(({className:e,title:t,active:n,badgeCount:r,isBadgeActive:c,previousActiveTab:s,onClick:i,clickArg:l})=>{const d=Object(a.q)(null);return Object(a.o)(()=>{if(!n||void 0===s)return;const e=d.current,t=e.querySelector("i"),a=e.parentElement.children[s].querySelector("i");a.classList.remove("animate"),t.classList.remove("animate");const r=a.parentElement.offsetLeft-t.parentElement.offsetLeft,c=a.clientWidth/t.clientWidth;t.style.transform=`translate3d(${r}px, 0, 0) scale3d(${c}, 1, 1)`,requestAnimationFrame(()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})})})},[n,s]),a.a.createElement("button",{type:"button",className:Object(o.a)("Tab",e,n&&"active"),onClick:()=>i(l),ref:d},a.a.createElement("span",null,t,!!r&&a.a.createElement("span",{className:Object(o.a)("badge",c&&"active")},r),a.a.createElement("i",null)))});n(202);t.a=Object(a.h)(({tabs:e,activeTab:t,big:n,onSwitchTab:o})=>{const d=Object(a.q)(null),u=Object(c.a)(t);Object(s.a)(d.current),Object(a.n)(()=>{const e=d.current;if(e.scrollWidth<=e.offsetWidth)return;const t=e.querySelector(".Tab.active");if(t){const n=t.offsetLeft-e.offsetWidth/2+t.offsetWidth/2;if(Math.abs(n-e.scrollLeft)<16)return;Object(r.a)(e,n)}},[t]);const m=Object(i.a)();return a.a.createElement("div",{className:"TabList no-selection no-scrollbar "+(n?"big":""),ref:d,dir:m.isRtl?"rtl":void 0},e.map((e,n)=>a.a.createElement(l,{key:e.title,title:m(e.title),active:n===t,badgeCount:e.badgeCount,isBadgeActive:e.isBadgeActive,previousActiveTab:u,onClick:o,clickArg:n})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const a={CHAT_RESTRICTED:"You can't send messages in this chat, you were restricted",CHAT_WRITE_FORBIDDEN:"You can't write in this chat",CHAT_SEND_POLL_FORBIDDEN:"You can't create polls in this chat",CHAT_SEND_STICKERS_FORBIDDEN:"You can't send stickers in this chat",CHAT_SEND_GIFS_FORBIDDEN:"You can't send gifs in this chat",CHAT_SEND_MEDIA_FORBIDDEN:"You can't send media in this chat",CHAT_LINK_EXISTS:"The chat is public, you can't hide the history to new users",SLOWMODE_WAIT_X:"Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.",USER_BANNED_IN_CHANNEL:"You're banned from sending messages in supergroups / channels",USER_IS_BLOCKED:"You were blocked by this user",YOU_BLOCKED_USER:"You blocked this user",IMAGE_PROCESS_FAILED:"Failure while processing image",MEDIA_EMPTY:"The provided media object is invalid",MEDIA_INVALID:"Media invalid",PHOTO_EXT_INVALID:"The extension of the photo is invalid",PHOTO_INVALID_DIMENSIONS:"The photo dimensions are invalid",PHOTO_SAVE_FILE_INVALID:"Internal issues, try again later",MESSAGE_DELETE_FORBIDDEN:"You can't delete one of the messages you tried to delete, most likely because it is a service message.",MESSAGE_POLL_CLOSED:"Poll closed",MESSAGE_EDIT_TIME_EXPIRED:"You can't edit this message anymore.",CHAT_ADMIN_REQUIRED:"You must be an admin in this chat to do this",PINNED_DIALOGS_TOO_MUCH:"Sorry, you can only pin 5 chats to the top",DIALOG_FILTERS_TOO_MUCH:"Sorry, you can't have more than 10 folders",CHANNEL_PRIVATE:"This channel is private",MEDIA_CAPTION_TOO_LONG:"The provided caption is too long",ADDRESS_STREET_LINE1_INVALID:"The address you provided is not valid",ADDRESS_STREET_LINE2_INVALID:"The address you provided is not valid",ADDRESS_CITY_INVALID:"The city you provided is not valid",ADDRESS_COUNTRY_INVALID:"The country you provided is not valid",ADDRESS_POSTCODE_INVALID:"The postcode you provided is not valid",ADDRESS_STATE_INVALID:"The state you provided is not valid",REQ_INFO_NAME_INVALID:"The name you provided is not valid",REQ_INFO_PHONE_INVALID:"The phone you provided is not valid",REQ_INFO_EMAIL_INVALID:"The email you provided is not valid",LINK_NOT_MODIFIED:"This discussion is already linked to the channel",SERVICE_WORKER_DISABLED:"Service Worker is disabled. Please reload the page without holding key.",CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS:"The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.",FRESH_RESET_AUTHORISATION_FORBIDDEN:"You can’t logout other sessions if less than 24 hours have passed since you logged on the current session",BOTS_TOO_MUCH:"There are too many bots in this chat/channel",BOT_GROUPS_BLOCKED:"This bot can't be added to groups",USERS_TOO_MUCH:"The maximum number of users has been exceeded",USER_CHANNELS_TOO_MUCH:"One of the users you tried to add is already in too many channels/supergroups",USER_KICKED:"This user was kicked from this supergroup/channel",USER_NOT_MUTUAL_CONTACT:"The provided user is not a mutual contact",USER_PRIVACY_RESTRICTED:"The user's privacy settings do not allow you to do this",INVITE_HASH_EMPTY:"The invite hash is empty",INVITE_HASH_EXPIRED:"The invite link has expired",INVITE_HASH_INVALID:"The invite hash is invalid",CHANNELS_TOO_MUCH:"You have joined too many channels/supergroups",USER_ALREADY_PARTICIPANT:"You already in the group"};function r(e){const{message:t,isSlowMode:n,textParams:r}=e;if(n){const e=t.indexOf(" (caused by");return e>0?t.substring(0,e):t}let c=a[t];return c&&r&&(c=Object.keys(r).reduce((e,t)=>e.replace(t,r[t]),c)),c}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(4),s=n(25);t.a=({chat:e,privateChatUser:t,handleDelete:n,folderId:i,isPinned:o})=>{const l=Object(s.a)(),{toggleChatPinned:d,updateChatMutedState:u,toggleChatArchived:m,toggleChatUnread:b}=Object(r.d)();return Object(a.p)(()=>{if(!e)return;const a=t&&t.isSelf,r=e.unreadCount||e.hasUnreadMark?{title:l("MarkAsRead"),icon:"readchats",handler:()=>b({id:e.id})}:{title:l("MarkAsUnread"),icon:"unread",handler:()=>b({id:e.id})},s=o?{title:l("UnpinFromTop"),icon:"unpin",handler:()=>d({id:e.id,folderId:i})}:{title:l("PinToTop"),icon:"pin",handler:()=>d({id:e.id,folderId:i})},h=e.isMuted?{title:l("ChatList.Unmute"),icon:"unmute",handler:()=>u({chatId:e.id,isMuted:!1})}:{title:l("ChatList.Mute"),icon:"mute",handler:()=>u({chatId:e.id,isMuted:!0})},f=Object(c.ib)(e)?{title:l("Unarchive"),icon:"unarchive",handler:()=>m({id:e.id})}:{title:l("Archive"),icon:"archive",handler:()=>m({id:e.id})};return[r,s,...a?[]:[h,f],{title:Object(c.mb)(e.id)?l("Delete"):l(Object(c.d)(e)?"DeleteChat":Object(c.kb)(e)?"LeaveChannel":"Group.LeaveGroup"),icon:"delete",destructive:!0,handler:n}]},[e,t,l,o,n,b,d,i,u,m])}},function(e,t,n){"use strict";var a=n(0),r=n(36),c=n(25),s=n(172);n(206);t.a=Object(a.h)(({message:e,outgoingStatus:t})=>{const n=Object(c.a)();return a.a.createElement("div",{className:"LastMessageMeta"},t&&a.a.createElement(s.a,{status:t}),a.a.createElement("span",{className:"time"},Object(r.g)(n,1e3*e.date)))})},function(e,t,n){"use strict";var a,r=n(0),c=n(111);n(205);!function(e){e[e.failed=0]="failed",e[e.pending=1]="pending",e[e.succeeded=2]="succeeded",e[e.read=3]="read"}(a||(a={}));t.a=Object(r.h)(({status:e})=>r.a.createElement("div",{className:"MessageOutgoingStatus"},r.a.createElement(c.a,{name:"reveal",activeKey:a[e]},()=>r.a.createElement("i",{className:"icon-message-"+e}))))},function(e,t,n){"use strict";var a=n(0);t.a=(e,t,n,r,c=0,s=0)=>{const[i,o]=Object(a.r)("right"),[l,d]=Object(a.r)("bottom"),[u,m]=Object(a.r)("");return Object(a.n)(()=>{const a=t();if(!e||!a)return;let{x:i,y:l}=e;const u={width:0,left:0,height:0,top:0},b=r(),h=n(),f=a.getBoundingClientRect(),p=b?{width:b.offsetWidth,height:b.offsetHeight}:u,O=h?h.getBoundingClientRect():u;i+p.width+c0?(o("right"),i-=3):(o("left"),i=16),l+p.height{const{shouldRender:d,transitionClassNames:u}=Object(r.a)(e,void 0,void 0,!t&&void 0),m=Object(c.a)(e),b=Object(c.a)(l),h=Object(a.q)();return m&&!e&&(h.current=b),d&&a.a.createElement("div",{id:n,className:Object(s.a)(i,u),onClick:o},e?l():h.current())}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(0),r=n(38),c=n(26),s=n(51);function i(e,t){const n=Object(r.a)(e,!0),i=Object(a.q)(),o=Object(c.a)(),l=null!=e,d=null!=n;return l&&i.current&&(clearTimeout(i.current),i.current=void 0),Object(s.a)(()=>{t&&!l&&d&&!i.current&&(i.current=window.setTimeout(()=>{i.current=void 0,o()},t))},[e]),i.current&&t&&!l?n:e}},function(e,t,n){"use strict";var a=n(0),r=n(177),c=n(58),s=n(158),i=n(51);t.a=(e,t,n,o,l,d=!1,u,m=!1)=>{const b=Object(a.q)(null),[h,f]=Object(a.r)(!1);let p=h;const[O,g]=Object(a.r)(0);Object(i.a)(()=>{b.current=Object(r.a)(e,(e,n)=>{switch(e){case"onPlay":f(!0);break;case"onPause":f(!1);break;case"onTimeUpdate":{const{proxy:e}=b.current,n=e.duration&&Number.isFinite(e.duration)?e.duration:t;g(e.currentTime/n);break}}o&&o[e]&&o[e](n)},u);const{proxy:n}=b.current;h||n.paused||(f(!0),p=!0),l&&l(n)},[e]);const{play:v,pause:j,setCurrentTime:E,proxy:y,destroy:C}=b.current,N=y.duration&&Number.isFinite(y.duration)?y.duration:t;Object(a.n)(()=>{N&&!Object(s.a)(y)&&g(y.currentTime/N)},[N,O,y]),Object(a.n)(()=>()=>{C(m)},[C,m]),Object(c.a)(([e,t])=>{e===d&&n===t||y.src&&y.paused||d&&n&&!h&&v(n)},[d,n,h,v,y.src,y.paused]);const T=Object(a.m)(()=>{h?j():n&&v(n)},[n,j,v,h]);return{isPlaying:p,playProgress:O,playPause:T,setCurrentTime:E,audioProxy:y,duration:N}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return m}));var a=n(7),r=n(136),c=n(158),s=n(2),i=n(4);const o=new Map;let l,d=[];function u(){const e=l&&o.get(l);e&&e.audio.pause()}function m(e,t,n){o.has(e)||(o.set(e,function(e,t){const n=new Audio;function a(t){return a=>{o.has(e)&&(Object(c.a)(n)||o.get(e).handlers.forEach(e=>{e(t,a)}))}}return n.addEventListener("timeupdate",a("onTimeUpdate")),n.addEventListener("play",a("onPlay")),n.addEventListener("pause",a("onPause")),n.addEventListener("loadstart",a("onLoadStart")),n.addEventListener("loadeddata",a("onLoadedData")),n.addEventListener("playing",a("onPlaying")),n.addEventListener("ended",()=>{if(Object(c.a)(n))return;const t=d[d.indexOf(e)+1];if(!t)return;if(!o.has(t))return void Object(s.d)().openAudioPlayer(Object(i.Ab)(t));const a=o.get(t);a.onForcePlay&&a.onForcePlay(),l=t,a.audio.src&&Object(r.a)(a.audio)}),{audio:n,proxy:new Proxy(n,{get:(e,t)=>e[t]}),handlers:[],onForcePlay:t}}(e,n)),d.includes(e)||d.push(e));const{audio:u,proxy:m,handlers:b}=o.get(e);return b.push(t),{play(t){l&&l!==e&&o.get(l).audio.pause(),l=e,u.src||(u.src=t,u.preload="auto",t.includes("/progressive/")&&a.j&&Object(c.b)(u)),Object(r.a)(u)},pause(){l===e&&u.pause()},setCurrentTime(t){l===e&&(u.currentTime=t)},proxy:m,destroy(n=!1){const a=o.get(e);a&&(a.handlers=a.handlers.filter(e=>e!==t),a.handlers.length||(a.audio.pause(),o.delete(e),n&&(d=d.filter(t=>t!==e)),e===l&&(l=void 0)))}}}},function(e,t,n){"use strict";function a(e,t){const n=document.createElement("a");n.href=e,n.download=t,n.click()}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";var a=n(0),r=n(35),c=n(114),s=n(8),i=n(36),o=n(59),l=n(115),d=n(23),u=n(25),m=n(121),b=n(27);n(220);t.a=Object(a.h)(({ref:e,name:t,size:n,extension:h="",timestamp:f,sender:p,thumbnailDataUri:O,previewData:g,className:v,smaller:j,isTransferring:E,isUploading:y,isSelectable:C,isSelected:N,transferProgress:T,onClick:w,onDateClick:M})=>{const S=Object(u.a)();let L=Object(a.q)(null);e&&(L=e);const{shouldRender:I,transitionClassNames:A}=Object(r.a)(E,void 0,!0),k=Object(o.a)(h),x=Object(o.e)(n),{shouldRenderThumb:D,shouldRenderFullMedia:R,transitionClassNames:_}=Object(c.a)(g,"slow"),{width:P,height:F}=Object(l.i)(j),U=Object(s.a)("File",v,j&&"smaller",w&&!y&&"interactive",N&&"file-is-selected");return a.a.createElement("div",{ref:L,className:U,dir:S.isRtl?"rtl":void 0},C&&a.a.createElement("div",{className:"message-select-control"},N&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement("div",{className:"file-icon-container",onClick:y?void 0:w},O||g?a.a.createElement("div",{className:"file-preview media-inner"},D&&a.a.createElement("img",{src:O,width:P,height:F,className:"thumbnail",alt:""}),R&&a.a.createElement("img",{src:g,className:"full-media "+_,width:P,height:F,alt:""})):a.a.createElement("div",{className:"file-icon "+k},h.length<=4&&a.a.createElement("span",{className:"file-ext",dir:"auto"},h)),I&&a.a.createElement("div",{className:Object(s.a)("file-progress",k,A)},a.a.createElement(m.a,{progress:T,size:j?"s":"m",onClick:y?w:void 0})),w&&a.a.createElement("i",{className:Object(s.a)("icon-download",I&&"hidden")})),a.a.createElement("div",{className:"file-info"},a.a.createElement("div",{className:"file-title",dir:"auto"},Object(d.a)(t)),a.a.createElement("div",{className:"file-subtitle",dir:"auto"},a.a.createElement("span",null,E&&T?Math.round(100*T)+"%":x),p&&a.a.createElement("span",{className:"file-sender"},Object(d.a)(p)),!p&&f&&a.a.createElement(a.a.Fragment,null," ",a.a.createElement(b.a,{onClick:M},Object(i.d)(S,1e3*f))))),p&&f&&a.a.createElement(b.a,{onClick:M},Object(i.g)(S,1e3*f)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(120),c=n(178);function s(e,t){const[n,s]=Object(a.r)(!1),{mediaData:i,downloadProgress:o}=Object(r.a)(e,!n);Object(a.n)(()=>{n&&i&&(Object(c.a)(i,t),s(!1))},[t,i,n]),Object(a.n)(()=>{s(!1)},[e]);const l=Object(a.m)(e=>{e.stopPropagation(),s(e=>!e)},[]);return{isDownloadStarted:n,downloadProgress:o,handleDownloadClick:l}}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(35),s=n(8),i=n(47),o=n(122);n(227);t.a=Object(a.h)(({message:e,duration:t=3e3,containerId:n,onDismiss:l})=>{const[d,u]=Object(a.r)(!0),m=Object(a.q)(null),{transitionClassNames:b}=Object(c.a)(d),h=Object(a.m)(()=>{u(!1),setTimeout(l,150+r.c)},[l]);Object(a.n)(()=>d?Object(i.a)(h):void 0,[d,h]),Object(a.n)(()=>(m.current=window.setTimeout(h,t),()=>{m.current&&(clearTimeout(m.current),m.current=void 0)}),[t,h]);const f=Object(a.m)(()=>{m.current&&(clearTimeout(m.current),m.current=void 0)},[]),p=Object(a.m)(()=>{m.current=window.setTimeout(h,t)},[t,h]);return a.a.createElement(o.a,{className:"Notification-container",containerId:n},a.a.createElement("div",{className:Object(s.a)("Notification",b),onClick:h,onMouseEnter:f,onMouseLeave:p},a.a.createElement("div",{className:"content"},e)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(1);function r(e){const{commonAncestorContainer:t}=e;let n=t,r=1;for(;n&&n.id!==a.v&&r<5;)n=n.parentElement,r++;return Boolean(n&&n.id===a.v)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return h}));var a=n(0),r=n(1),c=n(7),s=n(65),i=n(129),o=n(3),l=n(34);let d,u,m;const b=/[^-_:\p{L}\p{N}]+/iu;function h(e,t,h,f=r.v,p,O){const[g,v,j]=Object(l.a)(),[E,y]=Object(a.r)(),[C,N]=Object(a.r)({}),[T,w]=Object(a.r)({}),[M,S]=Object(a.r)([]),L=Object(a.p)(()=>E&&h.length?Object.values(Object(o.m)(E,h)):[],[E,h]);Object(a.n)(()=>{const e=()=>{y(m.emojis)};m?e():async function(){d||(d=n.e(1).then(n.t.bind(null,315,3)),u=(await d).default,m=Object(s.b)(u));return d}().then(e)},[]),Object(a.n)(()=>{if(!E)return;const e=Object.values(E);if(O){const t=Object(o.c)(e,"native");N(Object(o.i)(O,e=>Object.values(Object(o.m)(t,e))))}w(e.reduce((e,t)=>(t.names.forEach(n=>{e[n]||(e[n]=[]),e[n].push(t)}),e),{}))},[E,O]),Object(a.n)(()=>{if(!e||!t||!E)return void j();const n=function(e){const t=document.createElement("div");t.innerHTML=e.replace("
","\n");const n=t.innerText,a=n[n.length-1],r=n.split(b).pop();if(!n.length||b.test(a)||!r||!r.startsWith(":"))return;return r.toLowerCase()}(t);if(!n)return S([]),void j();const a=n.substr(1);let r=[];if(a){const e=Object.keys(C).filter(e=>e.startsWith(a));r=r.concat(Object(o.h)(Object.values(Object(o.m)(C,e))));const t=Object.keys(T).filter(e=>e.startsWith(a));r=r.concat(Object(o.h)(Object.values(Object(o.m)(T,t)))),r=Object(o.o)(r)}else r=L;r.length?(v(),S(r.slice(0,36))):j()},[E,C,T,t,e,v,L,j]);const I=Object(a.m)(e=>{const n=t.lastIndexOf(":");if(-1!==n){p(`${t.substr(0,n)}${e}`);const a=document.getElementById(f);c.g||requestAnimationFrame(()=>{Object(i.a)(a,!0)})}j()},[t,f,p,j]);return{isEmojiTooltipOpen:g,closeEmojiTooltip:j,filteredEmojis:M,insertEmoji:I}}},function(e,t,n){"use strict";var a=n(0),r=n(11),c=n(17);t.a=Object(a.h)(e=>{const{isOpen:t}=e,n=Object(c.a)(r.a.Extra,"EmojiTooltip",!t);return n?a.a.createElement(n,e):void 0})},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(1),s=n(6),i=n(9),o=n(129),l=n(8),d=n(3),u=n(7),m=n(55),b=n(159),h=n(34),f=n(64),p=n(182),O=n(25),g=n(164);const v=u.g?256:416;t.a=Object(a.h)(Object(r.h)(e=>{const{chatId:t,threadId:n}=Object(s.y)(e)||{},{messageSendKeyCombo:a}=e.settings.byKey;return{currentChatId:t,messageSendKeyCombo:a,replyingToId:t&&n?Object(s.mb)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}},(e,t)=>Object(d.l)(t,["editLastMessage","replyToNextMessage"]))(({id:e,editableInputId:t,html:n,placeholder:r,shouldSetFocus:s,shouldSupressFocus:d,shouldSupressTextFormatter:j,onUpdate:E,onSupressedFocus:y,onSend:C,currentChatId:N,replyingToId:T,noTabCapture:w,messageSendKeyCombo:M,editLastMessage:S,replyToNextMessage:L})=>{const I=Object(a.q)(null),A=Object(a.q)(null),k=Object(O.a)(),x=Object(a.q)(!1),[D,R,_]=Object(h.a)(),[P,F]=Object(a.r)(),[U,B]=Object(a.r)();Object(a.n)(()=>{K(!1)},[]),Object(b.a)(([e])=>{n!==I.current.innerHTML&&(I.current.innerHTML=n),n!==A.current.innerHTML&&(A.current.innerHTML=n),void 0!==e&&e!==n&&K(!n.length)},[n]);const q=Object(a.m)(()=>{I.current.closest(".from, .to")?setTimeout(q,350):Object(o.a)(I.current)},[]),H=Object(a.m)(()=>{_(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()},[_]);function $(){if(u.e)return;const e=window.getSelection();if(!e||!e.rangeCount||x.current)return void _();const t=e.getRangeAt(0),n=t.toString().trim();if(j||!Object(p.a)(t)||!n||Object(f.a)(n)||!t.START_TO_END)return void _();const a=t.getBoundingClientRect(),r=I.current.getBoundingClientRect();let c=a.left+a.width/2-r.left;c<90?c=90:c>r.width-90&&(c=r.width-90),F({x:c,y:a.top-r.top}),B(t),R()}function K(e=!1){const t=I.current,n=A.current,a=Number(t.style.height.replace("px","")),r=Math.min(n.scrollHeight,v);if(r===a)return;const c=Math.round(50*Math.log(Math.abs(r-a))),s=()=>{t.style.height=r+"px",t.style.transitionDuration=c+"ms",t.classList.toggle("overflown",n.scrollHeight>v)};e?requestAnimationFrame(s):s()}Object(a.n)(()=>{u.l||q()},[N,q,T,s]),Object(a.n)(()=>{if(w)return;const e=Object(i.a)(e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(q))},2e3,!0,!1);return Object(m.a)({onTab:e})},[q,w]),Object(a.n)(()=>{const e=I.current;function t(){e.blur()}return d&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}},[d]);const V=Object(l.a)("form-control custom-scroll",n.length>0&&"touched",d&&"focus-disabled");return a.a.createElement("div",{id:e,onClick:d?y:void 0,dir:k.isRtl?"rtl":void 0},a.a.createElement("div",{ref:I,id:t||c.v,className:V,contentEditable:!0,dir:"auto",onClick:q,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(E("
"===t?"":t),!(u.l||n&&n.length)){const e=window.getSelection();e&&(I.current.blur(),e.removeAllRanges(),Object(o.a)(I.current,!0))}},onKeyDown:function(e){if(e.metaKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(t)return e.preventDefault(),void L({targetIndexDelta:t})}"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||n.length||e.metaKey?e.target.addEventListener("keyup",(function t(){$(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),S()):u.e||u.b||!("enter"===M&&!e.shiftKey||"ctrl-enter"===M&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),_(),C())},onMouseDown:function(e){2===e.button?!0!==x.current&&(x.current=!0,document.addEventListener("mousedown",(function e(){setTimeout(()=>{x.current=!1},100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout(()=>{x.current=!1},100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){$(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:function(e){u.b&&(e.preventDefault(),e.stopPropagation())},onTouchCancel:function(){u.b&&$()}}),a.a.createElement("div",{ref:A,className:Object(l.a)(V,"clone"),dir:"auto"}),a.a.createElement("span",{className:"placeholder-text",dir:"auto"},r),a.a.createElement(g.a,{isOpen:D,anchorPosition:P,selectedRange:U,onClose:H}))}))},function(e,t,n){"use strict";var a=n(0),r=n(4),c=n(8),s=n(39),i=n(23),o=n(36),l=n(25),d=n(165),u=n(27),m=n(57);n(248);t.a=Object(a.h)(({message:e,senderTitle:t,onMessageClick:n})=>{const b=Object(l.a)();let h=Object(r.R)(e);if(!h){const t=Object(r.n)(e);if(t){const{url:n,domain:a}=t,c=Object(r.O)(b,e);h={siteName:a.replace(/^www./,""),url:n.includes("://")?n:n.includes("@")?"mailto:"+n:"http://"+n,description:c!==n?c:void 0}}}const f=Object(a.m)(()=>{n(e.id,e.chatId)},[n,e.id,e.chatId]);if(!h)return;const{siteName:p,url:O,displayUrl:g,title:v,description:j,photo:E}=h,y=!t&&Object(s.a)(j,170),C=Object(c.a)("WebLink scroll-item",!E&&"without-photo");return a.a.createElement("div",{className:C,"data-initial":(p||g)[0],dir:b.isRtl?"rtl":void 0},E&&a.a.createElement(d.a,{message:e}),a.a.createElement("div",{className:"content"},a.a.createElement(u.a,{isRtl:b.isRtl,className:"site-title",onClick:f},Object(i.a)(v||p||g)),y&&a.a.createElement(u.a,{isRtl:b.isRtl,className:"site-description",onClick:f},Object(i.a)(y)),a.a.createElement(m.a,{url:O,className:"site-name",text:"",isRtl:b.isRtl},O.replace("mailto:","")||g),t&&a.a.createElement("div",{className:"sender-name"},Object(i.a)(t))),t&&a.a.createElement("div",{className:"message-date"},a.a.createElement(u.a,{className:"date",onClick:f,isRtl:b.isRtl},Object(o.g)(b,1e3*e.date))))})},,,,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(5),s=n(1),i=n(7),o=n(38),l=n(3),d=n(4),u=n(6),m=n(127);let b;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(b||(b={}));var h=n(113),f=n(16),p=n(25),O=n(67),g=n(23),v=n(9),j=n(8),E=n(144),y=n(170),C=n(34),N=n(108),T=n(112),w=n(133),M=n(156),S=n(171),L=n(157),I=n(106),A=n(49),k=n(174);n(209);var x=Object(a.h)(({chat:e,isPinned:t,isMuted:n})=>{const r=Boolean(e.unreadCount||e.hasUnreadMark||t),c=Object(j.a)("Badge",n&&"muted",t&&"pinned",Boolean(e.unreadCount||e.hasUnreadMark)&&"unread");function s(){return e.unreadCount?e.unreadMentionsCount?a.a.createElement("div",{className:"Badge-wrapper"},a.a.createElement("div",{className:"Badge mention"},a.a.createElement("i",{className:"icon-mention"})),a.a.createElement("div",{className:c},Object(A.b)(e.unreadCount))):a.a.createElement("div",{className:c},Object(A.b)(e.unreadCount)):e.hasUnreadMark?a.a.createElement("div",{className:c}):t?a.a.createElement("div",{className:c},a.a.createElement("i",{className:"icon-pinned-chat"})):void 0}return a.a.createElement(k.a,{isCustom:!0,className:"Badge-transition",isOpen:r},s)});n(210);var D,R=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const n=Object(u.f)(e,t);if(!n||!n.lastMessage)return{};const{senderId:a,replyToMessageId:r,isOutgoing:s}=n.lastMessage,i=a?Object(u.Gb)(e,a):void 0,o=Object(d.t)(n.lastMessage),l=o&&r?Object(u.k)(e,n.id,r):void 0,{targetUserId:m,targetChatId:b}=o||{},h=Object(d.V)(n),{type:f}=Object(u.y)(e)||{};return{chat:n,isMuted:Object(d.Db)(n,Object(u.eb)(e),Object(u.db)(e)),lastMessageSender:i,...s&&{lastMessageOutgoingStatus:Object(u.fb)(e,n.lastMessage)},...h&&{privateChatUser:Object(u.Gb)(e,h)},...m&&{actionTargetUser:Object(u.Gb)(e,m)},actionTargetChatId:b,actionTargetMessage:l,draft:Object(u.B)(e,t,c.MAIN_THREAD_ID),messageListType:f,animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(l.l)(t,["openChat","focusLastMessage"]))(({style:e,chatId:t,folderId:n,orderDiff:r,animationType:c,isSelected:o,isPinned:l,chat:u,isMuted:m,privateChatUser:h,actionTargetUser:f,lastMessageSender:A,lastMessageOutgoingStatus:k,actionTargetMessage:D,actionTargetChatId:R,draft:_,messageListType:P,animationLevel:F,lastSyncTime:U,openChat:B,focusLastMessage:q})=>{const H=Object(a.q)(null),[$,K,V]=Object(C.a)(),{lastMessage:Y,typingStatus:G}=u||{},W=Y&&Object(d.eb)(Y);Object(E.a)(t,W?Y.replyToMessageId:void 0,D);const z=Y&&!Object(d.N)(Y)?Object(d.F)(Y):void 0,X=Object(N.a)(Y?Object(d.E)(Y,"micro"):void 0),Q=Boolean(Y&&Object(d.J)(Y));Object(a.o)(()=>{if(0===F)return;const e=H.current;if(c===b.Opacity)e.style.opacity="0",Object(v.b)(()=>{e.classList.add("animate-opacity"),e.style.opacity="1"});else{if(c!==b.Move)return;e.style.transform=`translate3d(0, ${100*-r}%, 0)`,Object(v.b)(()=>{e.classList.add("animate-transform"),e.style.transform=""})}setTimeout(()=>{Object(v.b)(()=>{e.classList.remove("animate-opacity","animate-transform"),e.style.opacity="",e.style.transform=""})},200+s.c)},[F,r,c]);const J=Object(a.m)(()=>{B({id:t}),o&&"thread"===P&&q()},[o,P,B,t,q]),Z=Object(y.a)({chat:u,privateChatUser:h,handleDelete:K,folderId:n,isPinned:l}),ee=Object(p.a)();if(!u)return;const te=Object(j.a)("Chat chat-item-clickable",Object(d.mb)(t)?"private":"group",o&&!i.g&&"selected");return a.a.createElement(I.a,{ref:H,className:te,style:e,ripple:!i.g,contextActions:Z,onClick:J},a.a.createElement("div",{className:"status"},a.a.createElement(T.a,{chat:u,user:h,withOnlineStatus:!0,isSavedMessages:h&&h.isSelf,lastSyncTime:U})),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,Object(g.a)(Object(d.l)(ee,u,h))),u.isVerified&&a.a.createElement(w.a,null),m&&a.a.createElement("i",{className:"icon-muted-chat"}),u.lastMessage&&a.a.createElement(S.a,{message:u.lastMessage,outgoingStatus:k})),a.a.createElement("div",{className:"subtitle"},function(){if(G&&Y&&G.timestamp>1e3*Y.date)return a.a.createElement(M.a,{typingStatus:G});if(_&&_.text.length)return a.a.createElement("p",{className:"last-message",dir:ee.isRtl?"auto":"ltr"},a.a.createElement("span",{className:"draft"},ee("Draft")),Object(g.a)(_.text));if(!Y)return;if(W){const e=u&&(Object(d.kb)(u)||Y.senderId===Y.chatId)?u:A;return a.a.createElement("p",{className:"last-message",dir:ee.isRtl?"auto":"ltr"},Object(g.a)(Object(O.a)(ee,Y,e,f,D,R,{asPlain:!0})))}const e=Object(d.K)(ee,t,A);return a.a.createElement("p",{className:"last-message",dir:ee.isRtl?"auto":"ltr"},e&&a.a.createElement(a.a.Fragment,null,a.a.createElement("span",{className:"sender-name"},Object(g.a)(e)),a.a.createElement("span",{className:"colon"},":")),function(e,t,n,r){if(!n)return Object(g.a)(Object(d.O)(e,t));return a.a.createElement("span",{className:"media-preview"},a.a.createElement("img",{src:n,alt:"",className:r?"round":void 0}),Object(d.Q)(t)&&a.a.createElement("i",{className:"icon-play"}),Object(g.a)(Object(d.O)(e,t,!0)))}(ee,Y,X||z,Q))}(),a.a.createElement(x,{chat:u,isPinned:l,isMuted:m}))),a.a.createElement(L.a,{isOpen:$,onClose:V,chat:u}))}));!function(e){e.all="active",e.archived="archived"}(D||(D={}));t.a=Object(a.h)(Object(r.h)((e,{folderType:t,folderId:n})=>{const{chats:{listIds:a,byId:r,orderedPinnedIds:s},users:{byId:i},lastSyncTime:o}=e,{chatId:l,threadId:d}=Object(u.y)(e)||{},m="folder"!==t?D[t]:void 0,b=n?Object(u.i)(e,n):void 0;return{chatsById:r,usersById:i,currentChatId:l,lastSyncTime:o,...m?{listIds:a[m],orderedPinnedIds:s[m]}:{chatFolder:b},isInDiscussionThread:d!==c.MAIN_THREAD_ID,notifySettings:Object(u.eb)(e),notifyExceptions:Object(u.db)(e)}},(e,t)=>Object(l.l)(t,["loadMoreChats","preloadTopChatMessages","openChat"]))(({folderType:e,folderId:t,noChatsText:n="Chat list is empty.",isActive:r,chatFolder:c,chatsById:u,usersById:p,listIds:O,currentChatId:g,orderedPinnedIds:v,lastSyncTime:j,isInDiscussionThread:E,notifySettings:y,notifyExceptions:C,loadMoreChats:N,preloadTopChatMessages:T,openChat:w})=>{const[M,S]=Object(a.p)(()=>"folder"===e&&c?Object(d.Cb)(u,p,c,y,C):[O,v],[e,c,u,p,y,C,O,v]),[L,I]=Object(a.p)(()=>{if(!M||"folder"===e&&!c)return[];const t=Object(d.Bb)(u,M,S,e),n=[...t.pinnedChats,...t.otherChats],a=n.map(({id:e})=>e);return[n.reduce((e,t,n)=>(e[t.id]=n,e),{}),a]},[M,S,e,c,u]),A=Object(o.a)(L),k=L&&A?Object(l.i)(L,(e,t)=>e-(void 0!==A[t]?A[t]:1/0)):{},x=Object(a.m)(()=>{N({listType:"archived"===e?"archived":"active"})},[N,e]),[D,_]=Object(m.a)(j?x:void 0,I,void 0,s.k,"all"===e&&!s.a),P=D&&Object(d.Bb)(u,D,S,e);Object(a.n)(()=>{j&&"all"===e&&T()},[j,e,T]);const F=function(e){const t=Object(a.m)(t=>e[t]<0,[e]),n=Object(a.m)(t=>e[t]>0,[e]),r=Object.keys(e).map(Number),c=r.filter(t).length,s=r.filter(n).length;return Object(a.m)(a=>{const r=e[a];return 0===r?b.None:r===1/0||r===-1/0||t(a)&&c<=s||n(a)&&s{const e=e=>{if(r&&I){if(e.ctrlKey&&e.code.startsWith("Digit")){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;const n=Number(t)-1;if(n>I.length-1)return;w({id:I[n]})}if(e.altKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(!t)return;if(!g)return e.preventDefault(),void w({id:I[0]});const n=I.indexOf(g);if(-1===n)return;const a=I[n+t];e.preventDefault(),w({id:a})}}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),a.a.createElement(h.a,{className:"chat-list custom-scroll",items:D,onLoadMore:_,preloadBackwards:s.k,noFastList:!0,noScrollRestore:!0},D&&D.length&&P?function(){const e=I.indexOf(D[0]),n=e+P.pinnedChats.length;return a.a.createElement("div",{className:"scroll-container",style:i.b?`height: ${I.length*s.i}px`:void 0,teactFastList:!0},P.pinnedChats.map(({id:n},r)=>a.a.createElement(R,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,isSelected:n===g&&!E,animationType:F(n),orderDiff:k[n],style:`top: ${(e+r)*s.i}px;`})),P.otherChats.map((e,r)=>a.a.createElement(R,{key:e.id,teactOrderKey:Object(d.j)(e),chatId:e.id,folderId:t,isSelected:e.id===g&&!E,animationType:F(e.id),orderDiff:k[e.id],style:`top: ${(n+r)*s.i}px;`})))}():D&&!D.length?a.a.createElement("div",{className:"no-results"},n):a.a.createElement(f.a,{key:"loading"}))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return m}));var a=n(0),r=n(5),c=n(1),s=n(4),i=n(52);var o=n(7),l=n(129),d=n(34);const u=/[^@_\d\wа-яё]+/i;function m(e,t,n,m=c.v,b,h,f){const[p,O,g]=Object(d.a)(),[v,j]=Object(a.r)(""),[E,y]=Object(a.r)([]),C=Object(a.m)(e=>{if(b&&f)return b.filter(({userId:t})=>{const n=f[t];return!(t===h||!n)&&(!e||function(e,t){const n=t.username.toLowerCase(),a=Object(s.ab)(t),r=a&&a.toLowerCase(),c=e.toLowerCase();return n.startsWith(c)||r&&Object(i.a)(r,c)}(e,n))})},[b,h,f]);Object(a.n)(()=>{if(!e||!t.length)return void g();const n=function(e){const t=document.createElement("div");t.innerHTML=e;const n=t.innerText,a=n[n.length-1],r=n.split(u).pop();if(!n.length||u.test(a)||!r||!r.startsWith("@"))return;return r}(t);if(n){const e=n?n.substr(1):"",t=C(e);t&&t.length?(O(),j(e),y(t)):g()}else g()},[e,t,C,O,g]);const N=Object(a.m)((e,a=!1)=>{if(!e.username&&!Object(s.Z)(e))return;const c=e.username?"@"+e.username:`${Object(s.Z)(e)}`,i=t.lastIndexOf("@");if(-1!==i){n(`${t.substr(0,i)}${c} `);const e=document.getElementById(m);o.g||requestAnimationFrame(()=>{Object(l.a)(e,a)})}g()},[t,m,n,g]);return{isMentionTooltipOpen:p,mentionFilter:v,closeMentionTooltip:g,insertMention:N,mentionFilteredMembers:E}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var a=n(0),r=n(163),c=n(51),s=n(13),i=n(26);const o=new Map;function l(e){const t=Object(a.q)();let n=!1;Object(c.a)(()=>{if(n=!0,t.current=void 0,!e)return;const a=new Image;if(a.src=e,!a.width)return;const c=Object(s.f)(a);Object(r.a)(c.getContext("2d"),0,0,c.width,c.height,2,2),t.current=c.toDataURL()},[e]);const l=function(e,t=!1,n){const c=Object(a.q)(e?o.get(e):void 0),l=Object(a.q)(),d=Object(i.a)();return l.current&&t&&(clearTimeout(l.current),l.current=void 0),Object(a.n)(()=>{if(!e||c.current||t)return;const a=new Image;a.onload=()=>{const t=Object(s.f)(a);Object(r.a)(t.getContext("2d"),0,0,t.width,t.height,2,2);const n=t.toDataURL();c.current=n,d(),o.size>=1e3&&o.clear(),o.set(e,n)},n?l.current=window.setTimeout(()=>{a.src=e},n):a.src=e},[e,n,d,t]),c.current}(e||void 0,Boolean(t.current));return t.current||!n&&l||e||void 0}},,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},,,function(e,t,n){},,function(e,t,n){},function(e,t,n){},,,,,,,,,,,,function(e,t,n){},,,,,,,,function(e,t,n){},function(e,t,n){},function(e,t,n){}])]); +//# sourceMappingURL=0.21ca60653ccd8108472e.js.map \ No newline at end of file diff --git a/dist/0.21ca60653ccd8108472e.js.map b/dist/0.21ca60653ccd8108472e.js.map new file mode 100644 index 000000000..c876b79e0 --- /dev/null +++ b/dist/0.21ca60653ccd8108472e.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/ui/ListItem.tsx","webpack:///./src/hooks/useIntersectionObserver.ts","webpack:///./src/hooks/useMedia.ts","webpack:///./src/components/common/PrivateChatInfo.tsx","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts","webpack:///./src/components/ui/Transition.tsx","webpack:///./src/components/common/Avatar.tsx","webpack:///./src/components/ui/InfiniteScroll.tsx","webpack:///./src/hooks/useTransitionForMedia.ts","webpack:///./src/components/common/helpers/mediaDimensions.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/components/ui/ConfirmDialog.tsx","webpack:///./src/components/common/NothingFound.tsx","webpack:///./src/components/right/hooks/useAsyncRendering.ts","webpack:///./src/hooks/useMediaWithDownloadProgress.ts","webpack:///./src/components/ui/ProgressSpinner.tsx","webpack:///./src/components/ui/Portal.ts","webpack:///./src/components/common/GroupChatInfo.tsx","webpack:///./src/util/fastSmoothScroll.ts","webpack:///./src/components/ui/Radio.tsx","webpack:///./src/components/ui/RadioGroup.tsx","webpack:///./src/hooks/useInfiniteScroll.ts","webpack:///./src/components/common/AnimatedEmoji.tsx","webpack:///./src/util/focusEditableElement.ts","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/util/captureEvents.ts","webpack:///./src/components/common/VerifiedIcon.tsx","webpack:///./src/util/cycleRestrict.ts","webpack:///./src/hooks/useCurrentOrPrev.ts","webpack:///./src/util/safePlay.ts","webpack:///./src/hooks/useBuffering.ts","webpack:///./src/components/middle/composer/helpers/parseMessageInput.ts","webpack:///./src/components/middle/composer/DropTarget.tsx","webpack:///./src/components/middle/composer/DropArea.tsx","webpack:///./src/components/common/PickerSelectedItem.tsx","webpack:///./src/util/fastSmoothScrollHorizontal.ts","webpack:///./src/hooks/useHorizontalScroll.ts","webpack:///./src/hooks/useEnsureMessage.ts","webpack:///./src/hooks/useContextMenuHandlers.ts","webpack:///./src/components/common/helpers/renderMessageText.tsx","webpack:///./src/hooks/useVideoCleanup.ts","webpack:///./src/util/clipboard.ts","webpack:///./src/components/ui/SearchInput.tsx","webpack:///./src/util/resetScroll.ts","webpack:///./src/components/common/TypingStatus.tsx","webpack:///./src/components/common/DeleteChatModal.tsx","webpack:///./src/util/patchSafariProgressiveAudio.ts","webpack:///./src/hooks/useLayoutEffectWithPrevDeps.ts","webpack:///./src/components/common/Document.tsx","webpack:///./src/components/common/StickerSetModal.async.tsx","webpack:///./src/hooks/useCanvasBlur.ts","webpack:///./src/lib/fastBlur.js","webpack:///./src/components/middle/composer/TextFormatter.tsx","webpack:///./src/components/common/Media.tsx","webpack:///./src/components/common/Audio.tsx","webpack:///./src/util/waveform.ts","webpack:///./src/components/common/helpers/waveform.ts","webpack:///./src/components/ui/Tab.tsx","webpack:///./src/components/ui/TabList.tsx","webpack:///./src/util/getReadableErrorText.ts","webpack:///./src/hooks/useChatContextActions.ts","webpack:///./src/components/common/LastMessageMeta.tsx","webpack:///./src/components/common/MessageOutgoingStatus.tsx","webpack:///./src/hooks/useContextMenuPosition.ts","webpack:///./src/components/ui/ShowTransition.tsx","webpack:///./src/hooks/usePrevDuringAnimation.ts","webpack:///./src/hooks/useAudioPlayer.ts","webpack:///./src/util/audioPlayer.ts","webpack:///./src/util/download.ts","webpack:///./src/components/common/File.tsx","webpack:///./src/hooks/useMediaDownload.ts","webpack:///./src/components/ui/Notification.tsx","webpack:///./src/components/middle/composer/helpers/selection.ts","webpack:///./src/components/middle/composer/hooks/useEmojiTooltip.ts","webpack:///./src/components/middle/composer/EmojiTooltip.async.tsx","webpack:///./src/components/middle/composer/MessageInput.tsx","webpack:///./src/components/common/WebLink.tsx","webpack:///./src/components/left/main/hooks/useChatAnimationType.ts","webpack:///./src/components/left/main/Badge.tsx","webpack:///./src/components/left/main/Chat.tsx","webpack:///./src/components/left/main/ChatList.tsx","webpack:///./src/components/middle/composer/hooks/useMentionTooltip.ts","webpack:///./src/components/middle/composer/helpers/searchUserName.ts","webpack:///./src/hooks/useBlur.ts","webpack:///./src/hooks/useBlurSync.ts"],"names":["ListItem","props","ref","buttonRef","icon","className","style","children","disabled","ripple","narrow","inactive","focus","destructive","multiline","isStatic","contextActions","onClick","containerRef","useRef","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","getTriggerElement","useCallback","current","getRootElement","closest","getMenuElement","querySelector","positionX","positionY","menuStyle","useContextMenuPosition","handleClick","e","handleMouseDown","IS_TOUCH_ENV","button","lang","useLang","fullClassName","buildClassName","dir","isRtl","undefined","role","tabIndex","onMouseDown","onContextMenu","isOpen","autoClose","onClose","onCloseAnimationEnd","map","action","key","title","handler","useIntersectionObserver","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","isDisabled","rootCallback","controllerRef","rootCallbackRef","isFrozenRef","onUnfreezeRef","freeze","unfreeze","useHeavyAnimationCheck","useEffect","observer","disconnect","callbacks","clear","observe","target","targetCallback","Map","entriesAccumulator","observerCallbackSync","entries","Array","from","values","forEach","entry","callback","get","scheduler","throttle","debounce","observerCallback","IntersectionObserver","set","root","rootMargin","initController","controller","delete","unobserve","useOnIntersect","targetRef","useIsIntersecting","isIntersecting","setIsIntersecting","useState","mediaHash","noLoad","mediaFormat","ApiMediaFormat","BlobUrl","cacheBuster","delay","mediaData","mediaLoader","forceUpdate","useForceUpdate","startedAt","Date","now","then","spentTime","setTimeout","memo","withGlobal","global","userId","forceShowSelf","lastSyncTime","user","selectUser","isSavedMessages","isSelf","areMessagesLoaded","Boolean","selectChatMessages","setGlobal","actions","pick","typingStatus","avatarSize","status","withMediaViewer","withUsername","withFullInfo","withUpdatingStatus","noStatusOrTyping","noRtl","loadFullUser","openMediaViewer","id","fullName","getUserFullName","handleAvatarViewerOpen","hasPhoto","stopPropagation","avatarOwnerId","origin","MediaViewerOrigin","ProfileAvatar","MiddleHeaderAvatar","size","renderText","isVerified","isUserOnline","username","getUserStatus","Modal","header","hasCloseButton","noBackdrop","onEnter","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","preventDefault","focusableElements","querySelectorAll","length","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","Button","round","color","ariaLabel","ANIMATION_DURATION","slide","fade","IS_MOBILE_SCREEN","reveal","CLEANED_UP","Symbol","animationLevel","settings","byKey","activeKey","name","direction","renderCount","shouldRestoreHeight","shouldCleanup","onStart","onStop","rendersRef","prevActiveKey","usePrevious","activateTimeoutRef","activeKeyChanged","useLayoutEffect","cleanup","container","childElements","add","childNodes","clearTimeout","isBackwards","keys","Object","Number","prevActiveIndex","indexOf","activeIndex","node","i","HTMLElement","width","offsetWidth","scrollBy","left","behavior","ANIMATION_END_DELAY","requestAnimationFrame","window","scrollLeft","height","clientHeight","flexBasis","renders","contents","fill","render","chat","text","withOnlineStatus","isDeleted","isDeletedUser","imageHash","getChatAvatarHash","dataUri","useMedia","DataUri","shouldRenderFullMedia","useTransitionForMedia","content","src","alt","decoding","userFullName","getFirstLetters","getChatTitle","isChatPrivate","isOnline","getUserColorKey","senderId","data-test-sender-id","IS_TEST","InfiniteScroll","onLoadMore","onScroll","onKeyDown","items","itemSelector","preloadBackwards","sensitiveArea","noScrollRestore","noScrollRestoreOnTop","noFastList","stateRef","loadMoreBackwards","loadMoreForwards","useMemo","noScroll","LoadMoreDirection","Backwards","Forwards","scrollHeight","state","newScrollTop","listItemElements","currentAnchor","includes","scrollTop","getBoundingClientRect","top","currentAnchorTop","nextAnchor","resetScroll","isScrollTopJustUpdated","handleScroll","listLength","offsetHeight","isNearTop","offsetTop","isNearBottom","isUpdated","nextAnchorTop","newAnchorTop","offsetParent","teactFastList","SPEED","fast","slow","speed","noAnimate","isMediaLoaded","willAnimate","shouldRenderThumb","setShouldRenderThumb","MEDIA_VIEWER_MEDIA_QUERY","REM","parseInt","getComputedStyle","documentElement","fontSize","ROUND_VIDEO_DIMENSIONS","AVATAR_FULL_DIMENSIONS","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidth","getAvailableWidth","fromOwnMessage","isForwarded","isWebPagePhoto","extraPaddingRem","regularMaxWidth","Math","min","floor","innerWidth","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","isGif","aspectRatio","calculateDimensions","getAvailableHeight","getMediaViewerAvailableDimensions","withFooter","isVideo","mql","matchMedia","windowWidth","windowHeight","windowSize","occupiedHeightRem","matches","calculateInlineImageDimensions","photo","getPhotoInlineDimensions","calculateVideoDimensions","video","getVideoDimensions","getPictogramDimensions","getDocumentThumbnailDimensions","smaller","getStickerDimensions","sticker","baseWidth","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_INLINE_DESKTOP_FACTOR","calculatedHeight","calculateMediaViewerDimensions","availableWidth","availableHeight","mediaWidth","mediaHeight","calculatedWidth","lottiePromise","RLottie","async","ensureLottie","default","animationData","play","playSegment","noLoop","quality","isLowPriority","onLoad","animation","setAnimation","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","fastRaf","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useBackgroundMode","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","split","textPart","isText","description","useAsyncRendering","dependencies","shouldRenderRef","timeoutRef","useOnChange","isStreaming","Stream","IS_PROGRESSIVE_SUPPORTED","Progressive","downloadProgress","setDownloadProgress","startedAtRef","handleProgress","progress","RADIUSES","s","m","l","xl","square","transparent","noCross","radius","circleRadius","STROKE_WIDTH","borderRadius","circumference","PI","svg","firstElementChild","strokeDashOffset","max","setAttribute","toString","innerHTML","containerId","elementRef","createElement","appendChild","TeactDOM","removeChild","chatId","selectChat","onlineCount","selectChatOnlineCount","withChatType","loadFullChat","isSuperGroup","isChatSuperGroup","isMin","isRestricted","getChatTypeString","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","isAnimating","fastSmoothScroll","position","maxDistance","forceDirection","forceDuration","forceCurrentContainerHeight","FocusDirection","Static","scrollIntoView","block","offset","Up","Down","elementTop","elementHeight","containerHeight","targetContainerHeight","dataset","normalHeight","path","remainingPath","duration","abs","startAt","animateSingle","t","currentPath","transition","scrollWithJs","isAnimatingScroll","label","subLabel","value","checked","hidden","isLoading","onChange","type","Spinner","options","selected","loadingOption","handleChange","event","currentTarget","option","getViewportSlice","sourceIds","offsetId","listSlice","index","indexForDirection","to","newViewportIds","slice","areSomeLocal","areAllLocal","listIds","forceFullPreload","lastParamsRef","viewportIdsRef","prevListIds","prevIsDisabled","areSortedArraysEqual","viewportIds","getMore","AnimatedEmoji","isInline","observeIntersection","isAnimationLoaded","markAnimationLoaded","useFlag","localMediaHash","previewBlobUrl","Lottie","playKey","setPlayKey","String","random","STICKER_SIZE_TWO_FA","focusEditableElement","force","selection","getSelection","range","createRange","lastChild","nodeValue","setStart","removeAllRanges","addRange","onBlur","onFocus","hasFocus","SwipeDirection","captureEvents","captureEvent","currentSwipeAxis","hasMoved","onCapture","excludedClosestSelector","onMove","onRelease","pageX","touches","pageY","withCursor","dragOffsetX","dragOffsetY","onDrag","onSwipe","xAbs","yAbs","Left","Right","processSwipe","passive","VerifiedIcon","cycleRestrict","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","prev","mediaEl","catch","err","DEBUG","console","warn","noInitiallyBuffered","isBuffered","setIsBuffered","bufferedProgress","setBufferedProgress","setIsBufferedDebounced","handleBuffering","media","isSafariPatchInProgress","buffered","end","readyState","currentTime","bufferingHandlers","onLoadedData","onPlaying","onLoadStart","onPause","onTimeUpdate","onProgress","checkBuffering","ENTITY_CLASS_BY_NODE_NAME","B","ApiMessageEntityTypes","Bold","STRONG","I","Italic","EM","U","Underline","S","Strike","STRIKE","DEL","CODE","Code","PRE","Pre","BLOCKQUOTE","Blockquote","parseMessageInput","html","fragment","parsedHtml","IS_EMOJI_SUPPORTED","replace","parseMarkdown","innerText","trim","textIndex","recursionDeepness","entities","addEntity","entity","rawText","nodeName","anchor","entityType","MentionName","href","startsWith","Email","Phone","textContent","TextUrl","Url","getEntityTypeFromNode","rawIndex","substring","url","getEntityDataFromNode","push","hasChildNodes","isQuick","onFileSelect","isHovered","markHovered","unmarkHovered","onDrop","onDragEnter","onDragLeave","relatedTarget","toTarget","DropAreaState","withQuick","onHide","hideTimeoutRef","prevWithQuick","captureEscKeyListener","handleFilesDrop","dataTransfer","dt","files","handleQuickFilesDrop","handleDragLeave","fromTarget","onDragOver","chatOrUserId","isMinimized","canClose","clickArg","iconElement","titleText","getUserFirstOrLastName","fastSmoothScrollHorizontal","IS_IOS","containerWidth","scrollWidth","animate","scrollTo","deltaX","deltaY","messageId","message","replyOriginForId","loadMessage","getDispatch","loadMessageThrottled","throttled","contextMenuCounter","isMenuDisabled","shouldDisableOnLink","setIsContextMenuOpen","setContextMenuPosition","x","clientX","y","clientY","timer","clearLongPressTimer","startLongPressTimer","contains","originalEvent","cancelClickOnce","stopImmediatePropagation","emulateContextMenuEvent","renderMessageText","highlight","shouldRenderHqEmoji","formattedText","getMessageText","renderTextWithEntities","organizeEntities","organizedEntityIndexes","Set","organizedEntities","has","organizedEntity","organizeEntity","organizedIndexes","nestedEntities","filter","organizedIndex","shouldRenderAsHtml","renderMessagePart","result","deleteLineBreakAfterPre","organizedEntites","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","textBefore","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","renderedContent","join","getLinkUrl","processEntityAsHtml","entityText","BotCommand","handleBotCommandClick","Hashtag","Cashtag","handleHashtagClick","rel","Mention","processEntity","isArray","textAfter","arrayIndex","c","emojiFilter","sendBotCommand","command","setLocalTextSearchQuery","query","searchTextMessagesLocal","useVideoCleanup","videoRef","videoEl","load","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","copyTextToClipboard","str","rangeToRestore","rangeCount","getRangeAt","select","execCommand","copyImageToClipboard","imageUrl","canvas","ctx","getContext","imageEl","Image","onload","img","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","error","parentContainerClassName","inputId","focused","placeholder","autoComplete","onReset","inputRef","isInputFocused","markInputFocused","unmarkInputFocused","blur","overflow","typingUser","typingUserName","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","canDeleteForAll","contactName","getPrivateChatUserId","isChannel","isChatChannel","isBasicGroup","isChatBasicGroup","leaveChannel","deleteHistory","deleteChannel","chatTitle","handleDeleteMessageForAll","shouldDeleteForAll","handleDeleteChat","isCreator","patchSafariProgressiveAudio","audioEl","patchedForSafari","patchForSafariInProgress","paused","once","cb","prevDeps","uploadProgress","withDate","datetime","sender","isSelected","isSelectable","onCancelUpload","onDateClick","extension","getDocumentExtension","fileName","timestamp","isDownloadAllowed","setIsDownloadAllowed","useMediaWithDownloadProgress","getMessageMediaHash","isUploading","isTransferring","transferProgress","getMediaTransferState","hasPreview","getDocumentHasPreview","thumbDataUri","getMessageMediaThumbDataUri","localBlobUrl","previewData","isAllowed","handleDateClick","download","thumbnailDataUri","StickerSetModal","useModuleLoader","Bundles","Extra","useCanvasBlur","withRaf","canvasRef","processBlur","alpha","IS_CANVAS_FILTER_SUPPORTED","RADIUS","fastBlur","mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","iterations","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData","TEXT_FORMAT_BY_TAG_NAME","anchorPosition","selectedRange","linkUrlInputRef","isLinkControlOpen","openLinkControl","closeLinkControl","linkUrl","setLinkUrl","isEditingLink","setIsEditingLink","inputClassName","setInputClassName","selectedTextFormats","setSelectedTextFormats","useVirtualBackdrop","selectedFormats","parentElement","commonAncestorContainer","EDITABLE_INPUT_ID","textFormat","tagName","getSelectedText","getSelectedElement","updateInputStyles","input","getFormatButtonClassName","some","fKey","monospace","strikethrough","handleBoldText","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","restoreSelection","KeyK","KeyB","KeyU","KeyI","KeyM","KeyS","code","altKey","ctrlKey","metaKey","linkUrlConfirmClassName","inputMode","idPrefix","mediaBlobUrl","getMessageVideo","formatMediaDuration","MIN_SPIKES","MAX_SPIKES","renderSeekline","playProgress","handleStartSeek","handleSeek","handleStopSeek","onMouseMove","onMouseUp","theme","senderTitle","renderingFor","date","onPlay","onReadMedia","audio","voice","isMediaUnread","isVoice","isSeeking","isActivated","setIsActivated","shouldDownload","getMessageMediaFormat","useBuffering","playPause","setCurrentTime","useAudioPlayer","getMessageKey","getMediaDuration","isMessageLocal","isDownloadStarted","directDownloadProgress","handleDownloadClick","useMediaDownload","getMessageAudioCaption","isLoadingForPlaying","shouldRenderSpinner","spinnerClassNames","handleButtonClick","seekBar","seekHandlers","isOwn","isOwnMessage","renderedWaveform","waveform","fillColor","fillOwnColor","progressFillColor","progressFillOwnColor","durationFactor","spikesCount","decodedWaveform","encoded5bit","bitsCount","valuesCount","bitsData","byteIndex","bitShift","lastByteIndex","lastBitShift","lastValue","decodeWaveform","Uint8Array","spikes","peak","fitCount","newData","springFactor","leftFiller","rightFiller","idx","val","interpolateArray","fillStyle","progressFillStyle","scale","item","globalAlpha","spikeHeight","beginPath","moveTo","arcTo","closePath","roundedRectangle","toDataURL","renderWaveformToDataUri","draggable","renderWaveform","buttonClassNames","showSeekline","contentClassName","ProgressSpinner","getFirstLine","Link","formatPastTimeShort","performer","getSecondLine","formatMediaDateTime","renderAudio","renderVoice","active","badgeCount","isBadgeActive","previousActiveTab","tabRef","tab","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","transform","tabs","activeTab","big","onSwitchTab","useHorizontalScroll","activeTabElement","newLeft","READABLE_ERROR_MESSAGES","CHAT_RESTRICTED","CHAT_WRITE_FORBIDDEN","CHAT_SEND_POLL_FORBIDDEN","CHAT_SEND_STICKERS_FORBIDDEN","CHAT_SEND_GIFS_FORBIDDEN","CHAT_SEND_MEDIA_FORBIDDEN","CHAT_LINK_EXISTS","SLOWMODE_WAIT_X","USER_BANNED_IN_CHANNEL","USER_IS_BLOCKED","YOU_BLOCKED_USER","IMAGE_PROCESS_FAILED","MEDIA_EMPTY","MEDIA_INVALID","PHOTO_EXT_INVALID","PHOTO_INVALID_DIMENSIONS","PHOTO_SAVE_FILE_INVALID","MESSAGE_DELETE_FORBIDDEN","MESSAGE_POLL_CLOSED","MESSAGE_EDIT_TIME_EXPIRED","CHAT_ADMIN_REQUIRED","PINNED_DIALOGS_TOO_MUCH","DIALOG_FILTERS_TOO_MUCH","CHANNEL_PRIVATE","MEDIA_CAPTION_TOO_LONG","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","LINK_NOT_MODIFIED","SERVICE_WORKER_DISABLED","CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS","FRESH_RESET_AUTHORISATION_FORBIDDEN","BOTS_TOO_MUCH","BOT_GROUPS_BLOCKED","USERS_TOO_MUCH","USER_CHANNELS_TOO_MUCH","USER_KICKED","USER_NOT_MUTUAL_CONTACT","USER_PRIVACY_RESTRICTED","INVITE_HASH_EMPTY","INVITE_HASH_EXPIRED","INVITE_HASH_INVALID","CHANNELS_TOO_MUCH","USER_ALREADY_PARTICIPANT","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","reduce","acc","privateChatUser","handleDelete","folderId","isPinned","toggleChatPinned","updateChatMutedState","toggleChatArchived","toggleChatUnread","actionUnreadMark","unreadCount","hasUnreadMark","actionPin","actionMute","isMuted","actionArchive","isChatArchived","getCanDeleteChat","outgoingStatus","Keys","extraPaddingX","extraTopPadding","setPositionX","setPositionY","setStyle","triggerEl","emptyRect","menuEl","rootEl","triggerRect","menuRect","rootRect","ShowTransition","isCustom","prevChildren","fromChildrenRef","usePrevDuringAnimation","isCurrentPresent","isPrevPresent","trackId","originalDuration","handlers","onInit","shouldPlay","onForcePlay","noPlaylist","setIsPlaying","isPlayingSync","setPlayProgress","register","eventName","proxy","isFinite","prevShouldPlay","prevSrc","audioProxy","tracks","currentTrackId","queue","stopCurrentAudio","currentTrack","Audio","handleEvent","nextTrackId","openAudioPlayer","parseMessageKey","nextTrack","safePlay","Proxy","createAudio","preload","IS_SAFARI","time","shouldRemoveFromQueue","track","h","filename","link","click","shouldSpinnerRender","getColorFromExtension","sizeString","getFileSizeString","setIsDownloadStarted","onDismiss","setIsOpen","timerRef","closeAndDismiss","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","isSelectionInsideInput","selectionRange","parentNode","emojiDataPromise","emojiRawData","emojiData","RE_NOT_EMOJI_SEARCH","useEmojiTooltip","recentEmojiIds","onUpdateHtml","emojiKeywords","markIsOpen","unmarkIsOpen","byId","setById","byKeyword","setByKeyword","byName","setByName","filteredEmojis","setFilteredEmojis","recentEmojis","pickTruthy","emojis","uncompressEmoji","ensureEmojiData","byNative","buildCollectionByKey","mapValues","natives","emoji","names","tempEl","lastSymbol","lastWord","pop","test","toLowerCase","getEmojiCode","matched","matchedKeywords","keyword","concat","flatten","matchedNames","unique","insertEmoji","textEmoji","atIndex","lastIndexOf","messageInput","getElementById","isEmojiTooltipOpen","closeEmojiTooltip","EmojiTooltip","MAX_INPUT_HEIGHT","currentChatId","threadId","selectCurrentMessageList","messageSendKeyCombo","replyingToId","selectReplyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","editableInputId","shouldSetFocus","shouldSupressFocus","shouldSupressTextFormatter","onUpdate","onSupressedFocus","onSend","editLastMessage","replyToNextMessage","cloneRef","isContextMenuOpenRef","isTextFormatterOpen","openTextFormatter","closeTextFormatter","textFormatterAnchorPosition","setTextFormatterAnchorPosition","setSelectedRange","updateInputHeight","useLayoutEffectWithPrevDeps","prevHtml","focusInput","handleCloseTextFormatter","empty","clearSelection","checkSelection","selectedText","parseEmojiOnlyString","START_TO_END","selectionRect","inputRect","willSend","clone","currentHeight","newHeight","transitionDuration","log","captureFirstTab","onTab","supressFocus","contentEditable","targetIndexDelta","handleKeyUp","IS_ANDROID","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onTouchCancel","onMessageClick","linkData","getMessageWebPage","getFirstLinkInMessage","domain","messageText","getMessageSummaryText","siteName","handleMessageClick","displayUrl","truncatedDescription","trimText","data-initial","ChatAnimationTypes","isShown","renderContent","unreadMentionsCount","formatIntegerCompact","FolderTypeToListType","lastMessage","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","getMessageAction","actionTargetMessage","selectChatMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","privateChatUserId","messageListType","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","lastMessageOutgoingStatus","selectOutgoingStatus","actionTargetUser","draft","selectDraft","MAIN_THREAD_ID","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isAction","isActionMessage","useEnsureMessage","mediaThumbnail","getMessageSticker","isRoundVideo","getMessageRoundVideo","Opacity","opacity","Move","useChatContextActions","Avatar","LastMessageMeta","TypingStatus","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","DeleteChatModal","folderType","chats","chatsById","orderedPinnedIds","users","usersById","currentThreadId","listType","chatFolder","selectChatFolder","isInDiscussionThread","notifySettings","notifyExceptions","noChatsText","isActive","loadMoreChats","preloadTopChatMessages","currentListIds","currentPinnedIds","prepareFolderListIds","orderById","orderedIds","newChatArrays","prepareChatList","singleList","pinnedChats","otherChats","newOrderedIds","prevOrderById","orderDiffById","order","Infinity","loadMoreOfType","useInfiniteScroll","CHAT_LIST_SLICE","ALL_CHATS_PRELOAD_DISABLED","chatArrays","getAnimationType","movesUp","movesDown","orderDiffIds","numberOfUp","numberOfDown","None","useChatAnimationType","digit","match","nextId","viewportOffset","pinnedOffset","CHAT_HEIGHT_PX","teactOrderKey","getChatOrder","renderChats","Loading","RE_NOT_USERNAME_SEARCH","useMentionTooltip","canSuggestMembers","groupChatMembers","currentUserId","currentFilter","setCurrentFilter","filteredMembers","setFilteredMembers","getFilteredMembers","usernameLowered","fullNameLowered","filterLowered","searchWords","searchUserName","usernameFilter","getUsernameFilter","membersToMention","insertMention","forceFocus","insertedHtml","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","mentionFilteredMembers","cache","useBlurSync","blurredRef","isChanged","imgToCanvas","blurredAsync","blurredDataUri","useBlur"],"mappings":"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AK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI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","file":"0.21ca60653ccd8108472e.js","sourcesContent":["import { RefObject } from 'react';\nimport React, { FC, useRef, useCallback } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport useContextMenuPosition from '../../hooks/useContextMenuPosition';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from './RippleEffect';\nimport Menu from './Menu';\nimport MenuItem from './MenuItem';\n\nimport './ListItem.scss';\n\ntype OnClickHandler = (e: React.MouseEvent) => void;\n\ntype MenuItemContextAction = {\n title: string;\n icon: string;\n destructive?: boolean;\n handler?: () => void;\n};\n\ntype OwnProps = {\n ref?: RefObject;\n buttonRef?: RefObject;\n icon?: string;\n className?: string;\n style?: string;\n children: any;\n disabled?: boolean;\n ripple?: boolean;\n narrow?: boolean;\n inactive?: boolean;\n focus?: boolean;\n destructive?: boolean;\n multiline?: boolean;\n isStatic?: boolean;\n contextActions?: MenuItemContextAction[];\n onClick?: OnClickHandler;\n};\n\nconst ListItem: FC = (props) => {\n const {\n ref,\n buttonRef,\n icon,\n className,\n style,\n children,\n disabled,\n ripple,\n narrow,\n inactive,\n focus,\n destructive,\n multiline,\n isStatic,\n contextActions,\n onClick,\n } = props;\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(containerRef, !contextActions);\n\n const getTriggerElement = useCallback(() => containerRef.current, []);\n\n const getRootElement = useCallback(\n () => containerRef.current!.closest('.custom-scroll'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => containerRef.current!.querySelector('.ListItem-context-menu .bubble'),\n [],\n );\n\n const { positionX, positionY, style: menuStyle } = useContextMenuPosition(\n contextMenuPosition,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n );\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n return;\n }\n onClick(e);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (inactive || IS_TOUCH_ENV) {\n return;\n }\n if (contextActions && (e.button === 2 || !onClick)) {\n handleBeforeContextMenu(e);\n }\n if (e.button === 0) {\n if (!onClick) {\n handleContextMenu(e);\n } else {\n handleClick(e);\n }\n }\n }, [inactive, contextActions, onClick, handleBeforeContextMenu, handleContextMenu, handleClick]);\n\n const lang = useLang();\n\n const fullClassName = buildClassName(\n 'ListItem',\n className,\n !isStatic && 'no-selection',\n ripple && 'has-ripple',\n narrow && 'narrow',\n disabled && 'disabled',\n inactive && 'inactive',\n contextMenuPosition && 'has-menu-open',\n focus && 'focus',\n destructive && 'destructive',\n multiline && 'multiline',\n isStatic && 'is-static',\n );\n\n return (\n \n \n {icon && (\n \n )}\n {multiline && (
{children}
)}\n {!multiline && children}\n {!disabled && !inactive && ripple && (\n \n )}\n
\n {contextActions && contextMenuPosition !== undefined && (\n \n {contextActions.map((action) => (\n \n {action.title}\n \n ))}\n \n )}\n
\n );\n};\n\nexport default ListItem;\n","import { RefObject } from 'react';\nimport {\n useEffect, useRef, useCallback, useState,\n} from '../lib/teact/teact';\n\nimport { throttle, debounce } from '../util/schedulers';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\n\ntype TargetCallback = (entry: IntersectionObserverEntry) => void;\ntype RootCallback = (entries: IntersectionObserverEntry[]) => void;\ntype ObserveCleanup = NoneToVoidFunction;\nexport type ObserveFn = (target: HTMLElement, targetCallback?: TargetCallback) => ObserveCleanup;\n\ninterface IntersectionController {\n observer: IntersectionObserver;\n callbacks: Map;\n}\n\ninterface Response {\n observe: ObserveFn;\n freeze: NoneToVoidFunction;\n unfreeze: NoneToVoidFunction;\n}\n\nexport function useIntersectionObserver({\n rootRef,\n throttleMs,\n debounceMs,\n shouldSkipFirst,\n margin,\n threshold,\n isDisabled,\n}: {\n rootRef: RefObject;\n throttleMs?: number;\n debounceMs?: number;\n shouldSkipFirst?: boolean;\n margin?: number;\n threshold?: number | number[];\n isDisabled?: boolean;\n}, rootCallback?: RootCallback): Response {\n const controllerRef = useRef();\n const rootCallbackRef = useRef();\n const isFrozenRef = useRef();\n const onUnfreezeRef = useRef();\n\n rootCallbackRef.current = rootCallback;\n\n const freeze = useCallback(() => {\n isFrozenRef.current = true;\n }, []);\n\n const unfreeze = useCallback(() => {\n isFrozenRef.current = false;\n\n if (onUnfreezeRef.current) {\n onUnfreezeRef.current();\n onUnfreezeRef.current = undefined;\n }\n }, []);\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\n return () => {\n if (controllerRef.current) {\n controllerRef.current.observer.disconnect();\n controllerRef.current.callbacks.clear();\n controllerRef.current = undefined;\n }\n };\n }, [isDisabled]);\n\n function initController() {\n const callbacks = new Map();\n const entriesAccumulator = new Map();\n const observerCallbackSync = () => {\n const entries = Array.from(entriesAccumulator.values());\n\n entries.forEach((entry: IntersectionObserverEntry) => {\n const callback = callbacks.get(entry.target);\n if (callback) {\n callback!(entry, entries);\n }\n });\n\n if (rootCallbackRef.current) {\n rootCallbackRef.current(entries);\n }\n\n entriesAccumulator.clear();\n };\n const scheduler = throttleMs ? throttle : debounceMs ? debounce : undefined;\n const observerCallback = scheduler\n ? scheduler(observerCallbackSync, (throttleMs || debounceMs)!, !shouldSkipFirst)\n : observerCallbackSync;\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n entriesAccumulator.set(entry.target, entry);\n });\n\n if (isFrozenRef.current) {\n onUnfreezeRef.current = () => {\n observerCallback();\n };\n } else {\n observerCallback();\n }\n },\n {\n root: rootRef.current,\n rootMargin: margin ? `${margin}px` : undefined,\n threshold,\n },\n );\n\n controllerRef.current = { observer, callbacks };\n }\n\n const observe = useCallback((target, targetCallback) => {\n if (!controllerRef.current) {\n initController();\n }\n\n const controller = controllerRef.current!;\n controller.observer.observe(target);\n\n if (targetCallback) {\n controller.callbacks.set(target, targetCallback);\n }\n\n return () => {\n if (targetCallback) {\n controller.callbacks.delete(target);\n }\n\n controller.observer.unobserve(target);\n };\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDisabled]);\n\n return { observe, freeze, unfreeze };\n}\n\nexport function useOnIntersect(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n useEffect(() => {\n return observe ? observe(targetRef.current!, callback) : undefined;\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport function useIsIntersecting(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n const [isIntersecting, setIsIntersecting] = useState(!observe);\n\n useOnIntersect(targetRef, observe, (entry) => {\n setIsIntersecting(entry.isIntersecting);\n\n if (callback) {\n callback(entry);\n }\n });\n\n return isIntersecting;\n}\n","import { useEffect } from '../lib/teact/teact';\n\nimport { ApiMediaFormat } from '../api/types';\n\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (\n mediaHash: string | false | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!noLoad && mediaHash && !mediaData) {\n const startedAt = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat).then(() => {\n const spentTime = Date.now() - startedAt;\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, delay]);\n\n return mediaData;\n};\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { selectChatMessages, selectUser } from '../../modules/selectors';\nimport { getUserFullName, getUserStatus, isUserOnline } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n userId: number;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n forceShowSelf?: boolean;\n status?: string;\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n noStatusOrTyping?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n isSavedMessages?: boolean;\n areMessagesLoaded: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n status,\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n noStatusOrTyping,\n noRtl,\n user,\n isSavedMessages,\n areMessagesLoaded,\n lastSyncTime,\n loadFullUser,\n openMediaViewer,\n}) => {\n const { id: userId } = user || {};\n const fullName = getUserFullName(user);\n\n useEffect(() => {\n if (withFullInfo && lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime, withFullInfo]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (user && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: user.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [user, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!user) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (status) {\n return (\n {status}\n );\n }\n\n if (withUpdatingStatus && !areMessagesLoaded) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!user) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n return (\n
\n {withUsername && user.username && {user.username}}\n {getUserStatus(lang, user)}\n
\n );\n }\n\n return (\n
\n \n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {user && user.isVerified && }\n
\n )}\n {(status || (!isSavedMessages && !noStatusOrTyping)) && renderStatusOrTyping()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { lastSyncTime } = global;\n const user = selectUser(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const areMessagesLoaded = Boolean(selectChatMessages(global, userId));\n\n return {\n lastSyncTime, user, isSavedMessages, areMessagesLoaded,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import { RefObject } from 'react';\nimport React, {\n FC, useLayoutEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Transition.scss';\n\ntype ChildrenFn = (isActive: boolean, isFrom: boolean) => any;\ntype OwnProps = {\n ref?: RefObject;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'slide-reversed' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'scroll-slide' | 'slide-layers'\n | 'fade' | 'push-slide' | 'reveal'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n id?: string;\n className?: string;\n onStart?: () => void;\n onStop?: () => void;\n children: ChildrenFn;\n};\n\ntype StateProps = {\n animationLevel: number;\n};\n\nconst ANIMATION_DURATION = {\n slide: 450,\n 'slide-reversed': 450,\n 'mv-slide': 400,\n 'slide-fade': 400,\n 'zoom-fade': 150,\n 'scroll-slide': 500,\n fade: 150,\n 'slide-layers': IS_MOBILE_SCREEN ? 450 : 300,\n 'push-slide': 300,\n reveal: 350,\n};\n\nconst CLEANED_UP = Symbol('CLEANED_UP');\n\nconst Transition: FC = ({\n ref,\n activeKey,\n name,\n direction = 'auto',\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n id,\n className,\n onStart,\n onStop,\n children,\n animationLevel,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const rendersRef = useRef>({});\n const prevActiveKey = usePrevious(activeKey);\n const activateTimeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n const activeKeyChanged = prevActiveKey !== undefined && activeKey !== prevActiveKey;\n\n if (!renderCount && activeKeyChanged) {\n rendersRef.current = { [prevActiveKey]: rendersRef.current[prevActiveKey] };\n }\n\n rendersRef.current[activeKey] = children;\n\n useLayoutEffect(() => {\n function cleanup() {\n if (!shouldCleanup) {\n return;\n }\n\n rendersRef.current = { [prevActiveKey]: CLEANED_UP };\n forceUpdate();\n }\n\n const container = containerRef.current!;\n\n const childElements = container.children;\n if (childElements.length === 1 && !activeKeyChanged) {\n childElements[0].classList.add('active');\n\n return;\n }\n\n const childNodes = Array.from(container.childNodes);\n\n if (!activeKeyChanged || !childNodes.length) {\n return;\n }\n\n if (activateTimeoutRef.current) {\n clearTimeout(activateTimeoutRef.current);\n activateTimeoutRef.current = undefined;\n }\n\n const isBackwards = (\n direction === -1\n || (direction === 'auto' && prevActiveKey > activeKey)\n || (direction === 'inverse' && prevActiveKey < activeKey)\n );\n\n container.classList.remove('animating');\n container.classList.toggle('backwards', isBackwards);\n\n const keys = Object.keys(rendersRef.current).map(Number);\n const prevActiveIndex = renderCount ? prevActiveKey : keys.indexOf(prevActiveKey);\n const activeIndex = renderCount ? activeKey : keys.indexOf(activeKey);\n\n if (name === 'none' || animationLevel === 0) {\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle('active', i === activeIndex);\n }\n });\n\n cleanup();\n\n return;\n }\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('active');\n node.classList.toggle('from', i === prevActiveIndex);\n node.classList.toggle('through', (\n (i > prevActiveIndex && i < activeIndex) || (i < prevActiveIndex && i > activeIndex)\n ));\n node.classList.toggle('to', i === activeIndex);\n }\n });\n\n if (name === 'scroll-slide') {\n const width = container.offsetWidth;\n container.scrollBy({\n left: activeIndex > prevActiveIndex ? width : -width,\n behavior: 'smooth',\n });\n }\n\n if (animationLevel > 0) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\n }\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n activateTimeoutRef.current = window.setTimeout(() => {\n requestAnimationFrame(() => {\n container.classList.remove('animating', 'backwards');\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle('active', i === activeIndex);\n }\n });\n\n if (name === 'scroll-slide') {\n container.scrollLeft = activeKey * container.offsetWidth;\n }\n\n if (shouldRestoreHeight) {\n const activeElement = container.querySelector('.active');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n\n cleanup();\n\n if (onStop) {\n onStop();\n }\n });\n }, ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\n\n if (onStart) {\n onStart();\n }\n });\n }, [\n activeKey,\n prevActiveKey,\n activeKeyChanged,\n direction,\n name,\n onStart,\n onStop,\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n animationLevel,\n forceUpdate,\n ]);\n\n useLayoutEffect(() => {\n if (shouldRestoreHeight) {\n const container = containerRef.current!;\n const activeElement = container.querySelector('.active')\n || container.querySelector('.from');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n container.style.flexBasis = `${activeElement.clientHeight}px`;\n }\n }\n }, [shouldRestoreHeight, children]);\n\n const renders = rendersRef.current;\n const collection = Object.keys(renderCount ? new Array(renderCount).fill(undefined) : renders).map(Number);\n const contents = collection.map((key) => {\n const render = renders[key];\n\n return (\n typeof render === 'function' ?
{render(key === activeKey, key === prevActiveKey)}
: undefined\n );\n });\n\n const fullClassName = buildClassName(\n 'Transition',\n className,\n animationLevel === 0 && name === 'scroll-slide' ? 'slide' : name,\n );\n\n return (\n
\n {contents}\n
\n );\n};\n\nexport default withGlobal((global) => {\n const { animationLevel } = global.settings.byKey;\n return { animationLevel };\n})(Transition);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiChat, ApiMediaFormat } from '../../api/types';\n\nimport { IS_TEST } from '../../config';\nimport {\n getChatAvatarHash, getChatTitle, isChatPrivate,\n getUserFullName, isUserOnline, isDeletedUser, getUserColorKey,\n} from '../../modules/helpers';\nimport { getFirstLetters } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useLang from '../../hooks/useLang';\n\nimport './Avatar.scss';\n\ntype OwnProps = {\n className?: string;\n size?: 'micro' | 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n withOnlineStatus?: boolean;\n chat?: ApiChat;\n user?: ApiUser;\n text?: string;\n isSavedMessages?: boolean;\n lastSyncTime?: number;\n onClick?: (e: ReactMouseEvent, hasPhoto: boolean) => void;\n};\n\nconst Avatar: FC = ({\n className,\n size = 'large',\n chat,\n user,\n text,\n withOnlineStatus,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const isDeleted = user && isDeletedUser(user);\n let imageHash: string | undefined;\n\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n imageHash = getChatAvatarHash(user);\n } else if (chat) {\n imageHash = getChatAvatarHash(chat);\n }\n }\n\n const dataUri = useMedia(imageHash, false, ApiMediaFormat.DataUri, lastSyncTime);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(dataUri, 'slow');\n\n const lang = useLang();\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (shouldRenderFullMedia) {\n content = \"\";\n } else if (user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isChatPrivate(chat.id) ? 2 : 1);\n } else if (text) {\n content = getFirstLetters(text, 2);\n }\n\n const isOnline = !isSavedMessages && user && isUserOnline(user);\n const fullClassName = buildClassName(\n `Avatar size-${size}`,\n className,\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n withOnlineStatus && isOnline && 'online',\n onClick && 'interactive',\n (!isSavedMessages && !shouldRenderFullMedia) && 'no-photo',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (onClick) {\n onClick(e, isSavedMessages || shouldRenderFullMedia);\n }\n }, [onClick, isSavedMessages, shouldRenderFullMedia]);\n\n const senderId = (user || chat) && (user || chat)!.id;\n\n return (\n
\n {typeof content === 'string' ? renderText(content, [size === 'jumbo' ? 'hq_emoji' : 'emoji']) : content}\n
\n );\n};\n\nexport default memo(Avatar);\n","import { RefObject, UIEvent } from 'react';\nimport { LoadMoreDirection } from '../../types';\n\nimport React, {\n FC, useCallback, useEffect, useLayoutEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport resetScroll from '../../util/resetScroll';\n\ntype OwnProps = {\n ref?: RefObject;\n className?: string;\n onLoadMore?: ({ direction }: { direction: LoadMoreDirection; noScroll?: boolean }) => void;\n onScroll?: (e: UIEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n items?: any[];\n itemSelector?: string;\n preloadBackwards?: number;\n sensitiveArea?: number;\n noScrollRestore?: boolean;\n noScrollRestoreOnTop?: boolean;\n noFastList?: boolean;\n cacheBuster?: any;\n children: any;\n};\n\nconst DEFAULT_LIST_SELECTOR = '.ListItem';\nconst DEFAULT_PRELOAD_BACKWARDS = 20;\nconst DEFAULT_SENSITIVE_AREA = 800;\n\nconst InfiniteScroll: FC = ({\n ref,\n className,\n onLoadMore,\n onScroll,\n onKeyDown,\n items,\n itemSelector = DEFAULT_LIST_SELECTOR,\n preloadBackwards = DEFAULT_PRELOAD_BACKWARDS,\n sensitiveArea = DEFAULT_SENSITIVE_AREA,\n // Used to turn off restoring scroll position (e.g. for frequently re-ordered chat or user lists)\n noScrollRestore = false,\n noScrollRestoreOnTop = false,\n noFastList,\n // Used to re-query `listItemElements` if rendering is delayed by transition\n cacheBuster,\n children,\n}: OwnProps) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const stateRef = useRef<{\n listItemElements: NodeListOf;\n isScrollTopJustUpdated: boolean;\n currentAnchor: HTMLDivElement | undefined;\n currentAnchorTop: number;\n }>({} as any);\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(() => {\n if (!onLoadMore) {\n return [];\n }\n\n return [\n debounce((noScroll = false) => {\n onLoadMore({ direction: LoadMoreDirection.Backwards, noScroll });\n }, 1000, true, false),\n debounce(() => {\n onLoadMore({ direction: LoadMoreDirection.Forwards });\n }, 1000, true, false),\n ];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onLoadMore, items]);\n\n // Initial preload\n useEffect(() => {\n if (!loadMoreBackwards) {\n return;\n }\n\n if (preloadBackwards > 0 && (!items || items.length < preloadBackwards)) {\n loadMoreBackwards(true);\n return;\n }\n\n const { scrollHeight, clientHeight } = containerRef.current!;\n if (clientHeight && scrollHeight <= clientHeight) {\n loadMoreBackwards();\n }\n }, [items, loadMoreBackwards, preloadBackwards]);\n\n // Restore `scrollTop` after adding items\n useLayoutEffect(() => {\n const container = containerRef.current!;\n const state = stateRef.current;\n\n state.listItemElements = container.querySelectorAll(itemSelector);\n\n let newScrollTop;\n\n if (state.currentAnchor && Array.from(state.listItemElements).includes(state.currentAnchor)) {\n const { scrollTop } = container;\n const newAnchorTop = state.currentAnchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - state.currentAnchorTop);\n } else {\n const nextAnchor = state.listItemElements[0];\n if (nextAnchor) {\n state.currentAnchor = nextAnchor;\n state.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n\n if (noScrollRestore) {\n return;\n }\n\n if (noScrollRestoreOnTop && container.scrollTop === 0) {\n return;\n }\n\n resetScroll(container, newScrollTop);\n\n state.isScrollTopJustUpdated = true;\n }, [items, itemSelector, noScrollRestore, noScrollRestoreOnTop, cacheBuster]);\n\n const handleScroll = useCallback((e: UIEvent) => {\n if (loadMoreForwards && loadMoreBackwards) {\n const {\n listItemElements, isScrollTopJustUpdated, currentAnchor, currentAnchorTop,\n } = stateRef.current;\n\n if (isScrollTopJustUpdated) {\n stateRef.current.isScrollTopJustUpdated = false;\n return;\n }\n\n const listLength = listItemElements.length;\n const container = containerRef.current!;\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const top = listLength ? listItemElements[0].offsetTop : 0;\n const isNearTop = scrollTop <= top + sensitiveArea;\n const bottom = listLength\n ? listItemElements[listLength - 1].offsetTop + listItemElements[listLength - 1].offsetHeight\n : scrollHeight;\n const isNearBottom = bottom - (scrollTop + offsetHeight) <= sensitiveArea;\n let isUpdated = false;\n\n if (isNearTop) {\n const nextAnchor = listItemElements[0];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor && currentAnchor.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingUp = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop > currentAnchorTop\n );\n\n if (isMovingUp) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n resetScroll(container);\n loadMoreForwards();\n }\n }\n }\n\n if (isNearBottom) {\n const nextAnchor = listItemElements[listLength - 1];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor && currentAnchor.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingDown = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop < currentAnchorTop\n );\n\n if (isMovingDown) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n resetScroll(container);\n loadMoreBackwards();\n }\n }\n }\n\n if (!isUpdated) {\n if (currentAnchor && currentAnchor.offsetParent) {\n stateRef.current.currentAnchorTop = currentAnchor.getBoundingClientRect().top;\n } else {\n const nextAnchor = listItemElements[0];\n\n if (nextAnchor) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n }\n }\n\n if (onScroll) {\n onScroll(e);\n }\n }, [loadMoreBackwards, loadMoreForwards, onScroll, sensitiveArea]);\n\n return (\n \n {children}\n \n );\n};\n\nexport default InfiniteScroll;\n","import { useEffect, useRef, useState } from '../lib/teact/teact';\n\nimport useShowTransition from './useShowTransition';\n\nconst SPEED = {\n fast: 200,\n slow: 350,\n};\n\nexport default (mediaData?: any, speed: keyof typeof SPEED = 'fast', noAnimate = false) => {\n const isMediaLoaded = Boolean(mediaData);\n const willAnimate = !useRef(isMediaLoaded).current && !noAnimate;\n const [shouldRenderThumb, setShouldRenderThumb] = useState(!isMediaLoaded);\n\n const {\n shouldRender: shouldRenderFullMedia,\n transitionClassNames,\n } = useShowTransition(isMediaLoaded, undefined, !willAnimate, speed);\n\n useEffect(() => {\n if (shouldRenderFullMedia) {\n if (willAnimate) {\n setTimeout(() => {\n setShouldRenderThumb(false);\n }, SPEED[speed]);\n } else {\n setShouldRenderThumb(false);\n }\n }\n }, [willAnimate, shouldRenderFullMedia, speed]);\n\n return {\n shouldRenderThumb,\n shouldRenderFullMedia,\n transitionClassNames,\n };\n};\n","import { ApiPhoto, ApiVideo, ApiSticker } from '../../../api/types';\nimport { getPhotoInlineDimensions, getVideoDimensions, IDimensions } from '../../../modules/helpers';\nimport windowSize from '../../../util/windowSize';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config';\n\nexport const MEDIA_VIEWER_MEDIA_QUERY = '(max-height: 640px)';\nexport const REM = parseInt(getComputedStyle(document.documentElement).fontSize, 10);\nexport const ROUND_VIDEO_DIMENSIONS = 200;\nexport const AVATAR_FULL_DIMENSIONS = { width: 640, height: 640 };\n\nconst DEFAULT_MEDIA_DIMENSIONS: IDimensions = { width: 100, height: 100 };\nconst LIKE_STICKER_ID = '1258816259753933';\nconst MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH = 0.69;\n\nlet cachedMaxWidth: number | undefined;\n\nfunction getMaxMessageWidthRem(fromOwnMessage: boolean) {\n const regularMaxWidth = fromOwnMessage ? 30 : 29;\n if (!IS_MOBILE_SCREEN) {\n return regularMaxWidth;\n }\n\n // @optimization Limitation: changing device screen width not supported\n if (!cachedMaxWidth) {\n cachedMaxWidth = Math.min(\n regularMaxWidth,\n Math.floor(window.innerWidth * MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH) / REM,\n );\n }\n\n return cachedMaxWidth;\n}\n\nfunction getAvailableWidth(\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n) {\n const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0;\n const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage) - extraPaddingRem;\n\n return availableWidthRem * REM;\n}\n\nfunction getAvailableHeight(isGif?: boolean, aspectRatio?: number) {\n if (\n isGif && aspectRatio\n && aspectRatio >= 0.75 && aspectRatio <= 1.25\n ) {\n return 20 * REM;\n }\n\n return 27 * REM;\n}\n\nfunction calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n isGif,\n}: {\n width: number;\n height: number;\n fromOwnMessage: boolean;\n isForwarded?: boolean;\n isWebPagePhoto?: boolean;\n isGif?: boolean;\n}): IDimensions {\n const aspectRatio = height / width;\n const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto);\n const availableHeight = getAvailableHeight(isGif, aspectRatio);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): IDimensions {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n const { width: windowWidth, height: windowHeight } = windowSize.get();\n let occupiedHeightRem = isVideo && mql.matches ? 10 : 8.25;\n if (withFooter) {\n occupiedHeightRem = mql.matches ? 10 : 15;\n }\n\n return {\n width: windowWidth,\n height: windowHeight - occupiedHeightRem * REM,\n };\n}\n\nexport function calculateInlineImageDimensions(\n photo: ApiPhoto,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n) {\n const { width, height } = getPhotoInlineDimensions(photo) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n });\n}\n\nexport function calculateVideoDimensions(\n video: ApiVideo,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n) {\n const { width, height } = getVideoDimensions(video) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isGif: video.isGif,\n });\n}\n\nexport function getPictogramDimensions(): IDimensions {\n return {\n width: 2 * REM,\n height: 2 * REM,\n };\n}\n\nexport function getDocumentThumbnailDimensions(smaller?: boolean): IDimensions {\n if (smaller) {\n return {\n width: 3 * REM,\n height: 3 * REM,\n };\n }\n\n return {\n width: 3.375 * REM,\n height: 3.375 * REM,\n };\n}\n\nexport function getStickerDimensions(sticker: ApiSticker): IDimensions {\n const { width } = sticker;\n let { height } = sticker;\n\n // For some reason this sticker has some weird `height` value\n if (sticker.id === LIKE_STICKER_ID) {\n height = width;\n }\n\n const aspectRatio = (height && width) && height / width;\n const baseWidth = (IS_MOBILE_SCREEN ? STICKER_SIZE_INLINE_MOBILE_FACTOR : STICKER_SIZE_INLINE_DESKTOP_FACTOR) * REM;\n const calculatedHeight = aspectRatio ? baseWidth * aspectRatio : baseWidth;\n\n if (aspectRatio && calculatedHeight > baseWidth) {\n return {\n width: Math.round(baseWidth / aspectRatio),\n height: baseWidth,\n };\n }\n\n return {\n width: baseWidth,\n height: calculatedHeight,\n };\n}\n\nexport function calculateMediaViewerDimensions(\n { width, height }: IDimensions, withFooter: boolean, isVideo: boolean = false,\n): IDimensions {\n const { width: availableWidth, height: availableHeight } = getMediaViewerAvailableDimensions(withFooter, isVideo);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function calculateDimensions(\n availableWidth: number,\n availableHeight: number,\n mediaWidth: number,\n mediaHeight: number,\n): IDimensions {\n const aspectRatio = mediaHeight / mediaWidth;\n const calculatedWidth = Math.min(mediaWidth, availableWidth);\n const calculatedHeight = Math.round(calculatedWidth * aspectRatio);\n\n if (calculatedHeight > availableHeight) {\n return {\n width: Math.round(availableHeight / aspectRatio),\n height: availableHeight,\n };\n }\n\n return {\n width: calculatedWidth,\n height: Math.round(calculatedWidth * aspectRatio),\n };\n}\n","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n}) => {\n const [animation, setAnimation] = useState();\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName('AnimatedSticker', className);\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport Modal from './Modal';\nimport Button from './Button';\n\ntype OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n title?: string;\n header?: FC;\n textParts?: TextPart[];\n text?: string;\n confirmLabel?: string;\n confirmHandler: () => void;\n confirmIsDestructive?: boolean;\n isButtonsInOneRow?: boolean;\n};\n\nconst ConfirmDialog: FC = ({\n isOpen,\n onClose,\n onCloseAnimationEnd,\n title,\n header,\n text,\n textParts,\n confirmLabel = 'Confirm',\n confirmHandler,\n confirmIsDestructive,\n isButtonsInOneRow,\n}) => {\n const lang = useLang();\n\n return (\n \n {text && text.split('\\\\n').map((textPart) => (\n

{textPart}

\n ))}\n {textParts}\n
\n \n {confirmLabel}\n \n \n
\n \n );\n};\n\nexport default memo(ConfirmDialog);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './NothingFound.scss';\n\ninterface OwnProps {\n text?: string;\n description?: string;\n}\n\nconst DEFAULT_TEXT = 'Nothing found.';\n\nconst NothingFound: FC = ({ text = DEFAULT_TEXT, description }) => {\n const lang = useLang();\n const { transitionClassNames } = useShowTransition(true);\n\n return (\n
\n {text}\n {description &&

{renderText(lang(description), ['br'])}

}\n
\n );\n};\n\nexport default memo(NothingFound);\n","import { useEffect, useRef } from '../../../lib/teact/teact';\n\nimport useOnChange from '../../../hooks/useOnChange';\nimport useForceUpdate from '../../../hooks/useForceUpdate';\n\nexport default function useAsyncRendering(dependencies: T, delay?: number) {\n const isDisabled = delay === undefined;\n const shouldRenderRef = useRef(isDisabled);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n if (isDisabled) {\n return;\n }\n\n shouldRenderRef.current = false;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n }, dependencies);\n\n useEffect(() => {\n if (isDisabled || shouldRenderRef.current) {\n return;\n }\n\n const exec = () => {\n shouldRenderRef.current = true;\n forceUpdate();\n };\n\n if (delay! > 0) {\n timeoutRef.current = window.setTimeout(exec, delay);\n } else {\n exec();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return shouldRenderRef.current;\n}\n","import {\n useEffect, useMemo, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { IS_PROGRESSIVE_SUPPORTED } from '../util/environment';\nimport { ApiMediaFormat } from '../api/types';\nimport { throttle } from '../util/schedulers';\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nconst STREAMING_PROGRESS = 0.75;\nconst STREAMING_TIMEOUT = 1500;\nconst PROGRESS_THROTTLE = 500;\n\nexport default (\n mediaHash: string | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const isStreaming = mediaFormat === ApiMediaFormat.Stream || (\n IS_PROGRESSIVE_SUPPORTED && mediaFormat === ApiMediaFormat.Progressive\n );\n const forceUpdate = useForceUpdate();\n const [downloadProgress, setDownloadProgress] = useState(mediaData && !isStreaming ? 1 : 0);\n const startedAtRef = useRef();\n\n const handleProgress = useMemo(() => {\n return throttle((progress: number) => {\n if (!delay || (Date.now() - startedAtRef.current! > delay)) {\n setDownloadProgress(progress);\n }\n }, PROGRESS_THROTTLE, true);\n }, [delay]);\n\n useEffect(() => {\n if (!noLoad && mediaHash) {\n if (!mediaData) {\n setDownloadProgress(0);\n\n if (startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n }\n\n startedAtRef.current = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat, handleProgress).then(() => {\n const spentTime = Date.now() - startedAtRef.current!;\n startedAtRef.current = undefined;\n\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n } else if (isStreaming) {\n setTimeout(() => {\n setDownloadProgress(STREAMING_PROGRESS);\n }, STREAMING_TIMEOUT);\n }\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, isStreaming, delay, handleProgress]);\n\n useEffect(() => {\n if (noLoad && startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n setDownloadProgress(0);\n }\n }, [handleProgress, noLoad]);\n\n return { mediaData, downloadProgress };\n};\n","import React, {\n FC, useEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './ProgressSpinner.scss';\n\nconst RADIUSES = {\n s: 22, m: 25, l: 28, xl: 20,\n};\nconst STROKE_WIDTH = 2;\nconst MIN_PROGRESS = 0.05;\nconst MAX_PROGRESS = 1;\n\nconst ProgressSpinner: FC<{\n progress?: number;\n size?: 's' | 'm' | 'l' | 'xl';\n square?: boolean;\n transparent?: boolean;\n noCross?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}> = ({\n progress = 0,\n size = 'l',\n square,\n transparent,\n noCross,\n onClick,\n}) => {\n const radius = RADIUSES[size];\n const circleRadius = radius - STROKE_WIDTH * 2;\n const borderRadius = radius - 1;\n const circumference = circleRadius * 2 * Math.PI;\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n\n useEffect(() => {\n if (!container.current) {\n return;\n }\n\n const svg = container.current.firstElementChild;\n const strokeDashOffset = circumference - Math.min(Math.max(MIN_PROGRESS, progress), MAX_PROGRESS) * circumference;\n\n if (!svg) {\n container.current.innerHTML = `\n \n `;\n } else {\n (svg.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n }, [container, circumference, borderRadius, circleRadius, progress]);\n\n const className = buildClassName(\n `ProgressSpinner size-${size}`,\n transparent && 'transparent',\n square && 'square',\n noCross && 'no-cross',\n );\n\n return (\n \n );\n};\n\nexport default memo(ProgressSpinner);\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef(document.createElement('div'));\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiTypingStatus } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport {\n getChatTypeString,\n getChatTitle,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport { selectChat, selectChatMessages, selectChatOnlineCount } from '../../modules/selectors';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n chatId: number;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'small' | 'medium' | 'large' | 'jumbo';\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n withChatType?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n onlineCount?: number;\n areMessagesLoaded: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst GroupChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n withChatType,\n noRtl,\n chat,\n onlineCount,\n areMessagesLoaded,\n lastSyncTime,\n loadFullChat,\n openMediaViewer,\n}) => {\n const isSuperGroup = chat && isChatSuperGroup(chat);\n const { id: chatId, isMin, isRestricted } = chat || {};\n\n useEffect(() => {\n if (chatId && !isMin && withFullInfo && lastSyncTime) {\n loadFullChat({ chatId });\n }\n }, [chatId, isMin, lastSyncTime, withFullInfo, loadFullChat, isSuperGroup]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (chat && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: chat.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [chat, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (withUpdatingStatus && !areMessagesLoaded && !isRestricted) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!chat) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n if (withChatType) {\n return (\n
{lang(getChatTypeString(chat))}
\n );\n }\n\n const handle = withUsername ? chat.username : undefined;\n const groupStatus = getGroupStatus(lang, chat);\n const onlineStatus = onlineCount ? `, ${lang('OnlineCount', onlineCount, 'i')}` : undefined;\n\n return (\n
\n {handle && {handle}}\n {groupStatus}\n {onlineStatus && {onlineStatus}}\n
\n );\n }\n\n return (\n
\n \n
\n
\n

{renderText(getChatTitle(lang, chat))}

\n {chat.isVerified && }\n
\n {renderStatusOrTyping()}\n
\n
\n );\n};\n\nfunction getGroupStatus(lang: LangFn, chat: ApiChat) {\n const chatTypeString = lang(getChatTypeString(chat));\n const { membersCount } = chat;\n\n if (chat.isRestricted) {\n return chatTypeString === 'Channel' ? 'channel is inaccessible' : 'group is inaccessible';\n }\n\n if (!membersCount) {\n return chatTypeString;\n }\n\n return chatTypeString === 'Channel'\n ? lang('Subscribers', membersCount, 'i')\n : lang('Members', membersCount, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { lastSyncTime } = global;\n const chat = selectChat(global, chatId);\n const onlineCount = chat ? selectChatOnlineCount(global, chat) : undefined;\n const areMessagesLoaded = Boolean(selectChatMessages(global, chatId));\n\n return {\n lastSyncTime, chat, onlineCount, areMessagesLoaded,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullChat', 'openMediaViewer']),\n)(GroupChatInfo));\n","import { FocusDirection } from '../types';\n\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { fastRaf } from './schedulers';\nimport { animateSingle } from './animation';\n\nconst MAX_DISTANCE = 1500;\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\n\nlet isAnimating = false;\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n maxDistance = MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceCurrentContainerHeight?: boolean,\n) {\n if (forceDirection === FocusDirection.Static) {\n element.scrollIntoView({ block: position });\n\n return;\n }\n\n const { offsetTop } = element;\n\n if (forceDirection === undefined) {\n const offset = offsetTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n container.scrollTop += (offset + maxDistance);\n } else if (offset > maxDistance) {\n container.scrollTop += (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n container.scrollTop = offsetTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\n }\n\n isAnimating = true;\n fastRaf(() => {\n scrollWithJs(container, element, position, margin, forceDuration, forceCurrentContainerHeight);\n });\n}\n\nexport function isAnimatingScroll() {\n return isAnimating;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n forceDuration?: number,\n forceCurrentContainerHeight?: boolean,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const { scrollTop, offsetHeight: containerHeight, scrollHeight } = container;\n const targetContainerHeight = !forceCurrentContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = (elementTop - margin) - scrollTop;\n break;\n case 'end':\n path = (elementTop + elementHeight + margin) - (scrollTop + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementHeight < targetContainerHeight\n ? (elementTop + elementHeight / 2) - (scrollTop + targetContainerHeight / 2)\n : (elementTop - margin) - scrollTop;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollTop;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollTop + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n const target = container.scrollTop + path;\n const duration = forceDuration || (\n MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n dispatchHeavyAnimationEvent(duration);\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollTop = Math.round(target - currentPath);\n\n isAnimating = t < 1;\n\n return isAnimating;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from './Spinner';\n\nimport './Radio.scss';\n\ntype OwnProps = {\n id?: string;\n name: string;\n label: string;\n subLabel?: string;\n value: string;\n checked: boolean;\n disabled?: boolean;\n hidden?: boolean;\n isLoading?: boolean;\n onChange: (e: ChangeEvent) => void;\n};\n\nconst Radio: FC = ({\n id,\n label,\n subLabel,\n value,\n name,\n checked,\n disabled,\n hidden,\n isLoading,\n onChange,\n}) => {\n const lang = useLang();\n const className = buildClassName(\n 'Radio',\n disabled && 'disabled',\n hidden && 'hidden-widget',\n isLoading && 'loading',\n );\n\n return (\n \n );\n};\n\nexport default memo(Radio);\n","import { ChangeEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\n\nimport Radio from './Radio';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n hidden?: boolean;\n};\n\ntype OwnProps = {\n id?: string;\n name: string;\n options: IRadioOption[];\n selected?: string;\n disabled?: boolean;\n loadingOption?: string;\n onChange: (value: string) => void;\n};\n\nconst RadioGroup: FC = ({\n id,\n name,\n options,\n selected,\n disabled,\n loadingOption,\n onChange,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value } = event.currentTarget;\n onChange(value);\n }, [onChange]);\n\n return (\n
\n {options.map((option) => (\n
\n );\n};\n\nexport default memo(RadioGroup);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\nimport { LoadMoreDirection } from '../types';\n\nimport { areSortedArraysEqual } from '../util/iteratees';\nimport useForceUpdate from './useForceUpdate';\nimport usePrevious from './usePrevious';\n\ntype GetMore = (args: { direction: LoadMoreDirection }) => void;\ntype LoadMoreBackwards = (args: { offsetId?: number }) => void;\n\nconst DEFAULT_LIST_SLICE = 30;\n\nexport default (\n loadMoreBackwards?: LoadMoreBackwards,\n listIds?: number[],\n isDisabled = false,\n listSlice = DEFAULT_LIST_SLICE,\n forceFullPreload = false,\n): [number[]?, GetMore?] => {\n const lastParamsRef = useRef<{\n direction?: LoadMoreDirection;\n offsetId?: number;\n }>();\n\n const viewportIdsRef = useRef((() => {\n // Only run once to initialize\n if (!listIds || lastParamsRef.current) {\n return undefined;\n }\n\n const { newViewportIds } = getViewportSlice(listIds, listIds[0], LoadMoreDirection.Forwards, listSlice);\n return newViewportIds;\n })());\n\n const forceUpdate = useForceUpdate();\n\n const prevListIds = usePrevious(listIds);\n const prevIsDisabled = usePrevious(isDisabled);\n if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) {\n const { offsetId = listIds[0], direction = LoadMoreDirection.Forwards } = lastParamsRef.current || {};\n const { newViewportIds } = getViewportSlice(listIds, offsetId, direction, listSlice);\n\n if (!viewportIdsRef.current || !areSortedArraysEqual(viewportIdsRef.current, newViewportIds)) {\n viewportIdsRef.current = newViewportIds;\n }\n }\n\n useEffect(() => {\n if (listIds && !isDisabled && loadMoreBackwards && forceFullPreload) {\n const viewportIds = viewportIdsRef.current!;\n loadMoreBackwards({ offsetId: viewportIds[viewportIds.length - 1] });\n }\n }, [listIds, isDisabled, loadMoreBackwards, forceFullPreload]);\n\n const getMore: GetMore = useCallback(({\n direction,\n noScroll,\n }: { direction: LoadMoreDirection; noScroll?: boolean }) => {\n const viewportIds = viewportIdsRef.current;\n\n const offsetId = viewportIds\n ? direction === LoadMoreDirection.Backwards ? viewportIds[viewportIds.length - 1] : viewportIds[0]\n : undefined;\n\n if (!listIds) {\n if (loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n\n return;\n }\n\n if (!noScroll) {\n lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\n }\n\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(listIds, offsetId, direction, listSlice);\n\n if (areSomeLocal && !(viewportIds && areSortedArraysEqual(viewportIds, newViewportIds))) {\n viewportIdsRef.current = newViewportIds;\n forceUpdate();\n }\n\n if (!areAllLocal && loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n }, [listIds, listSlice, loadMoreBackwards, forceUpdate]);\n\n return isDisabled ? [listIds] : [viewportIdsRef.current, getMore];\n};\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId = 0,\n direction: LoadMoreDirection,\n listSlice: number,\n) {\n const { length } = sourceIds;\n const index = sourceIds.indexOf(offsetId);\n const isForwards = direction === LoadMoreDirection.Forwards;\n const indexForDirection = isForwards ? index : (index + 1) || length;\n const from = Math.max(0, indexForDirection - listSlice);\n const to = indexForDirection + listSlice - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { STICKER_SIZE_TWO_FA } from '../../config';\nimport { getStickerDimensions } from './helpers/mediaDimensions';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './AnimatedEmoji.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n observeIntersection?: ObserveFn;\n isInline?: boolean;\n lastSyncTime?: number;\n};\n\nconst QUALITY = 1;\nconst RESIZE_FACTOR = 0.5;\n\nconst AnimatedEmoji: FC = ({\n sticker, isInline = false, observeIntersection, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isAnimationLoaded, markAnimationLoaded] = useFlag();\n const localMediaHash = `sticker${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl, lastSyncTime);\n const { transitionClassNames } = useTransitionForMedia(previewBlobUrl, 'slow');\n\n const mediaData = useMedia(localMediaHash, !isIntersecting, ApiMediaFormat.Lottie, lastSyncTime);\n const isMediaLoaded = Boolean(mediaData);\n\n const [playKey, setPlayKey] = useState(String(Math.random()));\n const handleClick = useCallback(() => {\n setPlayKey(String(Math.random()));\n }, []);\n\n let width: number;\n if (isInline) {\n width = getStickerDimensions(sticker).width * RESIZE_FACTOR;\n } else {\n width = STICKER_SIZE_TWO_FA;\n }\n\n const style = `width: ${width}px; height: ${width}px;`;\n\n return (\n \n {previewBlobUrl && !isAnimationLoaded && (\n \"\"\n )}\n {isMediaLoaded && (\n \n )}\n \n );\n};\n\nexport default AnimatedEmoji;\n","export default function focusEditableElement(element: HTMLElement, force?: boolean) {\n if (!force && element === document.activeElement) {\n return;\n }\n const selection = window.getSelection()!;\n const range = document.createRange();\n\n if (!element.lastChild || !element.lastChild.nodeValue) {\n element.focus();\n return;\n }\n\n range.setStart(element.lastChild, element.lastChild.nodeValue.length);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\n};\n","export enum SwipeDirection {\n Up,\n Down,\n Left,\n Right,\n}\n\ninterface CaptureOptions {\n onCapture?: (e: MouseEvent | TouchEvent) => void;\n onRelease?: (e: MouseEvent | TouchEvent) => void;\n onDrag?: (\n e: MouseEvent | TouchEvent,\n captureEvent: MouseEvent | TouchEvent,\n params: {\n dragOffsetX: number;\n dragOffsetY: number;\n },\n ) => void;\n onSwipe?: (e: Event, direction: SwipeDirection) => void;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n excludedClosestSelector?: string;\n withCursor?: boolean;\n}\n\n// https://stackoverflow.com/questions/11287877/how-can-i-get-e-offsetx-on-mobile-ipad\n// Android does not have this value, and iOS has it but as read-only\nexport interface RealTouchEvent extends TouchEvent {\n pageX?: number;\n pageY?: number;\n}\n\ntype TSwipeAxis = 'x' | 'y' | undefined;\n\nconst MOVED_THRESHOLD = 15;\nconst SWIPE_THRESHOLD = 50;\n\nexport function captureEvents(element: HTMLElement, options: CaptureOptions) {\n let captureEvent: MouseEvent | RealTouchEvent | undefined;\n let hasMoved = false;\n let currentSwipeAxis: TSwipeAxis;\n\n function onCapture(e: MouseEvent | RealTouchEvent) {\n if (options.excludedClosestSelector && (\n (e.target as HTMLElement).matches(options.excludedClosestSelector)\n || (e.target as HTMLElement).closest(options.excludedClosestSelector)\n )) {\n return;\n }\n\n captureEvent = e;\n\n if (e.type === 'mousedown') {\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onRelease);\n } else if (e.type === 'touchstart') {\n document.addEventListener('touchmove', onMove);\n document.addEventListener('touchend', onRelease);\n document.addEventListener('touchcancel', onRelease);\n\n if ('touches' in e) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n }\n }\n\n document.body.classList.add('no-selection');\n if (options.withCursor) {\n document.body.classList.add('cursor-grabbing');\n }\n\n if (options.onCapture) {\n options.onCapture(e);\n }\n }\n\n function onRelease(e: MouseEvent | TouchEvent) {\n if (captureEvent) {\n if (options.withCursor) {\n document.body.classList.remove('cursor-grabbing');\n }\n document.body.classList.remove('no-selection');\n\n document.removeEventListener('mouseup', onRelease);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchcancel', onRelease);\n document.removeEventListener('touchend', onRelease);\n document.removeEventListener('touchmove', onMove);\n\n captureEvent = undefined;\n\n if (hasMoved) {\n if (options.onRelease) {\n options.onRelease(e);\n }\n } else if (options.onClick) {\n options.onClick(e);\n }\n }\n\n hasMoved = false;\n currentSwipeAxis = undefined;\n }\n\n function onMove(e: MouseEvent | RealTouchEvent) {\n if (captureEvent) {\n if (e.type === 'touchmove' && ('touches' in e)) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n }\n\n const dragOffsetX = e.pageX! - captureEvent.pageX!;\n const dragOffsetY = e.pageY! - captureEvent.pageY!;\n\n if (Math.abs(dragOffsetX) >= MOVED_THRESHOLD || Math.abs(dragOffsetY) >= MOVED_THRESHOLD) {\n hasMoved = true;\n }\n\n if (options.onDrag) {\n e.preventDefault();\n options.onDrag(e, captureEvent, { dragOffsetX, dragOffsetY });\n }\n\n if (options.onSwipe) {\n onSwipe(e, dragOffsetX, dragOffsetY);\n }\n }\n }\n\n function onSwipe(e: Event, dragOffsetX: number, dragOffsetY: number) {\n if (!currentSwipeAxis) {\n const xAbs = Math.abs(dragOffsetX);\n const yAbs = Math.abs(dragOffsetY);\n\n if (dragOffsetX && dragOffsetY) {\n const ratio = Math.max(xAbs, yAbs) / Math.min(xAbs, yAbs);\n // Diagonal swipe\n if (ratio < 2) {\n return;\n }\n }\n\n if (xAbs >= SWIPE_THRESHOLD) {\n currentSwipeAxis = 'x';\n } else if (yAbs >= SWIPE_THRESHOLD) {\n currentSwipeAxis = 'y';\n }\n }\n\n processSwipe(e, currentSwipeAxis, dragOffsetX, dragOffsetY, options.onSwipe!);\n }\n\n element.addEventListener('mousedown', onCapture);\n element.addEventListener('touchstart', onCapture, { passive: true });\n\n return () => {\n element.removeEventListener('mousedown', onCapture);\n element.removeEventListener('touchstart', onCapture);\n };\n}\n\nfunction processSwipe(\n e: Event,\n currentSwipeAxis:TSwipeAxis,\n dragOffsetX: number,\n dragOffsetY: number,\n onSwipe: (e: Event, direction: SwipeDirection) => void,\n) {\n if (currentSwipeAxis === 'x') {\n if (dragOffsetX < 0) {\n onSwipe(e, SwipeDirection.Left);\n } else {\n onSwipe(e, SwipeDirection.Right);\n }\n } else if (currentSwipeAxis === 'y') {\n if (dragOffsetY < 0) {\n onSwipe(e, SwipeDirection.Up);\n } else {\n onSwipe(e, SwipeDirection.Down);\n }\n }\n}\n","import React, { FC } from '../../lib/teact/teact';\n\nimport './VerifiedIcon.scss';\n\nconst VerifiedIcon: FC = () => {\n return (\n \n );\n};\n\nexport default VerifiedIcon;\n","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\n","import usePrevious from './usePrevious';\n\nexport default function useCurrentOrPrev(\n current: T, shouldSkipUndefined = false, shouldForceCurrent = false,\n): T | undefined {\n const prev = usePrevious(current, shouldSkipUndefined);\n\n // eslint-disable-next-line no-null/no-null\n return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev;\n}\n","import { DEBUG } from '../config';\n\nexport default (mediaEl: HTMLMediaElement) => {\n mediaEl.play().catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n });\n};\n","import React, { useCallback, useMemo, useState } from '../lib/teact/teact';\nimport { debounce } from '../util/schedulers';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\n\ntype BufferingEvent = (e: Event | React.SyntheticEvent) => void;\n\nconst MIN_READY_STATE = 3;\n// Avoid flickering when re-mounting previously buffered video\nconst DEBOUNCE = 200;\n\nexport default (noInitiallyBuffered = false) => {\n const [isBuffered, setIsBuffered] = useState(!noInitiallyBuffered);\n const [bufferedProgress, setBufferedProgress] = useState(0);\n\n const setIsBufferedDebounced = useMemo(() => {\n return debounce(setIsBuffered, DEBOUNCE, false, true);\n }, []);\n\n const handleBuffering = useCallback((e) => {\n const media = e.currentTarget as HTMLMediaElement;\n\n if (!isSafariPatchInProgress(media)) {\n if (media.buffered.length) {\n setBufferedProgress(media.buffered.end(0) / media.duration);\n }\n\n setIsBufferedDebounced(media.readyState >= MIN_READY_STATE || media.currentTime > 0);\n }\n }, [setIsBufferedDebounced]);\n\n const bufferingHandlers = {\n onLoadedData: handleBuffering,\n onPlaying: handleBuffering,\n onLoadStart: handleBuffering, // Needed for Safari to start\n onPause: handleBuffering, // Needed for Chrome when seeking\n onTimeUpdate: handleBuffering, // Needed for audio buffering progress\n onProgress: handleBuffering, // Needed for video buffering progress\n };\n\n return {\n isBuffered,\n bufferedProgress,\n bufferingHandlers,\n checkBuffering(element: HTMLMediaElement) {\n setIsBufferedDebounced(element.readyState >= MIN_READY_STATE);\n },\n };\n};\n","import { ApiMessageEntity, ApiMessageEntityTypes, ApiFormattedText } from '../../../../api/types';\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nconst ENTITY_CLASS_BY_NODE_NAME: Record = {\n B: ApiMessageEntityTypes.Bold,\n STRONG: ApiMessageEntityTypes.Bold,\n I: ApiMessageEntityTypes.Italic,\n EM: ApiMessageEntityTypes.Italic,\n U: ApiMessageEntityTypes.Underline,\n S: ApiMessageEntityTypes.Strike,\n STRIKE: ApiMessageEntityTypes.Strike,\n DEL: ApiMessageEntityTypes.Strike,\n CODE: ApiMessageEntityTypes.Code,\n PRE: ApiMessageEntityTypes.Pre,\n BLOCKQUOTE: ApiMessageEntityTypes.Blockquote,\n};\n\nconst MAX_TAG_DEEPNESS = 3;\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default function parseMessageInput(html: string): ApiFormattedText {\n const fragment = document.createElement('div');\n fragment.innerHTML = parseMarkdown(html);\n const text = fragment.innerText.trim().replace(/\\u200b+/g, '').slice(0, MAX_MESSAGE_LENGTH);\n let textIndex = 0;\n let recursionDeepness = 0;\n const entities: ApiMessageEntity[] = [];\n\n function addEntity(node: ChildNode) {\n const { index, entity } = getEntityDataFromNode(node, text, textIndex);\n\n if (entity) {\n textIndex = index;\n entities.push(entity);\n } else if (node.textContent) {\n textIndex += node.textContent.length;\n }\n\n if (node.hasChildNodes() && recursionDeepness <= MAX_TAG_DEEPNESS) {\n recursionDeepness += 1;\n Array.from(node.childNodes).forEach(addEntity);\n }\n }\n\n Array.from(fragment.childNodes).forEach((node) => {\n recursionDeepness = 1;\n addEntity(node);\n });\n\n return {\n text,\n entities: entities.length ? entities : undefined,\n };\n}\n\nfunction parseMarkdown(html: string) {\n let parsedHtml = html.slice(0);\n\n if (!IS_EMOJI_SUPPORTED) {\n // Emojis\n parsedHtml = parsedHtml.replace(/]+alt=\"([^\"]+)\"[^>]*>/gm, '$1');\n } else {\n parsedHtml = parsedHtml.replace(/([^<]*)<\\/span>/g, '$1');\n }\n // Strip redundant tags\n parsedHtml = parsedHtml.replace(/<\\/?span([^>]*)?>/g, '');\n\n // Strip redundant nbsp's\n parsedHtml = parsedHtml.replace(/ /g, ' ');\n\n // Replace
with newline\n parsedHtml = parsedHtml.replace(/]*)?>/g, '\\n');\n\n // Strip redundant
tags\n parsedHtml = parsedHtml.replace(/<\\/div>(\\s*)
/g, '\\n');\n parsedHtml = parsedHtml.replace(/
/g, '\\n');\n parsedHtml = parsedHtml.replace(/<\\/div>/g, '');\n\n // Pre\n parsedHtml = parsedHtml.replace(/^`{3}(.*[\\n\\r][^]*?^)`{3}/gm, '
$1
');\n parsedHtml = parsedHtml.replace(/[`]{3}([^`]+)[`]{3}/g, '
$1
');\n\n // Code\n parsedHtml = parsedHtml.replace(/[`]{1}([^`\\n]+)[`]{1}/g, '$1');\n\n // Other simple markdown\n parsedHtml = parsedHtml.replace(/[*]{2}([^*\\n]+)[*]{2}/g, '$1');\n parsedHtml = parsedHtml.replace(/[*]{1}([^*\\n]+)[*]{1}/g, '$1');\n parsedHtml = parsedHtml.replace(/[~]{2}([^~\\n]+)[~]{2}/g, '$1');\n\n return parsedHtml;\n}\n\nfunction getEntityDataFromNode(\n node: ChildNode,\n rawText: string,\n textIndex: number,\n): { index: number; entity?: ApiMessageEntity } {\n const type = getEntityTypeFromNode(node);\n if (!type || !node.textContent) {\n return {\n index: textIndex,\n entity: undefined,\n };\n }\n\n const rawIndex = rawText.indexOf(node.textContent, textIndex);\n // In some cases, last text entity ends with a newline (which gets trimmed from `rawText`).\n // In this case, `rawIndex` would return `-1`, so we use `textIndex` instead.\n const index = rawIndex >= 0 ? rawIndex : textIndex;\n const offset = rawText.substring(0, index).length;\n const { length } = rawText.substring(index, index + node.textContent.length);\n\n let url: string | undefined;\n let userId: number | undefined;\n if (type === ApiMessageEntityTypes.TextUrl) {\n url = (node as HTMLAnchorElement).href;\n }\n if (type === ApiMessageEntityTypes.MentionName) {\n userId = Number((node as HTMLAnchorElement).dataset.userId);\n }\n\n return {\n index,\n entity: {\n type,\n offset,\n length,\n ...(url && { url }),\n ...(userId && { userId }),\n },\n };\n}\n\nfunction getEntityTypeFromNode(node: ChildNode) {\n if (ENTITY_CLASS_BY_NODE_NAME[node.nodeName]) {\n return ENTITY_CLASS_BY_NODE_NAME[node.nodeName];\n }\n\n if (node.nodeName === 'A') {\n const anchor = node as HTMLAnchorElement;\n if (anchor.dataset.entityType === ApiMessageEntityTypes.MentionName) {\n return ApiMessageEntityTypes.MentionName;\n }\n if (anchor.href.startsWith('mailto:')) {\n return ApiMessageEntityTypes.Email;\n }\n if (anchor.href.startsWith('tel:')) {\n return ApiMessageEntityTypes.Phone;\n }\n if (anchor.href !== anchor.textContent) {\n return ApiMessageEntityTypes.TextUrl;\n }\n\n return ApiMessageEntityTypes.Url;\n }\n\n if (node.nodeName === 'SPAN') {\n return (node as HTMLElement).dataset.entityType;\n }\n\n return undefined;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport './DropTarget.scss';\n\nexport type OwnProps = {\n isQuick?: boolean;\n onFileSelect: (e: React.DragEvent) => void;\n};\n\nconst DropTarget: FC = ({ isQuick, onFileSelect }) => {\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n\n const handleDragEnter = () => { markHovered(); };\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget } = e;\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const className = buildClassName(\n 'DropTarget',\n isHovered && 'hovered',\n );\n\n return (\n \n
\n
\n
Drop files here to send them
\n
{isQuick ? 'in a quick way' : 'without compression'}
\n
\n
\n );\n};\n\nexport default memo(DropTarget);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport DropTarget from './DropTarget';\n\nimport './DropArea.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n withQuick?: boolean;\n onHide: NoneToVoidFunction;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n};\n\nexport enum DropAreaState {\n None = 'none',\n Document = 'document',\n QuickFile = 'quick_file',\n}\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst DropArea: FC = ({\n isOpen, withQuick, onHide, onFileSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevWithQuick = usePrevious(withQuick);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onHide) : undefined), [isOpen, onHide]);\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), false);\n }\n }, [onFileSelect, onHide]);\n\n const handleQuickFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), true);\n }\n }, [onFileSelect, onHide]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.stopPropagation();\n\n const { target: fromTarget, relatedTarget: toTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.DropTarget, .DropArea') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(() => {\n onHide();\n }, DROP_LEAVE_TIMEOUT_MS);\n }\n }, [onHide]);\n\n const handleDragOver = () => {\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n };\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'DropArea',\n transitionClassNames,\n );\n\n return (\n
\n \n {(withQuick || prevWithQuick) && }\n
\n );\n};\n\nexport default memo(DropArea);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport { getChatTitle, getUserFirstOrLastName, isChatPrivate } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\n\nimport './PickerSelectedItem.scss';\n\ntype OwnProps = {\n chatOrUserId?: number;\n icon?: string;\n title?: string;\n isMinimized?: boolean;\n canClose?: boolean;\n onClick: (arg: any) => void;\n clickArg: any;\n className?: string;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n user?: ApiUser;\n};\n\nconst PickerSelectedItem: FC = ({\n icon,\n title,\n isMinimized,\n canClose,\n onClick,\n clickArg,\n chat,\n user,\n className,\n}) => {\n const lang = useLang();\n\n let iconElement: any;\n let titleText: any;\n\n if (icon && title) {\n iconElement = (\n
\n \n
\n );\n\n titleText = title;\n } else if (chat || user) {\n iconElement = (\n \n );\n\n const name = !chat || (user && !user.isSelf)\n ? getUserFirstOrLastName(user)\n : getChatTitle(lang, chat, user);\n\n titleText = name ? renderText(name) : undefined;\n }\n\n const fullClassName = buildClassName(\n 'PickerSelectedItem',\n className,\n isMinimized && 'minimized',\n canClose && 'closeable',\n );\n\n return (\n onClick(clickArg)}\n title={isMinimized ? titleText : undefined}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n {iconElement}\n {!isMinimized && (\n
\n {titleText}\n
\n )}\n {canClose && (\n
\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n if (!chatOrUserId) {\n return {};\n }\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isChatPrivate(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n\n return {\n chat,\n user,\n };\n },\n)(PickerSelectedItem));\n","import { fastRaf } from './schedulers';\nimport { animate } from './animation';\nimport { IS_IOS } from './environment';\n\nconst DURATION = 450;\n\nexport default function fastSmoothScrollHorizontal(container: HTMLElement, left: number) {\n // Native way seems to be smoother in Chrome\n if (!IS_IOS) {\n container.scrollTo({ left, behavior: 'smooth' });\n } else {\n fastRaf(() => {\n scrollWithJs(container, left);\n });\n }\n}\n\nfunction scrollWithJs(container: HTMLElement, left: number) {\n const { scrollLeft, offsetWidth: containerWidth, scrollWidth } = container;\n let path = left - scrollLeft;\n\n if (path < 0) {\n const remainingPath = -scrollLeft;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollWidth - (scrollLeft + containerWidth);\n path = Math.min(path, remainingPath);\n }\n\n const target = container.scrollLeft + path;\n const startAt = Date.now();\n\n animate(() => {\n const t = Math.min((Date.now() - startAt) / DURATION, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollLeft = Math.round(target - currentPath);\n\n return t < 1;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (container: HTMLElement | null, isDisabled?: boolean) => {\n useEffect(() => {\n if (!container) {\n return undefined;\n }\n\n function handleScroll(e: WheelEvent) {\n // Ignore horizontal scroll and let it work natively (e.g. on touchpad)\n if (!e.deltaX) {\n container!.scrollLeft += e.deltaY / 4;\n }\n }\n\n container.addEventListener('wheel', handleScroll, { passive: true });\n\n return () => {\n container.removeEventListener('wheel', handleScroll);\n };\n }, [container, isDisabled]);\n};\n","import { useEffect, useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiMessage } from '../api/types';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (\n chatId: number,\n messageId?: number,\n message?: ApiMessage,\n replyOriginForId?: number,\n) => {\n const { loadMessage } = getDispatch();\n const loadMessageThrottled = useMemo(() => {\n const throttled = throttle(loadMessage, 500, true);\n return () => {\n throttled({ chatId, messageId, replyOriginForId });\n };\n }, [loadMessage, chatId, messageId, replyOriginForId]);\n\n useEffect(() => {\n if (messageId && !message) {\n loadMessageThrottled();\n }\n });\n};\n","import { RefObject } from 'react';\nimport { useState, useEffect, useCallback } from '../lib/teact/teact';\n\nimport { IAnchorPosition } from '../types';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../util/environment';\n\nconst LONG_TAP_DURATION_MS = 250;\nconst SELECTION_ANIMATION_DURATION_MS = 200;\n\nlet contextMenuCounter = 0;\n\nfunction checkIsDisabledForMobile() {\n return IS_MOBILE_SCREEN\n && window.document.body.classList.contains('enable-symbol-menu-transforms');\n}\n\nexport default (\n elementRef: RefObject,\n isMenuDisabled?: boolean,\n shouldDisableOnLink?: boolean,\n) => {\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuPosition, setContextMenuPosition] = useState(undefined);\n\n const handleBeforeContextMenu = useCallback((e: React.MouseEvent) => {\n if (!isMenuDisabled && e.button === 2) {\n document.body.classList.add('no-selection');\n }\n }, [isMenuDisabled]);\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n document.body.classList.remove('no-selection');\n\n if (isMenuDisabled || (shouldDisableOnLink && (e.target as HTMLElement).matches('a.text-entity-link[href]'))) {\n return;\n }\n e.preventDefault();\n\n if (contextMenuPosition) {\n return;\n }\n document.body.classList.remove('no-selection');\n if (contextMenuCounter === 0) {\n document.body.classList.add('has-context-menu');\n }\n contextMenuCounter++;\n\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: e.clientX, y: e.clientY });\n }, [isMenuDisabled, shouldDisableOnLink, contextMenuPosition]);\n\n const handleContextMenuClose = useCallback(() => {\n setIsContextMenuOpen(false);\n }, []);\n\n const handleContextMenuHide = useCallback(() => {\n setContextMenuPosition(undefined);\n document.body.classList.remove('no-selection');\n\n setTimeout(() => {\n contextMenuCounter--;\n if (contextMenuCounter === 0) {\n document.body.classList.remove('has-context-menu');\n }\n }, SELECTION_ANIMATION_DURATION_MS);\n }, []);\n\n // Support context menu on touch-devices\n useEffect(() => {\n if (isMenuDisabled || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (!element) {\n return undefined;\n }\n\n let timer: number | undefined;\n\n const clearLongPressTimer = () => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const emulateContextMenuEvent = (originalEvent: TouchEvent) => {\n clearLongPressTimer();\n\n const { clientX, clientY } = originalEvent.touches[0];\n\n if (contextMenuPosition) {\n return;\n }\n\n // temporarily intercept and clear the next click\n element.addEventListener('touchend', function cancelClickOnce(e) {\n element.removeEventListener('touchend', cancelClickOnce, true);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n }, true);\n\n document.body.classList.add('no-selection');\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: clientX, y: clientY });\n };\n\n const startLongPressTimer = (e: TouchEvent) => {\n if (isMenuDisabled || checkIsDisabledForMobile()) {\n return;\n }\n clearLongPressTimer();\n\n timer = window.setTimeout(() => emulateContextMenuEvent(e), LONG_TAP_DURATION_MS);\n };\n\n // @perf Consider event delegation\n element.addEventListener('touchstart', startLongPressTimer, { passive: true });\n element.addEventListener('touchcancel', clearLongPressTimer, true);\n element.addEventListener('touchend', clearLongPressTimer, true);\n element.addEventListener('touchmove', clearLongPressTimer, { passive: true });\n\n return () => {\n clearLongPressTimer();\n element.removeEventListener('touchstart', startLongPressTimer);\n element.removeEventListener('touchcancel', clearLongPressTimer, true);\n element.removeEventListener('touchend', clearLongPressTimer, true);\n element.removeEventListener('touchmove', clearLongPressTimer);\n };\n }, [contextMenuPosition, isMenuDisabled, elementRef]);\n\n return {\n isContextMenuOpen,\n contextMenuPosition,\n handleBeforeContextMenu,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n };\n};\n","import { MouseEvent } from 'react';\nimport React from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMessageEntity, ApiMessageEntityTypes, ApiMessage } from '../../../api/types';\n\nimport { getMessageText } from '../../../modules/helpers';\nimport renderText from './renderText';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\nexport type TextPart = string | Element;\n\nexport function renderMessageText(message: ApiMessage, highlight?: string, shouldRenderHqEmoji?: boolean) {\n const formattedText = message.content.text;\n\n if (!formattedText || !formattedText.text) {\n const rawText = getMessageText(message);\n return rawText ? [rawText] : undefined;\n }\n const { text, entities } = formattedText;\n\n return renderTextWithEntities(text, entities, highlight, shouldRenderHqEmoji);\n}\n\ninterface IOrganizedEntity {\n entity: ApiMessageEntity;\n organizedIndexes: Set;\n nestedEntities: IOrganizedEntity[];\n}\n\nfunction organizeEntity(\n entity: ApiMessageEntity,\n index: number,\n entities: ApiMessageEntity[],\n organizedEntityIndexes: Set,\n): IOrganizedEntity | undefined {\n const { offset, length } = entity;\n const organizedIndexes = new Set([index]);\n\n if (organizedEntityIndexes.has(index)) {\n return undefined;\n }\n\n // Determine any nested entities inside current entity\n const nestedEntities = entities\n .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length)\n .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes))\n .filter(Boolean as any);\n\n nestedEntities.forEach((e) => e.organizedIndexes.forEach((i) => organizedIndexes.add(i)));\n\n return {\n entity,\n organizedIndexes,\n nestedEntities,\n };\n}\n\n// Organize entities in a tree-like structure to better represent how the text will be displayed\nfunction organizeEntities(entities: ApiMessageEntity[]) {\n const organizedEntityIndexes: Set = new Set();\n const organizedEntities: IOrganizedEntity[] = [];\n\n entities.forEach((entity, index) => {\n if (organizedEntityIndexes.has(index)) {\n return;\n }\n\n const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes);\n if (organizedEntity) {\n organizedEntity.organizedIndexes.forEach((organizedIndex) => {\n organizedEntityIndexes.add(organizedIndex);\n });\n\n organizedEntities.push(organizedEntity);\n }\n });\n\n return organizedEntities;\n}\n\nexport function renderTextWithEntities(\n text: string,\n entities?: ApiMessageEntity[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (!entities || !entities.length) {\n return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml);\n }\n\n const result: TextPart[] = [];\n let deleteLineBreakAfterPre = false;\n\n const organizedEntites = organizeEntities(entities);\n\n // Recursive function to render regular and nested entities\n function renderEntity(\n textPartStart: number,\n textPartEnd: number,\n organizedEntity: IOrganizedEntity,\n isLastEntity: boolean,\n ) {\n const renderResult: TextPart[] = [];\n const { entity, nestedEntities } = organizedEntity;\n const { offset, length, type } = entity;\n\n // Render text before the entity\n let textBefore = text.substring(textPartStart, offset);\n const textBeforeLength = textBefore.length;\n if (textBefore) {\n if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\\n') {\n textBefore = textBefore.substr(1);\n deleteLineBreakAfterPre = false;\n }\n if (textBefore) {\n renderResult.push(...renderMessagePart(\n textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n const entityStartIndex = textPartStart + textBeforeLength;\n const entityEndIndex = entityStartIndex + length;\n\n let entityContent: TextPart = text.substring(offset, offset + length);\n const nestedEntityContent: TextPart[] = [];\n\n if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\\n') {\n entityContent = entityContent.substr(1);\n deleteLineBreakAfterPre = false;\n }\n\n if (type === ApiMessageEntityTypes.Pre) {\n deleteLineBreakAfterPre = true;\n }\n\n // Render nested entities, if any\n if (nestedEntities.length) {\n let nestedIndex = entityStartIndex;\n\n nestedEntities.forEach((nestedEntity, nestedEntityIndex) => {\n const {\n renderResult: nestedResult,\n entityEndIndex: nestedEntityEndIndex,\n } = renderEntity(\n nestedIndex,\n entityEndIndex,\n nestedEntity,\n nestedEntityIndex === nestedEntities.length - 1,\n );\n\n nestedEntityContent.push(...nestedResult);\n nestedIndex = nestedEntityEndIndex;\n });\n }\n\n // Render the entity itself\n const newEntity = shouldRenderAsHtml\n ? processEntityAsHtml(entity, entityContent, nestedEntityContent)\n : processEntity(entity, entityContent, nestedEntityContent);\n\n if (Array.isArray(newEntity)) {\n renderResult.push(...newEntity);\n } else {\n renderResult.push(newEntity);\n }\n\n // Render text after the entity, if it is the last entity in the text,\n // or the last nested entity inside of another entity\n if (isLastEntity && entityEndIndex < textPartEnd) {\n let textAfter = text.substring(entityEndIndex, textPartEnd);\n if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\\n') {\n textAfter = textAfter.substring(1);\n }\n if (textAfter) {\n renderResult.push(...renderMessagePart(\n textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n return {\n renderResult,\n entityEndIndex,\n };\n }\n\n // Process highest-level entities\n let index = 0;\n\n organizedEntites.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntites.length - 1,\n );\n\n result.push(...renderResult);\n index = entityEndIndex;\n });\n\n return result;\n}\n\nfunction processEntity(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const entityText = typeof entityContent === 'string' && entityContent;\n const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent;\n\n if (!entityText) {\n return renderMessagePart(renderedContent);\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Blockquote:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.BotCommand:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Hashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Cashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Code:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Email:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Italic:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.MentionName:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Mention:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Phone:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Pre:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.Strike:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.TextUrl:\n case ApiMessageEntityTypes.Url:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Underline:\n return {renderMessagePart(renderedContent)};\n default:\n return renderMessagePart(renderedContent);\n }\n}\n\nfunction renderMessagePart(\n content: TextPart | TextPart[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (Array.isArray(content)) {\n const result: TextPart[] = [];\n\n content.forEach((c) => {\n result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml));\n });\n\n return result;\n }\n\n if (shouldRenderAsHtml) {\n return renderText(content, ['escape_html', 'emoji_html', 'br_html']);\n }\n\n const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji';\n\n if (highlight) {\n return renderText(content, [emojiFilter, 'br', 'highlight'], { highlight });\n } else {\n return renderText(content, [emojiFilter, 'br']);\n }\n}\n\nfunction getLinkUrl(entityContent: string, entity: ApiMessageEntity) {\n const { type, url } = entity;\n return type === ApiMessageEntityTypes.TextUrl && url ? url : entityContent;\n}\n\nfunction handleBotCommandClick(e: MouseEvent) {\n getDispatch().sendBotCommand({ command: e.currentTarget.innerText });\n}\n\nfunction handleHashtagClick(e: MouseEvent) {\n getDispatch().setLocalTextSearchQuery({ query: e.currentTarget.innerText });\n getDispatch().searchTextMessagesLocal();\n}\n\nfunction processEntityAsHtml(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const rawEntityText = typeof entityContent === 'string' && entityContent;\n\n const renderedContent = nestedEntityContent.length\n ? nestedEntityContent.join('')\n : renderText(entityContent, ['emoji_html', 'br_html']).join('');\n\n if (!rawEntityText) {\n return renderedContent;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Italic:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Underline:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Code:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Pre:\n return `\\`\\`\\`
${renderedContent}
\\`\\`\\``;\n case ApiMessageEntityTypes.Strike:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.MentionName:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Url:\n case ApiMessageEntityTypes.TextUrl:\n return `${renderedContent}`;\n default:\n return renderedContent;\n }\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\nimport { fastRaf } from '../util/schedulers';\n\n// Fix for memory leak when unmounting video element\nexport default function useVideoCleanup(videoRef: RefObject, dependencies: any[]) {\n useEffect(() => {\n const videoEl = videoRef.current;\n\n return () => {\n if (videoEl) {\n fastRaf(() => {\n videoEl.pause();\n videoEl.src = '';\n videoEl.load();\n });\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n}\n","import { DEBUG } from '../config';\n\nexport const CLIPBOARD_ITEM_SUPPORTED = navigator.clipboard && window.ClipboardItem;\n\nconst textCopyEl = document.createElement('textarea');\ntextCopyEl.setAttribute('readonly', '');\ntextCopyEl.tabIndex = -1;\ntextCopyEl.className = 'visually-hidden';\n\nexport const copyTextToClipboard = (str: string): void => {\n textCopyEl.value = str;\n document.body.appendChild(textCopyEl);\n const selection = document.getSelection();\n\n if (selection) {\n // Store previous selection\n const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0);\n textCopyEl.select();\n document.execCommand('copy');\n // Restore the original selection\n if (rangeToRestore) {\n selection.removeAllRanges();\n selection.addRange(rangeToRestore);\n }\n }\n\n document.body.removeChild(textCopyEl);\n};\n\nexport const copyImageToClipboard = (imageUrl: string) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = new Image();\n imageEl.onload = (e: Event) => {\n if (ctx && e.currentTarget) {\n const img = e.currentTarget as HTMLImageElement;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n canvas.toBlob(copyBlobToClipboard, 'image/png', 1);\n }\n };\n\n imageEl.src = imageUrl;\n};\n\nasync function copyBlobToClipboard(pngBlob: Blob | null) {\n if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) {\n return;\n }\n\n try {\n await navigator.clipboard.write([\n new window.ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","import { RefObject } from 'react';\nimport React, {\n FC, useRef, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from './Loading';\nimport Button from './Button';\n\nimport './SearchInput.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n children?: any;\n parentContainerClassName?: string;\n className?: string;\n inputId?: string;\n value?: string;\n focused?: boolean;\n isLoading?: boolean;\n placeholder?: string;\n disabled?: boolean;\n autoComplete?: string;\n canClose?: boolean;\n onChange: (value: string) => void;\n onReset?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n onBlur?: NoneToVoidFunction;\n};\n\nconst SearchInput: FC = ({\n ref,\n children,\n parentContainerClassName,\n value,\n inputId,\n className,\n focused,\n isLoading,\n placeholder,\n disabled,\n autoComplete,\n canClose,\n onChange,\n onReset,\n onFocus,\n onBlur,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let inputRef = useRef(null);\n if (ref) {\n inputRef = ref;\n }\n\n const [isInputFocused, markInputFocused, unmarkInputFocused] = useFlag(focused);\n\n useEffect(() => {\n if (!inputRef.current) {\n return;\n }\n\n if (focused) {\n inputRef.current.focus();\n } else {\n inputRef.current.blur();\n }\n }, [focused, placeholder]); // Trick for setting focus when selecting a contact to search for\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n onChange(currentTarget.value);\n }\n\n function handleFocus() {\n markInputFocused();\n if (onFocus) {\n onFocus();\n }\n }\n\n function handleBlur() {\n unmarkInputFocused();\n if (onBlur) {\n onBlur();\n }\n }\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n const element = document.querySelector(`.${parentContainerClassName} .ListItem-button`) as HTMLElement;\n if (element) {\n element.focus();\n }\n }\n }, [parentContainerClassName]);\n\n return (\n \n {children}\n \n \n {isLoading && (\n \n )}\n {!isLoading && (value || canClose) && onReset && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SearchInput);\n","import { IS_IOS } from './environment';\n\nexport default (container: HTMLDivElement, scrollTop?: number) => {\n if (IS_IOS) {\n container.style.overflow = 'hidden';\n }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n if (IS_IOS) {\n container.style.overflow = '';\n }\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\n\nimport { selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './TypingStatus.scss';\n\ntype OwnProps = {\n typingStatus: ApiTypingStatus;\n};\n\ntype StateProps = {\n typingUser?: ApiUser;\n};\n\nconst TypingStatus: FC = ({ typingStatus, typingUser }) => {\n const lang = useLang();\n const typingUserName = typingUser && !typingUser.isSelf && getUserFirstOrLastName(typingUser);\n\n return (\n

\n {typingUserName && (\n {renderText(typingUserName)}\n )}\n {/* fix for translation \"username _is_ typing\" */}\n {lang(typingStatus.action).replace('{user}', '').trim()}\n \n

\n );\n};\n\nexport default memo(withGlobal(\n (global, { typingStatus }): StateProps => {\n if (!typingStatus.userId) {\n return {};\n }\n\n const typingUser = selectUser(global, typingStatus.userId);\n\n return { typingUser };\n },\n)(TypingStatus));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n getChatTitle,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Avatar from './Avatar';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './DeleteChatModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n chat: ApiChat;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isChatWithSelf?: boolean;\n isPrivateChat: boolean;\n isBasicGroup: boolean;\n isSuperGroup: boolean;\n canDeleteForAll?: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteChatModal: FC = ({\n isOpen,\n chat,\n isChannel,\n isPrivateChat,\n isChatWithSelf,\n isBasicGroup,\n isSuperGroup,\n canDeleteForAll,\n contactName,\n onClose,\n leaveChannel,\n deleteHistory,\n deleteChannel,\n}) => {\n const lang = useLang();\n const chatTitle = getChatTitle(lang, chat);\n\n const handleDeleteMessageForAll = useCallback(() => {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });\n\n onClose();\n }, [deleteHistory, chat.id, onClose]);\n\n const handleDeleteChat = useCallback(() => {\n if (isPrivateChat || isBasicGroup) {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if ((isChannel || isSuperGroup) && !chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else if ((isChannel || isSuperGroup) && chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n }\n onClose();\n }, [\n isPrivateChat,\n isBasicGroup,\n isChannel,\n isSuperGroup,\n chat.isCreator,\n chat.id,\n onClose,\n deleteHistory,\n leaveChannel,\n deleteChannel,\n ]);\n\n function renderHeader() {\n return (\n
\n \n

{lang(renderTitle())}

\n
\n );\n }\n\n function renderTitle() {\n if (isChannel && !chat.isCreator) {\n return 'LeaveChannel';\n }\n\n if (isChannel && chat.isCreator) {\n return 'ChannelDelete';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Group.LeaveGroup';\n }\n\n return 'DeleteChatUser';\n }\n\n function renderMessage() {\n if (isChannel && chat.isCreator) {\n return

{renderText(lang('ChatList.DeleteAndLeaveGroupConfirmation', chatTitle), ['simple_markdown'])}

;\n }\n\n if ((isChannel && !chat.isCreator) || isBasicGroup || isSuperGroup) {\n return

{renderText(lang('ChannelLeaveAlertWithName', chatTitle), ['simple_markdown'])}

;\n }\n\n return

{renderText(lang('ChatList.DeleteChatConfirmation', contactName), ['simple_markdown'])}

;\n }\n\n function renderActionText() {\n if (isChannel && !chat.isCreator) {\n return 'LeaveChannel';\n }\n if (isChannel && chat.isCreator) {\n return 'Chat.Input.Delete';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Group.LeaveGroup';\n }\n\n return canDeleteForAll ? 'ChatList.DeleteForCurrentUser' : 'Delete';\n }\n\n return (\n \n {renderMessage()}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chat }): StateProps => {\n const isPrivateChat = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, chat.id);\n const canDeleteForAll = (isPrivateChat && !isChatWithSelf);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel: isChatChannel(chat),\n isBasicGroup: isChatBasicGroup(chat),\n isSuperGroup: isChatSuperGroup(chat),\n canDeleteForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['leaveChannel', 'deleteHistory', 'deleteChannel']),\n)(DeleteChatModal));\n","/*\n * Thanks to Ace Monkey for this mind-blowing patch.\n */\n\nexport function patchSafariProgressiveAudio(audioEl: HTMLAudioElement) {\n if (audioEl.dataset.patchedForSafari) {\n return;\n }\n\n audioEl.addEventListener('play', () => {\n const t = audioEl.currentTime;\n\n function onProgress() {\n if (!audioEl.buffered.length) {\n return;\n }\n\n audioEl.dataset.patchForSafariInProgress = 'true';\n audioEl.currentTime = audioEl.duration - 1;\n audioEl.addEventListener('progress', () => {\n delete audioEl.dataset.patchForSafariInProgress;\n audioEl.currentTime = t;\n if (audioEl.paused) {\n audioEl.play();\n }\n }, { once: true });\n\n audioEl.removeEventListener('progress', onProgress);\n }\n\n audioEl.addEventListener('progress', onProgress);\n }, { once: true });\n\n audioEl.dataset.patchedForSafari = 'true';\n}\n\nexport function isSafariPatchInProgress(audioEl: HTMLAudioElement) {\n return Boolean(audioEl.dataset.patchForSafariInProgress);\n}\n","import { useLayoutEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n return useLayoutEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n};\n","import React, {\n FC, useCallback, useEffect, useState, memo, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getDocumentExtension, getDocumentHasPreview } from './helpers/documentInfo';\nimport { getMediaTransferState, getMessageMediaHash, getMessageMediaThumbDataUri } from '../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../hooks/useMedia';\nimport download from '../../util/download';\n\nimport File from './File';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n smaller?: boolean;\n isSelected?: boolean;\n isSelectable?: boolean;\n uploadProgress?: number;\n withDate?: boolean;\n datetime?: number;\n className?: string;\n sender?: string;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: number) => void;\n};\n\nconst Document: FC = ({\n message,\n observeIntersection,\n smaller,\n uploadProgress,\n withDate,\n datetime,\n className,\n sender,\n isSelected,\n isSelectable,\n onCancelUpload,\n onDateClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const document = message.content.document!;\n const extension = getDocumentExtension(document) || '';\n const { fileName, size, timestamp } = document;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, 'download'), !isDownloadAllowed);\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, isDownloadAllowed);\n\n const hasPreview = getDocumentHasPreview(document);\n const thumbDataUri = hasPreview ? getMessageMediaThumbDataUri(message) : undefined;\n const localBlobUrl = hasPreview ? document.previewBlobUrl : undefined;\n const previewData = useMedia(getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [isUploading, onCancelUpload]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n useEffect(() => {\n if (isDownloadAllowed && mediaData) {\n download(mediaData, fileName);\n setIsDownloadAllowed(false);\n }\n }, [fileName, mediaData, isDownloadAllowed]);\n\n return (\n \n );\n};\n\nexport default memo(Document);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './StickerSetModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst StickerSetModalAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerSetModal = useModuleLoader(Bundles.Extra, 'StickerSetModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSetModal ? : undefined;\n};\n\nexport default memo(StickerSetModalAsync);\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useForceUpdate from './useForceUpdate';\nimport { IS_CANVAS_FILTER_SUPPORTED } from '../util/environment';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useCanvasBlur(dataUri?: string, isDisabled = false, withRaf?: boolean) {\n // eslint-disable-next-line no-null/no-null\n const canvasRef = useRef(null);\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n const canvas = canvasRef.current;\n\n if (!dataUri || !canvas || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n const processBlur = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', { alpha: false })!;\n\n if (IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${RADIUS}px)`;\n }\n\n ctx.drawImage(img, -RADIUS * 2, -RADIUS * 2, canvas.width + RADIUS * 4, canvas.height + RADIUS * 4);\n\n if (!IS_CANVAS_FILTER_SUPPORTED) {\n fastBlur(ctx, 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n }\n };\n\n img.onload = () => {\n if (withRaf) {\n requestAnimationFrame(processBlur);\n } else {\n processBlur();\n }\n };\n\n img.src = dataUri;\n }, [canvasRef, dataUri, forceUpdate, isDisabled, withRaf]);\n\n return canvasRef;\n}\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n/* eslint-disable no-multi-assign */\n/* eslint-disable no-cond-assign */\n/* eslint-disable no-param-reassign */\n/* eslint-disable prefer-const */\n/* eslint-disable eqeqeq */\n\n/*\nSuperfast Blur - a fast Box Blur For Canvas\n\nVersion: 0.5\nAuthor: Mario Klingemann\nContact: mario@quasimondo.com\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\nTwitter: @quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr:\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2011 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// eslint-disable-next-line max-len\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\n// eslint-disable-next-line max-len\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\n\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\n if (Number.isNaN(radius) || radius < 1) return;\n\n radius |= 0;\n\n if (Number.isNaN(iterations)) iterations = 1;\n iterations |= 0;\n if (iterations > 3) iterations = 3;\n if (iterations < 1) iterations = 1;\n\n const imageData = context.getImageData(top_x, top_y, width, height);\n\n const pixels = imageData.data;\n\n let rsum;\n let gsum;\n let bsum;\n let x;\n let y;\n let i;\n let p;\n let p1;\n let p2;\n let yp;\n let yi;\n let yw;\n let wm = width - 1;\n let hm = height - 1;\n let rad1 = radius + 1;\n\n let r = [];\n let g = [];\n let b = [];\n\n let mul_sum = mul_table[radius];\n let shg_sum = shg_table[radius];\n\n let vmin = [];\n let vmax = [];\n\n while (iterations-- > 0) {\n yw = yi = 0;\n\n for (y = 0; y < height; y++) {\n rsum = pixels[yw] * rad1;\n gsum = pixels[yw + 1] * rad1;\n bsum = pixels[yw + 2] * rad1;\n\n for (i = 1; i <= radius; i++) {\n p = yw + (((i > wm ? wm : i)) << 2);\n rsum += pixels[p++];\n gsum += pixels[p++];\n bsum += pixels[p++];\n }\n\n for (x = 0; x < width; x++) {\n r[yi] = rsum;\n g[yi] = gsum;\n b[yi] = bsum;\n\n if (y == 0) {\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\n }\n\n p1 = yw + vmin[x];\n p2 = yw + vmax[x];\n\n rsum += pixels[p1++] - pixels[p2++];\n gsum += pixels[p1++] - pixels[p2++];\n bsum += pixels[p1++] - pixels[p2++];\n\n yi++;\n }\n yw += (width << 2);\n }\n\n for (x = 0; x < width; x++) {\n yp = x;\n rsum = r[yp] * rad1;\n gsum = g[yp] * rad1;\n bsum = b[yp] * rad1;\n\n for (i = 1; i <= radius; i++) {\n yp += (i > hm ? 0 : width);\n rsum += r[yp];\n gsum += g[yp];\n bsum += b[yp];\n }\n\n yi = x << 2;\n for (y = 0; y < height; y++) {\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\n\n if (x == 0) {\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\n }\n\n p1 = x + vmin[y];\n p2 = x + vmax[y];\n\n rsum += r[p1] - r[p2];\n gsum += g[p1] - g[p2];\n bsum += b[p1] - b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n context.putImageData(imageData, top_x, top_y);\n}\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IAnchorPosition } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useVirtualBackdrop from '../../../hooks/useVirtualBackdrop';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\nimport './TextFormatter.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n anchorPosition?: IAnchorPosition;\n selectedRange?: Range;\n onClose: () => void;\n};\n\ninterface ISelectedTextFormats {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n monospace?: boolean;\n}\n\nconst TEXT_FORMAT_BY_TAG_NAME: Record = {\n B: 'bold',\n STRONG: 'bold',\n I: 'italic',\n EM: 'italic',\n U: 'underline',\n DEL: 'strikethrough',\n CODE: 'monospace',\n};\n\nconst TextFormatter: FC = ({\n isOpen,\n anchorPosition,\n selectedRange,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const linkUrlInputRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n const [isLinkControlOpen, openLinkControl, closeLinkControl] = useFlag();\n const [linkUrl, setLinkUrl] = useState('');\n const [isEditingLink, setIsEditingLink] = useState(false);\n const [inputClassName, setInputClassName] = useState();\n const [selectedTextFormats, setSelectedTextFormats] = useState({});\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\n useVirtualBackdrop(\n isOpen,\n containerRef,\n onClose,\n );\n\n useEffect(() => {\n if (isLinkControlOpen) {\n linkUrlInputRef.current!.focus();\n } else {\n setLinkUrl('');\n setIsEditingLink(false);\n }\n }, [isLinkControlOpen]);\n\n useEffect(() => {\n if (!shouldRender) {\n closeLinkControl();\n setSelectedTextFormats({});\n setInputClassName(undefined);\n }\n }, [closeLinkControl, shouldRender]);\n\n useEffect(() => {\n if (!isOpen || !selectedRange) {\n return;\n }\n\n const selectedFormats: ISelectedTextFormats = {};\n let { parentElement } = selectedRange.commonAncestorContainer;\n while (parentElement && parentElement.id !== EDITABLE_INPUT_ID) {\n const textFormat = TEXT_FORMAT_BY_TAG_NAME[parentElement.tagName];\n if (textFormat) {\n selectedFormats[textFormat] = true;\n }\n\n parentElement = parentElement.parentElement;\n }\n\n setSelectedTextFormats(selectedFormats);\n }, [isOpen, selectedRange, openLinkControl]);\n\n function restoreSelection() {\n if (!selectedRange) {\n return;\n }\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(selectedRange);\n }\n }\n\n const getSelectedText = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.toString();\n }, [selectedRange]);\n\n const getSelectedElement = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.commonAncestorContainer.parentElement;\n }, [selectedRange]);\n\n function updateInputStyles() {\n const input = linkUrlInputRef.current;\n if (!input) {\n return;\n }\n\n const { offsetWidth, scrollWidth, scrollLeft } = input;\n if (scrollWidth <= offsetWidth) {\n setInputClassName(undefined);\n return;\n }\n\n let className = '';\n if (scrollLeft < scrollWidth - offsetWidth) {\n className = 'mask-right';\n }\n if (scrollLeft > 0) {\n className += ' mask-left';\n }\n\n setInputClassName(className);\n }\n\n function handleLinkUrlChange(e: React.ChangeEvent) {\n setLinkUrl(e.target.value);\n updateInputStyles();\n }\n\n function getFormatButtonClassName(key: keyof ISelectedTextFormats) {\n if (selectedTextFormats[key]) {\n return 'active';\n }\n\n if (key === 'monospace' || key === 'strikethrough') {\n if (Object.keys(selectedTextFormats).some(\n (fKey) => fKey !== key && !!selectedTextFormats[fKey as keyof ISelectedTextFormats],\n )) {\n return 'disabled';\n }\n } else if (selectedTextFormats.monospace || selectedTextFormats.strikethrough) {\n return 'disabled';\n }\n\n return undefined;\n }\n\n const handleBoldText = useCallback(() => {\n setSelectedTextFormats((selectedFormats) => {\n // Somehow re-applying 'bold' command to already bold text doesn't work\n document.execCommand(selectedFormats.bold ? 'removeFormat' : 'bold');\n Object.keys(selectedFormats).forEach((key) => {\n if ((key === 'italic' || key === 'underline') && !!selectedFormats[key]) {\n document.execCommand(key);\n }\n });\n\n return {\n ...selectedFormats,\n bold: !selectedFormats.bold,\n };\n });\n }, []);\n\n const handleItalicText = useCallback(() => {\n document.execCommand('italic');\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n italic: !selectedFormats.italic,\n }));\n }, []);\n\n const handleUnderlineText = useCallback(() => {\n document.execCommand('underline');\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n underline: !selectedFormats.underline,\n }));\n }, []);\n\n const handleStrikethroughText = useCallback(() => {\n if (selectedTextFormats.strikethrough) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'DEL'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n strikethrough: false,\n }));\n\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.strikethrough,\n ]);\n\n const handleMonospaceText = useCallback(() => {\n if (selectedTextFormats.monospace) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'CODE'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n monospace: false,\n }));\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.monospace,\n ]);\n\n function handleLinkUrlConfirm() {\n const formattedLinkUrl = linkUrl.includes('://') ? linkUrl : `http://${linkUrl}`;\n\n if (isEditingLink) {\n const element = getSelectedElement();\n if (!element || element.tagName !== 'A') {\n return;\n }\n\n (element as HTMLAnchorElement).href = formattedLinkUrl;\n\n onClose();\n return;\n }\n\n const text = getSelectedText();\n restoreSelection();\n document.execCommand(\n 'insertHTML',\n false,\n `${text}`,\n );\n onClose();\n }\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n const HANDLERS_BY_KEY_CODE: Record = {\n KeyK: openLinkControl,\n KeyB: handleBoldText,\n KeyU: handleUnderlineText,\n KeyI: handleItalicText,\n KeyM: handleMonospaceText,\n KeyS: handleStrikethroughText,\n };\n\n const handler = HANDLERS_BY_KEY_CODE[e.code];\n\n if (\n e.altKey\n || !(e.ctrlKey || e.metaKey)\n || !handler\n ) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n handler();\n }, [\n handleBoldText, handleItalicText, handleUnderlineText,\n handleMonospaceText, handleStrikethroughText,\n openLinkControl,\n ]);\n\n useEffect(() => {\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, handleKeyDown]);\n\n const lang = useLang();\n\n function handleContainerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' && isLinkControlOpen) {\n handleLinkUrlConfirm();\n e.preventDefault();\n }\n }\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'TextFormatter',\n transitionClassNames,\n isLinkControlOpen && 'link-control-shown',\n );\n\n const linkUrlConfirmClassName = buildClassName(\n 'TextFormatter-link-url-confirm',\n !!linkUrl.length && 'shown',\n );\n\n const style = anchorPosition\n ? `left: ${anchorPosition.x}px; top: ${anchorPosition.y}px;--text-formatter-left: ${anchorPosition.x}px;`\n : '';\n\n return (\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n\n
\n
\n \n
\n\n \n \n
\n\n
\n
\n \n \n \n
\n
\n
\n
\n );\n};\n\nexport default memo(TextFormatter);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport {\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n} from '../../modules/helpers';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\n\nimport './Media.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n idPrefix?: string;\n onClick?: (messageId: number, chatId: number) => void;\n};\n\nconst Media: FC = ({ message, idPrefix = 'shared-media', onClick }) => {\n const handleClick = useCallback(() => {\n onClick!(message.id, message.chatId);\n }, [message.id, message.chatId, onClick]);\n\n const thumbDataUri = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(mediaBlobUrl, 'slow');\n\n const video = getMessageVideo(message);\n\n return (\n
\n {shouldRenderThumb && (\n \"\"\n )}\n {shouldRenderFullMedia && (\n \"\"\n )}\n {video && {video.isGif ? 'GIF' : formatMediaDuration(video.duration)}}\n
\n );\n};\n\nexport default memo(Media);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiAudio, ApiMessage, ApiVoice,\n} from '../../api/types';\nimport { ISettings } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat';\nimport {\n getMediaDuration,\n getMediaTransferState,\n getMessageAudioCaption,\n getMessageKey,\n getMessageMediaFormat,\n getMessageMediaHash,\n isMessageLocal,\n isOwnMessage,\n} from '../../modules/helpers';\nimport { renderWaveformToDataUri } from './helpers/waveform';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport { decodeWaveform, interpolateArray } from '../../util/waveform';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport useMediaDownload from '../../hooks/useMediaDownload';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './Audio.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n uploadProgress?: number;\n renderingFor?: 'searchResult' | 'sharedMedia';\n date?: number;\n lastSyncTime?: number;\n className?: string;\n isSelectable?: boolean;\n isSelected?: boolean;\n onPlay: (messageId: number, chatId: number) => void;\n onReadMedia?: () => void;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: number) => void;\n};\n\ntype StateProps = {\n theme: ISettings['theme'];\n};\n\ninterface ISeekMethods {\n handleStartSeek: (e: React.MouseEvent) => void;\n handleSeek: (e: React.MouseEvent) => void;\n handleStopSeek: () => void;\n}\n\nconst AVG_VOICE_DURATION = 30;\nconst MIN_SPIKES = IS_MOBILE_SCREEN ? 20 : 25;\nconst MAX_SPIKES = IS_MOBILE_SCREEN ? 50 : 75;\n// This is needed for browsers requiring user interaction before playing.\nconst PRELOAD = true;\n\nconst Audio: FC = ({\n theme,\n message,\n senderTitle,\n uploadProgress,\n renderingFor,\n date,\n lastSyncTime,\n className,\n isSelectable,\n isSelected,\n onPlay,\n onReadMedia,\n onCancelUpload,\n onDateClick,\n}) => {\n const { content: { audio, voice }, isMediaUnread } = message;\n const isVoice = Boolean(voice);\n const isSeeking = useRef(false);\n const lang = useLang();\n\n const [isActivated, setIsActivated] = useState(false);\n const shouldDownload = (isActivated || PRELOAD) && lastSyncTime;\n\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n );\n\n function handleForcePlay() {\n setIsActivated(true);\n onPlay(message.id, message.chatId);\n }\n\n const {\n isBuffered, bufferedProgress, bufferingHandlers, checkBuffering,\n } = useBuffering();\n\n const {\n isPlaying, playProgress, playPause, setCurrentTime, duration,\n } = useAudioPlayer(\n getMessageKey(message),\n getMediaDuration(message)!,\n mediaData,\n bufferingHandlers,\n checkBuffering,\n isActivated,\n handleForcePlay,\n isMessageLocal(message),\n );\n\n useEffect(() => {\n setIsActivated(isPlaying);\n }, [isPlaying]);\n\n const {\n isDownloadStarted,\n downloadProgress: directDownloadProgress,\n handleDownloadClick,\n } = useMediaDownload(getMessageMediaHash(message, 'download'), getMessageAudioCaption(message));\n\n const isLoadingForPlaying = isActivated && !isBuffered;\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(\n message,\n isDownloadStarted ? directDownloadProgress : (uploadProgress || downloadProgress),\n isLoadingForPlaying || isDownloadStarted,\n );\n\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring);\n\n const handleButtonClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n\n return;\n }\n\n if (!isPlaying) {\n onPlay(message.id, message.chatId);\n }\n\n setIsActivated(!isActivated);\n playPause();\n }, [isPlaying, isUploading, message.id, message.chatId, onCancelUpload, onPlay, playPause, isActivated]);\n\n useEffect(() => {\n if (isPlaying && onReadMedia && isMediaUnread) {\n onReadMedia();\n }\n }, [isPlaying, isMediaUnread, onReadMedia]);\n\n const handleSeek = useCallback((e: React.MouseEvent) => {\n if (isSeeking.current) {\n const seekBar = e.currentTarget.closest('.seekline,.waveform');\n if (seekBar) {\n const { width, left } = seekBar.getBoundingClientRect();\n setCurrentTime(duration * ((e.clientX - left) / width));\n }\n }\n }, [duration, setCurrentTime]);\n\n const handleStartSeek = useCallback((e: React.MouseEvent) => {\n isSeeking.current = true;\n handleSeek(e);\n }, [handleSeek]);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n }, []);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n function getFirstLine() {\n if (isVoice) {\n return senderTitle || 'Voice';\n }\n\n const { title, fileName } = audio!;\n\n return title || fileName;\n }\n\n function getSecondLine() {\n if (isVoice) {\n return formatMediaDuration(voice!.duration);\n }\n\n const { performer } = audio!;\n\n return (\n <>\n {performer && renderText(performer)}\n {performer && senderTitle && }\n {senderTitle && renderText(senderTitle)}\n \n );\n }\n\n const seekHandlers = { handleStartSeek, handleSeek, handleStopSeek };\n const isOwn = isOwnMessage(message);\n const renderedWaveform = useMemo(\n () => voice && renderWaveform(voice, playProgress, isOwn, seekHandlers, theme),\n [voice, playProgress, isOwn, seekHandlers, theme],\n );\n\n const fullClassName = buildClassName(\n 'Audio media-inner',\n className,\n isOwn && !renderingFor && 'own',\n renderingFor && 'bigger',\n isSelected && 'audio-is-selected',\n );\n\n const buttonClassNames = ['toggle-play'];\n if (isLoadingForPlaying) {\n buttonClassNames.push('loading');\n } else if (isPlaying) {\n buttonClassNames.push('pause');\n } else if (!isPlaying) {\n buttonClassNames.push('play');\n }\n\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n const contentClassName = buildClassName('content', showSeekline && 'with-seekline');\n\n function renderSearchResult() {\n return (\n <>\n
\n
\n

{renderText(getFirstLine())}

\n\n
\n {date && (\n \n {formatPastTimeShort(lang, date * 1000)}\n \n )}\n
\n
\n\n {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)}\n {!showSeekline && (\n

\n {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined}\n {getSecondLine()}\n

\n )}\n
\n \n );\n }\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n \n \n \n \n {shouldRenderSpinner && (\n
\n \n
\n )}\n {audio && (\n \n \n \n )}\n {renderingFor === 'searchResult' && renderSearchResult()}\n {renderingFor !== 'searchResult' && audio && renderAudio(\n lang, audio, isPlaying, playProgress, bufferedProgress, seekHandlers, date,\n onDateClick ? handleDateClick : undefined,\n )}\n {renderingFor !== 'searchResult' && voice && renderVoice(voice, renderedWaveform, isMediaUnread)}\n
\n );\n};\n\nfunction renderAudio(\n lang: LangFn,\n audio: ApiAudio,\n isPlaying: boolean,\n playProgress: number,\n bufferedProgress: number,\n seekHandlers: ISeekMethods,\n date?: number,\n handleDateClick?: NoneToVoidFunction,\n) {\n const {\n title, performer, duration, fileName,\n } = audio;\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n\n return (\n
\n

{renderText(title || fileName)}

\n {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)}\n {!showSeekline && (\n
\n {renderText(performer || 'Unknown')}\n {date && (\n <>\n {' '}\n •\n {' '}\n {formatMediaDateTime(lang, date * 1000)}\n \n )}\n
\n )}\n

\n {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined}\n {formatMediaDuration(duration)}\n

\n
\n );\n}\n\nfunction renderVoice(voice: ApiVoice, renderedWaveform: any, isMediaUnread?: boolean) {\n return (\n
\n {renderedWaveform}\n

\n {formatMediaDuration(voice.duration)}\n {isMediaUnread && }\n

\n
\n );\n}\n\nfunction renderWaveform(\n voice: ApiVoice,\n playProgress = 0,\n isOwn = false,\n { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods,\n theme: ISettings['theme'],\n) {\n const { waveform, duration } = voice;\n\n if (!waveform) {\n return undefined;\n }\n\n const fillColor = theme === 'dark' ? '#494B75' : '#CBCBCB';\n const fillOwnColor = theme === 'dark' ? '#C69C85' : '#B0DEA6';\n const progressFillColor = theme === 'dark' ? '#868DF5' : '#54a3e6';\n const progressFillOwnColor = theme === 'dark' ? '#FFFFFF' : '#53ad53';\n const durationFactor = Math.min(duration / AVG_VOICE_DURATION, 1);\n const spikesCount = Math.round(MIN_SPIKES + (MAX_SPIKES - MIN_SPIKES) * durationFactor);\n const decodedWaveform = decodeWaveform(new Uint8Array(waveform));\n const { data: spikes, peak } = interpolateArray(decodedWaveform, spikesCount);\n const { src, width, height } = renderWaveformToDataUri(spikes, playProgress, {\n peak,\n fillStyle: isOwn ? fillOwnColor : fillColor,\n progressFillStyle: isOwn ? progressFillOwnColor : progressFillColor,\n });\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n \n );\n}\n\nfunction renderSeekline(\n playProgress: number,\n bufferedProgress: number,\n { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods,\n) {\n return (\n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nexport default memo(withGlobal((global) => ({ theme: global.settings.byKey.theme }))(Audio));\n","/* eslint-disable no-bitwise */\n\n// eslint-disable-next-line max-len\n// Ref: https://github.com/telegramdesktop/tdesktop/blob/0743e71ab6b928d2ee5bae1aed991849b1e2b291/Telegram/SourceFiles/data/data_document.cpp#L1018\nexport function decodeWaveform(encoded5bit: Uint8Array) {\n const bitsCount = encoded5bit.length * 8;\n const valuesCount = Math.floor(bitsCount / 5);\n if (!valuesCount) {\n return [];\n }\n\n // Read each 5 bit of encoded5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries in a general way except the last one.\n const result = Array(valuesCount);\n const bitsData = encoded5bit;\n for (let i = 0, l = valuesCount - 1; i !== l; ++i) {\n const byteIndex = Math.floor((i * 5) / 8);\n const bitShift = Math.floor((i * 5) % 8);\n const value = bitsData[byteIndex] + (bitsData[byteIndex + 1] << 8);\n result[i] = ((value >> bitShift) & 0x1F);\n }\n const lastByteIndex = Math.floor(((valuesCount - 1) * 5) / 8);\n const lastBitShift = Math.floor(((valuesCount - 1) * 5) % 8);\n const lastValue = bitsData[lastByteIndex] + (bitsData[lastByteIndex + 1] << 8);\n result[valuesCount - 1] = (lastValue >> lastBitShift) & 0x1F;\n\n return result;\n}\n\nexport function interpolateArray(data: number[], fitCount: number) {\n let peak = 0;\n const newData = new Array(fitCount);\n const springFactor = data.length / fitCount;\n const leftFiller = data[0];\n const rightFiller = data[data.length - 1];\n for (let i = 0; i < fitCount; i++) {\n const idx = Math.floor(i * springFactor);\n const val = ((data[idx - 1] ?? leftFiller) + (data[idx] ?? leftFiller) + (data[idx + 1] ?? rightFiller)) / 3;\n newData[i] = val;\n if (peak < val) {\n peak = val;\n }\n }\n return { data: newData, peak };\n}\n","type IWaveformProps = {\n peak: number;\n fillStyle: string;\n progressFillStyle: string;\n};\n\nconst SPIKE_WIDTH = 2;\nconst SPIKE_STEP = 4;\nconst SPIKE_RADIUS = 1;\nconst HEIGHT = 23;\n\nexport function renderWaveformToDataUri(\n spikes: number[],\n progress: number,\n {\n peak, fillStyle, progressFillStyle,\n }: IWaveformProps,\n) {\n const width = spikes.length * SPIKE_STEP;\n const height = HEIGHT;\n\n const canvas = document.createElement('canvas');\n canvas.width = width * 2;\n canvas.height = height * 2;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n\n const ctx = canvas.getContext('2d')!;\n ctx.scale(2, 2);\n\n spikes.forEach((item, i) => {\n ctx.globalAlpha = (i / spikes.length >= progress) ? 0.5 : 1;\n ctx.fillStyle = progress > i / spikes.length ? progressFillStyle : fillStyle;\n const spikeHeight = Math.max(2, HEIGHT * (item / Math.max(1, peak)));\n roundedRectangle(ctx, i * SPIKE_STEP, height, SPIKE_WIDTH, spikeHeight, SPIKE_RADIUS);\n ctx.fill();\n });\n\n return {\n src: canvas.toDataURL(),\n width,\n height,\n };\n}\n\nfunction roundedRectangle(\n ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number,\n) {\n if (width < 2 * radius) {\n radius = width / 2;\n }\n if (height < 2 * radius) {\n radius = height / 2;\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + width, y, x + width, y - height, radius);\n ctx.arcTo(x + width, y - height, x, y - height, radius);\n ctx.arcTo(x, y - height, x, y, radius);\n ctx.arcTo(x, y, x + width, y, radius);\n ctx.closePath();\n}\n","import React, {\n FC, useLayoutEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Tab.scss';\n\ntype OwnProps = {\n className?: string;\n title: string;\n active?: boolean;\n badgeCount?: number;\n isBadgeActive?: boolean;\n previousActiveTab?: number;\n onClick: (arg: number) => void;\n clickArg: number;\n};\n\nconst Tab: FC = ({\n className,\n title,\n active,\n badgeCount,\n isBadgeActive,\n previousActiveTab,\n onClick,\n clickArg,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const tabRef = useRef(null);\n\n useLayoutEffect(() => {\n if (!active || previousActiveTab === undefined) {\n return;\n }\n\n const tab = tabRef.current!;\n const indicator = tab.querySelector('i')!;\n const currentIndicator = tab.parentElement!.children[previousActiveTab].querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement!.offsetLeft - indicator.parentElement!.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // 3 AFs needed here to synchronize animations with Transition component\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n });\n }, [active, previousActiveTab]);\n\n return (\n onClick(clickArg)}\n ref={tabRef}\n >\n \n {title}\n {!!badgeCount && (\n {badgeCount}\n )}\n \n \n \n );\n};\n\nexport default memo(Tab);\n","import React, {\n FC, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport fastSmoothScrollHorizontal from '../../util/fastSmoothScrollHorizontal';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHorizontalScroll from '../../hooks/useHorizontalScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Tab from './Tab';\n\nimport './TabList.scss';\n\nexport type TabWithProperties = {\n title: string;\n badgeCount?: number;\n isBadgeActive?: boolean;\n};\n\ntype OwnProps = {\n tabs: readonly TabWithProperties[];\n activeTab: number;\n big?: boolean;\n onSwitchTab: (index: number) => void;\n};\n\nconst TAB_SCROLL_THRESHOLD_PX = 16;\n\nconst TabList: FC = ({\n tabs, activeTab, big, onSwitchTab,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const previousActiveTab = usePrevious(activeTab);\n\n useHorizontalScroll(containerRef.current);\n\n // Scroll container to place active tab in the center\n useEffect(() => {\n const container = containerRef.current!;\n if (container.scrollWidth <= container.offsetWidth) {\n return;\n }\n\n const activeTabElement = container.querySelector('.Tab.active') as HTMLElement | null;\n if (activeTabElement) {\n const newLeft = activeTabElement.offsetLeft - (container.offsetWidth / 2) + (activeTabElement.offsetWidth / 2);\n\n // Prevent scrolling by only a couple of pixels, which doesn't look smooth\n if (Math.abs(newLeft - container.scrollLeft) < TAB_SCROLL_THRESHOLD_PX) {\n return;\n }\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n }, [activeTab]);\n\n const lang = useLang();\n\n return (\n \n {tabs.map((tab, i) => (\n \n ))}\n
\n );\n};\n\nexport default memo(TabList);\n","import { ApiError } from '../api/types';\n\nconst READABLE_ERROR_MESSAGES: Record = {\n CHAT_RESTRICTED: 'You can\\'t send messages in this chat, you were restricted',\n CHAT_WRITE_FORBIDDEN: 'You can\\'t write in this chat',\n CHAT_SEND_POLL_FORBIDDEN: 'You can\\'t create polls in this chat',\n CHAT_SEND_STICKERS_FORBIDDEN: 'You can\\'t send stickers in this chat',\n CHAT_SEND_GIFS_FORBIDDEN: 'You can\\'t send gifs in this chat',\n CHAT_SEND_MEDIA_FORBIDDEN: 'You can\\'t send media in this chat',\n CHAT_LINK_EXISTS: 'The chat is public, you can\\'t hide the history to new users',\n // eslint-disable-next-line max-len\n SLOWMODE_WAIT_X: 'Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.',\n USER_BANNED_IN_CHANNEL: 'You\\'re banned from sending messages in supergroups / channels',\n USER_IS_BLOCKED: 'You were blocked by this user',\n YOU_BLOCKED_USER: 'You blocked this user',\n IMAGE_PROCESS_FAILED: 'Failure while processing image',\n MEDIA_EMPTY: 'The provided media object is invalid',\n MEDIA_INVALID: 'Media invalid',\n PHOTO_EXT_INVALID: 'The extension of the photo is invalid',\n PHOTO_INVALID_DIMENSIONS: 'The photo dimensions are invalid',\n PHOTO_SAVE_FILE_INVALID: 'Internal issues, try again later',\n // eslint-disable-next-line max-len\n MESSAGE_DELETE_FORBIDDEN: 'You can\\'t delete one of the messages you tried to delete, most likely because it is a service message.',\n MESSAGE_POLL_CLOSED: 'Poll closed',\n MESSAGE_EDIT_TIME_EXPIRED: 'You can\\'t edit this message anymore.',\n CHAT_ADMIN_REQUIRED: 'You must be an admin in this chat to do this',\n PINNED_DIALOGS_TOO_MUCH: 'Sorry, you can only pin 5 chats to the top',\n DIALOG_FILTERS_TOO_MUCH: 'Sorry, you can\\'t have more than 10 folders',\n CHANNEL_PRIVATE: 'This channel is private',\n MEDIA_CAPTION_TOO_LONG: 'The provided caption is too long',\n ADDRESS_STREET_LINE1_INVALID: 'The address you provided is not valid',\n ADDRESS_STREET_LINE2_INVALID: 'The address you provided is not valid',\n ADDRESS_CITY_INVALID: 'The city you provided is not valid',\n ADDRESS_COUNTRY_INVALID: 'The country you provided is not valid',\n ADDRESS_POSTCODE_INVALID: 'The postcode you provided is not valid',\n ADDRESS_STATE_INVALID: 'The state you provided is not valid',\n REQ_INFO_NAME_INVALID: 'The name you provided is not valid',\n REQ_INFO_PHONE_INVALID: 'The phone you provided is not valid',\n REQ_INFO_EMAIL_INVALID: 'The email you provided is not valid',\n // TODO Bring back after fixing the weird bug\n // CHANNEL_INVALID: 'An error occurred. Please try again later',\n LINK_NOT_MODIFIED: 'This discussion is already linked to the channel',\n\n // Non-API errors\n SERVICE_WORKER_DISABLED: 'Service Worker is disabled. Please reload the page without holding key.',\n // eslint-disable-next-line max-len\n CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.',\n // eslint-disable-next-line max-len\n FRESH_RESET_AUTHORISATION_FORBIDDEN: 'You can’t logout other sessions if less than 24 hours have passed since you logged on the current session',\n\n BOTS_TOO_MUCH: 'There are too many bots in this chat/channel',\n BOT_GROUPS_BLOCKED: 'This bot can\\'t be added to groups',\n USERS_TOO_MUCH: 'The maximum number of users has been exceeded',\n USER_CHANNELS_TOO_MUCH: 'One of the users you tried to add is already in too many channels/supergroups',\n USER_KICKED: 'This user was kicked from this supergroup/channel',\n USER_NOT_MUTUAL_CONTACT: 'The provided user is not a mutual contact',\n USER_PRIVACY_RESTRICTED: 'The user\\'s privacy settings do not allow you to do this',\n INVITE_HASH_EMPTY: 'The invite hash is empty',\n INVITE_HASH_EXPIRED: 'The invite link has expired',\n INVITE_HASH_INVALID: 'The invite hash is invalid',\n CHANNELS_TOO_MUCH: 'You have joined too many channels/supergroups',\n USER_ALREADY_PARTICIPANT: 'You already in the group',\n};\n\nexport default function getReadableErrorText(error: ApiError) {\n const { message, isSlowMode, textParams } = error;\n // Currently Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs\n if (isSlowMode) {\n const extraPartIndex = message.indexOf(' (caused by');\n return extraPartIndex > 0 ? message.substring(0, extraPartIndex) : message;\n }\n let errorMessage = READABLE_ERROR_MESSAGES[message];\n if (errorMessage && textParams) {\n errorMessage = Object.keys(textParams).reduce((acc, current) => {\n return acc.replace(current, textParams[current]);\n }, errorMessage as string);\n }\n return errorMessage;\n}\n","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { ApiChat, ApiUser } from '../api/types';\nimport {\n isChatArchived, getCanDeleteChat, isChatPrivate, isChatChannel,\n} from '../modules/helpers';\nimport useLang from './useLang';\n\nexport default ({\n chat,\n privateChatUser,\n handleDelete,\n folderId,\n isPinned,\n}: {\n chat: ApiChat | undefined;\n privateChatUser: ApiUser | undefined;\n handleDelete: () => void;\n folderId?: number;\n isPinned?: boolean;\n}) => {\n const lang = useLang();\n\n const {\n toggleChatPinned,\n updateChatMutedState,\n toggleChatArchived,\n toggleChatUnread,\n } = getDispatch();\n\n return useMemo(() => {\n if (!chat) {\n return undefined;\n }\n\n const isChatWithSelf = privateChatUser && privateChatUser.isSelf;\n\n const actionUnreadMark = chat.unreadCount || chat.hasUnreadMark\n ? { title: lang('MarkAsRead'), icon: 'readchats', handler: () => toggleChatUnread({ id: chat.id }) }\n : { title: lang('MarkAsUnread'), icon: 'unread', handler: () => toggleChatUnread({ id: chat.id }) };\n\n const actionPin = isPinned\n ? {\n title: lang('UnpinFromTop'),\n icon: 'unpin',\n handler: () => toggleChatPinned({ id: chat.id, folderId }),\n }\n : { title: lang('PinToTop'), icon: 'pin', handler: () => toggleChatPinned({ id: chat.id, folderId }) };\n\n const actionMute = chat.isMuted\n ? {\n title: lang('ChatList.Unmute'),\n icon: 'unmute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: false }),\n }\n : {\n title: lang('ChatList.Mute'),\n icon: 'mute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: true }),\n };\n\n const actionArchive = isChatArchived(chat)\n ? { title: lang('Unarchive'), icon: 'unarchive', handler: () => toggleChatArchived({ id: chat.id }) }\n : { title: lang('Archive'), icon: 'archive', handler: () => toggleChatArchived({ id: chat.id }) };\n\n const actionDelete = {\n title: isChatPrivate(chat.id)\n ? lang('Delete')\n : lang(getCanDeleteChat(chat)\n ? 'DeleteChat'\n : (isChatChannel(chat) ? 'LeaveChannel' : 'Group.LeaveGroup')),\n icon: 'delete',\n destructive: true,\n handler: handleDelete,\n };\n\n return [\n actionUnreadMark,\n actionPin,\n ...(!isChatWithSelf ? [\n actionMute,\n actionArchive,\n ] : []),\n actionDelete,\n ];\n }, [\n chat, privateChatUser, lang, isPinned, handleDelete, toggleChatUnread, toggleChatPinned, folderId,\n updateChatMutedState, toggleChatArchived,\n ]);\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../api/types';\n\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport MessageOutgoingStatus from './MessageOutgoingStatus';\n\nimport './LastMessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n};\n\nconst LastMessageMeta: FC = ({ message, outgoingStatus }) => {\n const lang = useLang();\n return (\n
\n {outgoingStatus && (\n \n )}\n {formatPastTimeShort(lang, message.date * 1000)}\n
\n );\n};\n\nexport default memo(LastMessageMeta);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessageOutgoingStatus } from '../../api/types';\n\nimport Transition from '../ui/Transition';\n\nimport './MessageOutgoingStatus.scss';\n\ntype OwnProps = {\n status: ApiMessageOutgoingStatus;\n};\n\nenum Keys {\n failed, pending, succeeded, read,\n}\n\nconst MessageOutgoingStatus: FC = ({ status }) => {\n return (\n
\n \n {() => (\n \n )}\n \n
\n );\n};\n\nexport default memo(MessageOutgoingStatus);\n","import { useState, useEffect } from '../lib/teact/teact';\nimport { IAnchorPosition } from '../types';\n\nexport default (\n anchor: IAnchorPosition | undefined,\n getTriggerElement: () => HTMLElement | null,\n getRootElement: () => HTMLElement | null,\n getMenuElement: () => HTMLElement | null,\n extraPaddingX = 0,\n extraTopPadding = 0,\n) => {\n const [positionX, setPositionX] = useState<'right' | 'left'>('right');\n const [positionY, setPositionY] = useState<'top' | 'bottom'>('bottom');\n const [style, setStyle] = useState('');\n\n useEffect(() => {\n const triggerEl = getTriggerElement();\n if (!anchor || !triggerEl) {\n return;\n }\n\n let { x, y } = anchor;\n const emptyRect = {\n width: 0, left: 0, height: 0, top: 0,\n };\n\n const menuEl = getMenuElement();\n const rootEl = getRootElement();\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const menuRect = menuEl ? { width: menuEl.offsetWidth, height: menuEl.offsetHeight } : emptyRect;\n const rootRect = rootEl ? rootEl.getBoundingClientRect() : emptyRect;\n\n if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) {\n setPositionX('left');\n x += 3;\n } else if (x - menuRect.width > 0) {\n setPositionX('right');\n x -= 3;\n } else {\n setPositionX('left');\n x = 16;\n }\n\n if (y + menuRect.height < rootRect.height + rootRect.top) {\n setPositionY('top');\n } else {\n setPositionY('bottom');\n\n if (y - menuRect.height < rootRect.top + extraTopPadding) {\n y = rootRect.top + extraTopPadding + menuRect.height;\n }\n }\n\n setStyle(`left: ${x - triggerRect.left}px; top: ${y - triggerRect.top}px;`);\n }, [\n anchor, extraPaddingX, extraTopPadding,\n getMenuElement, getRootElement, getTriggerElement,\n ]);\n\n return {\n positionX,\n positionY,\n style,\n };\n};\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\n\ntype ChildrenFn = () => any;\n\ntype OwnProps = {\n isOpen: boolean;\n isCustom?: boolean;\n id?: string;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n children: ChildrenFn;\n};\n\nconst ShowTransition: FC = ({\n isOpen, isCustom, id, className, onClick, children,\n}) => {\n const { shouldRender, transitionClassNames } = useShowTransition(\n isOpen, undefined, undefined, isCustom ? false : undefined,\n );\n const prevIsOpen = usePrevious(isOpen);\n const prevChildren = usePrevious(children);\n const fromChildrenRef = useRef();\n\n if (prevIsOpen && !isOpen) {\n fromChildrenRef.current = prevChildren;\n }\n\n return (\n shouldRender && (\n
\n {isOpen ? children() : fromChildrenRef.current!()}\n
\n )\n );\n};\n\nexport default ShowTransition;\n","import { useRef } from '../lib/teact/teact';\n\nimport usePrevious from './usePrevious';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport default function usePrevDuringAnimation(current: any, duration?: number) {\n const prev = usePrevious(current, true);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n // eslint-disable-next-line no-null/no-null\n const isCurrentPresent = current !== undefined && current !== null;\n // eslint-disable-next-line no-null/no-null\n const isPrevPresent = prev !== undefined && prev !== null;\n\n if (isCurrentPresent && timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useOnChange(() => {\n // When `current` becomes empty\n if (duration && !isCurrentPresent && isPrevPresent && !timeoutRef.current) {\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = undefined;\n forceUpdate();\n }, duration);\n }\n }, [current]);\n\n return !timeoutRef.current || !duration || isCurrentPresent ? current : prev;\n}\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { register } from '../util/audioPlayer';\nimport useEffectWithPrevDeps from './useEffectWithPrevDeps';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\nimport useOnChange from './useOnChange';\n\ntype Handler = (e: Event) => void;\n\nexport default (\n trackId: string,\n originalDuration: number, // Sometimes incorrect for voice messages\n src?: string,\n handlers?: Record,\n onInit?: (element: HTMLAudioElement) => void,\n shouldPlay = false,\n onForcePlay?: NoneToVoidFunction,\n noPlaylist = false,\n) => {\n // eslint-disable-next-line no-null/no-null\n const controllerRef = useRef>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n let isPlayingSync = isPlaying;\n\n const [playProgress, setPlayProgress] = useState(0);\n\n useOnChange(() => {\n controllerRef.current = register(trackId, (eventName, e) => {\n switch (eventName) {\n case 'onPlay':\n setIsPlaying(true);\n break;\n case 'onPause':\n setIsPlaying(false);\n break;\n case 'onTimeUpdate': {\n const { proxy } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n setPlayProgress(proxy.currentTime / duration);\n break;\n }\n }\n\n if (handlers && handlers[eventName]) {\n handlers[eventName](e);\n }\n }, onForcePlay);\n\n const { proxy } = controllerRef.current!;\n\n if (!isPlaying && !proxy.paused) {\n setIsPlaying(true);\n isPlayingSync = true;\n }\n\n if (onInit) {\n onInit(proxy);\n }\n }, [trackId]);\n\n const {\n play, pause, setCurrentTime, proxy, destroy,\n } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n\n // RAF progress\n useEffect(() => {\n if (duration && !isSafariPatchInProgress(proxy)) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, playProgress, proxy]);\n\n // Cleanup\n useEffect(() => () => {\n destroy(noPlaylist);\n }, [destroy, noPlaylist]);\n\n // Autoplay once `src` is present\n useEffectWithPrevDeps(([prevShouldPlay, prevSrc]) => {\n if (prevShouldPlay === shouldPlay && src === prevSrc) {\n return;\n }\n\n // When paused by another player\n if (proxy.src && proxy.paused) {\n return;\n }\n\n if (shouldPlay && src && !isPlaying) {\n play(src);\n }\n }, [shouldPlay, src, isPlaying, play, proxy.src, proxy.paused]);\n\n const playPause = useCallback(() => {\n if (isPlaying) {\n pause();\n } else if (src) {\n play(src);\n }\n }, [src, pause, play, isPlaying]);\n\n return {\n isPlaying: isPlayingSync,\n playProgress,\n playPause,\n setCurrentTime,\n audioProxy: proxy,\n duration,\n };\n};\n","import { IS_SAFARI } from './environment';\nimport safePlay from './safePlay';\nimport { patchSafariProgressiveAudio, isSafariPatchInProgress } from './patchSafariProgressiveAudio';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { parseMessageKey } from '../modules/helpers';\n\ntype Handler = (eventName: string, e: Event) => void;\n\ninterface Track {\n audio: HTMLAudioElement;\n proxy: HTMLAudioElement;\n handlers: Handler[];\n onForcePlay?: NoneToVoidFunction;\n}\n\nconst tracks = new Map();\nlet queue: string[] = [];\n\nlet currentTrackId: string | undefined;\n\nfunction createAudio(trackId: string, onForcePlay?: NoneToVoidFunction) {\n const audio = new Audio();\n\n function handleEvent(eventName: string) {\n return (e: Event) => {\n if (!tracks.has(trackId)) {\n return;\n }\n\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n tracks.get(trackId)!.handlers.forEach((handler) => {\n handler(eventName, e);\n });\n };\n }\n\n audio.addEventListener('timeupdate', handleEvent('onTimeUpdate'));\n audio.addEventListener('play', handleEvent('onPlay'));\n audio.addEventListener('pause', handleEvent('onPause'));\n audio.addEventListener('loadstart', handleEvent('onLoadStart'));\n audio.addEventListener('loadeddata', handleEvent('onLoadedData'));\n audio.addEventListener('playing', handleEvent('onPlaying'));\n audio.addEventListener('ended', () => {\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n const nextTrackId = queue[queue.indexOf(trackId) + 1];\n if (!nextTrackId) {\n return;\n }\n\n if (!tracks.has(nextTrackId)) {\n // A bit hacky way to continue playlist when switching chat\n getDispatch().openAudioPlayer(parseMessageKey(nextTrackId));\n\n return;\n }\n\n const nextTrack = tracks.get(nextTrackId)!;\n\n if (nextTrack.onForcePlay) {\n nextTrack.onForcePlay();\n }\n\n currentTrackId = nextTrackId;\n\n if (nextTrack.audio.src) {\n safePlay(nextTrack.audio);\n }\n });\n\n return {\n audio,\n proxy: new Proxy(audio, {\n get: (origin, key: keyof HTMLAudioElement) => origin[key],\n }),\n handlers: [],\n onForcePlay,\n };\n}\n\nexport function stopCurrentAudio() {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n }\n}\n\nexport function register(trackId: string, handler: Handler, onForcePlay?: NoneToVoidFunction) {\n if (!tracks.has(trackId)) {\n tracks.set(trackId, createAudio(trackId, onForcePlay));\n\n if (!queue.includes(trackId)) {\n queue.push(trackId);\n }\n }\n\n const { audio, proxy, handlers } = tracks.get(trackId)!;\n\n handlers.push(handler);\n\n return {\n play(src: string) {\n if (currentTrackId && currentTrackId !== trackId) {\n tracks.get(currentTrackId)!.audio.pause();\n }\n\n currentTrackId = trackId;\n\n if (!audio.src) {\n audio.src = src;\n audio.preload = 'auto';\n\n if (src.includes('/progressive/') && IS_SAFARI) {\n patchSafariProgressiveAudio(audio);\n }\n }\n\n safePlay(audio);\n },\n\n pause() {\n if (currentTrackId === trackId) {\n audio.pause();\n }\n },\n\n setCurrentTime(time: number) {\n if (currentTrackId === trackId) {\n audio.currentTime = time;\n }\n },\n\n proxy,\n\n destroy(shouldRemoveFromQueue = false) {\n const track = tracks.get(trackId);\n if (!track) {\n return;\n }\n\n track.handlers = track.handlers.filter((h) => h !== handler);\n\n if (!track.handlers.length) {\n track.audio.pause();\n tracks.delete(trackId);\n\n if (shouldRemoveFromQueue) {\n queue = queue.filter((id) => id !== trackId);\n }\n\n if (trackId === currentTrackId) {\n currentTrackId = undefined;\n }\n }\n },\n };\n}\n","export default function download(url: string, filename: string) {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n}\n","import { RefObject } from 'react';\nimport React, { FC, memo, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport buildClassName from '../../util/buildClassName';\nimport { formatMediaDateTime, formatPastTimeShort } from '../../util/dateFormat';\nimport { getColorFromExtension, getFileSizeString } from './helpers/documentInfo';\nimport { getDocumentThumbnailDimensions } from './helpers/mediaDimensions';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './File.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n name: string;\n extension?: string;\n size: number;\n timestamp?: number;\n sender?: string;\n thumbnailDataUri?: string;\n previewData?: string;\n className?: string;\n smaller?: boolean;\n isTransferring?: boolean;\n isUploading?: boolean;\n isSelectable?: boolean;\n isSelected?: boolean;\n transferProgress?: number;\n onClick?: () => void;\n onDateClick?: (e: React.MouseEvent) => void;\n};\n\nconst File: FC = ({\n ref,\n name,\n size,\n extension = '',\n timestamp,\n sender,\n thumbnailDataUri,\n previewData,\n className,\n smaller,\n isTransferring,\n isUploading,\n isSelectable,\n isSelected,\n transferProgress,\n onClick,\n onDateClick,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, true);\n const color = getColorFromExtension(extension);\n const sizeString = getFileSizeString(size);\n\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewData, 'slow');\n const { width, height } = getDocumentThumbnailDimensions(smaller);\n\n const fullClassName = buildClassName(\n 'File',\n className,\n smaller && 'smaller',\n onClick && !isUploading && 'interactive',\n isSelected && 'file-is-selected',\n );\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n
\n {thumbnailDataUri || previewData ? (\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n
\n ) : (\n
\n {extension.length <= 4 && (\n {extension}\n )}\n
\n )}\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {onClick && }\n
\n
\n
{renderText(name)}
\n
\n \n {isTransferring && transferProgress ? `${Math.round(transferProgress * 100)}%` : sizeString}\n \n {sender && {renderText(sender)}}\n {!sender && timestamp && (\n <>\n {' '}\n {formatMediaDateTime(lang, timestamp * 1000)}\n \n )}\n
\n
\n {sender && timestamp && (\n {formatPastTimeShort(lang, timestamp * 1000)}\n )}\n
\n );\n};\n\nexport default memo(File);\n","import React, { useCallback, useEffect, useState } from '../lib/teact/teact';\n\nimport useMediaWithDownloadProgress from './useMediaWithDownloadProgress';\nimport download from '../util/download';\n\nexport default function useMediaDownload(\n mediaHash?: string,\n fileName?: string,\n) {\n const [isDownloadStarted, setIsDownloadStarted] = useState(false);\n\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(mediaHash, !isDownloadStarted);\n\n // Download with browser when fully loaded\n useEffect(() => {\n if (isDownloadStarted && mediaData) {\n download(mediaData, fileName!);\n setIsDownloadStarted(false);\n }\n }, [fileName, mediaData, isDownloadStarted]);\n\n // Cancel download on source change\n useEffect(() => {\n setIsDownloadStarted(false);\n }, [mediaHash]);\n\n const handleDownloadClick = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n setIsDownloadStarted((isAllowed) => !isAllowed);\n }, []);\n\n return {\n isDownloadStarted,\n downloadProgress,\n handleDownloadClick,\n };\n}\n","import React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../lib/teact/teact';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\n\nimport Portal from './Portal';\n\nimport './Notification.scss';\n\ntype OwnProps = {\n containerId?: string;\n message: TextPart[];\n duration?: number;\n onDismiss: () => void;\n};\n\nconst DEFAULT_DURATION = 3000;\nconst ANIMATION_DURATION = 150;\n\nconst Notification: FC = ({\n message, duration = DEFAULT_DURATION, containerId, onDismiss,\n}) => {\n const [isOpen, setIsOpen] = useState(true);\n // eslint-disable-next-line no-null/no-null\n const timerRef = useRef(null);\n\n const { transitionClassNames } = useShowTransition(isOpen);\n\n const closeAndDismiss = useCallback(() => {\n setIsOpen(false);\n setTimeout(onDismiss, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [onDismiss]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(closeAndDismiss) : undefined), [isOpen, closeAndDismiss]);\n\n useEffect(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n };\n }, [duration, closeAndDismiss]);\n\n const handleMouseEnter = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n }, [duration, closeAndDismiss]);\n\n return (\n \n \n
\n {message}\n
\n \n
\n );\n};\n\nexport default memo(Notification);\n","import { EDITABLE_INPUT_ID } from '../../../../config';\n\nconst MAX_NESTING_PARENTS = 5;\n\nexport function isSelectionInsideInput(selectionRange: Range) {\n const { commonAncestorContainer } = selectionRange;\n let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement;\n let iterations = 1;\n while (parentNode && parentNode.id !== EDITABLE_INPUT_ID && iterations < MAX_NESTING_PARENTS) {\n parentNode = parentNode.parentElement;\n iterations++;\n }\n\n return Boolean(parentNode && parentNode.id === EDITABLE_INPUT_ID);\n}\n","import {\n useCallback, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport {\n EmojiData, EmojiModule, EmojiRawData, uncompressEmoji,\n} from '../../../../util/emoji';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport {\n buildCollectionByKey, flatten, mapValues, pickTruthy, unique,\n} from '../../../../util/iteratees';\nimport useFlag from '../../../../hooks/useFlag';\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst RE_NOT_EMOJI_SEARCH = /[^-_:\\p{L}\\p{N}]+/iu;\nconst EMOJIS_LIMIT = 36;\n\nexport default function useEmojiTooltip(\n isAllowed: boolean,\n html: string,\n recentEmojiIds: string[],\n inputId = EDITABLE_INPUT_ID,\n onUpdateHtml: (html: string) => void,\n emojiKeywords?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n\n const [byId, setById] = useState | undefined>();\n const [byKeyword, setByKeyword] = useState>({});\n const [byName, setByName] = useState>({});\n\n const [filteredEmojis, setFilteredEmojis] = useState([]);\n\n const recentEmojis = useMemo(\n () => {\n if (!byId || !recentEmojiIds.length) {\n return [];\n }\n\n return Object.values(pickTruthy(byId, recentEmojiIds));\n },\n [byId, recentEmojiIds],\n );\n\n // Initialize data on first render.\n useEffect(() => {\n const exec = () => {\n setById(emojiData.emojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, []);\n\n useEffect(() => {\n if (!byId) {\n return;\n }\n\n const emojis = Object.values(byId);\n\n if (emojiKeywords) {\n const byNative = buildCollectionByKey(emojis, 'native');\n setByKeyword(mapValues(emojiKeywords, (natives) => {\n return Object.values(pickTruthy(byNative, natives));\n }));\n }\n\n setByName(emojis.reduce((result, emoji) => {\n emoji.names.forEach((name) => {\n if (!result[name]) {\n result[name] = [];\n }\n\n result[name].push(emoji);\n });\n\n return result;\n }, {} as Record));\n }, [byId, emojiKeywords]);\n\n useEffect(() => {\n if (!isAllowed || !html || !byId) {\n unmarkIsOpen();\n return;\n }\n\n const code = getEmojiCode(html);\n if (!code) {\n setFilteredEmojis([]);\n unmarkIsOpen();\n return;\n }\n\n const filter = code.substr(1);\n let matched: Emoji[] = [];\n\n if (!filter) {\n matched = recentEmojis;\n } else {\n const matchedKeywords = Object.keys(byKeyword).filter((keyword) => keyword.startsWith(filter));\n matched = matched.concat(flatten(Object.values(pickTruthy(byKeyword, matchedKeywords))));\n\n // Also search by names, which is useful for non-English languages\n const matchedNames = Object.keys(byName).filter((name) => name.startsWith(filter));\n matched = matched.concat(flatten(Object.values(pickTruthy(byName, matchedNames))));\n\n matched = unique(matched);\n }\n\n if (matched.length) {\n markIsOpen();\n setFilteredEmojis(matched.slice(0, EMOJIS_LIMIT));\n } else {\n unmarkIsOpen();\n }\n }, [byId, byKeyword, byName, html, isAllowed, markIsOpen, recentEmojis, unmarkIsOpen]);\n\n const insertEmoji = useCallback((textEmoji: string) => {\n const atIndex = html.lastIndexOf(':');\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${textEmoji}`);\n const messageInput = document.getElementById(inputId)!;\n if (!IS_MOBILE_SCREEN) {\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, true);\n });\n }\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isEmojiTooltipOpen: isOpen,\n closeEmojiTooltip: unmarkIsOpen,\n filteredEmojis,\n insertEmoji,\n };\n}\n\nfunction getEmojiCode(html: string) {\n const tempEl = document.createElement('div');\n tempEl.innerHTML = html.replace('
', '\\n');\n const text = tempEl.innerText;\n\n const lastSymbol = text[text.length - 1];\n const lastWord = text.split(RE_NOT_EMOJI_SEARCH).pop();\n\n if (\n !text.length || RE_NOT_EMOJI_SEARCH.test(lastSymbol)\n || !lastWord || !lastWord.startsWith(':')\n ) {\n return undefined;\n }\n\n return lastWord.toLowerCase();\n}\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './EmojiTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst EmojiTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const EmojiTooltip = useModuleLoader(Bundles.Extra, 'EmojiTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return EmojiTooltip ? : undefined;\n};\n\nexport default memo(EmojiTooltipAsync);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useEffect, useRef, memo, useState, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { IAnchorPosition, ISettings } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { selectCurrentMessageList, selectReplyingToId } from '../../../modules/selectors';\nimport { debounce } from '../../../util/schedulers';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport {\n IS_ANDROID, IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport useLayoutEffectWithPrevDeps from '../../../hooks/useLayoutEffectWithPrevDeps';\nimport useFlag from '../../../hooks/useFlag';\nimport parseEmojiOnlyString from '../../common/helpers/parseEmojiOnlyString';\nimport { isSelectionInsideInput } from './helpers/selection';\nimport useLang from '../../../hooks/useLang';\n\nimport TextFormatter from './TextFormatter';\n\nconst CONTEXT_MENU_CLOSE_DELAY_MS = 100;\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 350;\nconst TRANSITION_DURATION_FACTOR = 50;\n\ntype OwnProps = {\n id: string;\n editableInputId?: string;\n html: string;\n placeholder: string;\n shouldSetFocus: boolean;\n shouldSupressFocus?: boolean;\n shouldSupressTextFormatter?: boolean;\n onUpdate: (html: string) => void;\n onSupressedFocus?: () => void;\n onSend: () => void;\n};\n\ntype StateProps = {\n currentChatId?: number;\n replyingToId?: number;\n noTabCapture?: boolean;\n messageSendKeyCombo?: ISettings['messageSendKeyCombo'];\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_INPUT_HEIGHT = IS_MOBILE_SCREEN ? 256 : 416;\nconst TAB_INDEX_PRIORITY_TIMEOUT = 2000;\nconst TEXT_FORMATTER_SAFE_AREA_PX = 90;\n// For some reason Safari inserts `
` after user removes text from input\nconst SAFARI_BR = '
';\n\nfunction clearSelection() {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n } else if (selection.empty) {\n selection.empty();\n }\n}\n\nconst MessageInput: FC = ({\n id,\n editableInputId,\n html,\n placeholder,\n shouldSetFocus,\n shouldSupressFocus,\n shouldSupressTextFormatter,\n onUpdate,\n onSupressedFocus,\n onSend,\n currentChatId,\n replyingToId,\n noTabCapture,\n messageSendKeyCombo,\n editLastMessage,\n replyToNextMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const cloneRef = useRef(null);\n\n const lang = useLang();\n const isContextMenuOpenRef = useRef(false);\n const [isTextFormatterOpen, openTextFormatter, closeTextFormatter] = useFlag();\n const [textFormatterAnchorPosition, setTextFormatterAnchorPosition] = useState();\n const [selectedRange, setSelectedRange] = useState();\n\n useEffect(() => {\n updateInputHeight(false);\n }, []);\n\n useLayoutEffectWithPrevDeps(([prevHtml]) => {\n if (html !== inputRef.current!.innerHTML) {\n inputRef.current!.innerHTML = html;\n }\n\n if (html !== cloneRef.current!.innerHTML) {\n cloneRef.current!.innerHTML = html;\n }\n\n if (prevHtml !== undefined && prevHtml !== html) {\n updateInputHeight(!html.length);\n }\n }, [html]);\n\n const focusInput = useCallback(() => {\n // Avoid focusing during animation\n if (inputRef.current!.closest('.from, .to')) {\n setTimeout(focusInput, FOCUS_DELAY_MS);\n return;\n }\n\n focusEditableElement(inputRef.current!);\n }, []);\n\n const handleCloseTextFormatter = useCallback(() => {\n closeTextFormatter();\n clearSelection();\n }, [closeTextFormatter]);\n\n function checkSelection() {\n // Disable the formatter on iOS devices for now.\n if (IS_IOS) {\n return;\n }\n\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount || isContextMenuOpenRef.current) {\n closeTextFormatter();\n return;\n }\n\n const selectionRange = selection.getRangeAt(0);\n const selectedText = selectionRange.toString().trim();\n if (\n shouldSupressTextFormatter\n || !isSelectionInsideInput(selectionRange)\n || !selectedText\n || parseEmojiOnlyString(selectedText)\n || !selectionRange.START_TO_END\n ) {\n closeTextFormatter();\n return;\n }\n\n const selectionRect = selectionRange.getBoundingClientRect();\n const inputRect = inputRef.current!.getBoundingClientRect();\n\n let x = (selectionRect.left + selectionRect.width / 2) - inputRect.left;\n\n if (x < TEXT_FORMATTER_SAFE_AREA_PX) {\n x = TEXT_FORMATTER_SAFE_AREA_PX;\n } else if (x > inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX) {\n x = inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX;\n }\n\n setTextFormatterAnchorPosition({\n x,\n y: selectionRect.top - inputRect.top,\n });\n\n setSelectedRange(selectionRange);\n openTextFormatter();\n }\n\n function handleMouseDown(event: React.MouseEvent) {\n function handleMouseUp() {\n checkSelection();\n\n event.target.removeEventListener('mouseup', handleMouseUp);\n }\n\n if (event.button !== 2) {\n event.target.addEventListener('mouseup', handleMouseUp);\n return;\n }\n\n if (isContextMenuOpenRef.current === true) {\n return;\n }\n\n isContextMenuOpenRef.current = true;\n\n function closeContextMenuMouseListener() {\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('mouseup', closeContextMenuMouseListener);\n }\n\n function closeContextMenuKeyListener(e: KeyboardEvent) {\n if (e.key !== 'Esc' && e.key !== 'Escape') {\n return;\n }\n\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('keydown', closeContextMenuKeyListener);\n }\n\n document.addEventListener('mousedown', closeContextMenuMouseListener);\n document.addEventListener('keydown', closeContextMenuKeyListener);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n function handleKeyUp() {\n checkSelection();\n\n e.target.removeEventListener('keyup', handleKeyUp);\n }\n\n if (e.metaKey) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (targetIndexDelta) {\n e.preventDefault();\n\n replyToNextMessage({ targetIndexDelta });\n return;\n }\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n if (\n !(IS_IOS || IS_ANDROID)\n && (\n (messageSendKeyCombo === 'enter' && !e.shiftKey)\n || (messageSendKeyCombo === 'ctrl-enter' && (e.ctrlKey || e.metaKey))\n )\n ) {\n e.preventDefault();\n\n closeTextFormatter();\n onSend();\n }\n } else if (e.key === 'ArrowUp' && !html.length && !e.metaKey) {\n e.preventDefault();\n editLastMessage();\n } else {\n e.target.addEventListener('keyup', handleKeyUp);\n }\n }\n\n function handleTouchSelection() {\n if (!IS_ANDROID) {\n return;\n }\n\n checkSelection();\n }\n\n function handleChange(e: ChangeEvent) {\n const { innerHTML, textContent } = e.currentTarget;\n\n onUpdate(innerHTML === SAFARI_BR ? '' : innerHTML);\n\n // Reset focus on the input to remove any active styling when input is cleared\n if (!IS_TOUCH_ENV && (!textContent || !textContent.length)) {\n const selection = window.getSelection()!;\n if (selection) {\n inputRef.current!.blur();\n selection.removeAllRanges();\n focusEditableElement(inputRef.current!, true);\n }\n }\n }\n\n function stopEvent(e: React.MouseEvent) {\n if (!IS_ANDROID) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n function updateInputHeight(willSend = false) {\n const input = inputRef.current!;\n const clone = cloneRef.current!;\n const currentHeight = Number(input.style.height.replace('px', ''));\n const newHeight = Math.min(clone.scrollHeight, MAX_INPUT_HEIGHT);\n if (newHeight === currentHeight) {\n return;\n }\n\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\n );\n\n const exec = () => {\n input.style.height = `${newHeight}px`;\n input.style.transitionDuration = `${transitionDuration}ms`;\n input.classList.toggle('overflown', clone.scrollHeight > MAX_INPUT_HEIGHT);\n };\n\n if (willSend) {\n // Sync with sending animation\n requestAnimationFrame(exec);\n } else {\n exec();\n }\n }\n\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n focusInput();\n }, [currentChatId, focusInput, replyingToId, shouldSetFocus]);\n\n useEffect(() => {\n if (noTabCapture) {\n return undefined;\n }\n\n const captureFirstTab = debounce((e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n requestAnimationFrame(focusInput);\n }\n }, TAB_INDEX_PRIORITY_TIMEOUT, true, false);\n\n return captureKeyboardListeners({ onTab: captureFirstTab });\n }, [focusInput, noTabCapture]);\n\n useEffect(() => {\n const input = inputRef.current!;\n\n function supressFocus() {\n input.blur();\n }\n\n if (shouldSupressFocus) {\n input.addEventListener('focus', supressFocus);\n }\n\n return () => {\n input.removeEventListener('focus', supressFocus);\n };\n }, [shouldSupressFocus]);\n\n const className = buildClassName(\n 'form-control custom-scroll',\n html.length > 0 && 'touched',\n shouldSupressFocus && 'focus-disabled',\n );\n\n return (\n
\n \n
\n {placeholder}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: currentChatId, threadId } = selectCurrentMessageList(global) || {};\n const { messageSendKeyCombo } = global.settings.byKey;\n\n return {\n currentChatId,\n messageSendKeyCombo,\n replyingToId: currentChatId && threadId ? selectReplyingToId(global, currentChatId, threadId) : undefined,\n noTabCapture: global.isPollModalOpen || global.payment.isPaymentModalOpen,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editLastMessage', 'replyToNextMessage']),\n)(MessageInput));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiWebPage } from '../../api/types';\n\nimport { getFirstLinkInMessage, getMessageSummaryText, getMessageWebPage } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport trimText from '../../util/trimText';\nimport renderText from './helpers/renderText';\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport Media from './Media';\nimport Link from '../ui/Link';\nimport SafeLink from './SafeLink';\n\nimport './WebLink.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n onMessageClick: (messageId: number, chatId: number) => void;\n};\n\nconst WebLink: FC = ({ message, senderTitle, onMessageClick }) => {\n const lang = useLang();\n\n let linkData: ApiWebPage | undefined = getMessageWebPage(message);\n\n if (!linkData) {\n const link = getFirstLinkInMessage(message);\n if (link) {\n const { url, domain } = link;\n const messageText = getMessageSummaryText(lang, message);\n\n linkData = {\n siteName: domain.replace(/^www./, ''),\n url: url.includes('://') ? url : url.includes('@') ? `mailto:${url}` : `http://${url}`,\n description: messageText !== url ? messageText : undefined,\n } as ApiWebPage;\n }\n }\n\n const handleMessageClick = useCallback(() => {\n onMessageClick(message.id, message.chatId);\n }, [onMessageClick, message.id, message.chatId]);\n\n if (!linkData) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n } = linkData;\n\n const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebLink scroll-item',\n !photo && 'without-photo',\n );\n\n return (\n \n {photo && (\n \n )}\n
\n \n {renderText(title || siteName || displayUrl)}\n \n {truncatedDescription && (\n \n {renderText(truncatedDescription)}\n \n )}\n \n {url.replace('mailto:', '') || displayUrl}\n \n {senderTitle &&
{renderText(senderTitle)}
}\n
\n {senderTitle && (\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n )}\n
\n );\n};\n\nexport default memo(WebLink);\n","import { useCallback } from '../../../../lib/teact/teact';\n\nexport enum ChatAnimationTypes {\n Move,\n Opacity,\n None,\n}\n\nexport function useChatAnimationType(orderDiffById: Record) {\n const movesUp = useCallback((id: number) => orderDiffById[id] < 0, [orderDiffById]);\n const movesDown = useCallback((id: number) => orderDiffById[id] > 0, [orderDiffById]);\n\n const orderDiffIds = Object.keys(orderDiffById).map(Number);\n const numberOfUp = orderDiffIds.filter(movesUp).length;\n const numberOfDown = orderDiffIds.filter(movesDown).length;\n\n return useCallback((chatId: number): ChatAnimationTypes => {\n const orderDiff = orderDiffById[chatId];\n\n if (orderDiff === 0) {\n return ChatAnimationTypes.None;\n }\n\n if (\n orderDiff === Infinity\n || orderDiff === -Infinity\n || (movesUp(chatId) && numberOfUp <= numberOfDown)\n || (movesDown(chatId) && numberOfDown < numberOfUp)\n ) {\n return ChatAnimationTypes.Opacity;\n }\n\n return ChatAnimationTypes.Move;\n }, [movesDown, movesUp, numberOfDown, numberOfUp, orderDiffById]);\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\n\nimport ShowTransition from '../../ui/ShowTransition';\n\nimport './Badge.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst Badge: FC = ({ chat, isPinned, isMuted }) => {\n const isShown = Boolean(chat.unreadCount || chat.hasUnreadMark || isPinned);\n const className = buildClassName(\n 'Badge',\n isMuted && 'muted',\n isPinned && 'pinned',\n Boolean(chat.unreadCount || chat.hasUnreadMark) && 'unread',\n );\n\n function renderContent() {\n if (chat.unreadCount) {\n if (chat.unreadMentionsCount) {\n return (\n
\n
\n \n
\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n
\n );\n }\n\n return (\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n );\n } else if (chat.hasUnreadMark) {\n return (\n
\n );\n } else if (isPinned) {\n return (\n
\n \n
\n );\n }\n\n return undefined;\n }\n\n return (\n \n {renderContent}\n \n );\n};\n\nexport default memo(Badge);\n","import React, {\n FC, memo, useCallback, useLayoutEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, ApiFormattedText, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n getChatTitle,\n isChatPrivate,\n isActionMessage,\n getPrivateChatUserId,\n getMessageAction,\n getMessageSenderName,\n isChatChannel,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageSticker,\n selectIsChatMuted,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList,\n selectNotifySettings, selectNotifyExceptions,\n} from '../../../modules/selectors';\nimport { renderActionMessageText } from '../../common/helpers/renderActionMessageText';\nimport renderText from '../../common/helpers/renderText';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport useMedia from '../../../hooks/useMedia';\nimport { ChatAnimationTypes } from './hooks';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport TypingStatus from '../../common/TypingStatus';\nimport LastMessageMeta from '../../common/LastMessageMeta';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\nimport Badge from './Badge';\n\nimport './Chat.scss';\n\ntype OwnProps = {\n style?: string;\n chatId: number;\n folderId?: number;\n orderDiff: number;\n animationType: ChatAnimationTypes;\n isSelected: boolean;\n isPinned?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isMuted?: boolean;\n privateChatUser?: ApiUser;\n actionTargetUser?: ApiUser;\n actionTargetMessage?: ApiMessage;\n actionTargetChatId?: number;\n lastMessageSender?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n draft?: ApiFormattedText;\n messageListType?: MessageListType;\n animationLevel?: number;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 200;\n\nconst Chat: FC = ({\n style,\n chatId,\n folderId,\n orderDiff,\n animationType,\n isSelected,\n isPinned,\n chat,\n isMuted,\n privateChatUser,\n actionTargetUser,\n lastMessageSender,\n lastMessageOutgoingStatus,\n actionTargetMessage,\n actionTargetChatId,\n draft,\n messageListType,\n animationLevel,\n lastSyncTime,\n openChat,\n focusLastMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const { lastMessage, typingStatus } = chat || {};\n const isAction = lastMessage && isActionMessage(lastMessage);\n\n useEnsureMessage(chatId, isAction ? lastMessage!.replyToMessageId : undefined, actionTargetMessage);\n\n const mediaThumbnail = lastMessage && !getMessageSticker(lastMessage)\n ? getMessageMediaThumbDataUri(lastMessage)\n : undefined;\n const mediaBlobUrl = useMedia(lastMessage ? getMessageMediaHash(lastMessage, 'micro') : undefined);\n const isRoundVideo = Boolean(lastMessage && getMessageRoundVideo(lastMessage));\n\n // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.\n useLayoutEffect(() => {\n if (animationLevel === 0) {\n return;\n }\n\n const element = ref.current!;\n\n // TODO Refactor animation: create `useListAnimation` that owns `orderDiff` and `animationType`\n if (animationType === ChatAnimationTypes.Opacity) {\n element.style.opacity = '0';\n\n fastRaf(() => {\n element.classList.add('animate-opacity');\n element.style.opacity = '1';\n });\n } else if (animationType === ChatAnimationTypes.Move) {\n element.style.transform = `translate3d(0, ${-orderDiff * 100}%, 0)`;\n\n fastRaf(() => {\n element.classList.add('animate-transform');\n element.style.transform = '';\n });\n } else {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n element.classList.remove('animate-opacity', 'animate-transform');\n element.style.opacity = '';\n element.style.transform = '';\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [animationLevel, orderDiff, animationType]);\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId });\n\n if (isSelected && messageListType === 'thread') {\n focusLastMessage();\n }\n }, [\n isSelected,\n messageListType,\n openChat,\n chatId,\n focusLastMessage,\n ]);\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n handleDelete: openDeleteModal,\n folderId,\n isPinned,\n });\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderLastMessageOrTyping() {\n if (typingStatus && lastMessage && typingStatus.timestamp > lastMessage.date * 1000) {\n return ;\n }\n\n if (draft && draft.text.length) {\n return (\n

\n {lang('Draft')}\n {renderText(draft.text)}\n

\n );\n }\n\n if (!lastMessage) {\n return undefined;\n }\n\n if (isAction) {\n const actionOrigin = chat && (isChatChannel(chat) || lastMessage.senderId === lastMessage.chatId)\n ? chat\n : lastMessageSender;\n\n return (\n

\n {renderText(renderActionMessageText(\n lang,\n lastMessage,\n actionOrigin,\n actionTargetUser,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string)}\n

\n );\n }\n\n const senderName = getMessageSenderName(lang, chatId, lastMessageSender);\n\n return (\n

\n {senderName && (\n <>\n {renderText(senderName)}\n :\n \n )}\n {renderMessageSummary(lang, lastMessage!, mediaBlobUrl || mediaThumbnail, isRoundVideo)}\n

\n );\n }\n\n const className = buildClassName(\n 'Chat chat-item-clickable',\n isChatPrivate(chatId) ? 'private' : 'group',\n isSelected && !IS_MOBILE_SCREEN && 'selected',\n );\n\n return (\n \n
\n \n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n {isMuted && }\n {chat.lastMessage && (\n \n )}\n
\n
\n {renderLastMessageOrTyping()}\n \n
\n
\n \n \n );\n};\n\nfunction renderMessageSummary(lang: LangFn, message: ApiMessage, blobUrl?: string, isRoundVideo?: boolean) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, message, true))}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return {};\n }\n\n const { senderId, replyToMessageId, isOutgoing } = chat.lastMessage;\n const lastMessageSender = senderId ? selectUser(global, senderId) : undefined;\n const lastMessageAction = getMessageAction(chat.lastMessage);\n const actionTargetMessage = lastMessageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const { targetUserId: actionTargetUserId, targetChatId: actionTargetChatId } = lastMessageAction || {};\n const privateChatUserId = getPrivateChatUserId(chat);\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n lastMessageSender,\n ...(isOutgoing && { lastMessageOutgoingStatus: selectOutgoingStatus(global, chat.lastMessage) }),\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n ...(actionTargetUserId && { actionTargetUser: selectUser(global, actionTargetUserId) }),\n actionTargetChatId,\n actionTargetMessage,\n draft: selectDraft(global, chatId, MAIN_THREAD_ID),\n messageListType,\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'focusLastMessage',\n ]),\n)(Chat));\n","import React, {\n FC, memo, useMemo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiChatFolder, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { NotifyException, NotifySettings } from '../../../types';\n\nimport { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config';\nimport { IS_ANDROID } from '../../../util/environment';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { mapValues, pick } from '../../../util/iteratees';\nimport { getChatOrder, prepareChatList, prepareFolderListIds } from '../../../modules/helpers';\nimport {\n selectChatFolder, selectCurrentMessageList, selectNotifyExceptions, selectNotifySettings,\n} from '../../../modules/selectors';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport { useChatAnimationType } from './hooks';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Loading from '../../ui/Loading';\nimport Chat from './Chat';\n\ntype OwnProps = {\n folderType: 'all' | 'archived' | 'folder';\n folderId?: number;\n noChatsText?: string;\n isActive: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFolder?: ApiChatFolder;\n listIds?: number[];\n currentChatId?: number;\n orderedPinnedIds?: number[];\n lastSyncTime?: number;\n isInDiscussionThread?: boolean;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nenum FolderTypeToListType {\n 'all' = 'active',\n 'archived' = 'archived'\n}\n\nconst ChatList: FC = ({\n folderType,\n folderId,\n noChatsText = 'Chat list is empty.',\n isActive,\n chatFolder,\n chatsById,\n usersById,\n listIds,\n currentChatId,\n orderedPinnedIds,\n lastSyncTime,\n isInDiscussionThread,\n notifySettings,\n notifyExceptions,\n loadMoreChats,\n preloadTopChatMessages,\n openChat,\n}) => {\n const [currentListIds, currentPinnedIds] = useMemo(() => {\n return folderType === 'folder' && chatFolder\n ? prepareFolderListIds(chatsById, usersById, chatFolder, notifySettings, notifyExceptions)\n : [listIds, orderedPinnedIds];\n }, [folderType, chatFolder, chatsById, usersById, notifySettings, notifyExceptions, listIds, orderedPinnedIds]);\n\n const [orderById, orderedIds] = useMemo(() => {\n if (!currentListIds || (folderType === 'folder' && !chatFolder)) {\n return [];\n }\n const newChatArrays = prepareChatList(chatsById, currentListIds, currentPinnedIds, folderType);\n const singleList = [...newChatArrays.pinnedChats, ...newChatArrays.otherChats];\n const newOrderedIds = singleList.map(({ id }) => id);\n const newOrderById = singleList.reduce((acc, chat, i) => {\n acc[chat.id] = i;\n return acc;\n }, {} as Record);\n\n return [newOrderById, newOrderedIds];\n }, [currentListIds, currentPinnedIds, folderType, chatFolder, chatsById]);\n\n const prevOrderById = usePrevious(orderById);\n\n const orderDiffById = orderById && prevOrderById\n ? mapValues(orderById, (order, id) => {\n return order - (prevOrderById[id] !== undefined ? prevOrderById[id] : Infinity);\n })\n : {};\n\n const loadMoreOfType = useCallback(() => {\n loadMoreChats({ listType: folderType === 'archived' ? 'archived' : 'active' });\n }, [loadMoreChats, folderType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? loadMoreOfType : undefined,\n orderedIds,\n undefined,\n CHAT_LIST_SLICE,\n folderType === 'all' && !ALL_CHATS_PRELOAD_DISABLED,\n );\n\n // TODO Refactor to not call `prepareChatList` twice\n const chatArrays = viewportIds && prepareChatList(chatsById, viewportIds, currentPinnedIds, folderType);\n\n useEffect(() => {\n if (lastSyncTime && folderType === 'all') {\n preloadTopChatMessages();\n }\n }, [lastSyncTime, folderType, preloadTopChatMessages]);\n\n const getAnimationType = useChatAnimationType(orderDiffById);\n\n function renderChats() {\n const viewportOffset = orderedIds!.indexOf(viewportIds![0]);\n const pinnedOffset = viewportOffset + chatArrays!.pinnedChats.length;\n\n return (\n \n {chatArrays!.pinnedChats.map(({ id }, i) => (\n \n ))}\n {chatArrays!.otherChats.map((chat, i) => (\n \n ))}\n
\n );\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isActive && orderedIds) {\n if (e.ctrlKey && e.code.startsWith('Digit')) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n const position = Number(digit) - 1;\n if (position > orderedIds.length - 1) return;\n\n openChat({ id: orderedIds[position] });\n }\n\n if (e.altKey) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (!targetIndexDelta) return;\n\n if (!currentChatId) {\n e.preventDefault();\n openChat({ id: orderedIds[0] });\n return;\n }\n\n const position = orderedIds.indexOf(currentChatId);\n\n if (position === -1) {\n return;\n }\n const nextId = orderedIds[position + targetIndexDelta];\n\n e.preventDefault();\n openChat({ id: nextId });\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n return (\n \n {viewportIds && viewportIds.length && chatArrays ? (\n renderChats()\n ) : viewportIds && !viewportIds.length ? (\n
{noChatsText}
\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { folderType, folderId }): StateProps => {\n const {\n chats: {\n listIds,\n byId: chatsById,\n orderedPinnedIds,\n },\n users: { byId: usersById },\n lastSyncTime,\n } = global;\n const { chatId: currentChatId, threadId: currentThreadId } = selectCurrentMessageList(global) || {};\n\n const listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined;\n const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatsById,\n usersById,\n currentChatId,\n lastSyncTime,\n ...(listType ? {\n listIds: listIds[listType],\n orderedPinnedIds: orderedPinnedIds[listType],\n } : {\n chatFolder,\n }),\n isInDiscussionThread: currentThreadId !== MAIN_THREAD_ID,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadMoreChats',\n 'preloadTopChatMessages',\n 'openChat',\n ]),\n)(ChatList));\n","import { useCallback, useEffect, useState } from '../../../../lib/teact/teact';\n\nimport { ApiMessageEntityTypes, ApiChatMember, ApiUser } from '../../../../api/types';\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { getUserFirstOrLastName } from '../../../../modules/helpers';\nimport searchUserName from '../helpers/searchUserName';\nimport { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport useFlag from '../../../../hooks/useFlag';\n\nconst RE_NOT_USERNAME_SEARCH = /[^@_\\d\\wа-яё]+/i;\n\nexport default function useMentionTooltip(\n canSuggestMembers: boolean | undefined,\n html: string,\n onUpdateHtml: (html: string) => void,\n inputId: string = EDITABLE_INPUT_ID,\n groupChatMembers?: ApiChatMember[],\n currentUserId?: number,\n usersById?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [currentFilter, setCurrentFilter] = useState('');\n const [filteredMembers, setFilteredMembers] = useState([]);\n\n const getFilteredMembers = useCallback((filter) => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return groupChatMembers.filter(({ userId }) => {\n const user = usersById[userId];\n if (userId === currentUserId || !user) {\n return false;\n }\n\n return !filter || searchUserName(filter, user);\n });\n }, [groupChatMembers, currentUserId, usersById]);\n\n useEffect(() => {\n if (!canSuggestMembers || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const usernameFilter = getUsernameFilter(html);\n\n if (usernameFilter) {\n const filter = usernameFilter ? usernameFilter.substr(1) : '';\n const membersToMention = getFilteredMembers(filter);\n if (membersToMention && membersToMention.length) {\n markIsOpen();\n setCurrentFilter(filter);\n setFilteredMembers(membersToMention);\n } else {\n unmarkIsOpen();\n }\n } else {\n unmarkIsOpen();\n }\n }, [canSuggestMembers, html, getFilteredMembers, markIsOpen, unmarkIsOpen]);\n\n const insertMention = useCallback((user: ApiUser, forceFocus = false) => {\n if (!user.username && !getUserFirstOrLastName(user)) {\n return;\n }\n\n const insertedHtml = user.username\n ? `@${user.username}`\n : `${getUserFirstOrLastName(user)}`;\n\n const atIndex = html.lastIndexOf('@');\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${insertedHtml} `);\n const messageInput = document.getElementById(inputId)!;\n if (!IS_MOBILE_SCREEN) {\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, forceFocus);\n });\n }\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isMentionTooltipOpen: isOpen,\n mentionFilter: currentFilter,\n closeMentionTooltip: unmarkIsOpen,\n insertMention,\n mentionFilteredMembers: filteredMembers,\n };\n}\n\nfunction getUsernameFilter(html: string) {\n const tempEl = document.createElement('div');\n tempEl.innerHTML = html;\n const text = tempEl.innerText;\n\n const lastSymbol = text[text.length - 1];\n const lastWord = text.split(RE_NOT_USERNAME_SEARCH).pop();\n\n if (\n !text.length || RE_NOT_USERNAME_SEARCH.test(lastSymbol)\n || !lastWord || !lastWord.startsWith('@')\n ) {\n return undefined;\n }\n\n return lastWord;\n}\n","import { ApiUser } from '../../../../api/types';\nimport { getUserFullName } from '../../../../modules/helpers';\nimport searchWords from '../../../../util/searchWords';\n\n// TODO: Support cyrillic translit search\nexport default function searchUserName(filter: string, user: ApiUser) {\n const usernameLowered = user.username.toLowerCase();\n const fullName = getUserFullName(user);\n const fullNameLowered = fullName && fullName.toLowerCase();\n const filterLowered = filter.toLowerCase();\n\n return usernameLowered.startsWith(filterLowered) || (\n fullNameLowered && searchWords(fullNameLowered, filterLowered)\n );\n}\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport { imgToCanvas } from '../util/files';\nimport useForceUpdate from './useForceUpdate';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\nconst MAX_CACHE_SIZE = 1000;\n\nconst cache = new Map();\n\nexport default function useBlur(dataUri?: string, isDisabled = false, delay?: number) {\n const blurredRef = useRef(dataUri ? cache.get(dataUri) : undefined);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n if (timeoutRef.current && isDisabled) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useEffect(() => {\n if (!dataUri || blurredRef.current || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n img.onload = () => {\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n const blurredDataUri = canvas.toDataURL();\n\n blurredRef.current = blurredDataUri;\n forceUpdate();\n\n if (cache.size >= MAX_CACHE_SIZE) {\n cache.clear();\n }\n cache.set(dataUri, blurredDataUri);\n };\n\n if (delay) {\n timeoutRef.current = window.setTimeout(() => {\n img.src = dataUri;\n }, delay);\n } else {\n img.src = dataUri;\n }\n }, [dataUri, delay, forceUpdate, isDisabled]);\n\n return blurredRef.current;\n}\n","import { useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useOnChange from './useOnChange';\nimport useBlur from './useBlur';\nimport { imgToCanvas } from '../util/files';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useBlurSync(dataUri: string | false | undefined) {\n const blurredRef = useRef();\n\n let isChanged = false;\n\n useOnChange(() => {\n isChanged = true;\n\n blurredRef.current = undefined;\n\n if (!dataUri) {\n return;\n }\n\n const img = new Image();\n img.src = dataUri;\n if (!img.width) {\n return;\n }\n\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n\n blurredRef.current = canvas.toDataURL();\n }, [dataUri]);\n\n // Sometimes `Image` do not manage to load synchronously,\n // so we fall back the non-blurred variant and prepare the async one at least for the next time\n const blurredAsync = useBlur(dataUri || undefined, Boolean(blurredRef.current));\n\n return blurredRef.current || (!isChanged && blurredAsync) || dataUri || undefined;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/0.c66dcd2dcbc1482a0d6f.js b/dist/0.c66dcd2dcbc1482a0d6f.js deleted file mode 100644 index 8c99a3dfb..000000000 --- a/dist/0.c66dcd2dcbc1482a0d6f.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],Array(106).concat([function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(8),s=n(145),i=n(173),o=n(25),l=n(43),u=n(53),d=n(42);n(207);t.a=e=>{const{ref:t,buttonRef:n,icon:m,className:b,style:h,children:f,disabled:p,ripple:O,narrow:g,inactive:v,focus:j,destructive:E,multiline:y,isStatic:N,contextActions:T,onClick:C}=e;let w=Object(a.q)(null);t&&(w=t);const{isContextMenuOpen:M,contextMenuPosition:S,handleBeforeContextMenu:L,handleContextMenu:I,handleContextMenuClose:A,handleContextMenuHide:k}=Object(s.a)(w,!T),x=Object(a.m)(()=>w.current,[]),D=Object(a.m)(()=>w.current.closest(".custom-scroll"),[]),R=Object(a.m)(()=>w.current.querySelector(".ListItem-context-menu .bubble"),[]),{positionX:_,positionY:P,style:F}=Object(i.a)(S,x,D,R),U=Object(a.m)(e=>{!p&&C&&C(e)},[p,C]),B=Object(a.m)(e=>{v||r.l||(!T||2!==e.button&&C||L(e),0===e.button&&(C?U(e):I(e)))},[v,T,C,L,I,U]),q=Object(o.a)(),H=Object(c.a)("ListItem",b,!N&&"no-selection",O&&"has-ripple",g&&"narrow",p&&"disabled",v&&"inactive",S&&"has-menu-open",j&&"focus",E&&"destructive",y&&"multiline",N&&"is-static");return a.a.createElement("div",{ref:w,className:H,dir:q.isRtl?"rtl":void 0,style:h},a.a.createElement("div",{className:"ListItem-button",role:"button",ref:n,tabIndex:0,onClick:!v&&r.l?U:void 0,onMouseDown:B,onContextMenu:!v&&T?I:void 0},m&&a.a.createElement("i",{className:"icon-"+m}),y&&a.a.createElement("div",{className:"multiline-item"},f),!y&&f,!p&&!v&&O&&a.a.createElement(l.a,null)),T&&void 0!==S&&a.a.createElement(u.a,{isOpen:M,positionX:_,positionY:P,style:F,className:"ListItem-context-menu",autoClose:!0,onClose:A,onCloseAnimationEnd:k},T.map(e=>a.a.createElement(d.a,{key:e.title,icon:e.icon,destructive:e.destructive,disabled:!e.handler,onClick:e.handler},e.title))))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return o}));var a=n(0),r=n(9),c=n(48);function s({rootRef:e,throttleMs:t,debounceMs:n,shouldSkipFirst:s,margin:i,threshold:o,isDisabled:l},u){const d=Object(a.q)(),m=Object(a.q)(),b=Object(a.q)(),h=Object(a.q)();m.current=u;const f=Object(a.m)(()=>{b.current=!0},[]),p=Object(a.m)(()=>{b.current=!1,h.current&&(h.current(),h.current=void 0)},[]);Object(c.a)(f,p),Object(a.n)(()=>{if(!l)return()=>{d.current&&(d.current.observer.disconnect(),d.current.callbacks.clear(),d.current=void 0)}},[l]);return{observe:Object(a.m)((a,c)=>{d.current||function(){const a=new Map,c=new Map,l=()=>{const e=Array.from(c.values());e.forEach(t=>{const n=a.get(t.target);n&&n(t,e)}),m.current&&m.current(e),c.clear()},u=t?r.g:n?r.a:void 0,f=u?u(l,t||n,!s):l,p=new IntersectionObserver(e=>{e.forEach(e=>{c.set(e.target,e)}),b.current?h.current=()=>{f()}:f()},{root:e.current,rootMargin:i?i+"px":void 0,threshold:o});d.current={observer:p,callbacks:a}}();const l=d.current;return l.observer.observe(a),c&&l.callbacks.set(a,c),()=>{c&&l.callbacks.delete(a),l.observer.unobserve(a)}},[l]),freeze:f,unfreeze:p}}function i(e,t,n){Object(a.n)(()=>t?t(e.current,n):void 0,[])}function o(e,t,n){const[r,c]=Object(a.r)(!t);return i(e,t,e=>{c(e.isIntersecting),n&&n(e)}),r}},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(54),s=n(26);t.a=(e,t=!1,n=r.ApiMediaFormat.BlobUrl,i,o)=>{const l=e?c.c(e):void 0,u=Object(s.a)();return Object(a.n)(()=>{if(!t&&e&&!l){const t=Date.now();c.b(e,n).then(()=>{const e=Date.now()-t;!o||e>=o?u():setTimeout(u,o-e)})}},[t,e,l,n,i,u,o]),l}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(20),s=n(6),i=n(4),o=n(23),l=n(3),u=n(25),d=n(112),m=n(133),b=n(156);t.a=Object(a.h)(Object(r.h)((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a}=e,r=Object(s.Gb)(e,t);return{lastSyncTime:a,user:r,isSavedMessages:!n&&r&&r.isSelf,areMessagesLoaded:Boolean(Object(s.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullUser","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:r,withUsername:s,withFullInfo:l,withUpdatingStatus:h,noStatusOrTyping:f,noRtl:p,user:O,isSavedMessages:g,areMessagesLoaded:v,lastSyncTime:j,loadFullUser:E,openMediaViewer:y})=>{const{id:N}=O||{},T=Object(i.Z)(O);Object(a.n)(()=>{l&&j&&N&&E({userId:N})},[N,E,j,l]);const C=Object(a.m)((e,n)=>{O&&n&&(e.stopPropagation(),y({avatarOwnerId:O.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[O,t,y]),w=Object(u.a)();if(O)return a.a.createElement("div",{className:"ChatInfo",dir:!p&&w.isRtl?"rtl":void 0},a.a.createElement(d.a,{key:O.id,size:t,user:O,isSavedMessages:g,onClick:r?C:void 0}),a.a.createElement("div",{className:"info"},g?a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,w("SavedMessages"))):a.a.createElement("div",{className:"title"},a.a.createElement("h3",{dir:"auto"},T&&Object(o.a)(T)),O&&O.isVerified&&a.a.createElement(m.a,null)),(n||!g&&!f)&&(n?a.a.createElement("span",{className:"status",dir:"auto"},n):h&&!v?a.a.createElement("span",{className:"status",dir:"auto"},w("Updating")):O?e?a.a.createElement(b.a,{typingStatus:e}):a.a.createElement("div",{className:"status "+(Object(i.xb)(O)?"online":"")},s&&O.username&&a.a.createElement("span",{className:"handle"},O.username),a.a.createElement("span",{className:"user-status",dir:"auto"},Object(i.ab)(w,O))):void 0)))}))},function(e,t,n){"use strict";var a=n(0),r=n(55);var c=n(8),s=n(48),i=n(35),o=n(58),l=n(25),u=n(32),d=n(122);n(150);t.a=e=>{const{title:t,className:n,isOpen:m,header:b,hasCloseButton:h,noBackdrop:f,children:p,onClose:O,onCloseAnimationEnd:g,onEnter:v}=e,{shouldRender:j,transitionClassNames:E}=Object(i.a)(m,g),y=Object(a.q)(null);Object(a.n)(()=>m?Object(r.a)({onEsc:O,onEnter:v}):void 0,[m,O,v]),Object(a.n)(()=>m&&y.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const a=n.findIndex(e=>e.isSameNode(document.activeElement));let r=0;a>=0&&(r=t.shiftKey?a>0?a-1:n.length-1:a{document.removeEventListener("keydown",t,!1)}}(y.current):void 0,[m]),Object(o.a)(([e])=>(document.body.classList.toggle("has-open-dialog",m),(m||!m&&void 0!==e)&&Object(s.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[m]);const N=Object(l.a)();if(!j)return;const T=Object(c.a)("Modal",n,E,f&&"transparent-backdrop");return a.a.createElement(d.a,null,a.a.createElement("div",{ref:y,className:T,tabIndex:-1,role:"dialog"},a.a.createElement("div",{className:"modal-container"},a.a.createElement("div",{className:"modal-backdrop",onClick:O}),a.a.createElement("div",{className:"modal-dialog"},b||(t?a.a.createElement("div",{className:"modal-header"},h&&a.a.createElement(u.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:N("Close"),onClick:O},a.a.createElement("i",{className:"icon-close"})),a.a.createElement("div",{className:"modal-title"},t)):void 0),a.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(1),s=n(7),i=n(26),o=n(38),l=n(8),u=n(48);n(193);const d={slide:450,"slide-reversed":450,"mv-slide":400,"slide-fade":400,"zoom-fade":150,"scroll-slide":500,fade:150,"slide-layers":s.g?450:300,"push-slide":300,reveal:350},m=Symbol("CLEANED_UP");t.a=Object(r.h)(e=>{const{animationLevel:t}=e.settings.byKey;return{animationLevel:t}})(({ref:e,activeKey:t,name:n,direction:r="auto",renderCount:s,shouldRestoreHeight:b,shouldCleanup:h,id:f,className:p,onStart:O,onStop:g,children:v,animationLevel:j})=>{let E=Object(a.q)(null);e&&(E=e);const y=Object(a.q)({}),N=Object(o.a)(t),T=Object(a.q)(),C=Object(i.a)(),w=void 0!==N&&t!==N;!s&&w&&(y.current={[N]:y.current[N]}),y.current[t]=v,Object(a.o)(()=>{function e(){h&&(y.current={[N]:m},C())}const a=E.current,i=a.children;if(1===i.length&&!w)return void i[0].classList.add("active");const o=Array.from(a.childNodes);if(!w||!o.length)return;T.current&&(clearTimeout(T.current),T.current=void 0);const l=-1===r||"auto"===r&&N>t||"inverse"===r&&N{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),void e();if(o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("active"),e.classList.toggle("from",t===p),e.classList.toggle("through",t>p&&tv),e.classList.toggle("to",t===v))}),"scroll-slide"===n){const e=a.offsetWidth;a.scrollBy({left:v>p?e:-e,behavior:"smooth"})}j>0&&Object(u.b)(d[n]+c.c),requestAnimationFrame(()=>{a.classList.add("animating"),T.current=window.setTimeout(()=>{requestAnimationFrame(()=>{if(a.classList.remove("animating","backwards"),o.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===v))}),"scroll-slide"===n&&(a.scrollLeft=t*a.offsetWidth),b){const e=a.querySelector(".active");e&&(e.style.height="auto",a.style.height=e.clientHeight+"px")}e(),g&&g()})},d[n]+c.c),O&&O()})},[t,N,w,r,n,O,g,s,b,h,j,C]),Object(a.o)(()=>{if(b){const e=E.current,t=e.querySelector(".active")||e.querySelector(".from");t&&(t.style.height="auto",e.style.height=t.clientHeight+"px",e.style.flexBasis=t.clientHeight+"px")}},[b,v]);const M=y.current,S=Object.keys(s?new Array(s).fill(void 0):M).map(Number).map(e=>{const n=M[e];return"function"==typeof n?a.a.createElement("div",{key:e},n(e===t,e===N)):void 0}),L=Object(l.a)("Transition",p,0===j&&"scroll-slide"===n?"slide":n);return a.a.createElement("div",{ref:E,id:f,className:L},S)})},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(4),i=n(49),o=n(8),l=n(23),u=n(108),d=n(114),m=n(25);n(195);t.a=Object(a.h)(({className:e,size:t="large",chat:n,user:b,text:h,withOnlineStatus:f,isSavedMessages:p,lastSyncTime:O,onClick:g})=>{const v=b&&Object(s.pb)(b);let j;p||v||(b?j=Object(s.f)(b):n&&(j=Object(s.f)(n)));const E=Object(u.a)(j,!1,r.ApiMediaFormat.DataUri,O),{shouldRenderFullMedia:y,transitionClassNames:N}=Object(d.a)(E,"slow"),T=Object(m.a)();let C="";if(p)C=a.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(v)C=a.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)C=a.a.createElement("img",{src:E,className:N+" avatar-media",alt:"",decoding:"async"});else if(b){const e=Object(s.Z)(b);C=e?Object(i.c)(e,2):void 0}else if(n){const e=Object(s.l)(T,n);C=e&&Object(i.c)(e,Object(s.lb)(n.id)?2:1)}else h&&(C=Object(i.c)(h,2));const w=!p&&b&&Object(s.xb)(b),M=Object(o.a)("Avatar size-"+t,e,"color-bg-"+Object(s.X)(b||n),p&&"saved-messages",v&&"deleted-account",f&&w&&"online",g&&"interactive",!p&&!y&&"no-photo"),S=Object(a.m)(e=>{g&&g(e,p||y)},[g,p,y]),L=(b||n)&&(b||n).id;return a.a.createElement("div",{className:M,onClick:S,"data-test-sender-id":c.E?L:void 0},"string"==typeof C?Object(l.a)(C,["jumbo"===t?"hq_emoji":"emoji"]):C)})},function(e,t,n){"use strict";var a=n(20),r=n(0),c=n(9),s=n(155);t.a=({ref:e,className:t,onLoadMore:n,onScroll:i,onKeyDown:o,items:l,itemSelector:u=".ListItem",preloadBackwards:d=20,sensitiveArea:m=800,noScrollRestore:b=!1,noScrollRestoreOnTop:h=!1,noFastList:f,cacheBuster:p,children:O})=>{let g=Object(r.q)(null);e&&(g=e);const v=Object(r.q)({}),[j,E]=Object(r.p)(()=>n?[Object(c.a)((e=!1)=>{n({direction:a.e.Backwards,noScroll:e})},1e3,!0,!1),Object(c.a)(()=>{n({direction:a.e.Forwards})},1e3,!0,!1)]:[],[n,l]);Object(r.n)(()=>{if(!j)return;if(d>0&&(!l||l.length{const e=g.current,t=v.current;let n;if(t.listItemElements=e.querySelectorAll(u),t.currentAnchor&&Array.from(t.listItemElements).includes(t.currentAnchor)){const{scrollTop:a}=e;n=a+(t.currentAnchor.getBoundingClientRect().top-t.currentAnchorTop)}else{const e=t.listItemElements[0];e&&(t.currentAnchor=e,t.currentAnchorTop=e.getBoundingClientRect().top)}b||h&&0===e.scrollTop||(Object(s.a)(e,n),t.isScrollTopJustUpdated=!0)},[l,u,b,h,p]);const y=Object(r.m)(e=>{if(E&&j){const{listItemElements:e,isScrollTopJustUpdated:t,currentAnchor:n,currentAnchorTop:a}=v.current;if(t)return void(v.current.isScrollTopJustUpdated=!1);const r=e.length,c=g.current,{scrollTop:i,scrollHeight:o,offsetHeight:l}=c,u=i<=(r?e[0].offsetTop:0)+m,d=(r?e[r-1].offsetTop+e[r-1].offsetHeight:o)-(i+l)<=m;let b=!1;if(u){const t=e[0];if(t){const e=t.getBoundingClientRect().top,r=n&&n.offsetParent&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r>a&&(v.current.currentAnchor=t,v.current.currentAnchorTop=e,b=!0,Object(s.a)(c),E())}}if(d){const t=e[r-1];if(t){const e=t.getBoundingClientRect().top,r=n&&n.offsetParent&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r{const s=Boolean(e),i=!Object(a.q)(s).current&&!n,[o,l]=Object(a.r)(!s),{shouldRender:u,transitionClassNames:d}=Object(r.a)(s,void 0,!i,t);return Object(a.n)(()=>{u&&(i?setTimeout(()=>{l(!1)},c[t]):l(!1))},[i,u,t]),{shouldRenderThumb:o,shouldRenderFullMedia:u,transitionClassNames:d}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return l})),n.d(t,"a",(function(){return u})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return p})),n.d(t,"h",(function(){return O})),n.d(t,"k",(function(){return g})),n.d(t,"i",(function(){return v})),n.d(t,"l",(function(){return j})),n.d(t,"g",(function(){return E})),n.d(t,"e",(function(){return y}));var a=n(4),r=n(56),c=n(7),s=n(1);const i="(max-height: 640px)",o=parseInt(getComputedStyle(document.documentElement).fontSize,10),l=200,u={width:640,height:640},d={width:100,height:100};let m;function b(e,t,n){const a=t||n?1.625:0;return(function(e){const t=e?30:29;return c.g?(m||(m=Math.min(t,Math.floor(.69*window.innerWidth)/o)),m):t}(e)-a)*o}function h({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:c}){const s=t/e;return y(b(n,a,r),function(e,t){return e&&t&&t>=.75&&t<=1.25?20*o:27*o}(c,s),e,t)}function f(e,t){const n=window.matchMedia(i),{width:a,height:c}=r.a.get();let s=t&&n.matches?10:8.25;return e&&(s=n.matches?10:15),{width:a,height:c-s*o}}function p(e,t,n,r){const{width:c,height:s}=Object(a.T)(e)||d;return h({width:c,height:s,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:r})}function O(e,t,n){const{width:r,height:c}=Object(a.bb)(e)||d;return h({width:r,height:c,fromOwnMessage:t,isForwarded:n,isGif:e.isGif})}function g(){return{width:2*o,height:2*o}}function v(e){return e?{width:3*o,height:3*o}:{width:3.375*o,height:3.375*o}}function j(e){const{width:t}=e;let{height:n}=e;"1258816259753933"===e.id&&(n=t);const a=n&&t&&n/t,r=(c.g?s.wb:s.vb)*o,i=a?r*a:r;return a&&i>r?{width:Math.round(r/a),height:r}:{width:r,height:i}}function E({width:e,height:t},n,a=!1){const{width:r,height:c}=f(n,a);return y(r,c,e,t)}function y(e,t,n,a){const r=a/n,c=Math.min(n,e);return Math.round(c*r)>t?{width:Math.round(t/r),height:t}:{width:c,height:Math.round(c*r)}}},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(8),s=n(48),i=n(131);let o,l;async function u(){return o||(o=n.e(7).then(n.bind(null,192)),l=(await o).default),o}setTimeout(u,5e3);t.a=Object(a.h)(({className:e,id:t,animationData:n,play:o,playSegment:d,speed:m,noLoop:b,size:h,quality:f,isLowPriority:p,onLoad:O})=>{const[g,v]=Object(a.r)(),j=Object(a.q)(null),E=Object(a.q)(!1),y=Object(a.q)(!1),N=Object(a.q)();N.current=o;const T=Object(a.q)();T.current=d,Object(a.n)(()=>{if(g||!n)return;const e=()=>{if(!j.current)return;const e=new l(t,j.current,n,{noLoop:b,size:h,quality:f,isLowPriority:p},O);m&&e.setSpeed(m),v(e)};l?e():u().then(()=>{Object(r.b)(()=>{j.current&&e()})})},[g,n,t,p,b,O,f,h,m]),Object(a.n)(()=>()=>{g&&g.destroy()},[g]);const C=Object(a.m)((e=!1)=>{g&&(N.current||T.current)&&(T.current?g.playSegment(T.current):e?g.goToAndPlay(0):g.play())},[g]),w=Object(a.m)(()=>{g&&g.pause()},[g]),M=Object(a.m)(()=>{y.current=!0,g&&(E.current||(E.current=g.isPlaying()),w())},[g,w]),S=Object(a.m)(()=>{E.current&&C(),E.current=!1,y.current=!1},[C]),L=Object(a.m)(()=>{Object(r.b)(S)},[S]);Object(a.n)(()=>{g&&(o||d?y.current?E.current=!0:C(b):y.current?E.current=!1:w())},[g,o,d,b,C,w]),Object(s.a)(M,S),Object(i.a)(M,L);const I=Object(c.a)("AnimatedSticker",e),A=h?`width: ${h}px; height: ${h}px;`:void 0;return a.a.createElement("div",{ref:j,className:I,style:A})})},function(e,t,n){"use strict";var a=n(0),r=n(25),c=n(110),s=n(32);t.a=Object(a.h)(({isOpen:e,onClose:t,onCloseAnimationEnd:n,title:i,header:o,text:l,textParts:u,confirmLabel:d="Confirm",confirmHandler:m,confirmIsDestructive:b,isButtonsInOneRow:h})=>{const f=Object(r.a)();return a.a.createElement(c.a,{className:"confirm",title:i,header:o,isOpen:e,onClose:t,onCloseAnimationEnd:n,onEnter:m},l&&l.split("\\n").map(e=>a.a.createElement("p",null,e)),u,a.a.createElement("div",{className:h?"dialog-buttons mt-2":""},a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:m,color:b?"danger":"primary"},d),a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:t},f("Cancel"))))})},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(35),s=n(23),i=n(25);n(248);t.a=Object(a.h)(({text:e="Nothing found.",description:t})=>{const n=Object(i.a)(),{transitionClassNames:o}=Object(c.a)(!0);return a.a.createElement("div",{className:Object(r.a)("NothingFound",o,t&&"with-description")},e,t&&a.a.createElement("p",{className:"description"},Object(s.a)(n(t),["br"])))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(51),c=n(26);function s(e,t){const n=void 0===t,s=Object(a.q)(n),i=Object(a.q)(),o=Object(c.a)();return Object(r.a)(()=>{n||(s.current=!1,i.current&&(clearTimeout(i.current),i.current=void 0))},e),Object(a.n)(()=>{if(n||s.current)return;const e=()=>{s.current=!0,o()};t>0?i.current=window.setTimeout(e,t):e()},e),s.current}},function(e,t,n){"use strict";var a=n(0),r=n(7),c=n(5),s=n(9),i=n(54),o=n(26);t.a=(e,t=!1,n=c.ApiMediaFormat.BlobUrl,l,u)=>{const d=e?i.c(e):void 0,m=n===c.ApiMediaFormat.Stream||r.i&&n===c.ApiMediaFormat.Progressive,b=Object(o.a)(),[h,f]=Object(a.r)(d&&!m?1:0),p=Object(a.q)(),O=Object(a.p)(()=>Object(s.g)(e=>{(!u||Date.now()-p.current>u)&&f(e)},500,!0),[u]);return Object(a.n)(()=>{!t&&e&&(d?m&&setTimeout(()=>{f(.75)},1500):(f(0),p.current&&i.a(O),p.current=Date.now(),i.b(e,n,O).then(()=>{const e=Date.now()-p.current;p.current=void 0,!u||e>=u?b():setTimeout(b,u-e)})))},[t,e,d,n,l,b,m,u,O]),Object(a.n)(()=>{t&&p.current&&(i.a(O),f(0))},[O,t]),{mediaData:d,downloadProgress:h}}},function(e,t,n){"use strict";var a=n(0),r=n(8);n(218);const c={s:22,m:25,l:28,xl:20};t.a=Object(a.h)(({progress:e=0,size:t="l",square:n,transparent:s,noCross:i,onClick:o})=>{const l=c[t],u=l-4,d=l-1,m=2*u*Math.PI,b=Object(a.q)(null);Object(a.n)(()=>{if(!b.current)return;const t=b.current.firstElementChild,n=m-Math.min(Math.max(.05,e),1)*m;t?t.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):b.current.innerHTML=`\n \n `},[b,m,d,u,e]);const h=Object(r.a)("ProgressSpinner size-"+t,s&&"transparent",n&&"square",i&&"no-cross");return a.a.createElement("div",{ref:b,className:h,onClick:o})})},function(e,t,n){"use strict";var a=n(0),r=n(66);t.a=({containerId:e,className:t,children:n})=>{const c=Object(a.q)(document.createElement("div"));return Object(a.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const a=c.current;return t&&a.classList.add(t),n.appendChild(a),()=>{r.a.render(void 0,a),n.removeChild(a)}},[t,e]),r.a.render(n,c.current)}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(20),s=n(4),i=n(6),o=n(23),l=n(3),u=n(25),d=n(112),m=n(133),b=n(156);t.a=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=Object(i.f)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?Object(i.n)(e,a):void 0,areMessagesLoaded:Boolean(Object(i.m)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullChat","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withUsername:r,withFullInfo:i,withUpdatingStatus:l,withChatType:h,noRtl:f,chat:p,onlineCount:O,areMessagesLoaded:g,lastSyncTime:v,loadFullChat:j,openMediaViewer:E})=>{const y=p&&Object(s.nb)(p),{id:N,isMin:T,isRestricted:C}=p||{};Object(a.n)(()=>{N&&!T&&i&&v&&j({chatId:N})},[N,T,v,i,j,y]);const w=Object(a.m)((e,n)=>{p&&n&&(e.stopPropagation(),E({avatarOwnerId:p.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[p,t,E]),M=Object(u.a)();if(p)return a.a.createElement("div",{className:"ChatInfo",dir:!f&&M.isRtl?"rtl":void 0},a.a.createElement(d.a,{key:p.id,size:t,chat:p,onClick:n?w:void 0}),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",{dir:"auto"},Object(o.a)(Object(s.l)(M,p))),p.isVerified&&a.a.createElement(m.a,null)),function(){if(l&&!g&&!C)return a.a.createElement("span",{className:"status",dir:"auto"},M("Updating"));if(!p)return;if(e)return a.a.createElement(b.a,{typingStatus:e});if(h)return a.a.createElement("div",{className:"status",dir:"auto"},M(Object(s.m)(p)));const t=r?p.username:void 0,n=function(e,t){const n=e(Object(s.m)(t)),{membersCount:a}=t;if(t.isRestricted)return"Channel"===n?"channel is inaccessible":"group is inaccessible";if(!a)return n;return e("Channel"===n?"Subscribers":"Members",a,"i")}(M,p),c=O?", "+M("OnlineCount",O,"i"):void 0;return a.a.createElement("div",{className:"status"},t&&a.a.createElement("span",{className:"handle"},t),a.a.createElement("span",{className:"group-status"},n),c&&a.a.createElement("span",{className:"online-status"},c))}()))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return l}));var a=n(20),r=n(48),c=n(9),s=n(61);let i=!1;function o(e,t,n,o=0,l=1500,u,d,m){if(u===a.b.Static)return void t.scrollIntoView({block:n});const{offsetTop:b}=t;if(void 0===u){const t=b-e.scrollTop;t<-l?e.scrollTop+=t+l:t>l&&(e.scrollTop+=t-l)}else u===a.b.Up?e.scrollTop=b+l:u===a.b.Down&&(e.scrollTop=Math.max(0,b-l));i=!0,Object(c.b)(()=>{!function(e,t,n,a=0,c,o){const{offsetTop:l,offsetHeight:u}=t,{scrollTop:d,offsetHeight:m,scrollHeight:b}=e,h=!o&&e.dataset.normalHeight?Number(e.dataset.normalHeight):m;let f;switch(n){case"start":f=l-a-d;break;case"end":f=l+u+a-(d+h);break;case"nearest":case"center":f=u0){const e=b-(d+h);f=Math.min(f,e)}const p=e.scrollTop+f,O=c||250+Math.abs(f)/1500*350,g=Date.now();Object(r.b)(O),Object(s.b)(()=>{const t=Math.min((Date.now()-g)/O,1),n=f*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollTop=Math.round(p-n),i=t<1,i})}(e,t,n,o,d,m)})}function l(){return i}},,function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(25),s=n(21);n(225);var i=Object(a.h)(({id:e,label:t,subLabel:n,value:i,name:o,checked:l,disabled:u,hidden:d,isLoading:m,onChange:b})=>{const h=Object(c.a)(),f=Object(r.a)("Radio",u&&"disabled",d&&"hidden-widget",m&&"loading");return a.a.createElement("label",{className:f,dir:h.isRtl?"rtl":void 0},a.a.createElement("input",{type:"radio",name:o,value:i,id:e,checked:l,onChange:b,disabled:u||d}),a.a.createElement("div",{className:"Radio-main"},a.a.createElement("span",{className:"label",dir:h.isRtl?"auto":void 0},t),n&&a.a.createElement("span",{className:"subLabel",dir:h.isRtl?"auto":void 0},n)),m&&a.a.createElement(s.a,null))});t.a=Object(a.h)(({id:e,name:t,options:n,selected:r,disabled:c,loadingOption:s,onChange:o})=>{const l=Object(a.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]);return a.a.createElement("div",{id:e,className:"radio-group"},n.map(e=>a.a.createElement(i,{name:t,label:e.label,subLabel:e.subLabel,value:e.value,checked:e.value===r,hidden:e.hidden,disabled:c,isLoading:s?s===e.value:void 0,onChange:l})))})},function(e,t,n){"use strict";var a=n(0),r=n(20),c=n(3),s=n(26),i=n(38);function o(e,t=0,n,a){const{length:c}=e,s=e.indexOf(t),i=n===r.e.Forwards?s:s+1||c,o=Math.max(0,i-a),l=i+a-1,u=e.slice(Math.max(0,o),l+1);let d,m;switch(n){case r.e.Forwards:d=i>0,m=o>=0;break;case r.e.Backwards:d=i{const d=Object(a.q)(),m=Object(a.q)((()=>{if(!t||d.current)return;const{newViewportIds:e}=o(t,t[0],r.e.Forwards,l);return e})()),b=Object(s.a)(),h=Object(i.a)(t),f=Object(i.a)(n);if(t&&!n&&(t!==h||n!==f)){const{offsetId:e=t[0],direction:n=r.e.Forwards}=d.current||{},{newViewportIds:a}=o(t,e,n,l);m.current&&Object(c.a)(m.current,a)||(m.current=a)}Object(a.n)(()=>{if(t&&!n&&e&&u){const t=m.current;e({offsetId:t[t.length-1]})}},[t,n,e,u]);const p=Object(a.m)(({direction:n,noScroll:a})=>{const s=m.current,i=s?n===r.e.Backwards?s[s.length-1]:s[0]:void 0;if(!t)return void(e&&e({offsetId:i}));a||(d.current={...d.current,direction:n,offsetId:i});const{newViewportIds:u,areSomeLocal:h,areAllLocal:f}=o(t,i,n,l);!h||s&&Object(c.a)(s,u)||(m.current=u,b()),!f&&e&&e({offsetId:i})},[t,l,e,b]);return n?[t]:[m.current,p]}},function(e,t,n){"use strict";var a=n(0),r=n(5),c=n(1),s=n(115),i=n(107),o=n(108),l=n(114),u=n(34),d=n(116);n(223);t.a=({sticker:e,isInline:t=!1,observeIntersection:n,lastSyncTime:m})=>{const b=Object(a.q)(null),[h,f]=Object(u.a)(),p="sticker"+e.id,O=Object(i.b)(b,n),g=Object(o.a)(p+"?size=m",!O,r.ApiMediaFormat.BlobUrl,m),{transitionClassNames:v}=Object(l.a)(g,"slow"),j=Object(o.a)(p,!O,r.ApiMediaFormat.Lottie,m),E=Boolean(j),[y,N]=Object(a.r)(String(Math.random())),T=Object(a.m)(()=>{N(String(Math.random()))},[]);let C;C=t?.5*Object(s.l)(e).width:c.Bb;const w=`width: ${C}px; height: ${C}px;`;return a.a.createElement("div",{ref:b,className:"AnimatedEmoji media-inner",style:w,onClick:T},g&&!h&&a.a.createElement("img",{src:g,className:v,alt:""}),E&&a.a.createElement(d.a,{key:p,id:p,animationData:j,size:C,quality:1,play:O&&y,noLoop:!0,onLoad:f}))}},function(e,t,n){"use strict";function a(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),a=document.createRange();e.lastChild&&e.lastChild.nodeValue?(a.setStart(e.lastChild,e.lastChild.nodeValue.length),n.removeAllRanges(),n.addRange(a)):e.focus()}n.d(t,"a",(function(){return a}))},,function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},function(e,t,n){"use strict";let a;n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return r})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Left=2]="Left",e[e.Right=3]="Right"}(a||(a={}));function r(e,t){let n,r,c=!1;function s(e){t.excludedClosestSelector&&(e.target.matches(t.excludedClosestSelector)||e.target.closest(t.excludedClosestSelector))||(n=e,"mousedown"===e.type?(document.addEventListener("mousemove",o),document.addEventListener("mouseup",i)):"touchstart"===e.type&&(document.addEventListener("touchmove",o),document.addEventListener("touchend",i),document.addEventListener("touchcancel",i),"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY))),document.body.classList.add("no-selection"),t.withCursor&&document.body.classList.add("cursor-grabbing"),t.onCapture&&t.onCapture(e))}function i(e){n&&(t.withCursor&&document.body.classList.remove("cursor-grabbing"),document.body.classList.remove("no-selection"),document.removeEventListener("mouseup",i),document.removeEventListener("mousemove",o),document.removeEventListener("touchcancel",i),document.removeEventListener("touchend",i),document.removeEventListener("touchmove",o),n=void 0,c?t.onRelease&&t.onRelease(e):t.onClick&&t.onClick(e)),c=!1,r=void 0}function o(e){if(n){"touchmove"===e.type&&"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY));const s=e.pageX-n.pageX,i=e.pageY-n.pageY;(Math.abs(s)>=15||Math.abs(i)>=15)&&(c=!0),t.onDrag&&(e.preventDefault(),t.onDrag(e,n,{dragOffsetX:s,dragOffsetY:i})),t.onSwipe&&function(e,n,c){if(!r){const e=Math.abs(n),t=Math.abs(c);if(n&&c){if(Math.max(e,t)/Math.min(e,t)<2)return}e>=50?r="x":t>=50&&(r="y")}!function(e,t,n,r,c){"x"===t?c(e,n<0?a.Left:a.Right):"y"===t&&c(e,r<0?a.Up:a.Down)}(e,r,n,c,t.onSwipe)}(e,s,i)}}return e.addEventListener("mousedown",s),e.addEventListener("touchstart",s,{passive:!0}),()=>{e.removeEventListener("mousedown",s),e.removeEventListener("touchstart",s)}}},function(e,t,n){"use strict";var a=n(0);n(202);t.a=()=>a.a.createElement("span",{className:"VerifiedIcon"})},function(e,t,n){"use strict";function a(e,t){return t-Math.floor(t/e)*e}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(38);function r(e,t=!1,n=!1){const r=Object(a.a)(e,t);return n||null!=e?e:r}},function(e,t,n){"use strict";var a=n(1);t.a=e=>{e.play().catch(e=>{a.p&&console.warn(e)})}},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(158);t.a=(e=!1)=>{const[t,n]=Object(a.r)(!e),[s,i]=Object(a.r)(0),o=Object(a.p)(()=>Object(r.a)(n,200,!1,!0),[]),l=Object(a.m)(e=>{const t=e.currentTarget;Object(c.a)(t)||(t.buffered.length&&i(t.buffered.end(0)/t.duration),o(t.readyState>=3||t.currentTime>0))},[o]);return{isBuffered:t,bufferedProgress:s,bufferingHandlers:{onLoadedData:l,onPlaying:l,onLoadStart:l,onPause:l,onTimeUpdate:l,onProgress:l},checkBuffering(e){o(e.readyState>=3)}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(5),r=n(7);const c={B:a.ApiMessageEntityTypes.Bold,STRONG:a.ApiMessageEntityTypes.Bold,I:a.ApiMessageEntityTypes.Italic,EM:a.ApiMessageEntityTypes.Italic,U:a.ApiMessageEntityTypes.Underline,S:a.ApiMessageEntityTypes.Strike,STRIKE:a.ApiMessageEntityTypes.Strike,DEL:a.ApiMessageEntityTypes.Strike,CODE:a.ApiMessageEntityTypes.Code,PRE:a.ApiMessageEntityTypes.Pre,BLOCKQUOTE:a.ApiMessageEntityTypes.Blockquote};function s(e){const t=document.createElement("div");t.innerHTML=function(e){let t=e.slice(0);t=r.d?t.replace(/([^<]*)<\/span>/g,"$1"):t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1");return t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),t=t.replace(/]*)?>/g,"\n"),t=t.replace(/<\/div>(\s*)
/g,"\n"),t=t.replace(/
/g,"\n"),t=t.replace(/<\/div>/g,""),t=t.replace(/^`{3}(.*[\n\r][^]*?^)`{3}/gm,"
$1
"),t=t.replace(/[`]{3}([^`]+)[`]{3}/g,"
$1
"),t=t.replace(/[`]{1}([^`\n]+)[`]{1}/g,"$1"),t=t.replace(/[*]{2}([^*\n]+)[*]{2}/g,"$1"),t=t.replace(/[*]{1}([^*\n]+)[*]{1}/g,"$1"),t=t.replace(/[~]{2}([^~\n]+)[~]{2}/g,"$1"),t}(e);const n=t.innerText.trim().replace(/\u200b+/g,"").slice(0,4096);let s=0,i=0;const o=[];function l(e){const{index:t,entity:r}=function(e,t,n){const r=function(e){if(c[e.nodeName])return c[e.nodeName];if("A"===e.nodeName){const t=e;return t.dataset.entityType===a.ApiMessageEntityTypes.MentionName?a.ApiMessageEntityTypes.MentionName:t.href.startsWith("mailto:")?a.ApiMessageEntityTypes.Email:t.href.startsWith("tel:")?a.ApiMessageEntityTypes.Phone:t.href!==t.textContent?a.ApiMessageEntityTypes.TextUrl:a.ApiMessageEntityTypes.Url}if("SPAN"===e.nodeName)return e.dataset.entityType;return}(e);if(!r||!e.textContent)return{index:n,entity:void 0};const s=t.indexOf(e.textContent,n),i=s>=0?s:n,o=t.substring(0,i).length,{length:l}=t.substring(i,i+e.textContent.length);let u,d;r===a.ApiMessageEntityTypes.TextUrl&&(u=e.href);r===a.ApiMessageEntityTypes.MentionName&&(d=Number(e.dataset.userId));return{index:i,entity:{type:r,offset:o,length:l,...u&&{url:u},...d&&{userId:d}}}}(e,n,s);r?(s=t,o.push(r)):e.textContent&&(s+=e.textContent.length),e.hasChildNodes()&&i<=3&&(i+=1,Array.from(e.childNodes).forEach(l))}return Array.from(t.childNodes).forEach(e=>{i=1,l(e)}),{text:n,entities:o.length?o:void 0}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var a=n(0),r=n(35),c=n(8),s=n(47),i=n(38),o=n(34);n(213);var l=Object(a.h)(({isQuick:e,onFileSelect:t})=>{const[n,r,s]=Object(o.a)(),i=Object(c.a)("DropTarget",n&&"hovered");return a.a.createElement("div",{className:i,onDrop:t,onDragEnter:()=>{r()},onDragLeave:e=>{const{relatedTarget:t}=e;t&&e.stopPropagation(),s()}},a.a.createElement("div",{className:"target-content"},a.a.createElement("div",{className:"icon icon-"+(e?"photo":"document")}),a.a.createElement("div",{className:"title"},"Drop files here to send them"),a.a.createElement("div",{className:"description"},e?"in a quick way":"without compression")))});n(214);let u;!function(e){e.None="none",e.Document="document",e.QuickFile="quick_file"}(u||(u={}));t.b=Object(a.h)(({isOpen:e,withQuick:t,onHide:n,onFileSelect:o})=>{const u=Object(a.q)(null),d=Object(i.a)(t),{shouldRender:m,transitionClassNames:b}=Object(r.a)(e);Object(a.n)(()=>e?Object(s.a)(n):void 0,[e,n]);const h=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!1))},[o,n]),f=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!0))},[o,n]),p=Object(a.m)(e=>{e.stopPropagation();const{target:t,relatedTarget:a}=e;t.matches(".DropTarget, .DropArea")&&!a&&(u.current=window.setTimeout(()=>{n()},150))},[n]);if(!m)return;const O=Object(c.a)("DropArea",b);return a.a.createElement("div",{className:O,onDragLeave:p,onDragOver:()=>{u.current&&window.clearTimeout(u.current)},onDrop:n},a.a.createElement(l,{onFileSelect:h}),(t||d)&&a.a.createElement(l,{onFileSelect:f,isQuick:!0}))})},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(23),o=n(8),l=n(25),u=n(112);n(196);t.a=Object(a.h)(Object(r.h)((e,{chatOrUserId:t})=>{if(!t)return{};return{chat:t?Object(c.f)(e,t):void 0,user:Object(s.lb)(t)?Object(c.Gb)(e,t):void 0}})(({icon:e,title:t,isMinimized:n,canClose:r,onClick:c,clickArg:d,chat:m,user:b,className:h})=>{const f=Object(l.a)();let p,O;if(e&&t)p=a.a.createElement("div",{className:"item-icon"},a.a.createElement("i",{className:"icon-"+e})),O=t;else if(m||b){p=a.a.createElement(u.a,{chat:m,user:b,size:"small",isSavedMessages:b&&b.isSelf});const e=!m||b&&!b.isSelf?Object(s.Y)(b):Object(s.l)(f,m,b);O=e?Object(i.a)(e):void 0}const g=Object(o.a)("PickerSelectedItem",h,n&&"minimized",r&&"closeable");return a.a.createElement("div",{className:g,onClick:()=>c(d),title:n?O:void 0,dir:f.isRtl?"rtl":void 0},p,!n&&a.a.createElement("div",{className:"item-name",dir:"auto"},O),r&&a.a.createElement("div",{className:"item-remove"},a.a.createElement("i",{className:"icon-close"})))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(9),r=n(61),c=n(7);function s(e,t){c.e?Object(a.b)(()=>{!function(e,t){const{scrollLeft:n,offsetWidth:a,scrollWidth:c}=e;let s=t-n;if(s<0){const e=-n;s=Math.max(s,e)}else if(s>0){const e=c-(n+a);s=Math.min(s,e)}const i=e.scrollLeft+s,o=Date.now();Object(r.a)(()=>{const t=Math.min((Date.now()-o)/450,1),n=s*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(i-n),t<1})}(e,t)}):e.scrollTo({left:t,behavior:"smooth"})}},function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>{if(e)return e.addEventListener("wheel",t,{passive:!0}),()=>{e.removeEventListener("wheel",t)};function t(t){t.deltaX||(e.scrollLeft+=t.deltaY/4)}},[e,t])}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(9);t.a=(e,t,n,s)=>{const{loadMessage:i}=Object(r.d)(),o=Object(a.p)(()=>{const n=Object(c.g)(i,500,!0);return()=>{n({chatId:e,messageId:t,replyOriginForId:s})}},[i,e,t,s]);Object(a.n)(()=>{t&&!n&&o()})}},function(e,t,n){"use strict";var a=n(0),r=n(7);let c=0;t.a=(e,t,n)=>{const[s,i]=Object(a.r)(!1),[o,l]=Object(a.r)(void 0),u=Object(a.m)(e=>{t||2!==e.button||document.body.classList.add("no-selection")},[t]),d=Object(a.m)(e=>{document.body.classList.remove("no-selection"),t||n&&e.target.matches("a.text-entity-link[href]")||(e.preventDefault(),o||(document.body.classList.remove("no-selection"),0===c&&document.body.classList.add("has-context-menu"),c++,i(!0),l({x:e.clientX,y:e.clientY})))},[t,n,o]),m=Object(a.m)(()=>{i(!1)},[]),b=Object(a.m)(()=>{l(void 0),document.body.classList.remove("no-selection"),setTimeout(()=>{c--,0===c&&document.body.classList.remove("has-context-menu")},200)},[]);return Object(a.n)(()=>{if(t||!r.l)return;const n=e.current;if(!n)return;let a;const c=()=>{a&&(clearTimeout(a),a=void 0)},s=e=>{t||r.g&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(c(),a=window.setTimeout(()=>(e=>{c();const{clientX:t,clientY:a}=e.touches[0];o||(n.addEventListener("touchend",(function e(t){n.removeEventListener("touchend",e,!0),t.stopImmediatePropagation(),t.preventDefault(),t.stopPropagation()}),!0),document.body.classList.add("no-selection"),i(!0),l({x:t,y:a}))})(e),250))};return n.addEventListener("touchstart",s,{passive:!0}),n.addEventListener("touchcancel",c,!0),n.addEventListener("touchend",c,!0),n.addEventListener("touchmove",c,{passive:!0}),()=>{c(),n.removeEventListener("touchstart",s),n.removeEventListener("touchcancel",c,!0),n.removeEventListener("touchend",c,!0),n.removeEventListener("touchmove",c)}},[o,t,e]),{isContextMenuOpen:s,contextMenuPosition:o,handleBeforeContextMenu:u,handleContextMenu:d,handleContextMenuClose:m,handleContextMenuHide:b}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return m}));var a=n(0),r=n(2),c=n(5),s=n(4),i=n(23),o=n(76),l=n(57);function u(e,t,n){const a=e.content.text;if(!a||!a.text){const t=Object(s.O)(e);return t?[t]:void 0}const{text:r,entities:c}=a;return m(r,c,t,n)}function d(e){const t=new Set,n=[];return e.forEach((a,r)=>{if(t.has(r))return;const c=function e(t,n,a,r){const{offset:c,length:s}=t,i=new Set([n]);if(r.has(n))return;const o=a.filter((e,t)=>t>n&&e.offset>=c&&e.offsete(t,a.indexOf(t),a,r)).filter(Boolean);return o.forEach(e=>e.organizedIndexes.forEach(e=>i.add(e))),{entity:t,organizedIndexes:i,nestedEntities:o}}(a,r,e,t);c&&(c.organizedIndexes.forEach(e=>{t.add(e)}),n.push(c))}),n}function m(e,t,n,r,s){if(!t||!t.length)return b(e,n,r,s);const u=[];let m=!1;const O=d(t);function g(t,u,d,O){const v=[],{entity:j,nestedEntities:E}=d,{offset:y,length:N,type:T}=j;let C=e.substring(t,y);const w=C.length;C&&(m&&C.length>0&&"\n"===C[0]&&(C=C.substr(1),m=!1),C&&v.push(...b(C,n,r,s)));const M=t+w,S=M+N;let L=e.substring(y,y+N);const I=[];if(m&&L.length>0&&"\n"===L[0]&&(L=L.substr(1),m=!1),T===c.ApiMessageEntityTypes.Pre&&(m=!0),E.length){let e=M;E.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(e,S,t,n===E.length-1);I.push(...a),e=r})}const A=s?function(e,t,n){const a="string"==typeof t&&t,r=n.length?n.join(""):Object(i.a)(t,["emoji_html","br_html"]).join("");if(!a)return r;switch(e.type){case c.ApiMessageEntityTypes.Bold:return`${r}`;case c.ApiMessageEntityTypes.Italic:return`${r}`;case c.ApiMessageEntityTypes.Underline:return`${r}`;case c.ApiMessageEntityTypes.Code:return`${r}`;case c.ApiMessageEntityTypes.Pre:return`\`\`\`
${r}
\`\`\``;case c.ApiMessageEntityTypes.Strike:return`${r}`;case c.ApiMessageEntityTypes.MentionName:return`${r}`;case c.ApiMessageEntityTypes.Url:case c.ApiMessageEntityTypes.TextUrl:return`${r}`;default:return r}}(j,L,I):function(e,t,n){const r="string"==typeof t&&t,s=n.length?n:t;if(!r)return b(s);switch(e.type){case c.ApiMessageEntityTypes.Bold:return a.a.createElement("strong",null,b(s));case c.ApiMessageEntityTypes.Blockquote:return a.a.createElement("blockquote",null,b(s));case c.ApiMessageEntityTypes.BotCommand:return a.a.createElement("a",{onClick:f,className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Hashtag:case c.ApiMessageEntityTypes.Cashtag:return a.a.createElement("a",{onClick:p,className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Code:return a.a.createElement("code",{className:"text-entity-code"},b(s));case c.ApiMessageEntityTypes.Email:return a.a.createElement("a",{href:"mailto:"+r,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Italic:return a.a.createElement("em",null,b(s));case c.ApiMessageEntityTypes.MentionName:return a.a.createElement(o.a,{userId:e.userId},b(s));case c.ApiMessageEntityTypes.Mention:return a.a.createElement(o.a,{username:r},b(s));case c.ApiMessageEntityTypes.Phone:return a.a.createElement("a",{href:"tel:"+r,className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Pre:return a.a.createElement("pre",{className:"text-entity-pre"},b(s));case c.ApiMessageEntityTypes.Strike:return a.a.createElement("del",null,b(s));case c.ApiMessageEntityTypes.TextUrl:case c.ApiMessageEntityTypes.Url:return a.a.createElement(l.a,{url:h(r,e),text:r},b(s));case c.ApiMessageEntityTypes.Underline:return a.a.createElement("ins",null,b(s));default:return b(s)}}(j,L,I);if(Array.isArray(A)?v.push(...A):v.push(A),O&&S0&&"\n"===t[0]&&(t=t.substring(1)),t&&v.push(...b(t,n,r,s))}return{renderResult:v,entityEndIndex:S}}let v=0;return O.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(v,e.length,t,n===O.length-1);u.push(...a),v=r}),u}function b(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach(e=>{r.push(...b(e,t,n,a))}),r}if(a)return Object(i.a)(e,["escape_html","emoji_html","br_html"]);const r=n?"hq_emoji":"emoji";return t?Object(i.a)(e,[r,"br","highlight"],{highlight:t}):Object(i.a)(e,[r,"br"])}function h(e,t){const{type:n,url:a}=t;return n===c.ApiMessageEntityTypes.TextUrl&&a?a:e}function f(e){Object(r.d)().sendBotCommand({command:e.currentTarget.innerText})}function p(e){Object(r.d)().setLocalTextSearchQuery({query:e.currentTarget.innerText}),Object(r.d)().searchTextMessagesLocal()}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var a=n(0),r=n(9);function c(e,t){Object(a.n)(()=>{const t=e.current;return()=>{t&&Object(r.b)(()=>{t.pause(),t.src="",t.load()})}},t)}},,,function(e,t,n){},,,function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"c",(function(){return s})),n.d(t,"b",(function(){return i}));var a=n(1);const r=navigator.clipboard&&window.ClipboardItem,c=document.createElement("textarea");c.setAttribute("readonly",""),c.tabIndex=-1,c.className="visually-hidden";const s=e=>{c.value=e,document.body.appendChild(c);const t=document.getSelection();if(t){const e=t.rangeCount>0&&t.getRangeAt(0);c.select(),document.execCommand("copy"),e&&(t.removeAllRanges(),t.addRange(e))}document.body.removeChild(c)},i=e=>{const t=document.createElement("canvas"),n=t.getContext("2d"),a=new Image;a.onload=e=>{if(n&&e.currentTarget){const a=e.currentTarget;t.width=a.width,t.height=a.height,n.drawImage(a,0,0,a.width,a.height),t.toBlob(o,"image/png",1)}},a.src=e};async function o(e){if(e&&r)try{await navigator.clipboard.write([new window.ClipboardItem({[e.type]:e})])}catch(e){a.p&&console.error(e)}}},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(34),s=n(25),i=n(16),o=n(32);n(194);t.a=Object(a.h)(({ref:e,children:t,parentContainerClassName:n,value:l,inputId:u,className:d,focused:m,isLoading:b,placeholder:h,disabled:f,autoComplete:p,canClose:O,onChange:g,onReset:v,onFocus:j,onBlur:E})=>{let y=Object(a.q)(null);e&&(y=e);const[N,T,C]=Object(c.a)(m);Object(a.n)(()=>{y.current&&(m?y.current.focus():y.current.blur())},[m,h]);const w=Object(s.a)();const M=Object(a.m)(e=>{if("ArrowDown"===e.key){const e=document.querySelector(`.${n} .ListItem-button`);e&&e.focus()}},[n]);return a.a.createElement("div",{className:Object(r.a)("SearchInput",d,N&&"has-focus"),dir:w.isRtl?"rtl":void 0},t,a.a.createElement("input",{ref:y,id:u,type:"text",dir:"auto",placeholder:h||w("Search"),className:"form-control",value:l,disabled:f,autoComplete:p,onChange:function(e){const{currentTarget:t}=e;g(t.value)},onFocus:function(){T(),j&&j()},onBlur:function(){C(),E&&E()},onKeyDown:M}),a.a.createElement("i",{className:"icon-search"}),b&&a.a.createElement(i.a,null),!b&&(l||O)&&v&&a.a.createElement(o.a,{round:!0,size:"tiny",color:"translucent",onClick:v},a.a.createElement("span",{className:"icon-close"})))})},function(e,t,n){"use strict";var a=n(7);t.a=(e,t)=>{a.e&&(e.style.overflow="hidden"),void 0!==t&&(e.scrollTop=t),a.e&&(e.style.overflow="")}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(23),o=n(25);n(203);t.a=Object(a.h)(Object(r.h)((e,{typingStatus:t})=>{if(!t.userId)return{};return{typingUser:Object(c.Gb)(e,t.userId)}})(({typingStatus:e,typingUser:t})=>{const n=Object(o.a)(),r=t&&!t.isSelf&&Object(s.Y)(t);return a.a.createElement("p",{className:"typing-status",dir:n.isRtl?"rtl":"auto"},r&&a.a.createElement("span",{className:"sender-name",dir:"auto"},Object(i.a)(r)),n(e.action).replace("{user}","").trim(),a.a.createElement("span",{className:"ellipsis"}))}))},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(6),s=n(4),i=n(3),o=n(25),l=n(23),u=n(112),d=n(110),m=n(32);n(206);t.a=Object(a.h)(Object(r.h)((e,{chat:t})=>{const n=Object(s.lb)(t.id),a=Object(c.P)(e,t.id),r=n&&!a,i=t&&Object(s.lb)(t.id)?Object(s.Y)(Object(c.Gb)(e,Object(s.U)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isChannel:Object(s.jb)(t),isBasicGroup:Object(s.ib)(t),isSuperGroup:Object(s.nb)(t),canDeleteForAll:r,contactName:i}},(e,t)=>Object(i.l)(t,["leaveChannel","deleteHistory","deleteChannel"]))(({isOpen:e,chat:t,isChannel:n,isPrivateChat:r,isChatWithSelf:c,isBasicGroup:i,isSuperGroup:b,canDeleteForAll:h,contactName:f,onClose:p,leaveChannel:O,deleteHistory:g,deleteChannel:v})=>{const j=Object(o.a)(),E=Object(s.l)(j,t),y=Object(a.m)(()=>{g({chatId:t.id,shouldDeleteForAll:!0}),p()},[g,t.id,p]),N=Object(a.m)(()=>{r||i?g({chatId:t.id,shouldDeleteForAll:!1}):!n&&!b||t.isCreator?(n||b)&&t.isCreator&&v({chatId:t.id}):O({chatId:t.id}),p()},[r,i,n,b,t.isCreator,t.id,p,g,O,v]);return a.a.createElement(d.a,{isOpen:e,onClose:p,className:"DeleteChatModal",header:a.a.createElement("div",{className:"modal-header",dir:j.isRtl?"rtl":void 0},a.a.createElement(u.a,{size:"tiny",chat:t,isSavedMessages:c}),a.a.createElement("h3",{className:"modal-title"},j(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"ChannelDelete":i||b?"Group.LeaveGroup":"DeleteChatUser")))},n&&t.isCreator?a.a.createElement("p",null,Object(l.a)(j("ChatList.DeleteAndLeaveGroupConfirmation",E),["simple_markdown"])):n&&!t.isCreator||i||b?a.a.createElement("p",null,Object(l.a)(j("ChannelLeaveAlertWithName",E),["simple_markdown"])):a.a.createElement("p",null,Object(l.a)(j("ChatList.DeleteChatConfirmation",f),["simple_markdown"])),h&&a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:y},f?j("ChatList.DeleteForEveryone",f):j("DeleteForAll")),a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:N},j(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"Chat.Input.Delete":i||b?"Group.LeaveGroup":h?"ChatList.DeleteForCurrentUser":"Delete")),a.a.createElement(m.a,{className:"confirm-dialog-button",isText:!0,onClick:p},j("Cancel")))}))},function(e,t,n){"use strict";function a(e){e.dataset.patchedForSafari||(e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",(function n(){e.buffered.length&&(e.dataset.patchForSafariInProgress="true",e.currentTime=e.duration-1,e.addEventListener("progress",()=>{delete e.dataset.patchForSafariInProgress,e.currentTime=t,e.paused&&e.play()},{once:!0}),e.removeEventListener("progress",n))}))},{once:!0}),e.dataset.patchedForSafari="true")}function r(e){return Boolean(e.dataset.patchForSafariInProgress)}n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";var a=n(0),r=n(38);t.a=(e,t)=>{const n=Object(r.a)(t);return Object(a.o)(()=>{e(n||[])},t)}},function(e,t,n){"use strict";var a=n(0),r=n(59),c=n(4),s=n(107),i=n(120),o=n(108),l=n(178),u=n(179);t.a=Object(a.h)(({message:e,observeIntersection:t,smaller:n,uploadProgress:d,withDate:m,datetime:b,className:h,sender:f,isSelected:p,isSelectable:O,onCancelUpload:g,onDateClick:v})=>{const j=Object(a.q)(null),E=e.content.document,y=Object(r.b)(E)||"",{fileName:N,size:T,timestamp:C}=E,w=Object(s.b)(j,t),[M,S]=Object(a.r)(!1),{mediaData:L,downloadProgress:I}=Object(i.a)(Object(c.D)(e,"download"),!M),{isUploading:A,isTransferring:k,transferProgress:x}=Object(c.s)(e,d||I,M),D=Object(r.c)(E),R=D?Object(c.E)(e):void 0,_=D?E.previewBlobUrl:void 0,P=Object(o.a)(Object(c.D)(e,"pictogram"),!w),F=Object(a.m)(()=>{A?g&&g():S(e=>!e)},[A,g]),U=Object(a.m)(()=>{v(e.id,e.chatId)},[v,e.id,e.chatId]);return Object(a.n)(()=>{M&&L&&(Object(l.a)(L,N),S(!1))},[N,L,M]),a.a.createElement(u.a,{ref:j,name:N,extension:y,size:T,timestamp:m?b||C:void 0,thumbnailDataUri:R,previewData:_||P,smaller:n,isTransferring:k,isUploading:A,transferProgress:x,className:h,sender:f,isSelectable:O,isSelected:p,onClick:F,onDateClick:v?U:void 0})})},function(e,t,n){"use strict";var a=n(0),r=n(11),c=n(17);t.a=Object(a.h)(e=>{const{isOpen:t}=e,n=Object(c.a)(r.a.Extra,"StickerSetModal",!t);return n?a.a.createElement(n,e):void 0})},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(0),r=n(163),c=n(26),s=n(7);function i(e,t=!1,n){const i=Object(a.q)(null),o=Object(c.a)();return Object(a.n)(()=>{const a=i.current;if(!e||!a||t)return;const c=new Image,o=()=>{a.width=c.width,a.height=c.height;const e=a.getContext("2d",{alpha:!1});s.c&&(e.filter="blur(2px)"),e.drawImage(c,-4,-4,a.width+8,a.height+8),s.c||Object(r.a)(e,0,0,a.width,a.height,2,2)};c.onload=()=>{n?requestAnimationFrame(o):o()},c.src=e},[i,e,o,t,n]),i}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],r=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function c(e,t,n,c,s,i,o){if(Number.isNaN(i)||i<1)return;i|=0,Number.isNaN(o)&&(o=1),(o|=0)>3&&(o=3),o<1&&(o=1);const l=e.getImageData(t,n,c,s),u=l.data;let d,m,b,h,f,p,O,g,v,j,E,y,N=c-1,T=s-1,C=i+1,w=[],M=[],S=[],L=a[i],I=r[i],A=[],k=[];for(;o-- >0;){for(y=E=0,f=0;fN?N:p)<<2),d+=u[O++],m+=u[O++],b+=u[O++];for(h=0;h0?O<<2:0),g=y+A[h],v=y+k[h],d+=u[g++]-u[v++],m+=u[g++]-u[v++],b+=u[g++]-u[v++],E++;y+=c<<2}for(h=0;hT?0:c,d+=w[j],m+=M[j],b+=S[j];for(E=h<<2,f=0;f>>I,u[E+1]=m*L>>>I,u[E+2]=b*L>>>I,0==h&&(A[f]=((O=f+C)0?O*c:0),g=h+A[f],v=h+k[f],d+=w[g]-w[v],m+=M[g]-M[v],b+=S[g]-S[v],E+=c<<2}}e.putImageData(l,t,n)}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(8),s=n(47),i=n(35),o=n(79),l=n(34),u=n(25),d=n(32);n(238);const m={B:"bold",STRONG:"bold",I:"italic",EM:"italic",U:"underline",DEL:"strikethrough",CODE:"monospace"};t.a=Object(a.h)(({isOpen:e,anchorPosition:t,selectedRange:n,onClose:b})=>{const h=Object(a.q)(null),f=Object(a.q)(null),{shouldRender:p,transitionClassNames:O}=Object(i.a)(e),[g,v,j]=Object(l.a)(),[E,y]=Object(a.r)(""),[N,T]=Object(a.r)(!1),[C,w]=Object(a.r)(),[M,S]=Object(a.r)({});Object(a.n)(()=>e?Object(s.a)(b):void 0,[e,b]),Object(o.a)(e,h,b),Object(a.n)(()=>{g?f.current.focus():(y(""),T(!1))},[g]),Object(a.n)(()=>{p||(j(),S({}),w(void 0))},[j,p]),Object(a.n)(()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.v;){const e=m[a.tagName];e&&(t[e]=!0),a=a.parentElement}S(t)},[e,n,v]);const L=Object(a.m)(()=>{if(n)return n.toString()},[n]),I=Object(a.m)(()=>{if(n)return n.commonAncestorContainer.parentElement},[n]);function A(){const e=f.current;if(!e)return;const{offsetWidth:t,scrollWidth:n,scrollLeft:a}=e;if(n<=t)return void w(void 0);let r="";a0&&(r+=" mask-left"),w(r)}function k(e){if(M[e])return"active";if("monospace"===e||"strikethrough"===e){if(Object.keys(M).some(t=>t!==e&&!!M[t]))return"disabled"}else if(M.monospace||M.strikethrough)return"disabled"}const x=Object(a.m)(()=>{S(e=>(document.execCommand(e.bold?"removeFormat":"bold"),Object.keys(e).forEach(t=>{"italic"!==t&&"underline"!==t||!e[t]||document.execCommand(t)}),{...e,bold:!e.bold}))},[]),D=Object(a.m)(()=>{document.execCommand("italic"),S(e=>({...e,italic:!e.italic}))},[]),R=Object(a.m)(()=>{document.execCommand("underline"),S(e=>({...e,underline:!e.underline}))},[]),_=Object(a.m)(()=>{if(M.strikethrough){const e=I();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void S(e=>({...e,strikethrough:!1}))}const e=L();document.execCommand("insertHTML",!1,`${e}`),b()},[I,L,b,n,M.strikethrough]),P=Object(a.m)(()=>{if(M.monospace){const e=I();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void S(e=>({...e,monospace:!1}))}const e=L();document.execCommand("insertHTML",!1,`${e}`),b()},[I,L,b,n,M.monospace]);function F(){const e=E.includes("://")?E:"http://"+E;if(N){const t=I();if(!t||"A"!==t.tagName)return;return t.href=e,void b()}const t=L();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),b()}const U=Object(a.m)(e=>{const t={KeyK:v,KeyB:x,KeyU:R,KeyI:D,KeyM:P,KeyS:_}[e.code];!e.altKey&&(e.ctrlKey||e.metaKey)&&t&&(e.preventDefault(),e.stopPropagation(),t())},[x,D,R,P,_,v]);Object(a.n)(()=>(e&&document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)),[e,U]);const B=Object(u.a)();if(!p)return;const q=Object(c.a)("TextFormatter",O,g&&"link-control-shown"),H=Object(c.a)("TextFormatter-link-url-confirm",!!E.length&&"shown"),$=t?`left: ${t.x}px; top: ${t.y}px;--text-formatter-left: ${t.x}px;`:"";return a.a.createElement("div",{ref:h,className:q,style:$,onKeyDown:function(e){"Enter"===e.key&&g&&(F(),e.preventDefault())}},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(d.a,{color:"translucent",ariaLabel:"Bold text",className:k("bold"),onClick:x},a.a.createElement("i",{className:"icon-bold"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Italic text",className:k("italic"),onClick:D},a.a.createElement("i",{className:"icon-italic"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Underlined text",className:k("underline"),onClick:R},a.a.createElement("i",{className:"icon-underlined"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Strikethrough text",className:k("strikethrough"),onClick:_},a.a.createElement("i",{className:"icon-strikethrough"})),a.a.createElement(d.a,{color:"translucent",ariaLabel:"Monospace text",className:k("monospace"),onClick:P},a.a.createElement("i",{className:"icon-monospace"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(d.a,{color:"translucent",ariaLabel:B("TextFormat.AddLinkTitle"),onClick:v},a.a.createElement("i",{className:"icon-link"}))),a.a.createElement("div",{className:"TextFormatter-link-control"},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(d.a,{color:"translucent",ariaLabel:B("Cancel"),onClick:j},a.a.createElement("i",{className:"icon-arrow-left"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement("div",{className:Object(c.a)("TextFormatter-link-url-input-wrapper",C)},a.a.createElement("input",{ref:f,className:"TextFormatter-link-url-input",type:"text",value:E,placeholder:"Enter URL...",autoComplete:"off",inputMode:"url",dir:"auto",onChange:function(e){y(e.target.value),A()},onScroll:A})),a.a.createElement("div",{className:H},a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(d.a,{color:"translucent",ariaLabel:B("Save"),className:"color-primary",onClick:F},a.a.createElement("i",{className:"icon-check"}))))))})},function(e,t,n){"use strict";var a=n(0),r=n(36),c=n(4),s=n(108),i=n(114);n(246);t.a=Object(a.h)(({message:e,idPrefix:t="shared-media",onClick:n})=>{const o=Object(a.m)(()=>{n(e.id,e.chatId)},[e.id,e.chatId,n]),l=Object(c.E)(e),u=Object(s.a)(Object(c.D)(e,"pictogram")),{shouldRenderThumb:d,shouldRenderFullMedia:m,transitionClassNames:b}=Object(i.a)(u,"slow"),h=Object(c.P)(e);return a.a.createElement("div",{id:`${t}${e.id}`,className:"Media scroll-item",onClick:n?o:void 0},d&&a.a.createElement("img",{src:l,alt:""}),m&&a.a.createElement("img",{src:u,className:b+" full-media",alt:""}),h&&a.a.createElement("span",{className:"video-duration"},h.isGif?"GIF":Object(r.e)(h.duration)))})},,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(7),s=n(36),i=n(4);var o=n(8),l=n(23);var u=n(120),d=n(35),m=n(137),b=n(176),h=n(25),f=n(32),p=n(121),O=n(27);n(220);const g=c.g?20:25,v=c.g?50:75;function j(e,t,{handleStartSeek:n,handleSeek:r,handleStopSeek:c}){return a.a.createElement("div",{className:"seekline no-selection",onMouseDown:n,onMouseMove:r,onMouseUp:c},a.a.createElement("span",{className:"seekline-buffered-progress"},a.a.createElement("i",{style:`transform: translateX(${100*t}%)`})),a.a.createElement("span",{className:"seekline-play-progress"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})),a.a.createElement("span",{className:"seekline-thumb"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})))}t.a=Object(a.h)(Object(r.h)(e=>({theme:e.settings.byKey.theme}))(({theme:e,message:t,senderTitle:n,uploadProgress:r,renderingFor:E,date:y,lastSyncTime:N,className:T,isSelectable:C,isSelected:w,onPlay:M,onReadMedia:S,onCancelUpload:L,onDateClick:I})=>{const{content:{audio:A,voice:k},isMediaUnread:x}=t,D=Boolean(k),R=Object(a.q)(!1),_=Object(h.a)(),[P,F]=Object(a.r)(!1),U=N,{mediaData:B,downloadProgress:q}=Object(u.a)(Object(i.D)(t,"inline"),!U,Object(i.C)(t,"inline"));const{isBuffered:H,bufferedProgress:$,bufferingHandlers:K,checkBuffering:Y}=Object(m.a)(),{isPlaying:V,playProgress:G,playPause:W,setCurrentTime:z,duration:X}=Object(b.a)(Object(i.A)(t),Object(i.r)(t),B,K,Y,P,(function(){F(!0),M(t.id,t.chatId)}),Object(i.sb)(t));Object(a.n)(()=>{F(V)},[V]);const{isUploading:Q,isTransferring:J,transferProgress:Z}=Object(i.s)(t,r||q,P&&!H),{shouldRender:ee,transitionClassNames:te}=Object(d.a)(J),ne=Object(a.m)(()=>{Q?L&&L():(V||M(t.id,t.chatId),F(!P),W())},[V,Q,t.id,t.chatId,L,M,W,P]);Object(a.n)(()=>{V&&S&&x&&S()},[V,x,S]);const ae=Object(a.m)(e=>{if(R.current){const t=e.currentTarget.closest(".seekline,.waveform");if(t){const{width:n,left:a}=t.getBoundingClientRect();z(X*((e.clientX-a)/n))}}},[X,z]),re=Object(a.m)(e=>{R.current=!0,ae(e)},[ae]),ce=Object(a.m)(()=>{R.current=!1},[]),se=Object(a.m)(()=>{I(t.id,t.chatId)},[I,t.id,t.chatId]);const ie={handleStartSeek:re,handleSeek:ae,handleStopSeek:ce},oe=Object(i.tb)(t),le=Object(a.p)(()=>k&&function(e,t=0,n=!1,{handleStartSeek:r,handleSeek:c,handleStopSeek:s},i){const{waveform:o,duration:l}=e;if(!o)return;const u="dark"===i?"#494B75":"#CBCBCB",d="dark"===i?"#C69C85":"#B0DEA6",m="dark"===i?"#868DF5":"#54a3e6",b="dark"===i?"#FFFFFF":"#53ad53",h=Math.min(l/30,1),f=Math.round(g+(v-g)*h),p=function(e){const t=8*e.length,n=Math.floor(t/5);if(!n)return[];const a=Array(n),r=e;for(let e=0,t=n-1;e!==t;++e){const t=Math.floor(5*e/8),n=Math.floor(5*e%8),c=r[t]+(r[t+1]<<8);a[e]=c>>n&31}const c=Math.floor(5*(n-1)/8),s=Math.floor(5*(n-1)%8),i=r[c]+(r[c+1]<<8);return a[n-1]=i>>s&31,a}(new Uint8Array(o)),{data:O,peak:j}=function(e,t){let n=0;const a=new Array(t),r=e.length/t,c=e[0],s=e[e.length-1];for(let u=0;u{i.globalAlpha=s/e.length>=t?.5:1,i.fillStyle=t>s/e.length?r:a;const o=Math.max(2,c/Math.max(1,n)*23);!function(e,t,n,a,r,c){a<2*c&&(c=a/2);r<2*c&&(c=r/2);e.beginPath(),e.moveTo(t+c,n),e.arcTo(t+a,n,t+a,n-r,c),e.arcTo(t+a,n-r,t,n-r,c),e.arcTo(t,n-r,t,n,c),e.arcTo(t,n,t+a,n,c),e.closePath()}(i,4*s,23,2,o,1),i.fill()}),{src:s.toDataURL(),width:c,height:23}}(O,t,{peak:j,fillStyle:n?d:u,progressFillStyle:n?b:m});return a.a.createElement("img",{src:E,alt:"",width:y,height:N,className:"waveform",draggable:!1,onMouseDown:r,onMouseMove:c,onMouseUp:s})}(k,G,oe,ie,e),[k,G,oe,ie,e]),ue=Object(o.a)("Audio media-inner",T,oe&&!E&&"own",E&&"bigger",w&&"audio-is-selected"),de=["toggle-play"];ee?de.push("loading"):V?de.push("pause"):V||de.push("play");const me=V||G>0&&G<1,be=Object(o.a)("content",me&&"with-seekline");return a.a.createElement("div",{className:ue,dir:_.isRtl?"rtl":void 0},C&&a.a.createElement("div",{className:"message-select-control"},w&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement(f.a,{round:!0,ripple:!c.g,size:E?"smaller":"tiny",className:de.join(" "),ariaLabel:V?"Pause audio":"Play audio",onClick:ne,isRtl:_.isRtl},a.a.createElement("i",{className:"icon-play"}),a.a.createElement("i",{className:"icon-pause"})),ee&&a.a.createElement("div",{className:Object(o.a)("media-loading",te)},a.a.createElement(p.a,{progress:Z,transparent:!0,size:E?"m":"s",onClick:ne})),"searchResult"===E&&a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:be},a.a.createElement("div",{className:"content-row"},a.a.createElement("p",{className:"title",dir:"auto"},Object(l.a)(function(){if(D)return n||"Voice";const{title:e,fileName:t}=A;return e||t}())),a.a.createElement("div",{className:"message-date"},y&&a.a.createElement(O.a,{className:"date",onClick:se},Object(s.g)(_,1e3*y)))),me&&j(G,$,ie),!me&&a.a.createElement("p",{className:"duration",dir:"auto"},G>0?Object(s.e)(X*G)+" / ":void 0,function(){if(D)return Object(s.e)(k.duration);const{performer:e}=A;return a.a.createElement(a.a.Fragment,null,e&&Object(l.a)(e),e&&n&&a.a.createElement("span",null,"•"),n&&Object(l.a)(n))}()))),"searchResult"!==E&&A&&function(e,t,n,r,c,i,o,u){const{title:d,performer:m,duration:b,fileName:h}=t,f=n||r>0&&r<1;return a.a.createElement("div",{className:"content"},a.a.createElement("p",{className:"title",dir:"auto"},Object(l.a)(d||h)),f&&j(r,c,i),!f&&a.a.createElement("div",{className:"meta",dir:"auto"},a.a.createElement("span",{className:"performer"},Object(l.a)(m||"Unknown")),o&&a.a.createElement(a.a.Fragment,null," ","•"," ",a.a.createElement(O.a,{className:"date",onClick:u},Object(s.d)(e,1e3*o)))),a.a.createElement("p",{className:"duration",dir:"auto"},r>0?Object(s.e)(b*r)+" / ":void 0,Object(s.e)(b)))}(_,A,V,G,$,ie,y,I?se:void 0),"searchResult"!==E&&k&&function(e,t,n){return a.a.createElement("div",{className:"content"},t,a.a.createElement("p",{className:"voice-duration",dir:"auto"},Object(s.e)(e.duration),n&&a.a.createElement("span",null,"•")))}(k,le,x))}))},function(e,t,n){"use strict";var a=n(0),r=n(142),c=n(38),s=n(143),i=n(25),o=n(8);n(200);var l=Object(a.h)(({className:e,title:t,active:n,badgeCount:r,isBadgeActive:c,previousActiveTab:s,onClick:i,clickArg:l})=>{const u=Object(a.q)(null);return Object(a.o)(()=>{if(!n||void 0===s)return;const e=u.current,t=e.querySelector("i"),a=e.parentElement.children[s].querySelector("i");a.classList.remove("animate"),t.classList.remove("animate");const r=a.parentElement.offsetLeft-t.parentElement.offsetLeft,c=a.clientWidth/t.clientWidth;t.style.transform=`translate3d(${r}px, 0, 0) scale3d(${c}, 1, 1)`,requestAnimationFrame(()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})})})},[n,s]),a.a.createElement("button",{type:"button",className:Object(o.a)("Tab",e,n&&"active"),onClick:()=>i(l),ref:u},a.a.createElement("span",null,t,!!r&&a.a.createElement("span",{className:Object(o.a)("badge",c&&"active")},r),a.a.createElement("i",null)))});n(201);t.a=Object(a.h)(({tabs:e,activeTab:t,big:n,onSwitchTab:o})=>{const u=Object(a.q)(null),d=Object(c.a)(t);Object(s.a)(u.current),Object(a.n)(()=>{const e=u.current;if(e.scrollWidth<=e.offsetWidth)return;const t=e.querySelector(".Tab.active");if(t){const n=t.offsetLeft-e.offsetWidth/2+t.offsetWidth/2;if(Math.abs(n-e.scrollLeft)<16)return;Object(r.a)(e,n)}},[t]);const m=Object(i.a)();return a.a.createElement("div",{className:"TabList no-selection no-scrollbar "+(n?"big":""),ref:u,dir:m.isRtl?"rtl":void 0},e.map((e,n)=>a.a.createElement(l,{key:e.title,title:m(e.title),active:n===t,badgeCount:e.badgeCount,isBadgeActive:e.isBadgeActive,previousActiveTab:d,onClick:o,clickArg:n})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const a={CHAT_RESTRICTED:"You can't send messages in this chat, you were restricted",CHAT_WRITE_FORBIDDEN:"You can't write in this chat",CHAT_SEND_POLL_FORBIDDEN:"You can't create polls in this chat",CHAT_SEND_STICKERS_FORBIDDEN:"You can't send stickers in this chat",CHAT_SEND_GIFS_FORBIDDEN:"You can't send gifs in this chat",CHAT_SEND_MEDIA_FORBIDDEN:"You can't send media in this chat",CHAT_LINK_EXISTS:"The chat is public, you can't hide the history to new users",SLOWMODE_WAIT_X:"Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.",USER_BANNED_IN_CHANNEL:"You're banned from sending messages in supergroups / channels",USER_IS_BLOCKED:"You were blocked by this user",YOU_BLOCKED_USER:"You blocked this user",IMAGE_PROCESS_FAILED:"Failure while processing image",MEDIA_EMPTY:"The provided media object is invalid",MEDIA_INVALID:"Media invalid",PHOTO_EXT_INVALID:"The extension of the photo is invalid",PHOTO_INVALID_DIMENSIONS:"The photo dimensions are invalid",PHOTO_SAVE_FILE_INVALID:"Internal issues, try again later",MESSAGE_DELETE_FORBIDDEN:"You can't delete one of the messages you tried to delete, most likely because it is a service message.",MESSAGE_POLL_CLOSED:"Poll closed",MESSAGE_EDIT_TIME_EXPIRED:"You can't edit this message anymore.",CHAT_ADMIN_REQUIRED:"You must be an admin in this chat to do this",PINNED_DIALOGS_TOO_MUCH:"Sorry, you can only pin 5 chats to the top",DIALOG_FILTERS_TOO_MUCH:"Sorry, you can't have more than 10 folders",CHANNEL_PRIVATE:"This channel is private",MEDIA_CAPTION_TOO_LONG:"The provided caption is too long",ADDRESS_STREET_LINE1_INVALID:"The address you provided is not valid",ADDRESS_STREET_LINE2_INVALID:"The address you provided is not valid",ADDRESS_CITY_INVALID:"The city you provided is not valid",ADDRESS_COUNTRY_INVALID:"The country you provided is not valid",ADDRESS_POSTCODE_INVALID:"The postcode you provided is not valid",ADDRESS_STATE_INVALID:"The state you provided is not valid",REQ_INFO_NAME_INVALID:"The name you provided is not valid",REQ_INFO_PHONE_INVALID:"The phone you provided is not valid",REQ_INFO_EMAIL_INVALID:"The email you provided is not valid",LINK_NOT_MODIFIED:"This discussion is already linked to the channel",SERVICE_WORKER_DISABLED:"Service Worker is disabled. Please reload the page without holding key.",CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS:"The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.",FRESH_RESET_AUTHORISATION_FORBIDDEN:"You can’t logout other sessions if less than 24 hours have passed since you logged on the current session",BOTS_TOO_MUCH:"There are too many bots in this chat/channel",BOT_GROUPS_BLOCKED:"This bot can't be added to groups",USERS_TOO_MUCH:"The maximum number of users has been exceeded",USER_CHANNELS_TOO_MUCH:"One of the users you tried to add is already in too many channels/supergroups",USER_KICKED:"This user was kicked from this supergroup/channel",USER_NOT_MUTUAL_CONTACT:"The provided user is not a mutual contact",USER_PRIVACY_RESTRICTED:"The user's privacy settings do not allow you to do this",INVITE_HASH_EMPTY:"The invite hash is empty",INVITE_HASH_EXPIRED:"The invite link has expired",INVITE_HASH_INVALID:"The invite hash is invalid",CHANNELS_TOO_MUCH:"You have joined too many channels/supergroups",USER_ALREADY_PARTICIPANT:"You already in the group"};function r(e){const{message:t,isSlowMode:n,textParams:r}=e;if(n){const e=t.indexOf(" (caused by");return e>0?t.substring(0,e):t}let c=a[t];return c&&r&&(c=Object.keys(r).reduce((e,t)=>e.replace(t,r[t]),c)),c}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(4),s=n(25);t.a=({chat:e,privateChatUser:t,handleDelete:n,folderId:i,isPinned:o})=>{const l=Object(s.a)(),{toggleChatPinned:u,updateChatMutedState:d,toggleChatArchived:m,toggleChatUnread:b}=Object(r.d)();return Object(a.p)(()=>{if(!e)return;const a=t&&t.isSelf,r=e.unreadCount||e.hasUnreadMark?{title:l("MarkAsRead"),icon:"readchats",handler:()=>b({id:e.id})}:{title:l("MarkAsUnread"),icon:"unread",handler:()=>b({id:e.id})},s=o?{title:l("UnpinFromTop"),icon:"unpin",handler:()=>u({id:e.id,folderId:i})}:{title:l("PinToTop"),icon:"pin",handler:()=>u({id:e.id,folderId:i})},h=e.isMuted?{title:l("ChatList.Unmute"),icon:"unmute",handler:()=>d({chatId:e.id,isMuted:!1})}:{title:l("ChatList.Mute"),icon:"mute",handler:()=>d({chatId:e.id,isMuted:!0})},f=Object(c.hb)(e)?{title:l("Unarchive"),icon:"unarchive",handler:()=>m({id:e.id})}:{title:l("Archive"),icon:"archive",handler:()=>m({id:e.id})};return[r,s,...a?[]:[h,f],{title:Object(c.lb)(e.id)?l("Delete"):l(Object(c.d)(e)?"DeleteChat":Object(c.jb)(e)?"LeaveChannel":"Group.LeaveGroup"),icon:"delete",destructive:!0,handler:n}]},[e,t,l,o,n,b,u,i,d,m])}},function(e,t,n){"use strict";var a=n(0),r=n(36),c=n(25),s=n(172);n(205);t.a=Object(a.h)(({message:e,outgoingStatus:t})=>{const n=Object(c.a)();return a.a.createElement("div",{className:"LastMessageMeta"},t&&a.a.createElement(s.a,{status:t}),a.a.createElement("span",{className:"time"},Object(r.g)(n,1e3*e.date)))})},function(e,t,n){"use strict";var a,r=n(0),c=n(111);n(204);!function(e){e[e.failed=0]="failed",e[e.pending=1]="pending",e[e.succeeded=2]="succeeded",e[e.read=3]="read"}(a||(a={}));t.a=Object(r.h)(({status:e})=>r.a.createElement("div",{className:"MessageOutgoingStatus"},r.a.createElement(c.a,{name:"reveal",activeKey:a[e]},()=>r.a.createElement("i",{className:"icon-message-"+e}))))},function(e,t,n){"use strict";var a=n(0);t.a=(e,t,n,r,c=0,s=0)=>{const[i,o]=Object(a.r)("right"),[l,u]=Object(a.r)("bottom"),[d,m]=Object(a.r)("");return Object(a.n)(()=>{const a=t();if(!e||!a)return;let{x:i,y:l}=e;const d={width:0,left:0,height:0,top:0},b=r(),h=n(),f=a.getBoundingClientRect(),p=b?{width:b.offsetWidth,height:b.offsetHeight}:d,O=h?h.getBoundingClientRect():d;i+p.width+c0?(o("right"),i-=3):(o("left"),i=16),l+p.height{const{shouldRender:u,transitionClassNames:d}=Object(r.a)(e,void 0,void 0,!t&&void 0),m=Object(c.a)(e),b=Object(c.a)(l),h=Object(a.q)();return m&&!e&&(h.current=b),u&&a.a.createElement("div",{id:n,className:Object(s.a)(i,d),onClick:o},e?l():h.current())}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(0),r=n(38),c=n(26),s=n(51);function i(e,t){const n=Object(r.a)(e,!0),i=Object(a.q)(),o=Object(c.a)(),l=null!=e,u=null!=n;return l&&i.current&&(clearTimeout(i.current),i.current=void 0),Object(s.a)(()=>{t&&!l&&u&&!i.current&&(i.current=window.setTimeout(()=>{i.current=void 0,o()},t))},[e]),i.current&&t&&!l?n:e}},function(e,t,n){"use strict";var a=n(0),r=n(177),c=n(58),s=n(158),i=n(51);t.a=(e,t,n,o,l,u=!1,d,m=!1)=>{const b=Object(a.q)(null),[h,f]=Object(a.r)(!1);let p=h;const[O,g]=Object(a.r)(0);Object(i.a)(()=>{b.current=Object(r.a)(e,(e,n)=>{switch(e){case"onPlay":f(!0);break;case"onPause":f(!1);break;case"onTimeUpdate":{const{proxy:e}=b.current,n=e.duration&&Number.isFinite(e.duration)?e.duration:t;g(e.currentTime/n);break}}o&&o[e]&&o[e](n)},d);const{proxy:n}=b.current;h||n.paused||(f(!0),p=!0),l&&l(n)},[e]);const{play:v,pause:j,setCurrentTime:E,proxy:y,destroy:N}=b.current,T=y.duration&&Number.isFinite(y.duration)?y.duration:t;Object(a.n)(()=>{T&&!Object(s.a)(y)&&g(y.currentTime/T)},[T,O,y]),Object(a.n)(()=>()=>{N(m)},[N,m]),Object(c.a)(([e,t])=>{e===u&&n===t||y.src&&y.paused||u&&n&&!h&&v(n)},[u,n,h,v,y.src,y.paused]);const C=Object(a.m)(()=>{h?j():n&&v(n)},[n,j,v,h]);return{isPlaying:p,playProgress:O,playPause:C,setCurrentTime:E,audioProxy:y,duration:T}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"a",(function(){return m}));var a=n(7),r=n(136),c=n(158),s=n(2),i=n(4);const o=new Map;let l,u=[];function d(){const e=l&&o.get(l);e&&e.audio.pause()}function m(e,t,n){o.has(e)||(o.set(e,function(e,t){const n=new Audio;function a(t){return a=>{o.has(e)&&(Object(c.a)(n)||o.get(e).handlers.forEach(e=>{e(t,a)}))}}return n.addEventListener("timeupdate",a("onTimeUpdate")),n.addEventListener("play",a("onPlay")),n.addEventListener("pause",a("onPause")),n.addEventListener("loadstart",a("onLoadStart")),n.addEventListener("loadeddata",a("onLoadedData")),n.addEventListener("playing",a("onPlaying")),n.addEventListener("ended",()=>{if(Object(c.a)(n))return;const t=u[u.indexOf(e)+1];if(!t)return;if(!o.has(t))return void Object(s.d)().openAudioPlayer(Object(i.zb)(t));const a=o.get(t);a.onForcePlay&&a.onForcePlay(),l=t,a.audio.src&&Object(r.a)(a.audio)}),{audio:n,proxy:new Proxy(n,{get:(e,t)=>e[t]}),handlers:[],onForcePlay:t}}(e,n)),u.includes(e)||u.push(e));const{audio:d,proxy:m,handlers:b}=o.get(e);return b.push(t),{play(t){l&&l!==e&&o.get(l).audio.pause(),l=e,d.src||(d.src=t,d.preload="auto",t.includes("/progressive/")&&a.j&&Object(c.b)(d)),Object(r.a)(d)},pause(){l===e&&d.pause()},setCurrentTime(t){l===e&&(d.currentTime=t)},proxy:m,destroy(n=!1){const a=o.get(e);a&&(a.handlers=a.handlers.filter(e=>e!==t),a.handlers.length||(a.audio.pause(),o.delete(e),n&&(u=u.filter(t=>t!==e)),e===l&&(l=void 0)))}}}},function(e,t,n){"use strict";function a(e,t){const n=document.createElement("a");n.href=e,n.download=t,n.click()}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";var a=n(0),r=n(35),c=n(114),s=n(8),i=n(36),o=n(59),l=n(115),u=n(23),d=n(25),m=n(121),b=n(27);n(219);t.a=Object(a.h)(({ref:e,name:t,size:n,extension:h="",timestamp:f,sender:p,thumbnailDataUri:O,previewData:g,className:v,smaller:j,isTransferring:E,isUploading:y,isSelectable:N,isSelected:T,transferProgress:C,onClick:w,onDateClick:M})=>{const S=Object(d.a)();let L=Object(a.q)(null);e&&(L=e);const{shouldRender:I,transitionClassNames:A}=Object(r.a)(E,void 0,!0),k=Object(o.a)(h),x=Object(o.e)(n),{shouldRenderThumb:D,shouldRenderFullMedia:R,transitionClassNames:_}=Object(c.a)(g,"slow"),{width:P,height:F}=Object(l.i)(j),U=Object(s.a)("File",v,j&&"smaller",w&&!y&&"interactive",T&&"file-is-selected");return a.a.createElement("div",{ref:L,className:U,dir:S.isRtl?"rtl":void 0},N&&a.a.createElement("div",{className:"message-select-control"},T&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement("div",{className:"file-icon-container",onClick:y?void 0:w},O||g?a.a.createElement("div",{className:"file-preview media-inner"},D&&a.a.createElement("img",{src:O,width:P,height:F,className:"thumbnail",alt:""}),R&&a.a.createElement("img",{src:g,className:"full-media "+_,width:P,height:F,alt:""})):a.a.createElement("div",{className:"file-icon "+k},h.length<=4&&a.a.createElement("span",{className:"file-ext",dir:"auto"},h)),I&&a.a.createElement("div",{className:Object(s.a)("file-progress",k,A)},a.a.createElement(m.a,{progress:C,size:j?"s":"m",onClick:y?w:void 0})),w&&a.a.createElement("i",{className:Object(s.a)("icon-download",I&&"hidden")})),a.a.createElement("div",{className:"file-info"},a.a.createElement("div",{className:"file-title",dir:"auto"},Object(u.a)(t)),a.a.createElement("div",{className:"file-subtitle",dir:"auto"},a.a.createElement("span",null,E&&C?Math.round(100*C)+"%":x),p&&a.a.createElement("span",{className:"file-sender"},Object(u.a)(p)),!p&&f&&a.a.createElement(a.a.Fragment,null," ",a.a.createElement(b.a,{onClick:M},Object(i.d)(S,1e3*f))))),p&&f&&a.a.createElement(b.a,{onClick:M},Object(i.g)(S,1e3*f)))})},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(35),s=n(8),i=n(47),o=n(122);n(226);t.a=Object(a.h)(({message:e,duration:t=3e3,containerId:n,onDismiss:l})=>{const[u,d]=Object(a.r)(!0),m=Object(a.q)(null),{transitionClassNames:b}=Object(c.a)(u),h=Object(a.m)(()=>{d(!1),setTimeout(l,150+r.c)},[l]);Object(a.n)(()=>u?Object(i.a)(h):void 0,[u,h]),Object(a.n)(()=>(m.current=window.setTimeout(h,t),()=>{m.current&&(clearTimeout(m.current),m.current=void 0)}),[t,h]);const f=Object(a.m)(()=>{m.current&&(clearTimeout(m.current),m.current=void 0)},[]),p=Object(a.m)(()=>{m.current=window.setTimeout(h,t)},[t,h]);return a.a.createElement(o.a,{className:"Notification-container",containerId:n},a.a.createElement("div",{className:Object(s.a)("Notification",b),onClick:h,onMouseEnter:f,onMouseLeave:p},a.a.createElement("div",{className:"content"},e)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(1);function r(e){const{commonAncestorContainer:t}=e;let n=t,r=1;for(;n&&n.id!==a.v&&r<5;)n=n.parentElement,r++;return Boolean(n&&n.id===a.v)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return h}));var a=n(0),r=n(1),c=n(7),s=n(65),i=n(129),o=n(3),l=n(34);let u,d,m;const b=/[^-_:\p{L}\p{N}]+/iu;function h(e,t,h,f=r.v,p,O){const[g,v,j]=Object(l.a)(),[E,y]=Object(a.r)(),[N,T]=Object(a.r)({}),[C,w]=Object(a.r)({}),[M,S]=Object(a.r)([]),L=Object(a.p)(()=>E&&h.length?Object.values(Object(o.m)(E,h)):[],[E,h]);Object(a.n)(()=>{const e=()=>{y(m.emojis)};m?e():async function(){u||(u=n.e(1).then(n.t.bind(null,314,3)),d=(await u).default,m=Object(s.b)(d));return u}().then(e)},[]),Object(a.n)(()=>{if(!E)return;const e=Object.values(E);if(O){const t=Object(o.c)(e,"native");T(Object(o.i)(O,e=>Object.values(Object(o.m)(t,e))))}w(e.reduce((e,t)=>(t.names.forEach(n=>{e[n]||(e[n]=[]),e[n].push(t)}),e),{}))},[E,O]),Object(a.n)(()=>{if(!e||!t||!E)return void j();const n=function(e){const t=document.createElement("div");t.innerHTML=e.replace("
","\n");const n=t.innerText,a=n[n.length-1],r=n.split(b).pop();if(!n.length||b.test(a)||!r||!r.startsWith(":"))return;return r.toLowerCase()}(t);if(!n)return S([]),void j();const a=n.substr(1);let r=[];if(a){const e=Object.keys(N).filter(e=>e.startsWith(a));r=r.concat(Object(o.h)(Object.values(Object(o.m)(N,e))));const t=Object.keys(C).filter(e=>e.startsWith(a));r=r.concat(Object(o.h)(Object.values(Object(o.m)(C,t)))),r=Object(o.o)(r)}else r=L;r.length?(v(),S(r.slice(0,36))):j()},[E,N,C,t,e,v,L,j]);const I=Object(a.m)(e=>{const n=t.lastIndexOf(":");if(-1!==n){p(`${t.substr(0,n)}${e}`);const a=document.getElementById(f);c.g||requestAnimationFrame(()=>{Object(i.a)(a,!0)})}j()},[t,f,p,j]);return{isEmojiTooltipOpen:g,closeEmojiTooltip:j,filteredEmojis:M,insertEmoji:I}}},function(e,t,n){"use strict";var a=n(0),r=n(11),c=n(17);t.a=Object(a.h)(e=>{const{isOpen:t}=e,n=Object(c.a)(r.a.Extra,"EmojiTooltip",!t);return n?a.a.createElement(n,e):void 0})},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(1),s=n(6),i=n(9),o=n(129),l=n(8),u=n(3),d=n(7),m=n(55),b=n(159),h=n(34),f=n(64),p=n(181),O=n(25),g=n(164);const v=d.g?256:416;t.a=Object(a.h)(Object(r.h)(e=>{const{chatId:t,threadId:n}=Object(s.y)(e)||{},{messageSendKeyCombo:a}=e.settings.byKey;return{currentChatId:t,messageSendKeyCombo:a,replyingToId:t&&n?Object(s.mb)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}},(e,t)=>Object(u.l)(t,["editLastMessage","replyToNextMessage"]))(({id:e,editableInputId:t,html:n,placeholder:r,shouldSetFocus:s,shouldSupressFocus:u,shouldSupressTextFormatter:j,onUpdate:E,onSupressedFocus:y,onSend:N,currentChatId:T,replyingToId:C,noTabCapture:w,messageSendKeyCombo:M,editLastMessage:S,replyToNextMessage:L})=>{const I=Object(a.q)(null),A=Object(a.q)(null),k=Object(O.a)(),x=Object(a.q)(!1),[D,R,_]=Object(h.a)(),[P,F]=Object(a.r)(),[U,B]=Object(a.r)();Object(a.n)(()=>{K(!1)},[]),Object(b.a)(([e])=>{n!==I.current.innerHTML&&(I.current.innerHTML=n),n!==A.current.innerHTML&&(A.current.innerHTML=n),void 0!==e&&e!==n&&K(!n.length)},[n]);const q=Object(a.m)(()=>{I.current.closest(".from, .to")?setTimeout(q,350):Object(o.a)(I.current)},[]),H=Object(a.m)(()=>{_(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()},[_]);function $(){if(d.e)return;const e=window.getSelection();if(!e||!e.rangeCount||x.current)return void _();const t=e.getRangeAt(0),n=t.toString().trim();if(j||!Object(p.a)(t)||!n||Object(f.a)(n)||!t.START_TO_END)return void _();const a=t.getBoundingClientRect(),r=I.current.getBoundingClientRect();let c=a.left+a.width/2-r.left;c<90?c=90:c>r.width-90&&(c=r.width-90),F({x:c,y:a.top-r.top}),B(t),R()}function K(e=!1){const t=I.current,n=A.current,a=Number(t.style.height.replace("px","")),r=Math.min(n.scrollHeight,v);if(r===a)return;const c=Math.round(50*Math.log(Math.abs(r-a))),s=()=>{t.style.height=r+"px",t.style.transitionDuration=c+"ms",t.classList.toggle("overflown",n.scrollHeight>v)};e?requestAnimationFrame(s):s()}Object(a.n)(()=>{d.l||q()},[T,q,C,s]),Object(a.n)(()=>{if(w)return;const e=Object(i.a)(e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(q))},2e3,!0,!1);return Object(m.a)({onTab:e})},[q,w]),Object(a.n)(()=>{const e=I.current;function t(){e.blur()}return u&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}},[u]);const Y=Object(l.a)("form-control custom-scroll",n.length>0&&"touched",u&&"focus-disabled");return a.a.createElement("div",{id:e,onClick:u?y:void 0,dir:k.isRtl?"rtl":void 0},a.a.createElement("div",{ref:I,id:t||c.v,className:Y,contentEditable:!0,dir:"auto",onClick:q,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(E("
"===t?"":t),!(d.l||n&&n.length)){const e=window.getSelection();e&&(I.current.blur(),e.removeAllRanges(),Object(o.a)(I.current,!0))}},onKeyDown:function(e){if(e.metaKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(t)return e.preventDefault(),void L({targetIndexDelta:t})}"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||n.length||e.metaKey?e.target.addEventListener("keyup",(function t(){$(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),S()):d.e||d.b||!("enter"===M&&!e.shiftKey||"ctrl-enter"===M&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),_(),N())},onMouseDown:function(e){2===e.button?!0!==x.current&&(x.current=!0,document.addEventListener("mousedown",(function e(){setTimeout(()=>{x.current=!1},100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout(()=>{x.current=!1},100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){$(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:function(e){d.b&&(e.preventDefault(),e.stopPropagation())},onTouchCancel:function(){d.b&&$()}}),a.a.createElement("div",{ref:A,className:Object(l.a)(Y,"clone"),dir:"auto"}),a.a.createElement("span",{className:"placeholder-text",dir:"auto"},r),a.a.createElement(g.a,{isOpen:D,anchorPosition:P,selectedRange:U,onClose:H}))}))},function(e,t,n){"use strict";var a=n(0),r=n(4),c=n(8),s=n(39),i=n(23),o=n(36),l=n(25),u=n(165),d=n(27),m=n(57);n(247);t.a=Object(a.h)(({message:e,senderTitle:t,onMessageClick:n})=>{const b=Object(l.a)();let h=Object(r.Q)(e);if(!h){const t=Object(r.n)(e);if(t){const{url:n,domain:a}=t,c=Object(r.N)(b,e);h={siteName:a.replace(/^www./,""),url:n.includes("://")?n:n.includes("@")?"mailto:"+n:"http://"+n,description:c!==n?c:void 0}}}const f=Object(a.m)(()=>{n(e.id,e.chatId)},[n,e.id,e.chatId]);if(!h)return;const{siteName:p,url:O,displayUrl:g,title:v,description:j,photo:E}=h,y=!t&&Object(s.a)(j,170),N=Object(c.a)("WebLink scroll-item",!E&&"without-photo");return a.a.createElement("div",{className:N,"data-initial":(p||g)[0],dir:b.isRtl?"rtl":void 0},E&&a.a.createElement(u.a,{message:e}),a.a.createElement("div",{className:"content"},a.a.createElement(d.a,{isRtl:b.isRtl,className:"site-title",onClick:f},Object(i.a)(v||p||g)),y&&a.a.createElement(d.a,{isRtl:b.isRtl,className:"site-description",onClick:f},Object(i.a)(y)),a.a.createElement(m.a,{url:O,className:"site-name",text:"",isRtl:b.isRtl},O.replace("mailto:","")||g),t&&a.a.createElement("div",{className:"sender-name"},Object(i.a)(t))),t&&a.a.createElement("div",{className:"message-date"},a.a.createElement(d.a,{className:"date",onClick:f,isRtl:b.isRtl},Object(o.g)(b,1e3*e.date))))})},,,,function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(5),s=n(1),i=n(7),o=n(38),l=n(3),u=n(4),d=n(6),m=n(127);let b;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(b||(b={}));var h=n(113),f=n(16),p=n(25),O=n(67),g=n(23),v=n(9),j=n(8),E=n(144),y=n(170),N=n(34),T=n(108),C=n(112),w=n(133),M=n(156),S=n(171),L=n(157),I=n(106),A=n(49),k=n(174);n(208);var x=Object(a.h)(({chat:e,isPinned:t,isMuted:n})=>{const r=Boolean(e.unreadCount||e.hasUnreadMark||t),c=Object(j.a)("Badge",n&&"muted",t&&"pinned",Boolean(e.unreadCount||e.hasUnreadMark)&&"unread");function s(){return e.unreadCount?e.unreadMentionsCount?a.a.createElement("div",{className:"Badge-wrapper"},a.a.createElement("div",{className:"Badge mention"},a.a.createElement("i",{className:"icon-mention"})),a.a.createElement("div",{className:c},Object(A.b)(e.unreadCount))):a.a.createElement("div",{className:c},Object(A.b)(e.unreadCount)):e.hasUnreadMark?a.a.createElement("div",{className:c}):t?a.a.createElement("div",{className:c},a.a.createElement("i",{className:"icon-pinned-chat"})):void 0}return a.a.createElement(k.a,{isCustom:!0,className:"Badge-transition",isOpen:r},s)});n(209);var D,R=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const n=Object(d.f)(e,t);if(!n||!n.lastMessage)return{};const{senderId:a,replyToMessageId:r,isOutgoing:s}=n.lastMessage,i=a?Object(d.Gb)(e,a):void 0,o=Object(u.t)(n.lastMessage),l=o&&r?Object(d.k)(e,n.id,r):void 0,{targetUserId:m,targetChatId:b}=o||{},h=Object(u.U)(n),{type:f}=Object(d.y)(e)||{};return{chat:n,isMuted:Object(u.Cb)(n,Object(d.eb)(e),Object(d.db)(e)),lastMessageSender:i,...s&&{lastMessageOutgoingStatus:Object(d.fb)(e,n.lastMessage)},...h&&{privateChatUser:Object(d.Gb)(e,h)},...m&&{actionTargetUser:Object(d.Gb)(e,m)},actionTargetChatId:b,actionTargetMessage:l,draft:Object(d.B)(e,t,c.MAIN_THREAD_ID),messageListType:f,animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(l.l)(t,["openChat","focusLastMessage"]))(({style:e,chatId:t,folderId:n,orderDiff:r,animationType:c,isSelected:o,isPinned:l,chat:d,isMuted:m,privateChatUser:h,actionTargetUser:f,lastMessageSender:A,lastMessageOutgoingStatus:k,actionTargetMessage:D,actionTargetChatId:R,draft:_,messageListType:P,animationLevel:F,lastSyncTime:U,openChat:B,focusLastMessage:q})=>{const H=Object(a.q)(null),[$,K,Y]=Object(N.a)(),{lastMessage:V,typingStatus:G}=d||{},W=V&&Object(u.db)(V);Object(E.a)(t,W?V.replyToMessageId:void 0,D);const z=V&&!Object(u.M)(V)?Object(u.E)(V):void 0,X=Object(T.a)(V?Object(u.D)(V,"micro"):void 0),Q=Boolean(V&&Object(u.I)(V));Object(a.o)(()=>{if(0===F)return;const e=H.current;if(c===b.Opacity)e.style.opacity="0",Object(v.b)(()=>{e.classList.add("animate-opacity"),e.style.opacity="1"});else{if(c!==b.Move)return;e.style.transform=`translate3d(0, ${100*-r}%, 0)`,Object(v.b)(()=>{e.classList.add("animate-transform"),e.style.transform=""})}setTimeout(()=>{Object(v.b)(()=>{e.classList.remove("animate-opacity","animate-transform"),e.style.opacity="",e.style.transform=""})},200+s.c)},[F,r,c]);const J=Object(a.m)(()=>{B({id:t}),o&&"thread"===P&&q()},[o,P,B,t,q]),Z=Object(y.a)({chat:d,privateChatUser:h,handleDelete:K,folderId:n,isPinned:l}),ee=Object(p.a)();if(!d)return;const te=Object(j.a)("Chat chat-item-clickable",Object(u.lb)(t)?"private":"group",o&&!i.g&&"selected");return a.a.createElement(I.a,{ref:H,className:te,style:e,ripple:!i.g,contextActions:Z,onClick:J},a.a.createElement("div",{className:"status"},a.a.createElement(C.a,{chat:d,user:h,withOnlineStatus:!0,isSavedMessages:h&&h.isSelf,lastSyncTime:U})),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,Object(g.a)(Object(u.l)(ee,d,h))),d.isVerified&&a.a.createElement(w.a,null),m&&a.a.createElement("i",{className:"icon-muted-chat"}),d.lastMessage&&a.a.createElement(S.a,{message:d.lastMessage,outgoingStatus:k})),a.a.createElement("div",{className:"subtitle"},function(){if(G&&V&&G.timestamp>1e3*V.date)return a.a.createElement(M.a,{typingStatus:G});if(_&&_.text.length)return a.a.createElement("p",{className:"last-message",dir:ee.isRtl?"auto":"ltr"},a.a.createElement("span",{className:"draft"},ee("Draft")),Object(g.a)(_.text));if(!V)return;if(W){const e=d&&(Object(u.jb)(d)||V.senderId===V.chatId)?d:A;return a.a.createElement("p",{className:"last-message",dir:ee.isRtl?"auto":"ltr"},Object(g.a)(Object(O.a)(ee,V,e,f,D,R,{asPlain:!0})))}const e=Object(u.J)(ee,t,A);return a.a.createElement("p",{className:"last-message",dir:ee.isRtl?"auto":"ltr"},e&&a.a.createElement(a.a.Fragment,null,a.a.createElement("span",{className:"sender-name"},Object(g.a)(e)),a.a.createElement("span",{className:"colon"},":")),function(e,t,n,r){if(!n)return Object(g.a)(Object(u.N)(e,t));return a.a.createElement("span",{className:"media-preview"},a.a.createElement("img",{src:n,alt:"",className:r?"round":void 0}),Object(u.P)(t)&&a.a.createElement("i",{className:"icon-play"}),Object(g.a)(Object(u.N)(e,t,!0)))}(ee,V,X||z,Q))}(),a.a.createElement(x,{chat:d,isPinned:l,isMuted:m}))),a.a.createElement(L.a,{isOpen:$,onClose:Y,chat:d}))}));!function(e){e.all="active",e.archived="archived"}(D||(D={}));t.a=Object(a.h)(Object(r.h)((e,{folderType:t,folderId:n})=>{const{chats:{listIds:a,byId:r,orderedPinnedIds:s},users:{byId:i},lastSyncTime:o}=e,{chatId:l,threadId:u}=Object(d.y)(e)||{},m="folder"!==t?D[t]:void 0,b=n?Object(d.i)(e,n):void 0;return{chatsById:r,usersById:i,currentChatId:l,lastSyncTime:o,...m?{listIds:a[m],orderedPinnedIds:s[m]}:{chatFolder:b},isInDiscussionThread:u!==c.MAIN_THREAD_ID,notifySettings:Object(d.eb)(e),notifyExceptions:Object(d.db)(e)}},(e,t)=>Object(l.l)(t,["loadMoreChats","preloadTopChatMessages","openChat"]))(({folderType:e,folderId:t,noChatsText:n="Chat list is empty.",isActive:r,chatFolder:c,chatsById:d,usersById:p,listIds:O,currentChatId:g,orderedPinnedIds:v,lastSyncTime:j,isInDiscussionThread:E,notifySettings:y,notifyExceptions:N,loadMoreChats:T,preloadTopChatMessages:C,openChat:w})=>{const[M,S]=Object(a.p)(()=>"folder"===e&&c?Object(u.Bb)(d,p,c,y,N):[O,v],[e,c,d,p,y,N,O,v]),[L,I]=Object(a.p)(()=>{if(!M||"folder"===e&&!c)return[];const t=Object(u.Ab)(d,M,S,e),n=[...t.pinnedChats,...t.otherChats],a=n.map(({id:e})=>e);return[n.reduce((e,t,n)=>(e[t.id]=n,e),{}),a]},[M,S,e,c,d]),A=Object(o.a)(L),k=L&&A?Object(l.i)(L,(e,t)=>e-(void 0!==A[t]?A[t]:1/0)):{},x=Object(a.m)(()=>{T({listType:"archived"===e?"archived":"active"})},[T,e]),[D,_]=Object(m.a)(j?x:void 0,I,void 0,s.k,"all"===e&&!s.a),P=D&&Object(u.Ab)(d,D,S,e);Object(a.n)(()=>{j&&"all"===e&&C()},[j,e,C]);const F=function(e){const t=Object(a.m)(t=>e[t]<0,[e]),n=Object(a.m)(t=>e[t]>0,[e]),r=Object.keys(e).map(Number),c=r.filter(t).length,s=r.filter(n).length;return Object(a.m)(a=>{const r=e[a];return 0===r?b.None:r===1/0||r===-1/0||t(a)&&c<=s||n(a)&&s{const e=e=>{if(r&&I){if(e.ctrlKey&&e.code.startsWith("Digit")){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;const n=Number(t)-1;if(n>I.length-1)return;w({id:I[n]})}if(e.altKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(!t)return;if(!g)return e.preventDefault(),void w({id:I[0]});const n=I.indexOf(g);if(-1===n)return;const a=I[n+t];e.preventDefault(),w({id:a})}}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),a.a.createElement(h.a,{className:"chat-list custom-scroll",items:D,onLoadMore:_,preloadBackwards:s.k,noFastList:!0,noScrollRestore:!0},D&&D.length&&P?function(){const e=I.indexOf(D[0]),n=e+P.pinnedChats.length;return a.a.createElement("div",{className:"scroll-container",style:i.b?`height: ${I.length*s.i}px`:void 0,teactFastList:!0},P.pinnedChats.map(({id:n},r)=>a.a.createElement(R,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,isSelected:n===g&&!E,animationType:F(n),orderDiff:k[n],style:`top: ${(e+r)*s.i}px;`})),P.otherChats.map((e,r)=>a.a.createElement(R,{key:e.id,teactOrderKey:Object(u.j)(e),chatId:e.id,folderId:t,isSelected:e.id===g&&!E,animationType:F(e.id),orderDiff:k[e.id],style:`top: ${(n+r)*s.i}px;`})))}():D&&!D.length?a.a.createElement("div",{className:"no-results"},n):a.a.createElement(f.a,{key:"loading"}))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return m}));var a=n(0),r=n(5),c=n(1),s=n(4),i=n(52);var o=n(7),l=n(129),u=n(34);const d=/[^@_\d\wа-яё]+/i;function m(e,t,n,m=c.v,b,h,f){const[p,O,g]=Object(u.a)(),[v,j]=Object(a.r)(""),[E,y]=Object(a.r)([]),N=Object(a.m)(e=>{if(b&&f)return b.filter(({userId:t})=>{const n=f[t];return!(t===h||!n)&&(!e||function(e,t){const n=t.username.toLowerCase(),a=Object(s.Z)(t),r=a&&a.toLowerCase(),c=e.toLowerCase();return n.startsWith(c)||r&&Object(i.a)(r,c)}(e,n))})},[b,h,f]);Object(a.n)(()=>{if(!e||!t.length)return void g();const n=function(e){const t=document.createElement("div");t.innerHTML=e;const n=t.innerText,a=n[n.length-1],r=n.split(d).pop();if(!n.length||d.test(a)||!r||!r.startsWith("@"))return;return r}(t);if(n){const e=n?n.substr(1):"",t=N(e);t&&t.length?(O(),j(e),y(t)):g()}else g()},[e,t,N,O,g]);const T=Object(a.m)((e,a=!1)=>{if(!e.username&&!Object(s.Y)(e))return;const c=e.username?"@"+e.username:`${Object(s.Y)(e)}`,i=t.lastIndexOf("@");if(-1!==i){n(`${t.substr(0,i)}${c} `);const e=document.getElementById(m);o.g||requestAnimationFrame(()=>{Object(l.a)(e,a)})}g()},[t,m,n,g]);return{isMentionTooltipOpen:p,mentionFilter:v,closeMentionTooltip:g,insertMention:T,mentionFilteredMembers:E}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var a=n(0),r=n(163),c=n(51),s=n(13),i=n(26);const o=new Map;function l(e){const t=Object(a.q)();let n=!1;Object(c.a)(()=>{if(n=!0,t.current=void 0,!e)return;const a=new Image;if(a.src=e,!a.width)return;const c=Object(s.f)(a);Object(r.a)(c.getContext("2d"),0,0,c.width,c.height,2,2),t.current=c.toDataURL()},[e]);const l=function(e,t=!1,n){const c=Object(a.q)(e?o.get(e):void 0),l=Object(a.q)(),u=Object(i.a)();return l.current&&t&&(clearTimeout(l.current),l.current=void 0),Object(a.n)(()=>{if(!e||c.current||t)return;const a=new Image;a.onload=()=>{const t=Object(s.f)(a);Object(r.a)(t.getContext("2d"),0,0,t.width,t.height,2,2);const n=t.toDataURL();c.current=n,u(),o.size>=1e3&&o.clear(),o.set(e,n)},n?l.current=window.setTimeout(()=>{a.src=e},n):a.src=e},[e,n,u,t]),c.current}(e||void 0,Boolean(t.current));return t.current||!n&&l||e||void 0}},,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},,,function(e,t,n){},,function(e,t,n){},function(e,t,n){},,,,,,,,,,,,function(e,t,n){},,,,,,,,function(e,t,n){},function(e,t,n){},function(e,t,n){}])]); -//# sourceMappingURL=0.c66dcd2dcbc1482a0d6f.js.map \ No newline at end of file diff --git a/dist/0.c66dcd2dcbc1482a0d6f.js.map b/dist/0.c66dcd2dcbc1482a0d6f.js.map deleted file mode 100644 index 9b27e3227..000000000 --- a/dist/0.c66dcd2dcbc1482a0d6f.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/ui/ListItem.tsx","webpack:///./src/hooks/useIntersectionObserver.ts","webpack:///./src/hooks/useMedia.ts","webpack:///./src/components/common/PrivateChatInfo.tsx","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts","webpack:///./src/components/ui/Transition.tsx","webpack:///./src/components/common/Avatar.tsx","webpack:///./src/components/ui/InfiniteScroll.tsx","webpack:///./src/hooks/useTransitionForMedia.ts","webpack:///./src/components/common/helpers/mediaDimensions.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/components/ui/ConfirmDialog.tsx","webpack:///./src/components/common/NothingFound.tsx","webpack:///./src/components/right/hooks/useAsyncRendering.ts","webpack:///./src/hooks/useMediaWithDownloadProgress.ts","webpack:///./src/components/ui/ProgressSpinner.tsx","webpack:///./src/components/ui/Portal.ts","webpack:///./src/components/common/GroupChatInfo.tsx","webpack:///./src/util/fastSmoothScroll.ts","webpack:///./src/components/ui/Radio.tsx","webpack:///./src/components/ui/RadioGroup.tsx","webpack:///./src/hooks/useInfiniteScroll.ts","webpack:///./src/components/common/AnimatedEmoji.tsx","webpack:///./src/util/focusEditableElement.ts","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/util/captureEvents.ts","webpack:///./src/components/common/VerifiedIcon.tsx","webpack:///./src/util/cycleRestrict.ts","webpack:///./src/hooks/useCurrentOrPrev.ts","webpack:///./src/util/safePlay.ts","webpack:///./src/hooks/useBuffering.ts","webpack:///./src/components/middle/composer/helpers/parseMessageInput.ts","webpack:///./src/components/middle/composer/DropTarget.tsx","webpack:///./src/components/middle/composer/DropArea.tsx","webpack:///./src/components/common/PickerSelectedItem.tsx","webpack:///./src/util/fastSmoothScrollHorizontal.ts","webpack:///./src/hooks/useHorizontalScroll.ts","webpack:///./src/hooks/useEnsureMessage.ts","webpack:///./src/hooks/useContextMenuHandlers.ts","webpack:///./src/components/common/helpers/renderMessageText.tsx","webpack:///./src/hooks/useVideoCleanup.ts","webpack:///./src/util/clipboard.ts","webpack:///./src/components/ui/SearchInput.tsx","webpack:///./src/util/resetScroll.ts","webpack:///./src/components/common/TypingStatus.tsx","webpack:///./src/components/common/DeleteChatModal.tsx","webpack:///./src/util/patchSafariProgressiveAudio.ts","webpack:///./src/hooks/useLayoutEffectWithPrevDeps.ts","webpack:///./src/components/common/Document.tsx","webpack:///./src/components/common/StickerSetModal.async.tsx","webpack:///./src/hooks/useCanvasBlur.ts","webpack:///./src/lib/fastBlur.js","webpack:///./src/components/middle/composer/TextFormatter.tsx","webpack:///./src/components/common/Media.tsx","webpack:///./src/components/common/Audio.tsx","webpack:///./src/util/waveform.ts","webpack:///./src/components/common/helpers/waveform.ts","webpack:///./src/components/ui/Tab.tsx","webpack:///./src/components/ui/TabList.tsx","webpack:///./src/util/getReadableErrorText.ts","webpack:///./src/hooks/useChatContextActions.ts","webpack:///./src/components/common/LastMessageMeta.tsx","webpack:///./src/components/common/MessageOutgoingStatus.tsx","webpack:///./src/hooks/useContextMenuPosition.ts","webpack:///./src/components/ui/ShowTransition.tsx","webpack:///./src/hooks/usePrevDuringAnimation.ts","webpack:///./src/hooks/useAudioPlayer.ts","webpack:///./src/util/audioPlayer.ts","webpack:///./src/util/download.ts","webpack:///./src/components/common/File.tsx","webpack:///./src/components/ui/Notification.tsx","webpack:///./src/components/middle/composer/helpers/selection.ts","webpack:///./src/components/middle/composer/hooks/useEmojiTooltip.ts","webpack:///./src/components/middle/composer/EmojiTooltip.async.tsx","webpack:///./src/components/middle/composer/MessageInput.tsx","webpack:///./src/components/common/WebLink.tsx","webpack:///./src/components/left/main/hooks/useChatAnimationType.ts","webpack:///./src/components/left/main/Badge.tsx","webpack:///./src/components/left/main/Chat.tsx","webpack:///./src/components/left/main/ChatList.tsx","webpack:///./src/components/middle/composer/hooks/useMentionTooltip.ts","webpack:///./src/components/middle/composer/helpers/searchUserName.ts","webpack:///./src/hooks/useBlur.ts","webpack:///./src/hooks/useBlurSync.ts"],"names":["ListItem","props","ref","buttonRef","icon","className","style","children","disabled","ripple","narrow","inactive","focus","destructive","multiline","isStatic","contextActions","onClick","containerRef","useRef","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","getTriggerElement","useCallback","current","getRootElement","closest","getMenuElement","querySelector","positionX","positionY","menuStyle","useContextMenuPosition","handleClick","e","handleMouseDown","IS_TOUCH_ENV","button","lang","useLang","fullClassName","buildClassName","dir","isRtl","undefined","role","tabIndex","onMouseDown","onContextMenu","isOpen","autoClose","onClose","onCloseAnimationEnd","map","action","key","title","handler","useIntersectionObserver","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","isDisabled","rootCallback","controllerRef","rootCallbackRef","isFrozenRef","onUnfreezeRef","freeze","unfreeze","useHeavyAnimationCheck","useEffect","observer","disconnect","callbacks","clear","observe","target","targetCallback","Map","entriesAccumulator","observerCallbackSync","entries","Array","from","values","forEach","entry","callback","get","scheduler","throttle","debounce","observerCallback","IntersectionObserver","set","root","rootMargin","initController","controller","delete","unobserve","useOnIntersect","targetRef","useIsIntersecting","isIntersecting","setIsIntersecting","useState","mediaHash","noLoad","mediaFormat","ApiMediaFormat","BlobUrl","cacheBuster","delay","mediaData","mediaLoader","forceUpdate","useForceUpdate","startedAt","Date","now","then","spentTime","setTimeout","memo","withGlobal","global","userId","forceShowSelf","lastSyncTime","user","selectUser","isSavedMessages","isSelf","areMessagesLoaded","Boolean","selectChatMessages","setGlobal","actions","pick","typingStatus","avatarSize","status","withMediaViewer","withUsername","withFullInfo","withUpdatingStatus","noStatusOrTyping","noRtl","loadFullUser","openMediaViewer","id","fullName","getUserFullName","handleAvatarViewerOpen","hasPhoto","stopPropagation","avatarOwnerId","origin","MediaViewerOrigin","ProfileAvatar","MiddleHeaderAvatar","size","renderText","isVerified","isUserOnline","username","getUserStatus","Modal","header","hasCloseButton","noBackdrop","onEnter","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","preventDefault","focusableElements","querySelectorAll","length","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","Button","round","color","ariaLabel","ANIMATION_DURATION","slide","fade","IS_MOBILE_SCREEN","reveal","CLEANED_UP","Symbol","animationLevel","settings","byKey","activeKey","name","direction","renderCount","shouldRestoreHeight","shouldCleanup","onStart","onStop","rendersRef","prevActiveKey","usePrevious","activateTimeoutRef","activeKeyChanged","useLayoutEffect","cleanup","container","childElements","add","childNodes","clearTimeout","isBackwards","keys","Object","Number","prevActiveIndex","indexOf","activeIndex","node","i","HTMLElement","width","offsetWidth","scrollBy","left","behavior","ANIMATION_END_DELAY","requestAnimationFrame","window","scrollLeft","height","clientHeight","flexBasis","renders","contents","fill","render","chat","text","withOnlineStatus","isDeleted","isDeletedUser","imageHash","getChatAvatarHash","dataUri","useMedia","DataUri","shouldRenderFullMedia","useTransitionForMedia","content","src","alt","decoding","userFullName","getFirstLetters","getChatTitle","isChatPrivate","isOnline","getUserColorKey","senderId","data-test-sender-id","IS_TEST","InfiniteScroll","onLoadMore","onScroll","onKeyDown","items","itemSelector","preloadBackwards","sensitiveArea","noScrollRestore","noScrollRestoreOnTop","noFastList","stateRef","loadMoreBackwards","loadMoreForwards","useMemo","noScroll","LoadMoreDirection","Backwards","Forwards","scrollHeight","state","newScrollTop","listItemElements","currentAnchor","includes","scrollTop","getBoundingClientRect","top","currentAnchorTop","nextAnchor","resetScroll","isScrollTopJustUpdated","handleScroll","listLength","offsetHeight","isNearTop","offsetTop","isNearBottom","isUpdated","nextAnchorTop","newAnchorTop","offsetParent","teactFastList","SPEED","fast","slow","speed","noAnimate","isMediaLoaded","willAnimate","shouldRenderThumb","setShouldRenderThumb","MEDIA_VIEWER_MEDIA_QUERY","REM","parseInt","getComputedStyle","documentElement","fontSize","ROUND_VIDEO_DIMENSIONS","AVATAR_FULL_DIMENSIONS","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidth","getAvailableWidth","fromOwnMessage","isForwarded","isWebPagePhoto","extraPaddingRem","regularMaxWidth","Math","min","floor","innerWidth","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","isGif","aspectRatio","calculateDimensions","getAvailableHeight","getMediaViewerAvailableDimensions","withFooter","isVideo","mql","matchMedia","windowWidth","windowHeight","windowSize","occupiedHeightRem","matches","calculateInlineImageDimensions","photo","getPhotoInlineDimensions","calculateVideoDimensions","video","getVideoDimensions","getPictogramDimensions","getDocumentThumbnailDimensions","smaller","getStickerDimensions","sticker","baseWidth","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_INLINE_DESKTOP_FACTOR","calculatedHeight","calculateMediaViewerDimensions","availableWidth","availableHeight","mediaWidth","mediaHeight","calculatedWidth","lottiePromise","RLottie","async","ensureLottie","default","animationData","play","playSegment","noLoop","quality","isLowPriority","onLoad","animation","setAnimation","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","fastRaf","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useBackgroundMode","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","split","textPart","isText","description","useAsyncRendering","dependencies","shouldRenderRef","timeoutRef","useOnChange","isStreaming","Stream","IS_PROGRESSIVE_SUPPORTED","Progressive","downloadProgress","setDownloadProgress","startedAtRef","handleProgress","progress","RADIUSES","s","m","l","xl","square","transparent","noCross","radius","circleRadius","STROKE_WIDTH","borderRadius","circumference","PI","svg","firstElementChild","strokeDashOffset","max","setAttribute","toString","innerHTML","containerId","elementRef","createElement","appendChild","TeactDOM","removeChild","chatId","selectChat","onlineCount","selectChatOnlineCount","withChatType","loadFullChat","isSuperGroup","isChatSuperGroup","isMin","isRestricted","getChatTypeString","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","isAnimating","fastSmoothScroll","position","maxDistance","forceDirection","forceDuration","forceCurrentContainerHeight","FocusDirection","Static","scrollIntoView","block","offset","Up","Down","elementTop","elementHeight","containerHeight","targetContainerHeight","dataset","normalHeight","path","remainingPath","duration","abs","startAt","animateSingle","t","currentPath","transition","scrollWithJs","isAnimatingScroll","label","subLabel","value","checked","hidden","isLoading","onChange","type","Spinner","options","selected","loadingOption","handleChange","event","currentTarget","option","getViewportSlice","sourceIds","offsetId","listSlice","index","indexForDirection","to","newViewportIds","slice","areSomeLocal","areAllLocal","listIds","forceFullPreload","lastParamsRef","viewportIdsRef","prevListIds","prevIsDisabled","areSortedArraysEqual","viewportIds","getMore","AnimatedEmoji","isInline","observeIntersection","isAnimationLoaded","markAnimationLoaded","useFlag","localMediaHash","previewBlobUrl","Lottie","playKey","setPlayKey","String","random","STICKER_SIZE_TWO_FA","focusEditableElement","force","selection","getSelection","range","createRange","lastChild","nodeValue","setStart","removeAllRanges","addRange","onBlur","onFocus","hasFocus","SwipeDirection","captureEvents","captureEvent","currentSwipeAxis","hasMoved","onCapture","excludedClosestSelector","onMove","onRelease","pageX","touches","pageY","withCursor","dragOffsetX","dragOffsetY","onDrag","onSwipe","xAbs","yAbs","Left","Right","processSwipe","passive","VerifiedIcon","cycleRestrict","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","prev","mediaEl","catch","err","DEBUG","console","warn","noInitiallyBuffered","isBuffered","setIsBuffered","bufferedProgress","setBufferedProgress","setIsBufferedDebounced","handleBuffering","media","isSafariPatchInProgress","buffered","end","readyState","currentTime","bufferingHandlers","onLoadedData","onPlaying","onLoadStart","onPause","onTimeUpdate","onProgress","checkBuffering","ENTITY_CLASS_BY_NODE_NAME","B","ApiMessageEntityTypes","Bold","STRONG","I","Italic","EM","U","Underline","S","Strike","STRIKE","DEL","CODE","Code","PRE","Pre","BLOCKQUOTE","Blockquote","parseMessageInput","html","fragment","parsedHtml","IS_EMOJI_SUPPORTED","replace","parseMarkdown","innerText","trim","textIndex","recursionDeepness","entities","addEntity","entity","rawText","nodeName","anchor","entityType","MentionName","href","startsWith","Email","Phone","textContent","TextUrl","Url","getEntityTypeFromNode","rawIndex","substring","url","getEntityDataFromNode","push","hasChildNodes","isQuick","onFileSelect","isHovered","markHovered","unmarkHovered","onDrop","onDragEnter","onDragLeave","relatedTarget","toTarget","DropAreaState","withQuick","onHide","hideTimeoutRef","prevWithQuick","captureEscKeyListener","handleFilesDrop","dataTransfer","dt","files","handleQuickFilesDrop","handleDragLeave","fromTarget","onDragOver","chatOrUserId","isMinimized","canClose","clickArg","iconElement","titleText","getUserFirstOrLastName","fastSmoothScrollHorizontal","IS_IOS","containerWidth","scrollWidth","animate","scrollTo","deltaX","deltaY","messageId","message","replyOriginForId","loadMessage","getDispatch","loadMessageThrottled","throttled","contextMenuCounter","isMenuDisabled","shouldDisableOnLink","setIsContextMenuOpen","setContextMenuPosition","x","clientX","y","clientY","timer","clearLongPressTimer","startLongPressTimer","contains","originalEvent","cancelClickOnce","stopImmediatePropagation","emulateContextMenuEvent","renderMessageText","highlight","shouldRenderHqEmoji","formattedText","getMessageText","renderTextWithEntities","organizeEntities","organizedEntityIndexes","Set","organizedEntities","has","organizedEntity","organizeEntity","organizedIndexes","nestedEntities","filter","organizedIndex","shouldRenderAsHtml","renderMessagePart","result","deleteLineBreakAfterPre","organizedEntites","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","textBefore","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","renderedContent","join","getLinkUrl","processEntityAsHtml","entityText","BotCommand","handleBotCommandClick","Hashtag","Cashtag","handleHashtagClick","rel","Mention","processEntity","isArray","textAfter","arrayIndex","c","emojiFilter","sendBotCommand","command","setLocalTextSearchQuery","query","searchTextMessagesLocal","useVideoCleanup","videoRef","videoEl","load","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","copyTextToClipboard","str","rangeToRestore","rangeCount","getRangeAt","select","execCommand","copyImageToClipboard","imageUrl","canvas","ctx","getContext","imageEl","Image","onload","img","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","error","parentContainerClassName","inputId","focused","placeholder","autoComplete","onReset","inputRef","isInputFocused","markInputFocused","unmarkInputFocused","blur","overflow","typingUser","typingUserName","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","canDeleteForAll","contactName","getPrivateChatUserId","isChannel","isChatChannel","isBasicGroup","isChatBasicGroup","leaveChannel","deleteHistory","deleteChannel","chatTitle","handleDeleteMessageForAll","shouldDeleteForAll","handleDeleteChat","isCreator","patchSafariProgressiveAudio","audioEl","patchedForSafari","patchForSafariInProgress","paused","once","cb","prevDeps","uploadProgress","withDate","datetime","sender","isSelected","isSelectable","onCancelUpload","onDateClick","extension","getDocumentExtension","fileName","timestamp","isDownloadAllowed","setIsDownloadAllowed","useMediaWithDownloadProgress","getMessageMediaHash","isUploading","isTransferring","transferProgress","getMediaTransferState","hasPreview","getDocumentHasPreview","thumbDataUri","getMessageMediaThumbDataUri","localBlobUrl","previewData","isAllowed","handleDateClick","download","thumbnailDataUri","StickerSetModal","useModuleLoader","Bundles","Extra","useCanvasBlur","withRaf","canvasRef","processBlur","alpha","IS_CANVAS_FILTER_SUPPORTED","RADIUS","fastBlur","mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","iterations","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData","TEXT_FORMAT_BY_TAG_NAME","anchorPosition","selectedRange","linkUrlInputRef","isLinkControlOpen","openLinkControl","closeLinkControl","linkUrl","setLinkUrl","isEditingLink","setIsEditingLink","inputClassName","setInputClassName","selectedTextFormats","setSelectedTextFormats","useVirtualBackdrop","selectedFormats","parentElement","commonAncestorContainer","EDITABLE_INPUT_ID","textFormat","tagName","getSelectedText","getSelectedElement","updateInputStyles","input","getFormatButtonClassName","some","fKey","monospace","strikethrough","handleBoldText","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","restoreSelection","KeyK","KeyB","KeyU","KeyI","KeyM","KeyS","code","altKey","ctrlKey","metaKey","linkUrlConfirmClassName","inputMode","idPrefix","mediaBlobUrl","getMessageVideo","formatMediaDuration","MIN_SPIKES","MAX_SPIKES","renderSeekline","playProgress","handleStartSeek","handleSeek","handleStopSeek","onMouseMove","onMouseUp","theme","senderTitle","renderingFor","date","onPlay","onReadMedia","audio","voice","isMediaUnread","isVoice","isSeeking","isActivated","setIsActivated","shouldDownload","getMessageMediaFormat","useBuffering","playPause","setCurrentTime","useAudioPlayer","getMessageKey","getMediaDuration","isMessageLocal","shouldRenderSpinner","spinnerClassNames","handleButtonClick","seekBar","seekHandlers","isOwn","isOwnMessage","renderedWaveform","waveform","fillColor","fillOwnColor","progressFillColor","progressFillOwnColor","durationFactor","spikesCount","decodedWaveform","encoded5bit","bitsCount","valuesCount","bitsData","byteIndex","bitShift","lastByteIndex","lastBitShift","lastValue","decodeWaveform","Uint8Array","spikes","peak","fitCount","newData","springFactor","leftFiller","rightFiller","idx","val","interpolateArray","fillStyle","progressFillStyle","scale","item","globalAlpha","spikeHeight","beginPath","moveTo","arcTo","closePath","roundedRectangle","toDataURL","renderWaveformToDataUri","draggable","renderWaveform","buttonClassNames","showSeekline","contentClassName","ProgressSpinner","getFirstLine","Link","formatPastTimeShort","performer","getSecondLine","formatMediaDateTime","renderAudio","renderVoice","active","badgeCount","isBadgeActive","previousActiveTab","tabRef","tab","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","transform","tabs","activeTab","big","onSwitchTab","useHorizontalScroll","activeTabElement","newLeft","READABLE_ERROR_MESSAGES","CHAT_RESTRICTED","CHAT_WRITE_FORBIDDEN","CHAT_SEND_POLL_FORBIDDEN","CHAT_SEND_STICKERS_FORBIDDEN","CHAT_SEND_GIFS_FORBIDDEN","CHAT_SEND_MEDIA_FORBIDDEN","CHAT_LINK_EXISTS","SLOWMODE_WAIT_X","USER_BANNED_IN_CHANNEL","USER_IS_BLOCKED","YOU_BLOCKED_USER","IMAGE_PROCESS_FAILED","MEDIA_EMPTY","MEDIA_INVALID","PHOTO_EXT_INVALID","PHOTO_INVALID_DIMENSIONS","PHOTO_SAVE_FILE_INVALID","MESSAGE_DELETE_FORBIDDEN","MESSAGE_POLL_CLOSED","MESSAGE_EDIT_TIME_EXPIRED","CHAT_ADMIN_REQUIRED","PINNED_DIALOGS_TOO_MUCH","DIALOG_FILTERS_TOO_MUCH","CHANNEL_PRIVATE","MEDIA_CAPTION_TOO_LONG","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","LINK_NOT_MODIFIED","SERVICE_WORKER_DISABLED","CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS","FRESH_RESET_AUTHORISATION_FORBIDDEN","BOTS_TOO_MUCH","BOT_GROUPS_BLOCKED","USERS_TOO_MUCH","USER_CHANNELS_TOO_MUCH","USER_KICKED","USER_NOT_MUTUAL_CONTACT","USER_PRIVACY_RESTRICTED","INVITE_HASH_EMPTY","INVITE_HASH_EXPIRED","INVITE_HASH_INVALID","CHANNELS_TOO_MUCH","USER_ALREADY_PARTICIPANT","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","reduce","acc","privateChatUser","handleDelete","folderId","isPinned","toggleChatPinned","updateChatMutedState","toggleChatArchived","toggleChatUnread","actionUnreadMark","unreadCount","hasUnreadMark","actionPin","actionMute","isMuted","actionArchive","isChatArchived","getCanDeleteChat","outgoingStatus","Keys","extraPaddingX","extraTopPadding","setPositionX","setPositionY","setStyle","triggerEl","emptyRect","menuEl","rootEl","triggerRect","menuRect","rootRect","ShowTransition","isCustom","prevChildren","fromChildrenRef","usePrevDuringAnimation","isCurrentPresent","isPrevPresent","trackId","originalDuration","handlers","onInit","shouldPlay","onForcePlay","noPlaylist","setIsPlaying","isPlayingSync","setPlayProgress","register","eventName","proxy","isFinite","prevShouldPlay","prevSrc","audioProxy","tracks","currentTrackId","queue","stopCurrentAudio","currentTrack","Audio","handleEvent","nextTrackId","openAudioPlayer","parseMessageKey","nextTrack","safePlay","Proxy","createAudio","preload","IS_SAFARI","time","shouldRemoveFromQueue","track","h","filename","link","click","shouldSpinnerRender","getColorFromExtension","sizeString","getFileSizeString","onDismiss","setIsOpen","timerRef","closeAndDismiss","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","isSelectionInsideInput","selectionRange","parentNode","emojiDataPromise","emojiRawData","emojiData","RE_NOT_EMOJI_SEARCH","useEmojiTooltip","recentEmojiIds","onUpdateHtml","emojiKeywords","markIsOpen","unmarkIsOpen","byId","setById","byKeyword","setByKeyword","byName","setByName","filteredEmojis","setFilteredEmojis","recentEmojis","pickTruthy","emojis","uncompressEmoji","ensureEmojiData","byNative","buildCollectionByKey","mapValues","natives","emoji","names","tempEl","lastSymbol","lastWord","pop","test","toLowerCase","getEmojiCode","matched","matchedKeywords","keyword","concat","flatten","matchedNames","unique","insertEmoji","textEmoji","atIndex","lastIndexOf","messageInput","getElementById","isEmojiTooltipOpen","closeEmojiTooltip","EmojiTooltip","MAX_INPUT_HEIGHT","currentChatId","threadId","selectCurrentMessageList","messageSendKeyCombo","replyingToId","selectReplyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","editableInputId","shouldSetFocus","shouldSupressFocus","shouldSupressTextFormatter","onUpdate","onSupressedFocus","onSend","editLastMessage","replyToNextMessage","cloneRef","isContextMenuOpenRef","isTextFormatterOpen","openTextFormatter","closeTextFormatter","textFormatterAnchorPosition","setTextFormatterAnchorPosition","setSelectedRange","updateInputHeight","useLayoutEffectWithPrevDeps","prevHtml","focusInput","handleCloseTextFormatter","empty","clearSelection","checkSelection","selectedText","parseEmojiOnlyString","START_TO_END","selectionRect","inputRect","willSend","clone","currentHeight","newHeight","transitionDuration","log","captureFirstTab","onTab","supressFocus","contentEditable","targetIndexDelta","handleKeyUp","IS_ANDROID","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onTouchCancel","onMessageClick","linkData","getMessageWebPage","getFirstLinkInMessage","domain","messageText","getMessageSummaryText","siteName","handleMessageClick","displayUrl","truncatedDescription","trimText","data-initial","ChatAnimationTypes","isShown","renderContent","unreadMentionsCount","formatIntegerCompact","FolderTypeToListType","lastMessage","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","getMessageAction","actionTargetMessage","selectChatMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","privateChatUserId","messageListType","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","lastMessageOutgoingStatus","selectOutgoingStatus","actionTargetUser","draft","selectDraft","MAIN_THREAD_ID","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isAction","isActionMessage","useEnsureMessage","mediaThumbnail","getMessageSticker","isRoundVideo","getMessageRoundVideo","Opacity","opacity","Move","useChatContextActions","Avatar","LastMessageMeta","TypingStatus","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","DeleteChatModal","folderType","chats","chatsById","orderedPinnedIds","users","usersById","currentThreadId","listType","chatFolder","selectChatFolder","isInDiscussionThread","notifySettings","notifyExceptions","noChatsText","isActive","loadMoreChats","preloadTopChatMessages","currentListIds","currentPinnedIds","prepareFolderListIds","orderById","orderedIds","newChatArrays","prepareChatList","singleList","pinnedChats","otherChats","newOrderedIds","prevOrderById","orderDiffById","order","Infinity","loadMoreOfType","useInfiniteScroll","CHAT_LIST_SLICE","ALL_CHATS_PRELOAD_DISABLED","chatArrays","getAnimationType","movesUp","movesDown","orderDiffIds","numberOfUp","numberOfDown","None","useChatAnimationType","digit","match","nextId","viewportOffset","pinnedOffset","CHAT_HEIGHT_PX","teactOrderKey","getChatOrder","renderChats","Loading","RE_NOT_USERNAME_SEARCH","useMentionTooltip","canSuggestMembers","groupChatMembers","currentUserId","currentFilter","setCurrentFilter","filteredMembers","setFilteredMembers","getFilteredMembers","usernameLowered","fullNameLowered","filterLowered","searchWords","searchUserName","usernameFilter","getUsernameFilter","membersToMention","insertMention","forceFocus","insertedHtml","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","mentionFilteredMembers","cache","useBlurSync","blurredRef","isChanged","imgToCanvas","blurredAsync","blurredDataUri","useBlur"],"mappings":"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AK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAElgC,SAASC,EAAiBC,EAASC,EAAOC,EAAO5rB,EAAOS,EAAQ6M,EAAQue,GACrF,GAAIpsB,OAAOqsB,MAAMxe,IAAWA,EAAS,EAAG,OAExCA,GAAU,EAEN7N,OAAOqsB,MAAMD,KAAaA,EAAa,IAC3CA,GAAc,GACG,IAAGA,EAAa,GAC7BA,EAAa,IAAGA,EAAa,GAEjC,MAAME,EAAYL,EAAQM,aAAaL,EAAOC,EAAO5rB,EAAOS,GAEtDwrB,EAASF,EAAUG,KAEzB,IAAIC,EACAC,EACAC,EACA3M,EACAE,EACA9f,EACAwsB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAK5sB,EAAQ,EACb6sB,EAAKpsB,EAAS,EACdqsB,EAAOxf,EAAS,EAEhByf,EAAI,GACJC,EAAI,GACJC,EAAI,GAEJC,EAAU3B,EAAUje,GACpB6f,EAAU3B,EAAUle,GAEpB8f,EAAO,GACPC,EAAO,GAEX,KAAOxB,KAAe,GAAG,CAGvB,IAFAc,EAAKD,EAAK,EAEL9M,EAAI,EAAGA,EAAInf,EAAQmf,IAAK,CAK3B,IAJAuM,EAAOF,EAAOU,GAAMG,EACpBV,EAAOH,EAAOU,EAAK,GAAKG,EACxBT,EAAOJ,EAAOU,EAAK,GAAKG,EAEnBhtB,EAAI,EAAGA,GAAKwN,EAAQxN,IACvBwsB,EAAIK,IAAQ7sB,EAAI8sB,EAAKA,EAAK9sB,IAAO,GACjCqsB,GAAQF,EAAOK,KACfF,GAAQH,EAAOK,KACfD,GAAQJ,EAAOK,KAGjB,IAAK5M,EAAI,EAAGA,EAAI1f,EAAO0f,IACrBqN,EAAEL,GAAMP,EACRa,EAAEN,GAAMN,EACRa,EAAEP,GAAML,EAEC,GAALzM,IACFwN,EAAK1N,KAAO4M,EAAI5M,EAAIoN,GAAQF,EAAKN,EAAIM,IAAO,EAC5CS,EAAK3N,IAAO4M,EAAI5M,EAAIpS,GAAU,EAAIgf,GAAK,EAAI,GAG7CC,EAAKI,EAAKS,EAAK1N,GACf8M,EAAKG,EAAKU,EAAK3N,GAEfyM,GAAQF,EAAOM,KAAQN,EAAOO,KAC9BJ,GAAQH,EAAOM,KAAQN,EAAOO,KAC9BH,GAAQJ,EAAOM,KAAQN,EAAOO,KAE9BE,IAEFC,GAAO3sB,GAAS,EAGlB,IAAK0f,EAAI,EAAGA,EAAI1f,EAAO0f,IAAK,CAM1B,IALA+M,EAAK/M,EACLyM,EAAOY,EAAEN,GAAMK,EACfV,EAAOY,EAAEP,GAAMK,EACfT,EAAOY,EAAER,GAAMK,EAEVhtB,EAAI,EAAGA,GAAKwN,EAAQxN,IACvB2sB,GAAO3sB,EAAI+sB,EAAK,EAAI7sB,EACpBmsB,GAAQY,EAAEN,GACVL,GAAQY,EAAEP,GACVJ,GAAQY,EAAER,GAIZ,IADAC,EAAKhN,GAAK,EACLE,EAAI,EAAGA,EAAInf,EAAQmf,IACtBqM,EAAOS,GAAOP,EAAOe,IAAaC,EAClClB,EAAOS,EAAK,GAAMN,EAAOc,IAAaC,EACtClB,EAAOS,EAAK,GAAML,EAAOa,IAAaC,EAE7B,GAALzN,IACF0N,EAAKxN,KAAO0M,EAAI1M,EAAIkN,GAAQD,EAAKP,EAAIO,GAAM7sB,EAC3CqtB,EAAKzN,IAAO0M,EAAI1M,EAAItS,GAAU,EAAIgf,EAAItsB,EAAQ,GAGhDusB,EAAK7M,EAAI0N,EAAKxN,GACd4M,EAAK9M,EAAI2N,EAAKzN,GAEduM,GAAQY,EAAER,GAAMQ,EAAEP,GAClBJ,GAAQY,EAAET,GAAMS,EAAER,GAClBH,GAAQY,EAAEV,GAAMU,EAAET,GAElBE,GAAM1sB,GAAS,GAKrB0rB,EAAQ4B,aAAavB,EAAWJ,EAAOC,K,6BCtKzC,gFAiCA,MAAM2B,EAAsE,CAC1EpU,EAAG,OACHG,OAAQ,OACRC,EAAG,SACHE,GAAI,SACJC,EAAG,YACHK,IAAK,gBACLC,KAAM,aA6ZO5hB,gBA1ZqB,EAClC/E,SACAm6B,iBACAC,gBACAl6B,cAGA,MAAMtC,EAAeC,YAAuB,MAEtCw8B,EAAkBx8B,YAAyB,OAC3C,aAAEmK,EAAF,qBAAgBC,GAAyBC,YAAkBlI,IAC1Ds6B,EAAmBC,EAAiBC,GAAoB1Z,eACxD2Z,EAASC,GAAc72B,YAAS,KAChC82B,EAAeC,GAAoB/2B,aAAS,IAC5Cg3B,EAAgBC,GAAqBj3B,eACrCk3B,EAAqBC,GAA0Bn3B,YAA+B,IAErFpC,YAAU,IAAOzB,EAASiqB,YAAsB/pB,QAAWP,EAAY,CAACK,EAAQE,IAChF+6B,YACEj7B,EACApC,EACAsC,GAGFuB,YAAU,KACJ64B,EACFD,EAAgB97B,QAASjB,SAEzBo9B,EAAW,IACXE,GAAiB,KAElB,CAACN,IAEJ74B,YAAU,KACHuG,IACHwyB,IACAQ,EAAuB,IACvBF,OAAkBn7B,KAEnB,CAAC66B,EAAkBxyB,IAEtBvG,YAAU,KACR,IAAKzB,IAAWo6B,EACd,OAGF,MAAMc,EAAwC,GAC9C,IAAI,cAAEC,GAAkBf,EAAcgB,wBACtC,KAAOD,GAAiBA,EAAcz0B,KAAO20B,KAAmB,CAC9D,MAAMC,EAAapB,EAAwBiB,EAAcI,SACrDD,IACFJ,EAAgBI,IAAc,GAGhCH,EAAgBA,EAAcA,cAGhCH,EAAuBE,IACtB,CAACl7B,EAAQo6B,EAAeG,IAc3B,MAAMiB,EAAkBl9B,YAAY,KAClC,GAAK87B,EAIL,OAAOA,EAAcxf,YACpB,CAACwf,IAEEqB,EAAqBn9B,YAAY,KACrC,GAAK87B,EAIL,OAAOA,EAAcgB,wBAAwBD,eAC5C,CAACf,IAEJ,SAASsB,IACP,MAAMC,EAAQtB,EAAgB97B,QAC9B,IAAKo9B,EACH,OAGF,MAAM,YAAE/uB,EAAF,YAAewe,EAAf,WAA4Bje,GAAewuB,EACjD,GAAIvQ,GAAexe,EAEjB,YADAkuB,OAAkBn7B,GAIpB,IAAI5C,EAAY,GACZoQ,EAAaie,EAAcxe,IAC7B7P,EAAY,cAEVoQ,EAAa,IACfpQ,GAAa,cAGf+9B,EAAkB/9B,GAQpB,SAAS6+B,EAAyBt7B,GAChC,GAAIy6B,EAAoBz6B,GACtB,MAAO,SAGT,GAAY,cAARA,GAA+B,kBAARA,GACzB,GAAI6L,OAAOD,KAAK6uB,GAAqBc,KAClCC,GAASA,IAASx7B,KAASy6B,EAAoBe,IAEhD,MAAO,gBAEJ,GAAIf,EAAoBgB,WAAahB,EAAoBiB,cAC9D,MAAO,WAMX,MAAMC,EAAiB39B,YAAY,KACjC08B,EAAwBE,IAEtBlyB,SAASgpB,YAAYkJ,EAAgBgB,KAAO,eAAiB,QAC7D/vB,OAAOD,KAAKgvB,GAAiB14B,QAASlC,IACvB,WAARA,GAA4B,cAARA,IAA0B46B,EAAgB56B,IACjE0I,SAASgpB,YAAY1xB,KAIlB,IACF46B,EACHgB,MAAOhB,EAAgBgB,SAG1B,IAEGC,EAAmB79B,YAAY,KACnC0K,SAASgpB,YAAY,UACrBgJ,EAAwBE,IAAD,IAClBA,EACHkB,QAASlB,EAAgBkB,WAE1B,IAEGC,EAAsB/9B,YAAY,KACtC0K,SAASgpB,YAAY,aACrBgJ,EAAwBE,IAAD,IAClBA,EACHoB,WAAYpB,EAAgBoB,cAE7B,IAEGC,EAA0Bj+B,YAAY,KAC1C,GAAIy8B,EAAoBiB,cAAe,CACrC,MAAM1zB,EAAUmzB,IAChB,IACGrB,IACG9xB,GACmB,QAApBA,EAAQizB,UACPjzB,EAAQkgB,YAEZ,OASF,OANAlgB,EAAQk0B,YAAYl0B,EAAQkgB,kBAC5BwS,EAAwBE,IAAD,IAClBA,EACHc,eAAe,KAMnB,MAAMpuB,EAAO4tB,IACbxyB,SAASgpB,YAAY,cAAc,EAAQ,QAAOpkB,WAClD1N,KACC,CACDu7B,EAAoBD,EAAiBt7B,EACrCk6B,EAAeW,EAAoBiB,gBAG/BS,EAAsBn+B,YAAY,KACtC,GAAIy8B,EAAoBgB,UAAW,CACjC,MAAMzzB,EAAUmzB,IAChB,IACGrB,IACG9xB,GACmB,SAApBA,EAAQizB,UACPjzB,EAAQkgB,YAEZ,OAQF,OALAlgB,EAAQk0B,YAAYl0B,EAAQkgB,kBAC5BwS,EAAwBE,IAAD,IAClBA,EACHa,WAAW,KAKf,MAAMnuB,EAAO4tB,IACbxyB,SAASgpB,YAAY,cAAc,EAAQ,6CAA4CpkB,YACvF1N,KACC,CACDu7B,EAAoBD,EAAiBt7B,EACrCk6B,EAAeW,EAAoBgB,YAGrC,SAASW,IACP,MAAMC,EAAmBlC,EAAQ7pB,SAAS,OAAS6pB,EAAW,UAASA,EAEvE,GAAIE,EAAe,CACjB,MAAMryB,EAAUmzB,IAChB,IAAKnzB,GAA+B,MAApBA,EAAQizB,QACtB,OAMF,OAHCjzB,EAA8B8f,KAAOuU,OAEtCz8B,IAIF,MAAM0N,EAAO4tB,KAnLf,WACE,IAAKpB,EACH,OAGF,MAAM3Y,EAAYvU,OAAOwU,eACrBD,IACFA,EAAUO,kBACVP,EAAUQ,SAASmY,IA4KrBwC,GACA5zB,SAASgpB,YACP,cACA,EACC,WAAU2K,yCAAwD/uB,SAErE1N,IAGF,MAAMqI,EAAgBjK,YAAaW,IACjC,MASMuB,EAT0D,CAC9Dq8B,KAAMtC,EACNuC,KAAMb,EACNc,KAAMV,EACNW,KAAMb,EACNc,KAAMR,EACNS,KAAMX,GAG6Bt9B,EAAEk+B,OAGrCl+B,EAAEm+B,SACGn+B,EAAEo+B,SAAWp+B,EAAEq+B,UAChB98B,IAKNvB,EAAEuJ,iBACFvJ,EAAE8H,kBACFvG,MACC,CACDy7B,EAAgBE,EAAkBE,EAClCI,EAAqBF,EACrBhC,IAGF94B,YAAU,KACJzB,GACFgJ,SAASI,iBAAiB,UAAWb,GAGhC,IAAMS,SAASK,oBAAoB,UAAWd,IACpD,CAACvI,EAAQuI,IAEZ,MAAMlJ,EAAOC,cASb,IAAK0I,EACH,OAGF,MAAMjL,EAAYyC,YAChB,gBACAyI,EACAqyB,GAAqB,sBAGjBiD,EAA0B/9B,YAC9B,mCACEi7B,EAAQ9xB,QAAU,SAGhB3L,EAAQm9B,EACT,SAAQA,EAAe9N,aAAa8N,EAAe5N,8BAA8B4N,EAAe9N,OACjG,GAEJ,OACE,yBACEzvB,IAAKgB,EACLb,UAAWA,EAEXC,MAAOA,EACPuS,UAhCJ,SAAgCtQ,GAChB,UAAVA,EAAEqB,KAAmBg6B,IACvBoC,IACAz9B,EAAEuJ,oBA+BF,yBAAKzL,UAAU,yBACb,kBAAC,IAAD,CACEkN,MAAM,cACNC,UAAU,YACVnN,UAAW6+B,EAAyB,QACpCj+B,QAASs+B,GAET,uBAAGl/B,UAAU,eAEf,kBAAC,IAAD,CACEkN,MAAM,cACNC,UAAU,cACVnN,UAAW6+B,EAAyB,UACpCj+B,QAASw+B,GAET,uBAAGp/B,UAAU,iBAEf,kBAAC,IAAD,CACEkN,MAAM,cACNC,UAAU,kBACVnN,UAAW6+B,EAAyB,aACpCj+B,QAAS0+B,GAET,uBAAGt/B,UAAU,qBAEf,kBAAC,IAAD,CACEkN,MAAM,cACNC,UAAU,qBACVnN,UAAW6+B,EAAyB,iBACpCj+B,QAAS4+B,GAET,uBAAGx/B,UAAU,wBAEf,kBAAC,IAAD,CACEkN,MAAM,cACNC,UAAU,iBACVnN,UAAW6+B,EAAyB,aACpCj+B,QAAS8+B,GAET,uBAAG1/B,UAAU,oBAEf,yBAAKA,UAAU,0BACf,kBAAC,IAAD,CAAQkN,MAAM,cAAcC,UAAW7K,EAAK,2BAA4B1B,QAAS48B,GAC/E,uBAAGx9B,UAAU,gBAIjB,yBAAKA,UAAU,8BACb,yBAAKA,UAAU,yBACb,kBAAC,IAAD,CAAQkN,MAAM,cAAcC,UAAW7K,EAAK,UAAW1B,QAAS68B,GAC9D,uBAAGz9B,UAAU,qBAEf,yBAAKA,UAAU,0BAEf,yBACEA,UAAWyC,YAAe,uCAAwCq7B,IAElE,2BACEj+B,IAAKy9B,EACLt9B,UAAU,+BACV6hB,KAAK,OACLL,MAAOkc,EACPtH,YAAY,eACZC,aAAa,MACboK,UAAU,MACV/9B,IAAI,OACJkf,SArRZ,SAA6B1f,GAC3By7B,EAAWz7B,EAAE8C,OAAOwc,OACpBmd,KAoRUpsB,SAAUosB,KAId,yBAAK3+B,UAAWwgC,GACd,yBAAKxgC,UAAU,0BACf,kBAAC,IAAD,CACEkN,MAAM,cACNC,UAAW7K,EAAK,QAChBtC,UAAU,gBACVY,QAAS++B,GAET,uBAAG3/B,UAAU,uB,6BC5b3B,mDA+CegI,gBA1Ba,EAAG2mB,UAAS+R,WAAW,eAAgB9/B,cACjE,MAAMqB,EAAcV,YAAY,KAC9BX,EAAS+tB,EAAQhlB,GAAIglB,EAAQtQ,SAC5B,CAACsQ,EAAQhlB,GAAIglB,EAAQtQ,OAAQzd,IAE1Bm5B,EAAeC,YAA4BrL,GAC3CgS,EAAevvB,YAASooB,YAAoB7K,EAAS,eACrD,kBACJpZ,EADI,sBACejE,EADf,qBACsCpG,GACxCqG,YAAsBovB,EAAc,QAElC1oB,EAAQ2oB,YAAgBjS,GAE9B,OACE,yBAAKhlB,GAAK,GAAE+2B,IAAW/R,EAAQhlB,KAAM3J,UAAU,oBAAoBY,QAASA,EAAUqB,OAAcW,GACjG2S,GACC,yBAAK9D,IAAKsoB,EAAcroB,IAAI,KAE7BJ,GACC,yBAAKG,IAAKkvB,EAAc3gC,UAAckL,EAAF,cAAqCwG,IAAI,KAE9EuG,GAAS,0BAAMjY,UAAU,kBAAkBiY,EAAMlB,MAAQ,MAAQ8pB,YAAoB5oB,EAAM4I,e,wKCqBlG,MACMigB,EAAavzB,IAAmB,GAAK,GACrCwzB,EAAaxzB,IAAmB,GAAK,GA6U3C,SAASyzB,EACPC,EACArZ,GACA,gBAAEsZ,EAAF,WAAmBC,EAAnB,eAA+BC,IAE/B,OACE,yBACEphC,UAAU,wBACV+C,YAAam+B,EACbG,YAAaF,EACbG,UAAWF,GAEX,0BAAMphC,UAAU,8BACd,uBAEEC,MAAQ,yBAA2C,IAAnB2nB,SAGpC,0BAAM5nB,UAAU,0BACd,uBAEEC,MAAQ,yBAAuC,IAAfghC,SAGpC,0BAAMjhC,UAAU,kBACd,uBAEEC,MAAQ,yBAAuC,IAAfghC,UAO3Bj5B,gBAAKC,YAAsBC,IAAD,CAAeq5B,MAAOr5B,EAAO0F,SAASC,MAAM0zB,QAAjEt5B,CA3WqB,EACvCs5B,QACA5S,UACA6S,cACA/I,iBACAgJ,eACAC,OACAr5B,eACArI,YACA84B,eACAD,aACA8I,SACAC,cACA7I,iBACAC,kBAEA,MAAQxnB,SAAS,MAAEqwB,EAAF,MAASC,GAApB,cAA6BC,GAAkBpT,EAC/CqT,EAAUr5B,QAAQm5B,GAClBG,EAAYnhC,aAAgB,GAC5BwB,EAAOC,eAEN2/B,EAAaC,GAAkBr7B,aAAS,GACzCs7B,EAA6C/5B,GAE7C,UAAEf,EAAF,iBAAa+U,GAAqBkd,YACtCC,YAAoB7K,EAAS,WAC5ByT,EACDC,YAAsB1T,EAAS,WAQjC,MAAM,WACJjH,EADI,iBACQE,EADR,kBAC0BU,EAD1B,eAC6CO,GAC/CyZ,eAEE,UACJvnB,EADI,aACOkmB,EADP,UACqBsB,EADrB,eACgCC,EADhC,SACgD3hB,GAClD4hB,YACFC,YAAc/T,GACdgU,YAAiBhU,GACjBrnB,EACAghB,EACAO,EACAqZ,GAjBF,WACEC,GAAe,GACfR,EAAOhT,EAAQhlB,GAAIglB,EAAQtQ,UAiB3BukB,aAAejU,IAGjBjqB,YAAU,KACRy9B,EAAepnB,IACd,CAACA,IAEJ,MAAM,YACJ0e,EADI,eACSC,EADT,iBACyBC,GAC3BC,YAAsBjL,EAAS8J,GAAkBpc,EAAkB6lB,IAAgBxa,IAGrFzc,aAAc43B,GACd33B,qBAAsB43B,IACpB33B,YAAkBuuB,GAEhBqJ,GAAoBxhC,YAAY,KAChCk4B,EACEV,GACFA,KAMChe,GACH4mB,EAAOhT,EAAQhlB,GAAIglB,EAAQtQ,QAG7B8jB,GAAgBD,GAChBK,MACC,CAACxnB,EAAW0e,EAAa9K,EAAQhlB,GAAIglB,EAAQtQ,OAAQ0a,EAAgB4I,EAAQY,EAAWL,IAE3Fx9B,YAAU,KACJqW,GAAa6mB,GAAeG,GAC9BH,KAED,CAAC7mB,EAAWgnB,EAAeH,IAE9B,MAAMT,GAAa5/B,YAAaW,IAC9B,GAAI+/B,EAAUzgC,QAAS,CACrB,MAAMwhC,EAAU9gC,EAAEkgB,cAAc1gB,QAAQ,uBACxC,GAAIshC,EAAS,CACX,MAAM,MAAEpzB,EAAF,KAASG,GAASizB,EAAQjvB,wBAChCyuB,EAAe3hB,IAAa3e,EAAEqtB,QAAUxf,GAAQH,OAGnD,CAACiR,EAAU2hB,IAERtB,GAAkB3/B,YAAaW,IACnC+/B,EAAUzgC,SAAU,EACpB2/B,GAAWj/B,IACV,CAACi/B,KAEEC,GAAiB7/B,YAAY,KACjC0gC,EAAUzgC,SAAU,GACnB,IAEG44B,GAAkB74B,YAAY,KAClCy3B,EAAarK,EAAQhlB,GAAIglB,EAAQtQ,SAChC,CAAC2a,EAAarK,EAAQhlB,GAAIglB,EAAQtQ,SA4BrC,MAAM4kB,GAAe,CAAE/B,mBAAiBC,cAAYC,mBAC9C8B,GAAQC,aAAaxU,GACrByU,GAAmBjwB,YACvB,IAAM2uB,GAkJV,SACEA,EACAb,EAAe,EACfiC,GAAQ,GACR,gBAAEhC,EAAF,WAAmBC,EAAnB,eAA+BC,GAC/BG,GAEA,MAAM,SAAE8B,EAAF,SAAYxiB,GAAaihB,EAE/B,IAAKuB,EACH,OAGF,MAAMC,EAAsB,SAAV/B,EAAmB,UAAY,UAC3CgC,EAAyB,SAAVhC,EAAmB,UAAY,UAC9CiC,EAA8B,SAAVjC,EAAmB,UAAY,UACnDkC,EAAiC,SAAVlC,EAAmB,UAAY,UACtDmC,EAAiBjtB,KAAKC,IAAImK,EArTP,GAqTsC,GACzD8iB,EAAcltB,KAAKxJ,MAAM6zB,GAAcC,EAAaD,GAAc4C,GAClEE,EClXD,SAAwBC,GAC7B,MAAMC,EAAiC,EAArBD,EAAYj4B,OACxBm4B,EAActtB,KAAKE,MAAMmtB,EAAY,GAC3C,IAAKC,EACH,MAAO,GAWT,MAAM1S,EAAS/rB,MAAMy+B,GACfC,EAAWH,EACjB,IAAK,IAAIn0B,EAAI,EAAGmN,EAAIknB,EAAc,EAAGr0B,IAAMmN,IAAKnN,EAAG,CACjD,MAAMu0B,EAAYxtB,KAAKE,MAAW,EAAJjH,EAAS,GACjCw0B,EAAWztB,KAAKE,MAAW,EAAJjH,EAAS,GAChC8R,EAAQwiB,EAASC,IAAcD,EAASC,EAAY,IAAM,GAChE5S,EAAO3hB,GAAO8R,GAAS0iB,EAAY,GAErC,MAAMC,EAAgB1tB,KAAKE,MAA2B,GAAnBotB,EAAc,GAAU,GACrDK,EAAe3tB,KAAKE,MAA2B,GAAnBotB,EAAc,GAAU,GACpDM,EAAYL,EAASG,IAAkBH,EAASG,EAAgB,IAAM,GAG5E,OAFA9S,EAAO0S,EAAc,GAAMM,GAAaD,EAAgB,GAEjD/S,EDsViBiT,CAAe,IAAIC,WAAWlB,KAC9CvH,KAAM0I,EAAR,KAAgBC,GCpVjB,SAA0B3I,EAAgB4I,GAC/C,IAAID,EAAO,EACX,MAAME,EAAU,IAAIr/B,MAAMo/B,GACpBE,EAAe9I,EAAKlwB,OAAS84B,EAC7BG,EAAa/I,EAAK,GAClBgJ,EAAchJ,EAAKA,EAAKlwB,OAAS,GACvC,IAAK,IAAI8D,EAAI,EAAGA,EAAIg1B,EAAUh1B,IAAK,WACjC,MAAMq1B,EAAMtuB,KAAKE,MAAMjH,EAAIk1B,GACrBI,IAAO,UAAClJ,EAAKiJ,EAAM,UAAZ,QAAkBF,IAAlB,UAAiC/I,EAAKiJ,UAAtC,QAA8CF,IAA9C,UAA6D/I,EAAKiJ,EAAM,UAAxE,QAA8ED,IAAgB,EAC3GH,EAAQj1B,GAAKs1B,EACTP,EAAOO,IACTP,EAAOO,GAGX,MAAO,CAAElJ,KAAM6I,EAASF,QDsUOQ,CAAiBrB,EAAiBD,IAC3D,IAAElyB,EAAF,MAAO7B,EAAP,OAAcS,GE7Wf,SACLm0B,EACA/nB,GACA,KACEgoB,EADF,UACQS,EADR,kBACmBC,IAGnB,MAAMv1B,EAXW,EAWH40B,EAAO54B,OAGfwpB,EAASnpB,SAASgS,cAAc,UACtCmX,EAAOxlB,MAAgB,EAARA,EACfwlB,EAAO/kB,OAASA,GAChB+kB,EAAOn1B,MAAM2P,MAAWA,EAAF,KACtBwlB,EAAOn1B,MAAMoQ,OAAU,OAEvB,MAAMglB,EAAMD,EAAOE,WAAW,MAW9B,OAVAD,EAAI+P,MAAM,EAAG,GAEbZ,EAAO/+B,QAAQ,CAAC4/B,EAAM31B,KACpB2lB,EAAIiQ,YAAe51B,EAAI80B,EAAO54B,QAAU6Q,EAAY,GAAM,EAC1D4Y,EAAI6P,UAAYzoB,EAAW/M,EAAI80B,EAAO54B,OAASu5B,EAAoBD,EACnE,MAAMK,EAAc9uB,KAAKkH,IAAI,EAAa0nB,EAAO5uB,KAAKkH,IAAI,EAAG8mB,GAxBlD,KAoCf,SACEpP,EAA+B/F,EAAWE,EAAW5f,EAAeS,EAAgB6M,GAEhFtN,EAAQ,EAAIsN,IACdA,EAAStN,EAAQ,GAEfS,EAAS,EAAI6M,IACfA,EAAS7M,EAAS,GAGpBglB,EAAImQ,YACJnQ,EAAIoQ,OAAOnW,EAAIpS,EAAQsS,GACvB6F,EAAIqQ,MAAMpW,EAAI1f,EAAO4f,EAAGF,EAAI1f,EAAO4f,EAAInf,EAAQ6M,GAC/CmY,EAAIqQ,MAAMpW,EAAI1f,EAAO4f,EAAInf,EAAQif,EAAGE,EAAInf,EAAQ6M,GAChDmY,EAAIqQ,MAAMpW,EAAGE,EAAInf,EAAQif,EAAGE,EAAGtS,GAC/BmY,EAAIqQ,MAAMpW,EAAGE,EAAGF,EAAI1f,EAAO4f,EAAGtS,GAC9BmY,EAAIsQ,YA3BFC,CAAiBvQ,EA3BF,EA2BO3lB,EAzBX,GAHK,EA4B2C61B,EA1B1C,GA2BjBlQ,EAAI3kB,SAGC,CACLe,IAAK2jB,EAAOyQ,YACZj2B,QACAS,OAhCW,IF+WkBy1B,CAAwBtB,EAAQvD,EAAc,CAC3EwD,OACAS,UAAWhC,EAAQK,EAAeD,EAClC6B,kBAAmBjC,EAAQO,EAAuBD,IAGpD,OAEE,yBACE/xB,IAAKA,EACLC,IAAI,GACJ9B,MAAOA,EACPS,OAAQA,EACRrQ,UAAU,WACV+lC,WAAW,EACXhjC,YAAam+B,EACbG,YAAaF,EACbG,UAAWF,IAxLE4E,CAAelE,EAAOb,EAAciC,GAAOD,GAAc1B,GACxE,CAACO,EAAOb,EAAciC,GAAOD,GAAc1B,IAGvC/+B,GAAgBC,YACpB,oBACAzC,EACAkjC,KAAUzB,GAAgB,MAC1BA,GAAgB,SAChB5I,GAAc,qBAGVoN,GAAmB,CAAC,eACtBpD,GACFoD,GAAiBha,KAAK,WACblR,EACTkrB,GAAiBha,KAAK,SACZlR,GACVkrB,GAAiBha,KAAK,QAGxB,MAAMia,GAAenrB,GAAckmB,EAAe,GAAKA,EAAe,EAChEkF,GAAmB1jC,YAAe,UAAWyjC,IAAgB,iBAiCnE,OACE,yBAAKlmC,UAAWwC,GAAeE,IAAKJ,EAAKK,MAAQ,WAAQC,GACtDk2B,GACC,yBAAK94B,UAAU,0BACZ64B,GAAc,uBAAG74B,UAAU,iBAGhC,kBAACgN,EAAA,EAAD,CACEC,OAAK,EACL7M,QAASmN,IACTjD,KAAMm3B,EAAe,UAAY,OACjCzhC,UAAWimC,GAAiBrT,KAAK,KACjCzlB,UAAW4N,EAAY,cAAgB,aACvCna,QAASmiC,GACTpgC,MAAOL,EAAKK,OAEZ,uBAAG3C,UAAU,cACb,uBAAGA,UAAU,gBAEd6iC,IACC,yBAAK7iC,UAAWyC,YAAe,gBAAiBqgC,KAC9C,kBAACsD,EAAA,EAAD,CACE3pB,SAAUkd,EACV3c,aAAW,EACX1S,KAAMm3B,EAAe,IAAM,IAC3B7gC,QAASmiC,MAIG,iBAAjBtB,GA1DD,oCACE,yBAAKzhC,UAAWmmC,IACd,yBAAKnmC,UAAU,eACb,uBAAGA,UAAU,QAAQ0C,IAAI,QAAQ6H,YA1D3C,WACE,GAAIy3B,EACF,OAAOR,GAAe,QAGxB,MAAM,MAAEh+B,EAAF,SAAS21B,GAAa0I,EAE5B,OAAOr+B,GAAS21B,EAmDoCkN,KAE5C,yBAAKrmC,UAAU,gBACZ0hC,GACC,kBAAC4E,EAAA,EAAD,CACEtmC,UAAU,OACVY,QAASw5B,IAERmM,YAAoBjkC,EAAa,IAAPo/B,MAMlCwE,IAAgBlF,EAAeC,EAAcrZ,EAAkBqb,KAC9DiD,IACA,uBAAGlmC,UAAU,WAAW0C,IAAI,QACzBu+B,EAAe,EAAOJ,YAAoBhgB,EAAWogB,GAAjC,WAAsDr+B,EAjEvF,WACE,GAAIo/B,EACF,OAAOnB,YAAoBiB,EAAOjhB,UAGpC,MAAM,UAAE2lB,GAAc3E,EAEtB,OACE,oCACG2E,GAAaj8B,YAAWi8B,GACxBA,GAAahF,GAAe,mCAC5BA,GAAej3B,YAAWi3B,IAuDpBiF,MAsCS,iBAAjBhF,GAAmCI,GAS1C,SACEv/B,EACAu/B,EACA9mB,EACAkmB,EACArZ,EACAqb,EACAvB,EACAtH,GAEA,MAAM,MACJ52B,EADI,UACGgjC,EADH,SACc3lB,EADd,SACwBsY,GAC1B0I,EACEqE,EAAenrB,GAAckmB,EAAe,GAAKA,EAAe,EAEtE,OACE,yBAAKjhC,UAAU,WACb,uBAAGA,UAAU,QAAQ0C,IAAI,QAAQ6H,YAAW/G,GAAS21B,IACpD+M,GAAgBlF,EAAeC,EAAcrZ,EAAkBqb,IAC9DiD,GACA,yBAAKlmC,UAAU,OAAO0C,IAAI,QACxB,0BAAM1C,UAAU,aAAauK,YAAWi8B,GAAa,YACpD9E,GACC,oCACG,IADH,IAGG,IACD,kBAAC4E,EAAA,EAAD,CAAMtmC,UAAU,OAAOY,QAASw5B,GAAkBsM,YAAoBpkC,EAAa,IAAPo/B,MAKpF,uBAAG1hC,UAAU,WAAW0C,IAAI,QACzBu+B,EAAe,EAAOJ,YAAoBhgB,EAAWogB,GAAjC,WAAsDr+B,EAC1Ei+B,YAAoBhgB,KA3CsB8lB,CAC3CrkC,EAAMu/B,EAAO9mB,EAAWkmB,EAAcrZ,EAAkBqb,GAAcvB,EACtE1I,EAAcoB,QAAkBx3B,GAEhB,iBAAjB6+B,GAAmCK,GA6C1C,SAAqBA,EAAiBsB,EAAuBrB,GAC3D,OACE,yBAAK/hC,UAAU,WACZojC,EACD,uBAAGpjC,UAAU,iBAAiB0C,IAAI,QAC/Bm+B,YAAoBiB,EAAMjhB,UAC1BkhB,GAAiB,qCAnDyB6E,CAAY9E,EAAOsB,GAAkBrB,Q,wFG3NzE/5B,kBA5DW,EACxBhI,YACAwD,QACAqjC,SACAC,aACAC,gBACAC,oBACApmC,UACAktB,eAGA,MAAMmZ,EAASnmC,YAA0B,MA+BzC,OA7BA6N,YAAgB,KACd,IAAKk4B,QAAgCjkC,IAAtBokC,EACb,OAGF,MAAME,EAAMD,EAAOzlC,QACb2lC,EAAYD,EAAItlC,cAAc,KAC9BwlC,EAAmBF,EAAI9I,cAAel+B,SAAS8mC,GAAmBplC,cAAc,KAEtFwlC,EAAiBz6B,UAAUG,OAAO,WAClCq6B,EAAUx6B,UAAUG,OAAO,WAG3B,MAAMu6B,EAAYD,EAAiBhJ,cAAekJ,WAAaH,EAAU/I,cAAekJ,WAClFC,EAAcH,EAAiBI,YAAcL,EAAUK,YAC7DL,EAAUlnC,MAAMwnC,UAAa,eAAcJ,sBAA8BE,WAGzEr3B,sBAAsB,KACpBA,sBAAsB,KACpBA,sBAAsB,KAEpBi3B,EAAUx6B,UAAUoC,IAAI,WACxBo4B,EAAUlnC,MAAMwnC,UAAY,cAIjC,CAACZ,EAAQG,IAGV,4BACEnlB,KAAK,SACL7hB,UAAWyC,YAAe,MAAOzC,EAAW6mC,GAAU,UACtDjmC,QAAS,IAAMA,EAAQktB,GACvBjuB,IAAKonC,GAEL,8BACGzjC,IACEsjC,GACD,0BAAM9mC,UAAWyC,YAAe,QAASskC,GAAiB,WAAYD,GAExE,gC,OCQO9+B,gBArDe,EAC5B0/B,OAAMC,YAAWC,MAAKC,kBAGtB,MAAMhnC,EAAeC,YAAuB,MACtCkmC,EAAoBx4B,YAAYm5B,GAEtCG,YAAoBjnC,EAAaW,SAGjCkD,YAAU,KACR,MAAMmK,EAAYhO,EAAaW,QAC/B,GAAIqN,EAAUwf,aAAexf,EAAUgB,YACrC,OAGF,MAAMk4B,EAAmBl5B,EAAUjN,cAAc,eACjD,GAAImmC,EAAkB,CACpB,MAAMC,EAAUD,EAAiBT,WAAcz4B,EAAUgB,YAAc,EAAMk4B,EAAiBl4B,YAAc,EAG5G,GAAI4G,KAAKqK,IAAIknB,EAAUn5B,EAAUuB,YAvBP,GAwBxB,OAGF8d,YAA2Brf,EAAWm5B,KAEvC,CAACL,IAEJ,MAAMrlC,EAAOC,cAEb,OACE,yBACEvC,UAAY,sCAAoC4nC,EAAM,MAAQ,IAC9D/nC,IAAKgB,EACL6B,IAAKJ,EAAKK,MAAQ,WAAQC,GAEzB8kC,EAAKrkC,IAAI,CAAC6jC,EAAKx3B,IACd,kBAAC,EAAD,CACEnM,IAAK2jC,EAAI1jC,MACTA,MAAOlB,EAAK4kC,EAAI1jC,OAChBqjC,OAAQn3B,IAAMi4B,EACdb,WAAYI,EAAIJ,WAChBC,cAAeG,EAAIH,cACnBC,kBAAmBA,EACnBpmC,QAASinC,EACT/Z,SAAUpe,S,6BCxEpB,wCAAMu4B,EAAkD,CACtDC,gBAAiB,4DACjBC,qBAAsB,+BACtBC,yBAA0B,sCAC1BC,6BAA8B,uCAC9BC,yBAA0B,mCAC1BC,0BAA2B,oCAC3BC,iBAAkB,8DAElBC,gBAAiB,kIACjBC,uBAAwB,gEACxBC,gBAAiB,gCACjBC,iBAAkB,wBAClBC,qBAAsB,iCACtBC,YAAa,uCACbC,cAAe,gBACfC,kBAAmB,wCACnBC,yBAA0B,mCAC1BC,wBAAyB,mCAEzBC,yBAA0B,yGAC1BC,oBAAqB,cACrBC,0BAA2B,uCAC3BC,oBAAqB,+CACrBC,wBAAyB,6CACzBC,wBAAyB,6CACzBC,gBAAiB,0BACjBC,uBAAwB,mCACxBC,6BAA8B,wCAC9BC,6BAA8B,wCAC9BC,qBAAsB,qCACtBC,wBAAyB,wCACzBC,yBAA0B,yCAC1BC,sBAAuB,sCACvBC,sBAAuB,qCACvBC,uBAAwB,sCACxBC,uBAAwB,sCAGxBC,kBAAmB,mDAGnBC,wBAAyB,kFAEzBC,0CAA2C,2FAE3CC,oCAAqC,4GAErCC,cAAe,+CACfC,mBAAoB,oCACpBC,eAAgB,gDAChBC,uBAAwB,gFACxBC,YAAa,oDACbC,wBAAyB,4CACzBC,wBAAyB,0DACzBC,kBAAmB,2BACnBC,oBAAqB,8BACrBC,oBAAqB,6BACrBC,kBAAmB,gDACnBC,yBAA0B,4BAGb,SAASC,EAAqBpV,GAC3C,MAAM,QAAErH,EAAF,WAAW0c,EAAX,WAAuBC,GAAetV,EAE5C,GAAIqV,EAAY,CACd,MAAME,EAAiB5c,EAAQpf,QAAQ,eACvC,OAAOg8B,EAAiB,EAAI5c,EAAQ7C,UAAU,EAAGyf,GAAkB5c,EAErE,IAAI6c,EAAevD,EAAwBtZ,GAM3C,OALI6c,GAAgBF,IAClBE,EAAep8B,OAAOD,KAAKm8B,GAAYG,OAAO,CAACC,EAAKlqC,IAC3CkqC,EAAInhB,QAAQ/oB,EAAS8pC,EAAW9pC,IACtCgqC,IAEEA,I,6BC7ET,iCAQe,MACb56B,OACA+6B,kBACAC,eACAC,WACAC,eAQA,MAAMxpC,EAAOC,eAEP,iBACJwpC,EADI,qBAEJC,EAFI,mBAGJC,EAHI,iBAIJC,GACEpd,cAEJ,OAAO3b,YAAQ,KACb,IAAKvC,EACH,OAGF,MAAMomB,EAAiB2U,GAAmBA,EAAgBljC,OAEpD0jC,EAAmBv7B,EAAKw7B,aAAex7B,EAAKy7B,cAC9C,CAAE7oC,MAAOlB,EAAK,cAAevC,KAAM,YAAa0D,QAAS,IAAMyoC,EAAiB,CAAEviC,GAAIiH,EAAKjH,MAC3F,CAAEnG,MAAOlB,EAAK,gBAAiBvC,KAAM,SAAU0D,QAAS,IAAMyoC,EAAiB,CAAEviC,GAAIiH,EAAKjH,MAExF2iC,EAAYR,EACd,CACAtoC,MAAOlB,EAAK,gBACZvC,KAAM,QACN0D,QAAS,IAAMsoC,EAAiB,CAAEpiC,GAAIiH,EAAKjH,GAAIkiC,cAE/C,CAAEroC,MAAOlB,EAAK,YAAavC,KAAM,MAAO0D,QAAS,IAAMsoC,EAAiB,CAAEpiC,GAAIiH,EAAKjH,GAAIkiC,cAErFU,EAAa37B,EAAK47B,QACpB,CACAhpC,MAAOlB,EAAK,mBACZvC,KAAM,SACN0D,QAAS,IAAMuoC,EAAqB,CAAE3tB,OAAQzN,EAAKjH,GAAI6iC,SAAS,KAEhE,CACAhpC,MAAOlB,EAAK,iBACZvC,KAAM,OACN0D,QAAS,IAAMuoC,EAAqB,CAAE3tB,OAAQzN,EAAKjH,GAAI6iC,SAAS,KAG9DC,EAAgBC,aAAe97B,GACjC,CAAEpN,MAAOlB,EAAK,aAAcvC,KAAM,YAAa0D,QAAS,IAAMwoC,EAAmB,CAAEtiC,GAAIiH,EAAKjH,MAC5F,CAAEnG,MAAOlB,EAAK,WAAYvC,KAAM,UAAW0D,QAAS,IAAMwoC,EAAmB,CAAEtiC,GAAIiH,EAAKjH,MAa5F,MAAO,CACLwiC,EACAG,KACKtV,EAGD,GAHkB,CACpBuV,EACAE,GAhBiB,CACnBjpC,MAAOuO,aAAcnB,EAAKjH,IACtBrH,EAAK,UACLA,EAAKqqC,YAAiB/7B,GACpB,aACC0mB,aAAc1mB,GAAQ,eAAiB,oBAC9C7Q,KAAM,SACNS,aAAa,EACbiD,QAASmoC,KAYV,CACDh7B,EAAM+6B,EAAiBrpC,EAAMwpC,EAAUF,EAAcM,EAAkBH,EAAkBF,EACzFG,EAAsBC,M,6BCvF1B,2CA4BejkC,gBAZuB,EAAG2mB,UAASie,qBAChD,MAAMtqC,EAAOC,cACb,OACE,yBAAKvC,UAAU,mBACZ4sC,GACC,kBAAC,IAAD,CAAuB1jC,OAAQ0jC,IAEjC,0BAAM5sC,UAAU,QAAQumC,YAAoBjkC,EAAqB,IAAfqsB,EAAQ+S,W,6BCvBhE,IAYKmL,EAZL,wB,SAYKA,O,mBAAAA,I,qBAAAA,I,yBAAAA,I,gBAAAA,M,KAgBU7kC,gBAZ6B,EAAGkB,YAE3C,yBAAKlJ,UAAU,yBACb,kBAAC,IAAD,CAAY+N,KAAK,SAASD,UAAW++B,EAAK3jC,IACvC,IACC,uBAAGlJ,UAAY,gBAAekJ,Q,6BCrBxC,WAGe,KACbgiB,EACA5pB,EACAG,EACAE,EACAmrC,EAAgB,EAChBC,EAAkB,KAElB,MAAOlrC,EAAWmrC,GAAgBlmC,YAA2B,UACtDhF,EAAWmrC,GAAgBnmC,YAA2B,WACtD7G,EAAOitC,GAAYpmC,YAAS,IA+CnC,OA7CApC,YAAU,KACR,MAAMyoC,EAAY7rC,IAClB,IAAK4pB,IAAWiiB,EACd,OAGF,IAAI,EAAE7d,EAAF,EAAKE,GAAMtE,EACf,MAAMkiB,EAAY,CAChBx9B,MAAO,EAAGG,KAAM,EAAGM,OAAQ,EAAG2D,IAAK,GAG/Bq5B,EAAS1rC,IACT2rC,EAAS7rC,IAET8rC,EAAcJ,EAAUp5B,wBACxBy5B,EAAWH,EAAS,CAAEz9B,MAAOy9B,EAAOx9B,YAAaQ,OAAQg9B,EAAO94B,cAAiB64B,EACjFK,EAAWH,EAASA,EAAOv5B,wBAA0Bq5B,EAEvD9d,EAAIke,EAAS59B,MAAQk9B,EAAgBW,EAAS79B,MAAQ69B,EAAS19B,MACjEi9B,EAAa,QACb1d,GAAK,GACIA,EAAIke,EAAS59B,MAAQ,GAC9Bo9B,EAAa,SACb1d,GAAK,IAEL0d,EAAa,QACb1d,EAAI,IAGFE,EAAIge,EAASn9B,OAASo9B,EAASp9B,OAASo9B,EAASz5B,IACnDi5B,EAAa,QAEbA,EAAa,UAETzd,EAAIge,EAASn9B,OAASo9B,EAASz5B,IAAM+4B,IACvCvd,EAAIie,EAASz5B,IAAM+4B,EAAkBS,EAASn9B,SAIlD68B,EAAU,SAAQ5d,EAAIie,EAAYx9B,gBAAgByf,EAAI+d,EAAYv5B,WACjE,CACDkX,EAAQ4hB,EAAeC,EACvBprC,EAAgBF,EAAgBH,IAG3B,CACLO,YACAC,YACA7B,W,6BC/DJ,kCAwCeytC,IAvBsB,EACnCzqC,SAAQ0qC,WAAUhkC,KAAI3J,YAAWY,UAASV,eAE1C,MAAM,aAAE+K,EAAF,qBAAgBC,GAAyBC,YAC7ClI,OAAQL,OAAWA,GAAW+qC,QAAmB/qC,GAE7C6J,EAAa+B,YAAYvL,GACzB2qC,EAAep/B,YAAYtO,GAC3B2tC,EAAkB/sC,cAMxB,OAJI2L,IAAexJ,IACjB4qC,EAAgBrsC,QAAUosC,GAI1B3iC,GACE,yBAAKtB,GAAIA,EAAI3J,UAAWyC,YAAezC,EAAWkL,GAAuBtK,QAASA,GAC/EqC,EAAS/C,IAAa2tC,EAAgBrsC,a,6BClC/C,qEAMe,SAASssC,EAAuBtsC,EAAcqf,GAC3D,MAAMqG,EAAO1Y,YAAYhN,GAAS,GAC5Bua,EAAajb,cACb0G,EAAcC,cAEdsmC,EAAmBvsC,QAEnBwsC,EAAgB9mB,QAiBtB,OAfI6mB,GAAoBhyB,EAAWva,UACjCyN,aAAa8M,EAAWva,SACxBua,EAAWva,aAAUoB,GAGvBoZ,YAAY,KAEN6E,IAAaktB,GAAoBC,IAAkBjyB,EAAWva,UAChEua,EAAWva,QAAU2O,OAAOpI,WAAW,KACrCgU,EAAWva,aAAUoB,EACrB4E,KACCqZ,KAEJ,CAACrf,IAEIua,EAAWva,SAAYqf,IAAYktB,EAA6B7mB,EAAV1lB,I,6BC9BhE,6CAWe,KACbysC,EACAC,EACAz8B,EACA08B,EACAC,EACAC,GAAa,EACbC,EACAC,GAAa,KAGb,MAAMpqC,EAAgBrD,YAAoC,OAEnDia,EAAWyzB,GAAgB1nC,aAAS,GAC3C,IAAI2nC,EAAgB1zB,EAEpB,MAAOkmB,EAAcyN,GAAmB5nC,YAAiB,GAEzDkV,YAAY,KACV7X,EAAc3C,QAAUmtC,YAASV,EAAS,CAACW,EAAW1sC,KACpD,OAAQ0sC,GACN,IAAK,SACHJ,GAAa,GACb,MACF,IAAK,UACHA,GAAa,GACb,MACF,IAAK,eAAgB,CACnB,MAAM,MAAEK,GAAU1qC,EAAc3C,QAC1Bqf,EAAWguB,EAAMhuB,UAAYxR,OAAOy/B,SAASD,EAAMhuB,UAAYguB,EAAMhuB,SAAWqtB,EACtFQ,EAAgBG,EAAMxmB,YAAcxH,GACpC,OAIAstB,GAAYA,EAASS,IACvBT,EAASS,GAAW1sC,IAErBosC,GAEH,MAAM,MAAEO,GAAU1qC,EAAc3C,QAE3BuZ,GAAc8zB,EAAMxW,SACvBmW,GAAa,GACbC,GAAgB,GAGdL,GACFA,EAAOS,IAER,CAACZ,IAEJ,MAAM,KACJz0B,EADI,MACEqB,EADF,eACS2nB,EADT,MACyBqM,EADzB,QACgCr0B,GAClCrW,EAAc3C,QACZqf,EAAWguB,EAAMhuB,UAAYxR,OAAOy/B,SAASD,EAAMhuB,UAAYguB,EAAMhuB,SAAWqtB,EAGtFxpC,YAAU,KACJmc,IAAaoH,YAAwB4mB,IACvCH,EAAgBG,EAAMxmB,YAAcxH,IAErC,CAACA,EAAUogB,EAAc4N,IAG5BnqC,YAAU,IAAM,KACd8V,EAAQ+zB,IACP,CAAC/zB,EAAS+zB,IAGb/hC,YAAsB,EAAEuiC,EAAgBC,MAClCD,IAAmBV,GAAc58B,IAAQu9B,GAKzCH,EAAMp9B,KAAOo9B,EAAMxW,QAInBgW,GAAc58B,IAAQsJ,GACxBvB,EAAK/H,IAEN,CAAC48B,EAAY58B,EAAKsJ,EAAWvB,EAAMq1B,EAAMp9B,IAAKo9B,EAAMxW,SAEvD,MAAMkK,EAAYhhC,YAAY,KACxBwZ,EACFF,IACSpJ,GACT+H,EAAK/H,IAEN,CAACA,EAAKoJ,EAAOrB,EAAMuB,IAEtB,MAAO,CACLA,UAAW0zB,EACXxN,eACAsB,YACAC,iBACAyM,WAAYJ,EACZhuB,c,6BC9GJ,+GAeA,MAAMquB,EAAS,IAAIhqC,IACnB,IAEIiqC,EAFAC,EAAkB,GAqEf,SAASC,IACd,MAAMC,EAAeH,GAAkBD,EAAOtpC,IAAIupC,GAC9CG,GACFA,EAAazN,MAAMhnB,QAIhB,SAAS8zB,EAASV,EAAiBxqC,EAAkB6qC,GACrDY,EAAOte,IAAIqd,KACdiB,EAAOhpC,IAAI+nC,EA1Ef,SAAqBA,EAAiBK,GACpC,MAAMzM,EAAQ,IAAI0N,MAElB,SAASC,EAAYZ,GACnB,OAAQ1sC,IACDgtC,EAAOte,IAAIqd,KAIZhmB,YAAwB4Z,IAI5BqN,EAAOtpC,IAAIqoC,GAAUE,SAAS1oC,QAAShC,IACrCA,EAAQmrC,EAAW1sC,OAyCzB,OApCA2/B,EAAMx1B,iBAAiB,aAAcmjC,EAAY,iBACjD3N,EAAMx1B,iBAAiB,OAAQmjC,EAAY,WAC3C3N,EAAMx1B,iBAAiB,QAASmjC,EAAY,YAC5C3N,EAAMx1B,iBAAiB,YAAamjC,EAAY,gBAChD3N,EAAMx1B,iBAAiB,aAAcmjC,EAAY,iBACjD3N,EAAMx1B,iBAAiB,UAAWmjC,EAAY,cAC9C3N,EAAMx1B,iBAAiB,QAAS,KAC9B,GAAI4b,YAAwB4Z,GAC1B,OAGF,MAAM4N,EAAcL,EAAMA,EAAM7/B,QAAQ0+B,GAAW,GACnD,IAAKwB,EACH,OAGF,IAAKP,EAAOte,IAAI6e,GAId,YAFA3gB,cAAc4gB,gBAAgBC,aAAgBF,IAKhD,MAAMG,EAAYV,EAAOtpC,IAAI6pC,GAEzBG,EAAUtB,aACZsB,EAAUtB,cAGZa,EAAiBM,EAEbG,EAAU/N,MAAMpwB,KAClBo+B,YAASD,EAAU/N,SAIhB,CACLA,QACAgN,MAAO,IAAIiB,MAAMjO,EAAO,CACtBj8B,IAAK,CAACsE,EAAQ3G,IAAgC2G,EAAO3G,KAEvD4qC,SAAU,GACVG,eAaoByB,CAAY9B,EAASK,IAEpCc,EAAMv7B,SAASo6B,IAClBmB,EAAMnjB,KAAKgiB,IAIf,MAAM,MAAEpM,EAAF,MAASgN,EAAT,SAAgBV,GAAae,EAAOtpC,IAAIqoC,GAI9C,OAFAE,EAASliB,KAAKxoB,GAEP,CACL+V,KAAK/H,GACC09B,GAAkBA,IAAmBlB,GACvCiB,EAAOtpC,IAAIupC,GAAiBtN,MAAMhnB,QAGpCs0B,EAAiBlB,EAEZpM,EAAMpwB,MACTowB,EAAMpwB,IAAMA,EACZowB,EAAMmO,QAAU,OAEZv+B,EAAIoC,SAAS,kBAAoBo8B,KACnChY,YAA4B4J,IAIhCgO,YAAShO,IAGXhnB,QACMs0B,IAAmBlB,GACrBpM,EAAMhnB,SAIV2nB,eAAe0N,GACTf,IAAmBlB,IACrBpM,EAAMxZ,YAAc6nB,IAIxBrB,QAEAr0B,QAAQ21B,GAAwB,GAC9B,MAAMC,EAAQlB,EAAOtpC,IAAIqoC,GACpBmC,IAILA,EAAMjC,SAAWiC,EAAMjC,SAASld,OAAQof,GAAMA,IAAM5sC,GAE/C2sC,EAAMjC,SAASviC,SAClBwkC,EAAMvO,MAAMhnB,QACZq0B,EAAO3oC,OAAO0nC,GAEVkC,IACFf,EAAQA,EAAMne,OAAQtnB,GAAOA,IAAOskC,IAGlCA,IAAYkB,IACdA,OAAiBvsC,S,6BC5JZ,SAASy3B,EAAStO,EAAaukB,GAC5C,MAAMC,EAAOtkC,SAASgS,cAAc,KACpCsyB,EAAKllB,KAAOU,EACZwkB,EAAKlW,SAAWiW,EAChBC,EAAKC,QAJP,mC,6BCCA,oGAuJexoC,gBAnHY,EACzBnI,MACAkO,OACAzD,OACA2uB,YAAY,GACZG,YACAR,SACA0B,mBACAJ,cACAl6B,YACAqY,UACAqhB,iBACAD,cACAX,eACAD,aACAc,mBACA/4B,UACAo4B,kBAEA,MAAM12B,EAAOC,cAEb,IAAIyb,EAAald,YAAuB,MACpCjB,IACFme,EAAane,GAGf,MACEoL,aAAcwlC,EACdvlC,qBAAsB43B,GACpB33B,YAAkBuuB,OAAgB92B,GAAW,GAC3CsK,EAAQwjC,YAAsBzX,GAC9B0X,EAAaC,YAAkBtmC,IAE/B,kBACJiL,EADI,sBACejE,EADf,qBACsCpG,GACxCqG,YAAsB2oB,EAAa,SACjC,MAAEtqB,EAAF,OAASS,GAAW+H,YAA+BC,GAEnD7V,EAAgBC,YACpB,OACAzC,EACAqY,GAAW,UACXzX,IAAY64B,GAAe,cAC3BZ,GAAc,oBAGhB,OACE,yBAAKh5B,IAAKme,EAAYhe,UAAWwC,EAAeE,IAAKJ,EAAKK,MAAQ,WAAQC,GACvEk2B,GACC,yBAAK94B,UAAU,0BACZ64B,GAAc,uBAAG74B,UAAU,iBAGhC,yBAAKA,UAAU,sBAAsBY,QAAS64B,OAAc72B,EAAYhC,GACrE05B,GAAoBJ,EACnB,yBAAKl6B,UAAU,4BACZuV,GACC,yBACE9D,IAAK6oB,EACL1qB,MAAOA,EACPS,OAAQA,EACRrQ,UAAU,YACV0R,IAAI,KAGPJ,GACC,yBACEG,IAAKyoB,EACLl6B,UAAY,cAAakL,EACzB0E,MAAOA,EACPS,OAAQA,EACRqB,IAAI,MAKV,yBAAK1R,UAAY,aAAYkN,GAC1B+rB,EAAUrtB,QAAU,GACnB,0BAAM5L,UAAU,WAAW0C,IAAI,QAAQu2B,IAI5CwX,GACC,yBAAKzwC,UAAWyC,YAAe,gBAAiByK,EAAO41B,IACrD,kBAAC,IAAD,CACErmB,SAAUkd,EACVrvB,KAAM+N,EAAU,IAAM,IACtBzX,QAAS64B,EAAc74B,OAAUgC,KAItChC,GAAW,uBAAGZ,UAAWyC,YAAe,gBAAiBguC,GAAuB,aAEnF,yBAAKzwC,UAAU,aACb,yBAAKA,UAAU,aAAa0C,IAAI,QAAQ6H,YAAWwD,IACnD,yBAAK/N,UAAU,gBAAgB0C,IAAI,QACjC,8BACGg3B,GAAkBC,EAAsBljB,KAAKxJ,MAAyB,IAAnB0sB,GAAb,IAA0CgX,GAElF/X,GAAU,0BAAM54B,UAAU,eAAeuK,YAAWquB,KACnDA,GAAUQ,GACV,oCACG,IACD,kBAAC,IAAD,CAAMx4B,QAASo4B,GAAc0N,YAAoBpkC,EAAkB,IAAZ82B,OAK9DR,GAAUQ,GACT,kBAAC,IAAD,CAAMx4B,QAASo4B,GAAcuN,YAAoBjkC,EAAkB,IAAZ82B,Q,6BClJ/D,yDAmFepxB,gBAtDoB,EACjC2mB,UAAS9N,WAJc,IAIe9C,cAAa8yB,gBAEnD,MAAO5tC,EAAQ6tC,GAAahqC,aAAS,GAE/BiqC,EAAWjwC,YAA2B,OAEtC,qBAAEoK,GAAyBC,YAAkBlI,GAE7C+tC,EAAkBzvC,YAAY,KAClCuvC,GAAU,GACV/oC,WAAW8oC,EAbY,IAaoB5gC,MAC1C,CAAC4gC,IAEJnsC,YAAU,IAAOzB,EAASiqB,YAAsB8jB,QAAmBpuC,EAAY,CAACK,EAAQ+tC,IAExFtsC,YAAU,KACRqsC,EAASvvC,QAAU2O,OAAOpI,WAAWipC,EAAiBnwB,GAE/C,KACDkwB,EAASvvC,UACXyN,aAAa8hC,EAASvvC,SACtBuvC,EAASvvC,aAAUoB,KAGtB,CAACie,EAAUmwB,IAEd,MAAMC,EAAmB1vC,YAAY,KAC/BwvC,EAASvvC,UACXyN,aAAa8hC,EAASvvC,SACtBuvC,EAASvvC,aAAUoB,IAEpB,IAEGsuC,EAAmB3vC,YAAY,KACnCwvC,EAASvvC,QAAU2O,OAAOpI,WAAWipC,EAAiBnwB,IACrD,CAACA,EAAUmwB,IAEd,OACE,kBAAC,IAAD,CAAQhxC,UAAU,yBAAyB+d,YAAaA,GACtD,yBACE/d,UAAWyC,YAAe,eAAgByI,GAC1CtK,QAASowC,EACTG,aAAcF,EACdG,aAAcF,GAEd,yBAAKlxC,UAAU,WACZ2uB,Q,6BC5EX,6CAIO,SAAS0iB,EAAuBC,GACrC,MAAM,wBAAEjT,GAA4BiT,EACpC,IAAIC,EAAiClT,EACjC5C,EAAa,EACjB,KAAO8V,GAAcA,EAAW5nC,KAAO20B,KAAqB7C,EANlC,GAOxB8V,EAAaA,EAAWnT,cACxB3C,IAGF,OAAO9yB,QAAQ4oC,GAAcA,EAAW5nC,KAAO20B,O,6BCbjD,2FAeA,IAAIkT,EACAC,EACAC,EAEJ,MAAMC,EAAsB,sBAGb,SAASC,EACtBzX,EACAhQ,EACA0nB,EACA3b,EAAUoI,IACVwT,EACAC,GAEA,MAAO9uC,EAAQ+uC,EAAYC,GAAgBluB,eAEpCmuB,EAAMC,GAAWrrC,eACjBsrC,EAAWC,GAAgBvrC,YAAkC,KAC7DwrC,EAAQC,GAAazrC,YAAkC,KAEvD0rC,EAAgBC,GAAqB3rC,YAAkB,IAExD4rC,EAAev/B,YACnB,IACO++B,GAASL,EAAejmC,OAItBwD,OAAO5J,OAAOmtC,YAAWT,EAAML,IAH7B,GAKX,CAACK,EAAML,IAITntC,YAAU,KACR,MAAM0V,EAAO,KACX+3B,EAAQT,EAAUkB,SAGhBlB,EACFt3B,IAgHNhB,iBACOo4B,IACHA,EAAmB,kCACnBC,SAAsBD,GAAkBl4B,QAExCo4B,EAAYmB,YAAgBpB,IAG9B,OAAOD,EAtHHsB,GACGjrC,KAAKuS,IAET,IAEH1V,YAAU,KACR,IAAKwtC,EACH,OAGF,MAAMU,EAASxjC,OAAO5J,OAAO0sC,GAE7B,GAAIH,EAAe,CACjB,MAAMgB,EAAWC,YAAqBJ,EAAQ,UAC9CP,EAAaY,YAAUlB,EAAgBmB,GAC9B9jC,OAAO5J,OAAOmtC,YAAWI,EAAUG,MAI9CX,EAAUK,EAAOnH,OAAO,CAACpa,EAAQ8hB,KAC/BA,EAAMC,MAAM3tC,QAASsI,IACdsjB,EAAOtjB,KACVsjB,EAAOtjB,GAAQ,IAGjBsjB,EAAOtjB,GAAMke,KAAKknB,KAGb9hB,GACN,MACF,CAAC6gB,EAAMH,IAEVrtC,YAAU,KACR,IAAKy1B,IAAchQ,IAAS+nB,EAE1B,YADAD,IAIF,MAAM7R,EAsDV,SAAsBjW,GACpB,MAAMkpB,EAASpnC,SAASgS,cAAc,OACtCo1B,EAAOv1B,UAAYqM,EAAKI,QAAQ,OAAQ,MACxC,MAAM1Z,EAAOwiC,EAAO5oB,UAEd6oB,EAAaziC,EAAKA,EAAKjF,OAAS,GAChC2nC,EAAW1iC,EAAK2K,MAAMm2B,GAAqB6B,MAEjD,IACG3iC,EAAKjF,QAAU+lC,EAAoB8B,KAAKH,KACrCC,IAAaA,EAASjoB,WAAW,KAErC,OAGF,OAAOioB,EAASG,cArEDC,CAAaxpB,GAC1B,IAAKiW,EAGH,OAFAqS,EAAkB,SAClBR,IAIF,MAAMhhB,EAASmP,EAAKrO,OAAO,GAC3B,IAAI6hB,EAAmB,GAEvB,GAAK3iB,EAEE,CACL,MAAM4iB,EAAkBzkC,OAAOD,KAAKijC,GAAWnhB,OAAQ6iB,GAAYA,EAAQxoB,WAAW2F,IACtF2iB,EAAUA,EAAQG,OAAOC,YAAQ5kC,OAAO5J,OAAOmtC,YAAWP,EAAWyB,MAGrE,MAAMI,EAAe7kC,OAAOD,KAAKmjC,GAAQrhB,OAAQljB,GAASA,EAAKud,WAAW2F,IAC1E2iB,EAAUA,EAAQG,OAAOC,YAAQ5kC,OAAO5J,OAAOmtC,YAAWL,EAAQ2B,MAElEL,EAAUM,YAAON,QATjBA,EAAUlB,EAYRkB,EAAQhoC,QACVomC,IACAS,EAAkBmB,EAAQ9wB,MAAM,EArGjB,MAuGfmvB,KAED,CAACC,EAAME,EAAWE,EAAQnoB,EAAMgQ,EAAW6X,EAAYU,EAAcT,IAExE,MAAMkC,EAAc5yC,YAAa6yC,IAC/B,MAAMC,EAAUlqB,EAAKmqB,YAAY,KACjC,IAAiB,IAAbD,EAAgB,CAClBvC,EAAc,GAAE3nB,EAAK4H,OAAO,EAAGsiB,KAAWD,KAC1C,MAAMG,EAAetoC,SAASuoC,eAAete,GACxC3oB,KACH2C,sBAAsB,KACpBsU,YAAqB+vB,GAAc,KAKzCtC,KACC,CAAC9nB,EAAM+L,EAAS4b,EAAcG,IAEjC,MAAO,CACLwC,mBAAoBxxC,EACpByxC,kBAAmBzC,EACnBO,iBACA2B,iB,6BClJJ,2BAcensC,gBAR0BpI,IACvC,MAAM,OAAEqD,GAAWrD,EACb+0C,EAAena,YAAgBC,IAAQC,MAAO,gBAAiBz3B,GAGrE,OAAO0xC,EAAe,kBAACA,EAAiB/0C,QAAYgD,K,6BCVtD,gIA0BA,MA2BMgyC,EAAmBrnC,IAAmB,IAAM,IAkVnCvF,gBAAKC,YACjBC,IACC,MAAQmW,OAAQw2B,EAAV,SAAyBC,GAAaC,YAAyB7sC,IAAW,IAC1E,oBAAE8sC,GAAwB9sC,EAAO0F,SAASC,MAEhD,MAAO,CACLgnC,gBACAG,sBACAC,aAAcJ,GAAiBC,EAAWI,aAAmBhtC,EAAQ2sC,EAAeC,QAAYlyC,EAChGuyC,aAAcjtC,EAAOktC,iBAAmBltC,EAAOmtC,QAAQC,qBAG3D,CAACzsC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kBAAmB,uBAZvDb,CA/T4C,EAC9D0B,KACA4rC,kBACAprB,OACAiM,cACAof,iBACAC,qBACAC,6BACAC,WACAC,mBACAC,SACAhB,gBACAI,eACAE,eACAH,sBACAc,kBACAC,yBAGA,MAAMxf,EAAWz1B,YAAuB,MAElCk1C,EAAWl1C,YAAuB,MAElCwB,EAAOC,cACP0zC,EAAuBn1C,aAAO,IAC7Bo1C,EAAqBC,EAAmBC,GAAsBryB,eAC9DsyB,EAA6BC,GAAkCxvC,eAC/Du2B,EAAekZ,GAAoBzvC,cAE1CpC,YAAU,KACR8xC,GAAkB,IACjB,IAEHC,YAA4B,EAAEC,MACxBvsB,IAASoM,EAAS/0B,QAASsc,YAC7ByY,EAAS/0B,QAASsc,UAAYqM,GAG5BA,IAAS6rB,EAASx0C,QAASsc,YAC7Bk4B,EAASx0C,QAASsc,UAAYqM,QAGfvnB,IAAb8zC,GAA0BA,IAAavsB,GACzCqsB,GAAmBrsB,EAAKve,SAEzB,CAACue,IAEJ,MAAMwsB,EAAap1C,YAAY,KAEzBg1B,EAAS/0B,QAASE,QAAQ,cAC5BqG,WAAW4uC,EA9FM,KAkGnBnyB,YAAqB+R,EAAS/0B,UAC7B,IAEGo1C,EAA2Br1C,YAAY,KAC3C60C,IAvEJ,WACE,MAAM1xB,EAAYvU,OAAOwU,eACpBD,IAIDA,EAAUO,gBACZP,EAAUO,kBACDP,EAAUmyB,OACnBnyB,EAAUmyB,SA+DVC,IACC,CAACV,IAEJ,SAASW,IAEP,GAAI5oB,IACF,OAGF,MAAMzJ,EAAYvU,OAAOwU,eACzB,IAAKD,IAAcA,EAAUoQ,YAAcmhB,EAAqBz0C,QAE9D,YADA40C,IAIF,MAAM9E,EAAiB5sB,EAAUqQ,WAAW,GACtCiiB,EAAe1F,EAAezzB,WAAW6M,OAC/C,GACEgrB,IACIrE,YAAuBC,KACvB0F,GACDC,YAAqBD,KACpB1F,EAAe4F,aAGnB,YADAd,IAIF,MAAMe,EAAgB7F,EAAev9B,wBAC/BqjC,EAAY7gB,EAAS/0B,QAASuS,wBAEpC,IAAIub,EAAK6nB,EAAcpnC,KAAOonC,EAAcvnC,MAAQ,EAAKwnC,EAAUrnC,KAE/Duf,EA7G4B,GA8G9BA,EA9G8B,GA+GrBA,EAAI8nB,EAAUxnC,MA/GO,KAgH9B0f,EAAI8nB,EAAUxnC,MAhHgB,IAmHhC0mC,EAA+B,CAC7BhnB,IACAE,EAAG2nB,EAAcnjC,IAAMojC,EAAUpjC,MAGnCuiC,EAAiBjF,GACjB6E,IAoHF,SAASK,EAAkBa,GAAW,GACpC,MAAMzY,EAAQrI,EAAS/0B,QACjB81C,EAAQtB,EAASx0C,QACjB+1C,EAAgBloC,OAAOuvB,EAAM3+B,MAAMoQ,OAAOka,QAAQ,KAAM,KACxDitB,EAAY/gC,KAAKC,IAAI4gC,EAAM9jC,aAAcohC,GAC/C,GAAI4C,IAAcD,EAChB,OAGF,MAAME,EAAqBhhC,KAAKxJ,MAhRD,GAiRAwJ,KAAKihC,IAAIjhC,KAAKqK,IAAI02B,EAAYD,KAGvDn9B,EAAO,KACXwkB,EAAM3+B,MAAMoQ,OAAYmnC,EAAF,KACtB5Y,EAAM3+B,MAAMw3C,mBAAwBA,EAAF,KAClC7Y,EAAMjyB,UAAUC,OAAO,YAAa0qC,EAAM9jC,aAAeohC,IAGvDyC,EAEFnnC,sBAAsBkK,GAEtBA,IAIJ1V,YAAU,KACJtC,KAIJu0C,KACC,CAAC9B,EAAe8B,EAAY1B,EAAcO,IAE7C9wC,YAAU,KACR,GAAIywC,EACF,OAGF,MAAMwC,EAAkB5xC,YAAU7D,IAClB,QAAVA,EAAEqB,MACJrB,EAAEuJ,iBACFyE,sBAAsBymC,KAzRK,KA2RA,GAAM,GAErC,OAAOtrC,YAAyB,CAAEusC,MAAOD,KACxC,CAAChB,EAAYxB,IAEhBzwC,YAAU,KACR,MAAMk6B,EAAQrI,EAAS/0B,QAEvB,SAASq2C,IACPjZ,EAAMjI,OAOR,OAJI8e,GACF7W,EAAMvyB,iBAAiB,QAASwrC,GAG3B,KACLjZ,EAAMtyB,oBAAoB,QAASurC,KAEpC,CAACpC,IAEJ,MAAMz1C,EAAYyC,YAChB,6BACA0nB,EAAKve,OAAS,GAAK,UACnB6pC,GAAsB,kBAGxB,OACE,yBAAK9rC,GAAIA,EAAI/I,QAAS60C,EAAqBG,OAAmBhzC,EAAWF,IAAKJ,EAAKK,MAAQ,WAAQC,GACjG,yBACE/C,IAAK02B,EACL5sB,GAAI4rC,GAAmBjX,IACvBt+B,UAAWA,EACX83C,iBAAe,EACfp1C,IAAI,OACJ9B,QAAS+1C,EACT/0B,SA1GN,SAAsB1f,GACpB,MAAM,UAAE4b,EAAF,YAAa2N,GAAgBvpB,EAAEkgB,cAKrC,GAHAuzB,EArNc,SAqNL73B,EAA0B,GAAKA,KAGnC1b,KAAkBqpB,GAAgBA,EAAY7f,QAAS,CAC1D,MAAM8Y,EAAYvU,OAAOwU,eACrBD,IACF6R,EAAS/0B,QAASm1B,OAClBjS,EAAUO,kBACVT,YAAqB+R,EAAS/0B,SAAU,MAgGxCgR,UAzJN,SAAuBtQ,GAOrB,GAAIA,EAAEq+B,QAAS,CACb,MAAMwX,EAA6B,cAAV71C,EAAEqB,IAAsB,EAAc,YAAVrB,EAAEqB,KAAqB,OAAIX,EAChF,GAAIm1C,EAIF,OAHA71C,EAAEuJ,sBAEFsqC,EAAmB,CAAEgC,qBAKX,UAAV71C,EAAEqB,KAAoBrB,EAAEkK,SAaP,YAAVlK,EAAEqB,KAAsB4mB,EAAKve,QAAW1J,EAAEq+B,QAInDr+B,EAAE8C,OAAOqH,iBAAiB,SAjC5B,SAAS2rC,IACPjB,IAEA70C,EAAE8C,OAAOsH,oBAAoB,QAAS0rC,OA2BtC91C,EAAEuJ,iBACFqqC,KAbI3nB,KAAU8pB,OAEe,UAAxBjD,IAAoC9yC,EAAEkK,UACX,eAAxB4oC,IAAyC9yC,EAAEo+B,SAAWp+B,EAAEq+B,YAG9Dr+B,EAAEuJ,iBAEF2qC,IACAP,MA8HA9yC,YApMN,SAAyBof,GAOF,IAAjBA,EAAM9f,QAK2B,IAAjC4zC,EAAqBz0C,UAIzBy0C,EAAqBz0C,SAAU,EAsB/ByK,SAASI,iBAAiB,aApB1B,SAAS6rC,IACPnwC,WAAW,KACTkuC,EAAqBz0C,SAAU,GA7KH,KAgL9B2O,OAAO7D,oBAAoB,UAAW4rC,MAgBxCjsC,SAASI,iBAAiB,WAb1B,SAAS8rC,EAA4Bj2C,GACrB,QAAVA,EAAEqB,KAA2B,WAAVrB,EAAEqB,MAIzBwE,WAAW,KACTkuC,EAAqBz0C,SAAU,GAzLH,KA4L9B2O,OAAO7D,oBAAoB,UAAW6rC,QA3BtCh2B,EAAMnd,OAAOqH,iBAAiB,WAPhC,SAAS+rC,IACPrB,IAEA50B,EAAMnd,OAAOsH,oBAAoB,UAAW8rC,OAiM1Cp1C,cA7FN,SAAmBd,GACZ+1C,MAIL/1C,EAAEuJ,iBACFvJ,EAAE8H,oBAwFEquC,cAtHN,WACOJ,KAILlB,OAmHE,yBAAKl3C,IAAKm2C,EAAUh2C,UAAWyC,YAAezC,EAAW,SAAU0C,IAAI,SACvE,0BAAM1C,UAAU,mBAAmB0C,IAAI,QAAQ0zB,GAC/C,kBAAC,IAAD,CACEnzB,OAAQizC,EACR9Y,eAAgBiZ,EAChBhZ,cAAeA,EACfl6B,QAASyzC,S,6BClYjB,yFA+Ge5uC,gBAtFe,EAAG2mB,UAAS6S,cAAa8W,qBACrD,MAAMh2C,EAAOC,cAEb,IAAIg2C,EAAmCC,YAAkB7pB,GAEzD,IAAK4pB,EAAU,CACb,MAAMhI,EAAOkI,YAAsB9pB,GACnC,GAAI4hB,EAAM,CACR,MAAM,IAAExkB,EAAF,OAAO2sB,GAAWnI,EAClBoI,EAAcC,YAAsBt2C,EAAMqsB,GAEhD4pB,EAAW,CACTM,SAAUH,EAAOnuB,QAAQ,QAAS,IAClCwB,IAAKA,EAAIlY,SAAS,OAASkY,EAAMA,EAAIlY,SAAS,KAAQ,UAASkY,EAAS,UAASA,EACjFpQ,YAAag9B,IAAgB5sB,EAAM4sB,OAAc/1C,IAKvD,MAAMk2C,EAAqBv3C,YAAY,KACrC+2C,EAAe3pB,EAAQhlB,GAAIglB,EAAQtQ,SAClC,CAACi6B,EAAgB3pB,EAAQhlB,GAAIglB,EAAQtQ,SAExC,IAAKk6B,EACH,OAGF,MAAM,SACJM,EADI,IAEJ9sB,EAFI,WAGJgtB,EAHI,MAIJv1C,EAJI,YAKJmY,EALI,MAMJ7D,GACEygC,EAEES,GAAwBxX,GAAeyX,YAASt9B,EA5ChC,KA8ChB3b,EAAYyC,YAChB,uBACCqV,GAAS,iBAGZ,OACE,yBACE9X,UAAWA,EACXk5C,gBAAeL,GAAYE,GAAY,GACvCr2C,IAAKJ,EAAKK,MAAQ,WAAQC,GAEzBkV,GACC,kBAAC,IAAD,CAAO6W,QAASA,IAElB,yBAAK3uB,UAAU,WACb,kBAAC,IAAD,CAAM2C,MAAOL,EAAKK,MAAO3C,UAAU,aAAaY,QAASk4C,GACtDvuC,YAAW/G,GAASq1C,GAAYE,IAElCC,GACC,kBAAC,IAAD,CAAMr2C,MAAOL,EAAKK,MAAO3C,UAAU,mBAAmBY,QAASk4C,GAC5DvuC,YAAWyuC,IAGhB,kBAAC,IAAD,CACEjtB,IAAKA,EACL/rB,UAAU,YACV6Q,KAAK,GACLlO,MAAOL,EAAKK,OAEXopB,EAAIxB,QAAQ,UAAW,KAAOwuB,GAEhCvX,GAAe,yBAAKxhC,UAAU,eAAeuK,YAAWi3B,KAE1DA,GACC,yBAAKxhC,UAAU,gBACb,kBAAC,IAAD,CACEA,UAAU,OACVY,QAASk4C,EACTn2C,MAAOL,EAAKK,OAEX4jC,YAAoBjkC,EAAqB,IAAfqsB,EAAQ+S,Y,6GCrGxC,IAAKyX,G,SAAAA,O,eAAAA,I,qBAAAA,I,gBAAAA,M,iLCkEGnxC,kBAnDa,EAAG4I,OAAMk7B,WAAUU,cAC7C,MAAM4M,EAAUzwC,QAAQiI,EAAKw7B,aAAex7B,EAAKy7B,eAAiBP,GAC5D9rC,EAAYyC,YAChB,QACA+pC,GAAW,QACXV,GAAY,SACZnjC,QAAQiI,EAAKw7B,aAAex7B,EAAKy7B,gBAAkB,UAGrD,SAASgN,IACP,OAAIzoC,EAAKw7B,YACHx7B,EAAK0oC,oBAEL,yBAAKt5C,UAAU,iBACb,yBAAKA,UAAU,iBACb,uBAAGA,UAAU,kBAEf,yBAAKA,UAAWA,GACbu5C,YAAqB3oC,EAAKw7B,eAOjC,yBAAKpsC,UAAWA,GACbu5C,YAAqB3oC,EAAKw7B,cAGtBx7B,EAAKy7B,cAEZ,yBAAKrsC,UAAWA,IAET8rC,EAEP,yBAAK9rC,UAAWA,GACd,uBAAGA,UAAU,2BAHZ,EAWT,OACE,kBAAC0tC,EAAA,EAAD,CAAgBC,UAAQ,EAAC3tC,UAAU,mBAAmBiD,OAAQm2C,GAC3DC,K,OC8OQrxC,IC7PVwxC,ED6PUxxC,cAAKC,YAClB,CAACC,GAAUmW,aACT,MAAMzN,EAAO0N,YAAWpW,EAAQmW,GAChC,IAAKzN,IAASA,EAAK6oC,YACjB,MAAO,GAGT,MAAM,SAAEvnC,EAAF,iBAAYwnC,EAAZ,WAA8BC,GAAe/oC,EAAK6oC,YAClDG,EAAoB1nC,EAAW3J,aAAWL,EAAQgK,QAAYtP,EAC9Di3C,EAAoBC,YAAiBlpC,EAAK6oC,aAC1CM,EAAsBF,GAAqBH,EAC7CM,YAAkB9xC,EAAQ0I,EAAKjH,GAAI+vC,QACnC92C,GACIq3C,aAAcC,EAAoBC,aAAcC,GAAuBP,GAAqB,GAC9FQ,EAAoBjjB,YAAqBxmB,IACvCiR,KAAMy4B,GAAoBvF,YAAyB7sC,IAAW,GAEtE,MAAO,CACL0I,OACA47B,QAAS+N,aAAkB3pC,EAAM4pC,aAAqBtyC,GAASuyC,aAAuBvyC,IACtF0xC,uBACID,GAAc,CAAEe,0BAA2BC,aAAqBzyC,EAAQ0I,EAAK6oC,iBAC7EY,GAAqB,CAAE1O,gBAAiBpjC,aAAWL,EAAQmyC,OAC3DH,GAAsB,CAAEU,iBAAkBryC,aAAWL,EAAQgyC,IACjEE,qBACAL,sBACAc,MAAOC,YAAY5yC,EAAQmW,EAAQ08B,kBACnCT,kBACA3sC,eAAgBzF,EAAO0F,SAASC,MAAMF,eACtCtF,aAAcH,EAAOG,eAGzB,CAACQ,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,WACA,qBAlCgBb,CAzNoC,EACtDhI,QACAoe,SACAwtB,WACAmP,YACAC,gBACApiB,aACAiT,WACAl7B,OACA47B,UACAb,kBACAiP,mBACAhB,oBACAc,4BACAX,sBACAK,qBACAS,QACAP,kBACA3sC,iBACAtF,eACA6yC,WACAC,uBAGA,MAAMt7C,EAAMiB,YAAuB,OAE5Bs6C,EAAmBC,EAAiBC,GAAoBv3B,eAEzD,YAAE01B,EAAF,aAAezwC,GAAiB4H,GAAQ,GACxC2qC,EAAW9B,GAAe+B,aAAgB/B,GAEhDgC,YAAiBp9B,EAAQk9B,EAAW9B,EAAaC,sBAAmB92C,EAAWm3C,GAE/E,MAAM2B,EAAiBjC,IAAgBkC,YAAkBlC,GACrDzf,YAA4Byf,QAC5B72C,EACE+9B,EAAevvB,YAASqoC,EAAcjgB,YAAoBigB,EAAa,cAAW72C,GAClFg5C,EAAejzC,QAAQ8wC,GAAeoC,YAAqBpC,IAGjE9qC,YAAgB,KACd,GAAuB,IAAnBhB,EACF,OAGF,MAAMpC,EAAU1L,EAAI2B,QAGpB,GAAIy5C,IAAkB9B,EAAmB2C,QACvCvwC,EAAQtL,MAAM87C,QAAU,IAExBxhC,YAAQ,KACNhP,EAAQoB,UAAUoC,IAAI,mBACtBxD,EAAQtL,MAAM87C,QAAU,UAErB,IAAId,IAAkB9B,EAAmB6C,KAQ9C,OAPAzwC,EAAQtL,MAAMwnC,UAAa,kBAA8B,KAAZuT,SAE7CzgC,YAAQ,KACNhP,EAAQoB,UAAUoC,IAAI,qBACtBxD,EAAQtL,MAAMwnC,UAAY,KAM9B1/B,WAAW,KACTwS,YAAQ,KACNhP,EAAQoB,UAAUG,OAAO,kBAAmB,qBAC5CvB,EAAQtL,MAAM87C,QAAU,GACxBxwC,EAAQtL,MAAMwnC,UAAY,MAxEP,IA0ECx3B,MACvB,CAACtC,EAAgBqtC,EAAWC,IAE/B,MAAMh5C,EAAcV,YAAY,KAC9B25C,EAAS,CAAEvxC,GAAI0U,IAEXwa,GAAkC,WAApByhB,GAChBa,KAED,CACDtiB,EACAyhB,EACAY,EACA78B,EACA88B,IAGIx6C,EAAiBs7C,YAAsB,CAC3CrrC,OACA+6B,kBACAC,aAAcyP,EACdxP,WACAC,aAGIxpC,GAAOC,cAEb,IAAKqO,EACH,OAwDF,MAAM5Q,GAAYyC,YAChB,2BACAsP,aAAcsM,GAAU,UAAY,QACpCwa,IAAetrB,KAAoB,YAGrC,OACE,kBAAC5N,EAAA,EAAD,CACEE,IAAKA,EACLG,UAAWA,GACXC,MAAOA,EACPG,QAASmN,IACT5M,eAAgBA,EAChBC,QAASqB,GAET,yBAAKjC,UAAU,UACb,kBAACk8C,EAAA,EAAD,CACEtrC,KAAMA,EACNtI,KAAMqjC,EACN76B,kBAAgB,EAChBtI,gBAAiBmjC,GAAmBA,EAAgBljC,OACpDJ,aAAcA,KAGlB,yBAAKrI,UAAU,QACb,yBAAKA,UAAU,SACb,4BAAKuK,YAAWuH,YAAaxP,GAAMsO,EAAM+6B,KACxC/6B,EAAKpG,YAAc,kBAACqc,EAAA,EAAD,MACnB2lB,GAAW,uBAAGxsC,UAAU,oBACxB4Q,EAAK6oC,aACJ,kBAAC0C,EAAA,EAAD,CAAiBxtB,QAAS/d,EAAK6oC,YAAa7M,eAAgB8N,KAGhE,yBAAK16C,UAAU,YAtFrB,WACE,GAAIgJ,GAAgBywC,GAAezwC,EAAaowB,UAA+B,IAAnBqgB,EAAY/X,KACtE,OAAO,kBAAC0a,EAAA,EAAD,CAAcpzC,aAAcA,IAGrC,GAAI6xC,GAASA,EAAMhqC,KAAKjF,OACtB,OACE,uBAAG5L,UAAU,eAAe0C,IAAKJ,GAAKK,MAAQ,OAAS,OACrD,0BAAM3C,UAAU,SAASsC,GAAK,UAC7BiI,YAAWswC,EAAMhqC,OAKxB,IAAK4oC,EACH,OAGF,GAAI8B,EAAU,CACZ,MAAMc,EAAezrC,IAAS0mB,aAAc1mB,IAAS6oC,EAAYvnC,WAAaunC,EAAYp7B,QACtFzN,EACAgpC,EAEJ,OACE,uBAAG55C,UAAU,eAAe0C,IAAKJ,GAAKK,MAAQ,OAAS,OACpD4H,YAAW+xC,YACVh6C,GACAm3C,EACA4C,EACAzB,EACAb,EACAK,EACA,CAAEmC,SAAS,MAMnB,MAAMC,EAAaC,YAAqBn6C,GAAM+b,EAAQu7B,GAEtD,OACE,uBAAG55C,UAAU,eAAe0C,IAAKJ,GAAKK,MAAQ,OAAS,OACpD65C,GACC,oCACE,0BAAMx8C,UAAU,eAAeuK,YAAWiyC,IAC1C,0BAAMx8C,UAAU,SAAhB,MAuDZ,SAA8BsC,EAAcqsB,EAAqB+tB,EAAkBd,GACjF,IAAKc,EACH,OAAOnyC,YAAWquC,YAAsBt2C,EAAMqsB,IAGhD,OACE,0BAAM3uB,UAAU,iBACd,yBAAKyR,IAAKirC,EAAShrC,IAAI,GAAG1R,UAAW47C,EAAe,aAAUh5C,IAC7Dg+B,YAAgBjS,IAAY,uBAAG3uB,UAAU,cACzCuK,YAAWquC,YAAsBt2C,EAAMqsB,GAAS,KA7D9CguB,CAAqBr6C,GAAMm3C,EAAc9Y,GAAgB+a,EAAgBE,IAuCvEgB,GACD,kBAAC,EAAD,CAAOhsC,KAAMA,EAAMk7B,SAAUA,EAAUU,QAASA,MAGpD,kBAACqQ,EAAA,EAAD,CACE55C,OAAQm4C,EACRj4C,QAASm4C,EACT1qC,KAAMA,S,SCzOT4oC,K,aAAAA,E,qBAAAA,M,KAqLUxxC,gBAAKC,YAClB,CAACC,GAAU40C,aAAYjR,eACrB,MACEkR,OAAO,QACL95B,EACAivB,KAAM8K,EAFD,iBAGLC,GAEFC,OAAShL,KAAMiL,GANX,aAOJ90C,GACEH,GACImW,OAAQw2B,EAAeC,SAAUsI,GAAoBrI,YAAyB7sC,IAAW,GAE3Fm1C,EAA0B,WAAfP,EAA0BtD,EAAqBsD,QAAcl6C,EACxE06C,EAAazR,EAAW0R,YAAiBr1C,EAAQ2jC,QAAYjpC,EAEnE,MAAO,CACLo6C,YACAG,YACAtI,gBACAxsC,kBACIg1C,EAAW,CACbp6B,QAASA,EAAQo6B,GACjBJ,iBAAkBA,EAAiBI,IACjC,CACFC,cAEFE,qBAAsBJ,IAAoBrC,iBAC1C0C,eAAgBjD,aAAqBtyC,GACrCw1C,iBAAkBjD,aAAuBvyC,KAG7C,CAACW,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,gBACA,yBACA,aAnCgBb,CAhLwC,EAC1D60C,aACAjR,WACA8R,cAAc,sBACdC,WACAN,aACAN,YACAG,YACAl6B,UACA4xB,gBACAoI,mBACA50C,eACAm1C,uBACAC,iBACAC,mBACAG,gBACAC,yBACA5C,eAEA,MAAO6C,EAAgBC,GAAoB7qC,YAAQ,IAC3B,WAAf2pC,GAA2BQ,EAC9BW,aAAqBjB,EAAWG,EAAWG,EAAYG,EAAgBC,GACvE,CAACz6B,EAASg6B,GACb,CAACH,EAAYQ,EAAYN,EAAWG,EAAWM,EAAgBC,EAAkBz6B,EAASg6B,KAEtFiB,EAAWC,GAAchrC,YAAQ,KACtC,IAAK4qC,GAAkC,WAAfjB,IAA4BQ,EAClD,MAAO,GAET,MAAMc,EAAgBC,aAAgBrB,EAAWe,EAAgBC,EAAkBlB,GAC7EwB,EAAa,IAAIF,EAAcG,eAAgBH,EAAcI,YAC7DC,EAAgBH,EAAWj7C,IAAI,EAAGsG,QAASA,GAMjD,MAAO,CALc20C,EAAW7S,OAAO,CAACC,EAAK96B,EAAMlB,KACjDg8B,EAAI96B,EAAKjH,IAAM+F,EACRg8B,GACN,IAEmB+S,IACrB,CAACV,EAAgBC,EAAkBlB,EAAYQ,EAAYN,IAExD0B,EAAgBlwC,YAAY0vC,GAE5BS,EAAgBT,GAAaQ,EAC/BzL,YAAUiL,EAAW,CAACU,EAAOj1C,IACtBi1C,QAA+Bh8C,IAAtB87C,EAAc/0C,GAAoB+0C,EAAc/0C,GAAMk1C,MAEtE,GAEEC,EAAiBv9C,YAAY,KACjCs8C,EAAc,CAAER,SAAyB,aAAfP,EAA4B,WAAa,YAClE,CAACe,EAAef,KAEZt5B,EAAaC,GAAWs7B,YAC7B12C,EAAey2C,OAAiBl8C,EAChCu7C,OACAv7C,EACAo8C,IACe,QAAflC,IAAyBmC,KAIrBC,EAAa17B,GAAe66B,aAAgBrB,EAAWx5B,EAAaw6B,EAAkBlB,GAE5Fp4C,YAAU,KACJ2D,GAA+B,QAAfy0C,GAClBgB,KAED,CAACz1C,EAAcy0C,EAAYgB,IAE9B,MAAMqB,EHlHD,SAA8BR,GACnC,MAAMS,EAAU79C,YAAaoI,GAAeg1C,EAAch1C,GAAM,EAAG,CAACg1C,IAC9DU,EAAY99C,YAAaoI,GAAeg1C,EAAch1C,GAAM,EAAG,CAACg1C,IAEhEW,EAAelwC,OAAOD,KAAKwvC,GAAet7C,IAAIgM,QAC9CkwC,EAAaD,EAAaruB,OAAOmuB,GAASxzC,OAC1C4zC,EAAeF,EAAaruB,OAAOouB,GAAWzzC,OAEpD,OAAOrK,YAAa8c,IAClB,MAAM28B,EAAY2D,EAActgC,GAEhC,OAAkB,IAAd28B,EACK7B,EAAmBsG,KAI1BzE,IAAc6D,KACX7D,KAAe6D,KACdO,EAAQ/gC,IAAWkhC,GAAcC,GACjCH,EAAUhhC,IAAWmhC,EAAeD,EAEjCpG,EAAmB2C,QAGrB3C,EAAmB6C,MACzB,CAACqD,EAAWD,EAASI,EAAcD,EAAYZ,IGyFzBe,CAAqBf,GAuF9C,OA3CAj6C,YAAU,KACR,MAAM8G,EAAiBtJ,IACrB,GAAI07C,GAAYO,EAAY,CAC1B,GAAIj8C,EAAEo+B,SAAWp+B,EAAEk+B,KAAK9U,WAAW,SAAU,CAC3C,MAAO,CAAEq0B,GAASz9C,EAAEk+B,KAAKwf,MAAM,cAAgB,GAC/C,IAAKD,EAAO,OAEZ,MAAMlgC,EAAWpQ,OAAOswC,GAAS,EACjC,GAAIlgC,EAAW0+B,EAAWvyC,OAAS,EAAG,OAEtCsvC,EAAS,CAAEvxC,GAAIw0C,EAAW1+B,KAG5B,GAAIvd,EAAEm+B,OAAQ,CACZ,MAAM0X,EAA6B,cAAV71C,EAAEqB,IAAsB,EAAc,YAAVrB,EAAEqB,KAAqB,OAAIX,EAChF,IAAKm1C,EAAkB,OAEvB,IAAKlD,EAGH,OAFA3yC,EAAEuJ,sBACFyvC,EAAS,CAAEvxC,GAAIw0C,EAAW,KAI5B,MAAM1+B,EAAW0+B,EAAW5uC,QAAQslC,GAEpC,IAAkB,IAAdp1B,EACF,OAEF,MAAMogC,EAAS1B,EAAW1+B,EAAWs4B,GAErC71C,EAAEuJ,iBACFyvC,EAAS,CAAEvxC,GAAIk2C,OAOrB,OAFA5zC,SAASI,iBAAiB,UAAWb,GAAe,GAE7C,KACLS,SAASK,oBAAoB,UAAWd,GAAe,MAKzD,kBAAC6G,EAAA,EAAD,CACErS,UAAU,0BACVyS,MAAO+Q,EACPlR,WAAYmR,EACZ9Q,iBAAkBqsC,IAClBjsC,YAAU,EACVF,iBAAe,GAEd2Q,GAAeA,EAAY5X,QAAUszC,EA9F1C,WACE,MAAMY,EAAiB3B,EAAY5uC,QAAQiU,EAAa,IAClDu8B,EAAeD,EAAiBZ,EAAYX,YAAY3yC,OAE9D,OACE,yBACE5L,UAAU,mBAEVC,MAAOg4C,IAAc,WAAUkG,EAAYvyC,OAASo0C,aAAqBp9C,EACzEmS,eAAa,GAEZmqC,EAAYX,YAAYl7C,IAAI,EAAGsG,MAAM+F,IACpC,kBAAC,EAAD,CACEnM,IAAKoG,EACLs2C,cAAevwC,EACf2O,OAAQ1U,EACRmiC,UAAQ,EACRD,SAAUA,EACVhT,WAAYlvB,IAAOkrC,IAAkB2I,EACrCvC,cAAekE,EAAiBx1C,GAChCqxC,UAAW2D,EAAch1C,GAEzB1J,MAAQ,SAAQ6/C,EAAiBpwC,GAAKswC,YAGzCd,EAAYV,WAAWn7C,IAAI,CAACuN,EAAMlB,IACjC,kBAAC,EAAD,CACEnM,IAAKqN,EAAKjH,GACVs2C,cAAeC,YAAatvC,GAC5ByN,OAAQzN,EAAKjH,GACbkiC,SAAUA,EACVhT,WAAYjoB,EAAKjH,KAAOkrC,IAAkB2I,EAC1CvC,cAAekE,EAAiBvuC,EAAKjH,IACrCqxC,UAAW2D,EAAc/tC,EAAKjH,IAE9B1J,MAAQ,SAAQ8/C,EAAerwC,GAAKswC,aA4DxCG,GACE38B,IAAgBA,EAAY5X,OAC9B,yBAAK5L,UAAU,cAAc29C,GAE7B,kBAACyC,EAAA,EAAD,CAAS78C,IAAI,iB,mICrNrB,MAAM88C,EAAyB,kBAEhB,SAASC,EACtBC,EACAp2B,EACA2nB,EACA5b,EAAkBoI,IAClBkiB,EACAC,EACAtD,GAEA,MAAOl6C,EAAQ+uC,EAAYC,GAAgBluB,eACpC28B,EAAeC,GAAoB75C,YAAS,KAC5C85C,EAAiBC,GAAsB/5C,YAA0B,IAElEg6C,EAAqBv/C,YAAa0vB,IACtC,GAAKuvB,GAAqBrD,EAI1B,OAAOqD,EAAiBvvB,OAAO,EAAG9oB,aAChC,MAAMG,EAAO60C,EAAUh1C,GACvB,QAAIA,IAAWs4C,IAAkBn4C,MAIzB2oB,GC/BC,SAAwBA,EAAgB3oB,GACrD,MAAMy4C,EAAkBz4C,EAAKoC,SAASgpC,cAChC9pC,EAAWC,YAAgBvB,GAC3B04C,EAAkBp3C,GAAYA,EAAS8pC,cACvCuN,EAAgBhwB,EAAOyiB,cAE7B,OAAOqN,EAAgBz1B,WAAW21B,IAChCD,GAAmBE,YAAYF,EAAiBC,GDwB5BE,CAAelwB,EAAQ3oB,OAE1C,CAACk4C,EAAkBC,EAAetD,IAErCz4C,YAAU,KACR,IAAK67C,IAAsBp2B,EAAKve,OAE9B,YADAqmC,IAIF,MAAMmP,EAuDV,SAA2Bj3B,GACzB,MAAMkpB,EAASpnC,SAASgS,cAAc,OACtCo1B,EAAOv1B,UAAYqM,EACnB,MAAMtZ,EAAOwiC,EAAO5oB,UAEd6oB,EAAaziC,EAAKA,EAAKjF,OAAS,GAChC2nC,EAAW1iC,EAAK2K,MAAM6kC,GAAwB7M,MAEpD,IACG3iC,EAAKjF,QAAUy0C,EAAuB5M,KAAKH,KACxCC,IAAaA,EAASjoB,WAAW,KAErC,OAGF,OAAOioB,EAtEkB8N,CAAkBl3B,GAEzC,GAAIi3B,EAAgB,CAClB,MAAMnwB,EAASmwB,EAAiBA,EAAervB,OAAO,GAAK,GACrDuvB,EAAmBR,EAAmB7vB,GACxCqwB,GAAoBA,EAAiB11C,QACvComC,IACA2O,EAAiB1vB,GACjB4vB,EAAmBS,IAEnBrP,SAGFA,KAED,CAACsO,EAAmBp2B,EAAM22B,EAAoB9O,EAAYC,IAE7D,MAAMsP,EAAgBhgD,YAAY,CAAC+G,EAAek5C,GAAa,KAC7D,IAAKl5C,EAAKoC,WAAaujB,YAAuB3lB,GAC5C,OAGF,MAAMm5C,EAAen5C,EAAKoC,SACrB,IAAGpC,EAAKoC,SACR,uEAEqBse,wBAAsBoC,yCAC1B9iB,EAAKqB,0EAGpBskB,YAAuB3lB,SAExB+rC,EAAUlqB,EAAKmqB,YAAY,KACjC,IAAiB,IAAbD,EAAgB,CAClBvC,EAAc,GAAE3nB,EAAK4H,OAAO,EAAGsiB,KAAWoN,WAC1C,MAAMlN,EAAetoC,SAASuoC,eAAete,GACxC3oB,KACH2C,sBAAsB,KACpBsU,YAAqB+vB,EAAciN,KAKzCvP,KACC,CAAC9nB,EAAM+L,EAAS4b,EAAcG,IAEjC,MAAO,CACLyP,qBAAsBz+C,EACtB0+C,cAAejB,EACfkB,oBAAqB3P,EACrBsP,gBACAM,uBAAwBjB,K,2GE3F5B,MAIMkB,EAAQ,IAAI58C,ICAH,SAAS68C,EAAY5wC,GAClC,MAAM6wC,EAAalhD,cAEnB,IAAImhD,GAAY,EAEhBjmC,YAAY,KAKV,GAJAimC,GAAY,EAEZD,EAAWxgD,aAAUoB,GAEhBuO,EACH,OAGF,MAAMukB,EAAM,IAAIF,MAEhB,GADAE,EAAIjkB,IAAMN,GACLukB,EAAI9lB,MACP,OAGF,MAAMwlB,EAAS8sB,YAAYxsB,GAC3BwF,YAAS9F,EAAOE,WAAW,MAAO,EAAG,EAAGF,EAAOxlB,MAAOwlB,EAAO/kB,OAxBlD,EACI,GAyBf2xC,EAAWxgD,QAAU4zB,EAAOyQ,aAC3B,CAAC10B,IAIJ,MAAMgxC,ED1BO,SAAiBhxC,EAAkBlN,GAAa,EAAOoD,GACpE,MAAM26C,EAAalhD,YAA2BqQ,EAAU2wC,EAAMl8C,IAAIuL,QAAWvO,GACvEmZ,EAAajb,cACb0G,EAAcC,cAqCpB,OAnCIsU,EAAWva,SAAWyC,IACxBgL,aAAa8M,EAAWva,SACxBua,EAAWva,aAAUoB,GAGvB8B,YAAU,KACR,IAAKyM,GAAW6wC,EAAWxgD,SAAWyC,EACpC,OAGF,MAAMyxB,EAAM,IAAIF,MAEhBE,EAAID,OAAS,KACX,MAAML,EAAS8sB,YAAYxsB,GAC3BwF,YAAS9F,EAAOE,WAAW,MAAO,EAAG,EAAGF,EAAOxlB,MAAOwlB,EAAO/kB,OAzBpD,EACI,GAyBb,MAAM+xC,EAAiBhtB,EAAOyQ,YAE9Bmc,EAAWxgD,QAAU4gD,EACrB56C,IAEIs6C,EAAMx3C,MA7BO,KA8Bfw3C,EAAMh9C,QAERg9C,EAAM57C,IAAIiL,EAASixC,IAGjB/6C,EACF0U,EAAWva,QAAU2O,OAAOpI,WAAW,KACrC2tB,EAAIjkB,IAAMN,GACT9J,GAEHquB,EAAIjkB,IAAMN,GAEX,CAACA,EAAS9J,EAAOG,EAAavD,IAE1B+9C,EAAWxgD,QCdG6gD,CAAQlxC,QAAWvO,EAAW+F,QAAQq5C,EAAWxgD,UAEtE,OAAOwgD,EAAWxgD,UAAaygD,GAAaE,GAAiBhxC,QAAWvO,I","file":"0.c66dcd2dcbc1482a0d6f.js","sourcesContent":["import { RefObject } from 'react';\nimport React, { FC, useRef, useCallback } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport useContextMenuPosition from '../../hooks/useContextMenuPosition';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from './RippleEffect';\nimport Menu from './Menu';\nimport MenuItem from './MenuItem';\n\nimport './ListItem.scss';\n\ntype OnClickHandler = (e: React.MouseEvent) => void;\n\ntype MenuItemContextAction = {\n title: string;\n icon: string;\n destructive?: boolean;\n handler?: () => void;\n};\n\ntype OwnProps = {\n ref?: RefObject;\n buttonRef?: RefObject;\n icon?: string;\n className?: string;\n style?: string;\n children: any;\n disabled?: boolean;\n ripple?: boolean;\n narrow?: boolean;\n inactive?: boolean;\n focus?: boolean;\n destructive?: boolean;\n multiline?: boolean;\n isStatic?: boolean;\n contextActions?: MenuItemContextAction[];\n onClick?: OnClickHandler;\n};\n\nconst ListItem: FC = (props) => {\n const {\n ref,\n buttonRef,\n icon,\n className,\n style,\n children,\n disabled,\n ripple,\n narrow,\n inactive,\n focus,\n destructive,\n multiline,\n isStatic,\n contextActions,\n onClick,\n } = props;\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(containerRef, !contextActions);\n\n const getTriggerElement = useCallback(() => containerRef.current, []);\n\n const getRootElement = useCallback(\n () => containerRef.current!.closest('.custom-scroll'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => containerRef.current!.querySelector('.ListItem-context-menu .bubble'),\n [],\n );\n\n const { positionX, positionY, style: menuStyle } = useContextMenuPosition(\n contextMenuPosition,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n );\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n return;\n }\n onClick(e);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (inactive || IS_TOUCH_ENV) {\n return;\n }\n if (contextActions && (e.button === 2 || !onClick)) {\n handleBeforeContextMenu(e);\n }\n if (e.button === 0) {\n if (!onClick) {\n handleContextMenu(e);\n } else {\n handleClick(e);\n }\n }\n }, [inactive, contextActions, onClick, handleBeforeContextMenu, handleContextMenu, handleClick]);\n\n const lang = useLang();\n\n const fullClassName = buildClassName(\n 'ListItem',\n className,\n !isStatic && 'no-selection',\n ripple && 'has-ripple',\n narrow && 'narrow',\n disabled && 'disabled',\n inactive && 'inactive',\n contextMenuPosition && 'has-menu-open',\n focus && 'focus',\n destructive && 'destructive',\n multiline && 'multiline',\n isStatic && 'is-static',\n );\n\n return (\n \n \n {icon && (\n \n )}\n {multiline && (
{children}
)}\n {!multiline && children}\n {!disabled && !inactive && ripple && (\n \n )}\n
\n {contextActions && contextMenuPosition !== undefined && (\n \n {contextActions.map((action) => (\n \n {action.title}\n \n ))}\n \n )}\n
\n );\n};\n\nexport default ListItem;\n","import { RefObject } from 'react';\nimport {\n useEffect, useRef, useCallback, useState,\n} from '../lib/teact/teact';\n\nimport { throttle, debounce } from '../util/schedulers';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\n\ntype TargetCallback = (entry: IntersectionObserverEntry) => void;\ntype RootCallback = (entries: IntersectionObserverEntry[]) => void;\ntype ObserveCleanup = NoneToVoidFunction;\nexport type ObserveFn = (target: HTMLElement, targetCallback?: TargetCallback) => ObserveCleanup;\n\ninterface IntersectionController {\n observer: IntersectionObserver;\n callbacks: Map;\n}\n\ninterface Response {\n observe: ObserveFn;\n freeze: NoneToVoidFunction;\n unfreeze: NoneToVoidFunction;\n}\n\nexport function useIntersectionObserver({\n rootRef,\n throttleMs,\n debounceMs,\n shouldSkipFirst,\n margin,\n threshold,\n isDisabled,\n}: {\n rootRef: RefObject;\n throttleMs?: number;\n debounceMs?: number;\n shouldSkipFirst?: boolean;\n margin?: number;\n threshold?: number | number[];\n isDisabled?: boolean;\n}, rootCallback?: RootCallback): Response {\n const controllerRef = useRef();\n const rootCallbackRef = useRef();\n const isFrozenRef = useRef();\n const onUnfreezeRef = useRef();\n\n rootCallbackRef.current = rootCallback;\n\n const freeze = useCallback(() => {\n isFrozenRef.current = true;\n }, []);\n\n const unfreeze = useCallback(() => {\n isFrozenRef.current = false;\n\n if (onUnfreezeRef.current) {\n onUnfreezeRef.current();\n onUnfreezeRef.current = undefined;\n }\n }, []);\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\n return () => {\n if (controllerRef.current) {\n controllerRef.current.observer.disconnect();\n controllerRef.current.callbacks.clear();\n controllerRef.current = undefined;\n }\n };\n }, [isDisabled]);\n\n function initController() {\n const callbacks = new Map();\n const entriesAccumulator = new Map();\n const observerCallbackSync = () => {\n const entries = Array.from(entriesAccumulator.values());\n\n entries.forEach((entry: IntersectionObserverEntry) => {\n const callback = callbacks.get(entry.target);\n if (callback) {\n callback!(entry, entries);\n }\n });\n\n if (rootCallbackRef.current) {\n rootCallbackRef.current(entries);\n }\n\n entriesAccumulator.clear();\n };\n const scheduler = throttleMs ? throttle : debounceMs ? debounce : undefined;\n const observerCallback = scheduler\n ? scheduler(observerCallbackSync, (throttleMs || debounceMs)!, !shouldSkipFirst)\n : observerCallbackSync;\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n entriesAccumulator.set(entry.target, entry);\n });\n\n if (isFrozenRef.current) {\n onUnfreezeRef.current = () => {\n observerCallback();\n };\n } else {\n observerCallback();\n }\n },\n {\n root: rootRef.current,\n rootMargin: margin ? `${margin}px` : undefined,\n threshold,\n },\n );\n\n controllerRef.current = { observer, callbacks };\n }\n\n const observe = useCallback((target, targetCallback) => {\n if (!controllerRef.current) {\n initController();\n }\n\n const controller = controllerRef.current!;\n controller.observer.observe(target);\n\n if (targetCallback) {\n controller.callbacks.set(target, targetCallback);\n }\n\n return () => {\n if (targetCallback) {\n controller.callbacks.delete(target);\n }\n\n controller.observer.unobserve(target);\n };\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDisabled]);\n\n return { observe, freeze, unfreeze };\n}\n\nexport function useOnIntersect(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n useEffect(() => {\n return observe ? observe(targetRef.current!, callback) : undefined;\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport function useIsIntersecting(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n const [isIntersecting, setIsIntersecting] = useState(!observe);\n\n useOnIntersect(targetRef, observe, (entry) => {\n setIsIntersecting(entry.isIntersecting);\n\n if (callback) {\n callback(entry);\n }\n });\n\n return isIntersecting;\n}\n","import { useEffect } from '../lib/teact/teact';\n\nimport { ApiMediaFormat } from '../api/types';\n\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (\n mediaHash: string | false | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!noLoad && mediaHash && !mediaData) {\n const startedAt = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat).then(() => {\n const spentTime = Date.now() - startedAt;\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, delay]);\n\n return mediaData;\n};\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { selectChatMessages, selectUser } from '../../modules/selectors';\nimport { getUserFullName, getUserStatus, isUserOnline } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n userId: number;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n forceShowSelf?: boolean;\n status?: string;\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n noStatusOrTyping?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n isSavedMessages?: boolean;\n areMessagesLoaded: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n status,\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n noStatusOrTyping,\n noRtl,\n user,\n isSavedMessages,\n areMessagesLoaded,\n lastSyncTime,\n loadFullUser,\n openMediaViewer,\n}) => {\n const { id: userId } = user || {};\n const fullName = getUserFullName(user);\n\n useEffect(() => {\n if (withFullInfo && lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime, withFullInfo]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (user && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: user.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [user, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!user) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (status) {\n return (\n {status}\n );\n }\n\n if (withUpdatingStatus && !areMessagesLoaded) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!user) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n return (\n
\n {withUsername && user.username && {user.username}}\n {getUserStatus(lang, user)}\n
\n );\n }\n\n return (\n
\n \n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {user && user.isVerified && }\n
\n )}\n {(status || (!isSavedMessages && !noStatusOrTyping)) && renderStatusOrTyping()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { lastSyncTime } = global;\n const user = selectUser(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const areMessagesLoaded = Boolean(selectChatMessages(global, userId));\n\n return {\n lastSyncTime, user, isSavedMessages, areMessagesLoaded,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import { RefObject } from 'react';\nimport React, {\n FC, useLayoutEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Transition.scss';\n\ntype ChildrenFn = (isActive: boolean, isFrom: boolean) => any;\ntype OwnProps = {\n ref?: RefObject;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'slide-reversed' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'scroll-slide' | 'slide-layers'\n | 'fade' | 'push-slide' | 'reveal'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n id?: string;\n className?: string;\n onStart?: () => void;\n onStop?: () => void;\n children: ChildrenFn;\n};\n\ntype StateProps = {\n animationLevel: number;\n};\n\nconst ANIMATION_DURATION = {\n slide: 450,\n 'slide-reversed': 450,\n 'mv-slide': 400,\n 'slide-fade': 400,\n 'zoom-fade': 150,\n 'scroll-slide': 500,\n fade: 150,\n 'slide-layers': IS_MOBILE_SCREEN ? 450 : 300,\n 'push-slide': 300,\n reveal: 350,\n};\n\nconst CLEANED_UP = Symbol('CLEANED_UP');\n\nconst Transition: FC = ({\n ref,\n activeKey,\n name,\n direction = 'auto',\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n id,\n className,\n onStart,\n onStop,\n children,\n animationLevel,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const rendersRef = useRef>({});\n const prevActiveKey = usePrevious(activeKey);\n const activateTimeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n const activeKeyChanged = prevActiveKey !== undefined && activeKey !== prevActiveKey;\n\n if (!renderCount && activeKeyChanged) {\n rendersRef.current = { [prevActiveKey]: rendersRef.current[prevActiveKey] };\n }\n\n rendersRef.current[activeKey] = children;\n\n useLayoutEffect(() => {\n function cleanup() {\n if (!shouldCleanup) {\n return;\n }\n\n rendersRef.current = { [prevActiveKey]: CLEANED_UP };\n forceUpdate();\n }\n\n const container = containerRef.current!;\n\n const childElements = container.children;\n if (childElements.length === 1 && !activeKeyChanged) {\n childElements[0].classList.add('active');\n\n return;\n }\n\n const childNodes = Array.from(container.childNodes);\n\n if (!activeKeyChanged || !childNodes.length) {\n return;\n }\n\n if (activateTimeoutRef.current) {\n clearTimeout(activateTimeoutRef.current);\n activateTimeoutRef.current = undefined;\n }\n\n const isBackwards = (\n direction === -1\n || (direction === 'auto' && prevActiveKey > activeKey)\n || (direction === 'inverse' && prevActiveKey < activeKey)\n );\n\n container.classList.remove('animating');\n container.classList.toggle('backwards', isBackwards);\n\n const keys = Object.keys(rendersRef.current).map(Number);\n const prevActiveIndex = renderCount ? prevActiveKey : keys.indexOf(prevActiveKey);\n const activeIndex = renderCount ? activeKey : keys.indexOf(activeKey);\n\n if (name === 'none' || animationLevel === 0) {\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle('active', i === activeIndex);\n }\n });\n\n cleanup();\n\n return;\n }\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('active');\n node.classList.toggle('from', i === prevActiveIndex);\n node.classList.toggle('through', (\n (i > prevActiveIndex && i < activeIndex) || (i < prevActiveIndex && i > activeIndex)\n ));\n node.classList.toggle('to', i === activeIndex);\n }\n });\n\n if (name === 'scroll-slide') {\n const width = container.offsetWidth;\n container.scrollBy({\n left: activeIndex > prevActiveIndex ? width : -width,\n behavior: 'smooth',\n });\n }\n\n if (animationLevel > 0) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\n }\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n activateTimeoutRef.current = window.setTimeout(() => {\n requestAnimationFrame(() => {\n container.classList.remove('animating', 'backwards');\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle('active', i === activeIndex);\n }\n });\n\n if (name === 'scroll-slide') {\n container.scrollLeft = activeKey * container.offsetWidth;\n }\n\n if (shouldRestoreHeight) {\n const activeElement = container.querySelector('.active');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n\n cleanup();\n\n if (onStop) {\n onStop();\n }\n });\n }, ANIMATION_DURATION[name] + ANIMATION_END_DELAY);\n\n if (onStart) {\n onStart();\n }\n });\n }, [\n activeKey,\n prevActiveKey,\n activeKeyChanged,\n direction,\n name,\n onStart,\n onStop,\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n animationLevel,\n forceUpdate,\n ]);\n\n useLayoutEffect(() => {\n if (shouldRestoreHeight) {\n const container = containerRef.current!;\n const activeElement = container.querySelector('.active')\n || container.querySelector('.from');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n container.style.flexBasis = `${activeElement.clientHeight}px`;\n }\n }\n }, [shouldRestoreHeight, children]);\n\n const renders = rendersRef.current;\n const collection = Object.keys(renderCount ? new Array(renderCount).fill(undefined) : renders).map(Number);\n const contents = collection.map((key) => {\n const render = renders[key];\n\n return (\n typeof render === 'function' ?
{render(key === activeKey, key === prevActiveKey)}
: undefined\n );\n });\n\n const fullClassName = buildClassName(\n 'Transition',\n className,\n animationLevel === 0 && name === 'scroll-slide' ? 'slide' : name,\n );\n\n return (\n
\n {contents}\n
\n );\n};\n\nexport default withGlobal((global) => {\n const { animationLevel } = global.settings.byKey;\n return { animationLevel };\n})(Transition);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiChat, ApiMediaFormat } from '../../api/types';\n\nimport { IS_TEST } from '../../config';\nimport {\n getChatAvatarHash, getChatTitle, isChatPrivate,\n getUserFullName, isUserOnline, isDeletedUser, getUserColorKey,\n} from '../../modules/helpers';\nimport { getFirstLetters } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useLang from '../../hooks/useLang';\n\nimport './Avatar.scss';\n\ntype OwnProps = {\n className?: string;\n size?: 'micro' | 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n withOnlineStatus?: boolean;\n chat?: ApiChat;\n user?: ApiUser;\n text?: string;\n isSavedMessages?: boolean;\n lastSyncTime?: number;\n onClick?: (e: ReactMouseEvent, hasPhoto: boolean) => void;\n};\n\nconst Avatar: FC = ({\n className,\n size = 'large',\n chat,\n user,\n text,\n withOnlineStatus,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const isDeleted = user && isDeletedUser(user);\n let imageHash: string | undefined;\n\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n imageHash = getChatAvatarHash(user);\n } else if (chat) {\n imageHash = getChatAvatarHash(chat);\n }\n }\n\n const dataUri = useMedia(imageHash, false, ApiMediaFormat.DataUri, lastSyncTime);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(dataUri, 'slow');\n\n const lang = useLang();\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (shouldRenderFullMedia) {\n content = \"\";\n } else if (user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isChatPrivate(chat.id) ? 2 : 1);\n } else if (text) {\n content = getFirstLetters(text, 2);\n }\n\n const isOnline = !isSavedMessages && user && isUserOnline(user);\n const fullClassName = buildClassName(\n `Avatar size-${size}`,\n className,\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n withOnlineStatus && isOnline && 'online',\n onClick && 'interactive',\n (!isSavedMessages && !shouldRenderFullMedia) && 'no-photo',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (onClick) {\n onClick(e, isSavedMessages || shouldRenderFullMedia);\n }\n }, [onClick, isSavedMessages, shouldRenderFullMedia]);\n\n const senderId = (user || chat) && (user || chat)!.id;\n\n return (\n
\n {typeof content === 'string' ? renderText(content, [size === 'jumbo' ? 'hq_emoji' : 'emoji']) : content}\n
\n );\n};\n\nexport default memo(Avatar);\n","import { RefObject, UIEvent } from 'react';\nimport { LoadMoreDirection } from '../../types';\n\nimport React, {\n FC, useCallback, useEffect, useLayoutEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport resetScroll from '../../util/resetScroll';\n\ntype OwnProps = {\n ref?: RefObject;\n className?: string;\n onLoadMore?: ({ direction }: { direction: LoadMoreDirection; noScroll?: boolean }) => void;\n onScroll?: (e: UIEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n items?: any[];\n itemSelector?: string;\n preloadBackwards?: number;\n sensitiveArea?: number;\n noScrollRestore?: boolean;\n noScrollRestoreOnTop?: boolean;\n noFastList?: boolean;\n cacheBuster?: any;\n children: any;\n};\n\nconst DEFAULT_LIST_SELECTOR = '.ListItem';\nconst DEFAULT_PRELOAD_BACKWARDS = 20;\nconst DEFAULT_SENSITIVE_AREA = 800;\n\nconst InfiniteScroll: FC = ({\n ref,\n className,\n onLoadMore,\n onScroll,\n onKeyDown,\n items,\n itemSelector = DEFAULT_LIST_SELECTOR,\n preloadBackwards = DEFAULT_PRELOAD_BACKWARDS,\n sensitiveArea = DEFAULT_SENSITIVE_AREA,\n // Used to turn off restoring scroll position (e.g. for frequently re-ordered chat or user lists)\n noScrollRestore = false,\n noScrollRestoreOnTop = false,\n noFastList,\n // Used to re-query `listItemElements` if rendering is delayed by transition\n cacheBuster,\n children,\n}: OwnProps) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const stateRef = useRef<{\n listItemElements: NodeListOf;\n isScrollTopJustUpdated: boolean;\n currentAnchor: HTMLDivElement | undefined;\n currentAnchorTop: number;\n }>({} as any);\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(() => {\n if (!onLoadMore) {\n return [];\n }\n\n return [\n debounce((noScroll = false) => {\n onLoadMore({ direction: LoadMoreDirection.Backwards, noScroll });\n }, 1000, true, false),\n debounce(() => {\n onLoadMore({ direction: LoadMoreDirection.Forwards });\n }, 1000, true, false),\n ];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onLoadMore, items]);\n\n // Initial preload\n useEffect(() => {\n if (!loadMoreBackwards) {\n return;\n }\n\n if (preloadBackwards > 0 && (!items || items.length < preloadBackwards)) {\n loadMoreBackwards(true);\n return;\n }\n\n const { scrollHeight, clientHeight } = containerRef.current!;\n if (clientHeight && scrollHeight <= clientHeight) {\n loadMoreBackwards();\n }\n }, [items, loadMoreBackwards, preloadBackwards]);\n\n // Restore `scrollTop` after adding items\n useLayoutEffect(() => {\n const container = containerRef.current!;\n const state = stateRef.current;\n\n state.listItemElements = container.querySelectorAll(itemSelector);\n\n let newScrollTop;\n\n if (state.currentAnchor && Array.from(state.listItemElements).includes(state.currentAnchor)) {\n const { scrollTop } = container;\n const newAnchorTop = state.currentAnchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - state.currentAnchorTop);\n } else {\n const nextAnchor = state.listItemElements[0];\n if (nextAnchor) {\n state.currentAnchor = nextAnchor;\n state.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n\n if (noScrollRestore) {\n return;\n }\n\n if (noScrollRestoreOnTop && container.scrollTop === 0) {\n return;\n }\n\n resetScroll(container, newScrollTop);\n\n state.isScrollTopJustUpdated = true;\n }, [items, itemSelector, noScrollRestore, noScrollRestoreOnTop, cacheBuster]);\n\n const handleScroll = useCallback((e: UIEvent) => {\n if (loadMoreForwards && loadMoreBackwards) {\n const {\n listItemElements, isScrollTopJustUpdated, currentAnchor, currentAnchorTop,\n } = stateRef.current;\n\n if (isScrollTopJustUpdated) {\n stateRef.current.isScrollTopJustUpdated = false;\n return;\n }\n\n const listLength = listItemElements.length;\n const container = containerRef.current!;\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const top = listLength ? listItemElements[0].offsetTop : 0;\n const isNearTop = scrollTop <= top + sensitiveArea;\n const bottom = listLength\n ? listItemElements[listLength - 1].offsetTop + listItemElements[listLength - 1].offsetHeight\n : scrollHeight;\n const isNearBottom = bottom - (scrollTop + offsetHeight) <= sensitiveArea;\n let isUpdated = false;\n\n if (isNearTop) {\n const nextAnchor = listItemElements[0];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor && currentAnchor.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingUp = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop > currentAnchorTop\n );\n\n if (isMovingUp) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n resetScroll(container);\n loadMoreForwards();\n }\n }\n }\n\n if (isNearBottom) {\n const nextAnchor = listItemElements[listLength - 1];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor && currentAnchor.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingDown = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop < currentAnchorTop\n );\n\n if (isMovingDown) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n resetScroll(container);\n loadMoreBackwards();\n }\n }\n }\n\n if (!isUpdated) {\n if (currentAnchor && currentAnchor.offsetParent) {\n stateRef.current.currentAnchorTop = currentAnchor.getBoundingClientRect().top;\n } else {\n const nextAnchor = listItemElements[0];\n\n if (nextAnchor) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n }\n }\n\n if (onScroll) {\n onScroll(e);\n }\n }, [loadMoreBackwards, loadMoreForwards, onScroll, sensitiveArea]);\n\n return (\n \n {children}\n \n );\n};\n\nexport default InfiniteScroll;\n","import { useEffect, useRef, useState } from '../lib/teact/teact';\n\nimport useShowTransition from './useShowTransition';\n\nconst SPEED = {\n fast: 200,\n slow: 350,\n};\n\nexport default (mediaData?: any, speed: keyof typeof SPEED = 'fast', noAnimate = false) => {\n const isMediaLoaded = Boolean(mediaData);\n const willAnimate = !useRef(isMediaLoaded).current && !noAnimate;\n const [shouldRenderThumb, setShouldRenderThumb] = useState(!isMediaLoaded);\n\n const {\n shouldRender: shouldRenderFullMedia,\n transitionClassNames,\n } = useShowTransition(isMediaLoaded, undefined, !willAnimate, speed);\n\n useEffect(() => {\n if (shouldRenderFullMedia) {\n if (willAnimate) {\n setTimeout(() => {\n setShouldRenderThumb(false);\n }, SPEED[speed]);\n } else {\n setShouldRenderThumb(false);\n }\n }\n }, [willAnimate, shouldRenderFullMedia, speed]);\n\n return {\n shouldRenderThumb,\n shouldRenderFullMedia,\n transitionClassNames,\n };\n};\n","import { ApiPhoto, ApiVideo, ApiSticker } from '../../../api/types';\nimport { getPhotoInlineDimensions, getVideoDimensions, IDimensions } from '../../../modules/helpers';\nimport windowSize from '../../../util/windowSize';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config';\n\nexport const MEDIA_VIEWER_MEDIA_QUERY = '(max-height: 640px)';\nexport const REM = parseInt(getComputedStyle(document.documentElement).fontSize, 10);\nexport const ROUND_VIDEO_DIMENSIONS = 200;\nexport const AVATAR_FULL_DIMENSIONS = { width: 640, height: 640 };\n\nconst DEFAULT_MEDIA_DIMENSIONS: IDimensions = { width: 100, height: 100 };\nconst LIKE_STICKER_ID = '1258816259753933';\nconst MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH = 0.69;\n\nlet cachedMaxWidth: number | undefined;\n\nfunction getMaxMessageWidthRem(fromOwnMessage: boolean) {\n const regularMaxWidth = fromOwnMessage ? 30 : 29;\n if (!IS_MOBILE_SCREEN) {\n return regularMaxWidth;\n }\n\n // @optimization Limitation: changing device screen width not supported\n if (!cachedMaxWidth) {\n cachedMaxWidth = Math.min(\n regularMaxWidth,\n Math.floor(window.innerWidth * MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH) / REM,\n );\n }\n\n return cachedMaxWidth;\n}\n\nfunction getAvailableWidth(\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n) {\n const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0;\n const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage) - extraPaddingRem;\n\n return availableWidthRem * REM;\n}\n\nfunction getAvailableHeight(isGif?: boolean, aspectRatio?: number) {\n if (\n isGif && aspectRatio\n && aspectRatio >= 0.75 && aspectRatio <= 1.25\n ) {\n return 20 * REM;\n }\n\n return 27 * REM;\n}\n\nfunction calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n isGif,\n}: {\n width: number;\n height: number;\n fromOwnMessage: boolean;\n isForwarded?: boolean;\n isWebPagePhoto?: boolean;\n isGif?: boolean;\n}): IDimensions {\n const aspectRatio = height / width;\n const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto);\n const availableHeight = getAvailableHeight(isGif, aspectRatio);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): IDimensions {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n const { width: windowWidth, height: windowHeight } = windowSize.get();\n let occupiedHeightRem = isVideo && mql.matches ? 10 : 8.25;\n if (withFooter) {\n occupiedHeightRem = mql.matches ? 10 : 15;\n }\n\n return {\n width: windowWidth,\n height: windowHeight - occupiedHeightRem * REM,\n };\n}\n\nexport function calculateInlineImageDimensions(\n photo: ApiPhoto,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n) {\n const { width, height } = getPhotoInlineDimensions(photo) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n });\n}\n\nexport function calculateVideoDimensions(\n video: ApiVideo,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n) {\n const { width, height } = getVideoDimensions(video) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isGif: video.isGif,\n });\n}\n\nexport function getPictogramDimensions(): IDimensions {\n return {\n width: 2 * REM,\n height: 2 * REM,\n };\n}\n\nexport function getDocumentThumbnailDimensions(smaller?: boolean): IDimensions {\n if (smaller) {\n return {\n width: 3 * REM,\n height: 3 * REM,\n };\n }\n\n return {\n width: 3.375 * REM,\n height: 3.375 * REM,\n };\n}\n\nexport function getStickerDimensions(sticker: ApiSticker): IDimensions {\n const { width } = sticker;\n let { height } = sticker;\n\n // For some reason this sticker has some weird `height` value\n if (sticker.id === LIKE_STICKER_ID) {\n height = width;\n }\n\n const aspectRatio = (height && width) && height / width;\n const baseWidth = (IS_MOBILE_SCREEN ? STICKER_SIZE_INLINE_MOBILE_FACTOR : STICKER_SIZE_INLINE_DESKTOP_FACTOR) * REM;\n const calculatedHeight = aspectRatio ? baseWidth * aspectRatio : baseWidth;\n\n if (aspectRatio && calculatedHeight > baseWidth) {\n return {\n width: Math.round(baseWidth / aspectRatio),\n height: baseWidth,\n };\n }\n\n return {\n width: baseWidth,\n height: calculatedHeight,\n };\n}\n\nexport function calculateMediaViewerDimensions(\n { width, height }: IDimensions, withFooter: boolean, isVideo: boolean = false,\n): IDimensions {\n const { width: availableWidth, height: availableHeight } = getMediaViewerAvailableDimensions(withFooter, isVideo);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function calculateDimensions(\n availableWidth: number,\n availableHeight: number,\n mediaWidth: number,\n mediaHeight: number,\n): IDimensions {\n const aspectRatio = mediaHeight / mediaWidth;\n const calculatedWidth = Math.min(mediaWidth, availableWidth);\n const calculatedHeight = Math.round(calculatedWidth * aspectRatio);\n\n if (calculatedHeight > availableHeight) {\n return {\n width: Math.round(availableHeight / aspectRatio),\n height: availableHeight,\n };\n }\n\n return {\n width: calculatedWidth,\n height: Math.round(calculatedWidth * aspectRatio),\n };\n}\n","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n}) => {\n const [animation, setAnimation] = useState();\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName('AnimatedSticker', className);\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport Modal from './Modal';\nimport Button from './Button';\n\ntype OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n title?: string;\n header?: FC;\n textParts?: TextPart[];\n text?: string;\n confirmLabel?: string;\n confirmHandler: () => void;\n confirmIsDestructive?: boolean;\n isButtonsInOneRow?: boolean;\n};\n\nconst ConfirmDialog: FC = ({\n isOpen,\n onClose,\n onCloseAnimationEnd,\n title,\n header,\n text,\n textParts,\n confirmLabel = 'Confirm',\n confirmHandler,\n confirmIsDestructive,\n isButtonsInOneRow,\n}) => {\n const lang = useLang();\n\n return (\n \n {text && text.split('\\\\n').map((textPart) => (\n

{textPart}

\n ))}\n {textParts}\n
\n \n {confirmLabel}\n \n \n
\n \n );\n};\n\nexport default memo(ConfirmDialog);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './NothingFound.scss';\n\ninterface OwnProps {\n text?: string;\n description?: string;\n}\n\nconst DEFAULT_TEXT = 'Nothing found.';\n\nconst NothingFound: FC = ({ text = DEFAULT_TEXT, description }) => {\n const lang = useLang();\n const { transitionClassNames } = useShowTransition(true);\n\n return (\n
\n {text}\n {description &&

{renderText(lang(description), ['br'])}

}\n
\n );\n};\n\nexport default memo(NothingFound);\n","import { useEffect, useRef } from '../../../lib/teact/teact';\n\nimport useOnChange from '../../../hooks/useOnChange';\nimport useForceUpdate from '../../../hooks/useForceUpdate';\n\nexport default function useAsyncRendering(dependencies: T, delay?: number) {\n const isDisabled = delay === undefined;\n const shouldRenderRef = useRef(isDisabled);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n if (isDisabled) {\n return;\n }\n\n shouldRenderRef.current = false;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n }, dependencies);\n\n useEffect(() => {\n if (isDisabled || shouldRenderRef.current) {\n return;\n }\n\n const exec = () => {\n shouldRenderRef.current = true;\n forceUpdate();\n };\n\n if (delay! > 0) {\n timeoutRef.current = window.setTimeout(exec, delay);\n } else {\n exec();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return shouldRenderRef.current;\n}\n","import {\n useEffect, useMemo, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { IS_PROGRESSIVE_SUPPORTED } from '../util/environment';\nimport { ApiMediaFormat } from '../api/types';\nimport { throttle } from '../util/schedulers';\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nconst STREAMING_PROGRESS = 0.75;\nconst STREAMING_TIMEOUT = 1500;\nconst PROGRESS_THROTTLE = 500;\n\nexport default (\n mediaHash: string | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const isStreaming = mediaFormat === ApiMediaFormat.Stream || (\n IS_PROGRESSIVE_SUPPORTED && mediaFormat === ApiMediaFormat.Progressive\n );\n const forceUpdate = useForceUpdate();\n const [downloadProgress, setDownloadProgress] = useState(mediaData && !isStreaming ? 1 : 0);\n const startedAtRef = useRef();\n\n const handleProgress = useMemo(() => {\n return throttle((progress: number) => {\n if (!delay || (Date.now() - startedAtRef.current! > delay)) {\n setDownloadProgress(progress);\n }\n }, PROGRESS_THROTTLE, true);\n }, [delay]);\n\n useEffect(() => {\n if (!noLoad && mediaHash) {\n if (!mediaData) {\n setDownloadProgress(0);\n\n if (startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n }\n\n startedAtRef.current = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat, handleProgress).then(() => {\n const spentTime = Date.now() - startedAtRef.current!;\n startedAtRef.current = undefined;\n\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n } else if (isStreaming) {\n setTimeout(() => {\n setDownloadProgress(STREAMING_PROGRESS);\n }, STREAMING_TIMEOUT);\n }\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, isStreaming, delay, handleProgress]);\n\n useEffect(() => {\n if (noLoad && startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n setDownloadProgress(0);\n }\n }, [handleProgress, noLoad]);\n\n return { mediaData, downloadProgress };\n};\n","import React, {\n FC, useEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './ProgressSpinner.scss';\n\nconst RADIUSES = {\n s: 22, m: 25, l: 28, xl: 20,\n};\nconst STROKE_WIDTH = 2;\nconst MIN_PROGRESS = 0.05;\nconst MAX_PROGRESS = 1;\n\nconst ProgressSpinner: FC<{\n progress?: number;\n size?: 's' | 'm' | 'l' | 'xl';\n square?: boolean;\n transparent?: boolean;\n noCross?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}> = ({\n progress = 0,\n size = 'l',\n square,\n transparent,\n noCross,\n onClick,\n}) => {\n const radius = RADIUSES[size];\n const circleRadius = radius - STROKE_WIDTH * 2;\n const borderRadius = radius - 1;\n const circumference = circleRadius * 2 * Math.PI;\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n\n useEffect(() => {\n if (!container.current) {\n return;\n }\n\n const svg = container.current.firstElementChild;\n const strokeDashOffset = circumference - Math.min(Math.max(MIN_PROGRESS, progress), MAX_PROGRESS) * circumference;\n\n if (!svg) {\n container.current.innerHTML = `\n \n `;\n } else {\n (svg.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n }, [container, circumference, borderRadius, circleRadius, progress]);\n\n const className = buildClassName(\n `ProgressSpinner size-${size}`,\n transparent && 'transparent',\n square && 'square',\n noCross && 'no-cross',\n );\n\n return (\n \n );\n};\n\nexport default memo(ProgressSpinner);\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef(document.createElement('div'));\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiTypingStatus } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport {\n getChatTypeString,\n getChatTitle,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport { selectChat, selectChatMessages, selectChatOnlineCount } from '../../modules/selectors';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n chatId: number;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'small' | 'medium' | 'large' | 'jumbo';\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n withChatType?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n onlineCount?: number;\n areMessagesLoaded: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst GroupChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n withChatType,\n noRtl,\n chat,\n onlineCount,\n areMessagesLoaded,\n lastSyncTime,\n loadFullChat,\n openMediaViewer,\n}) => {\n const isSuperGroup = chat && isChatSuperGroup(chat);\n const { id: chatId, isMin, isRestricted } = chat || {};\n\n useEffect(() => {\n if (chatId && !isMin && withFullInfo && lastSyncTime) {\n loadFullChat({ chatId });\n }\n }, [chatId, isMin, lastSyncTime, withFullInfo, loadFullChat, isSuperGroup]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (chat && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: chat.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [chat, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (withUpdatingStatus && !areMessagesLoaded && !isRestricted) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!chat) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n if (withChatType) {\n return (\n
{lang(getChatTypeString(chat))}
\n );\n }\n\n const handle = withUsername ? chat.username : undefined;\n const groupStatus = getGroupStatus(lang, chat);\n const onlineStatus = onlineCount ? `, ${lang('OnlineCount', onlineCount, 'i')}` : undefined;\n\n return (\n
\n {handle && {handle}}\n {groupStatus}\n {onlineStatus && {onlineStatus}}\n
\n );\n }\n\n return (\n
\n \n
\n
\n

{renderText(getChatTitle(lang, chat))}

\n {chat.isVerified && }\n
\n {renderStatusOrTyping()}\n
\n
\n );\n};\n\nfunction getGroupStatus(lang: LangFn, chat: ApiChat) {\n const chatTypeString = lang(getChatTypeString(chat));\n const { membersCount } = chat;\n\n if (chat.isRestricted) {\n return chatTypeString === 'Channel' ? 'channel is inaccessible' : 'group is inaccessible';\n }\n\n if (!membersCount) {\n return chatTypeString;\n }\n\n return chatTypeString === 'Channel'\n ? lang('Subscribers', membersCount, 'i')\n : lang('Members', membersCount, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { lastSyncTime } = global;\n const chat = selectChat(global, chatId);\n const onlineCount = chat ? selectChatOnlineCount(global, chat) : undefined;\n const areMessagesLoaded = Boolean(selectChatMessages(global, chatId));\n\n return {\n lastSyncTime, chat, onlineCount, areMessagesLoaded,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullChat', 'openMediaViewer']),\n)(GroupChatInfo));\n","import { FocusDirection } from '../types';\n\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { fastRaf } from './schedulers';\nimport { animateSingle } from './animation';\n\nconst MAX_DISTANCE = 1500;\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\n\nlet isAnimating = false;\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n maxDistance = MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceCurrentContainerHeight?: boolean,\n) {\n if (forceDirection === FocusDirection.Static) {\n element.scrollIntoView({ block: position });\n\n return;\n }\n\n const { offsetTop } = element;\n\n if (forceDirection === undefined) {\n const offset = offsetTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n container.scrollTop += (offset + maxDistance);\n } else if (offset > maxDistance) {\n container.scrollTop += (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n container.scrollTop = offsetTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\n }\n\n isAnimating = true;\n fastRaf(() => {\n scrollWithJs(container, element, position, margin, forceDuration, forceCurrentContainerHeight);\n });\n}\n\nexport function isAnimatingScroll() {\n return isAnimating;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n forceDuration?: number,\n forceCurrentContainerHeight?: boolean,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const { scrollTop, offsetHeight: containerHeight, scrollHeight } = container;\n const targetContainerHeight = !forceCurrentContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = (elementTop - margin) - scrollTop;\n break;\n case 'end':\n path = (elementTop + elementHeight + margin) - (scrollTop + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementHeight < targetContainerHeight\n ? (elementTop + elementHeight / 2) - (scrollTop + targetContainerHeight / 2)\n : (elementTop - margin) - scrollTop;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollTop;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollTop + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n const target = container.scrollTop + path;\n const duration = forceDuration || (\n MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n dispatchHeavyAnimationEvent(duration);\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollTop = Math.round(target - currentPath);\n\n isAnimating = t < 1;\n\n return isAnimating;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from './Spinner';\n\nimport './Radio.scss';\n\ntype OwnProps = {\n id?: string;\n name: string;\n label: string;\n subLabel?: string;\n value: string;\n checked: boolean;\n disabled?: boolean;\n hidden?: boolean;\n isLoading?: boolean;\n onChange: (e: ChangeEvent) => void;\n};\n\nconst Radio: FC = ({\n id,\n label,\n subLabel,\n value,\n name,\n checked,\n disabled,\n hidden,\n isLoading,\n onChange,\n}) => {\n const lang = useLang();\n const className = buildClassName(\n 'Radio',\n disabled && 'disabled',\n hidden && 'hidden-widget',\n isLoading && 'loading',\n );\n\n return (\n \n );\n};\n\nexport default memo(Radio);\n","import { ChangeEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\n\nimport Radio from './Radio';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n hidden?: boolean;\n};\n\ntype OwnProps = {\n id?: string;\n name: string;\n options: IRadioOption[];\n selected?: string;\n disabled?: boolean;\n loadingOption?: string;\n onChange: (value: string) => void;\n};\n\nconst RadioGroup: FC = ({\n id,\n name,\n options,\n selected,\n disabled,\n loadingOption,\n onChange,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value } = event.currentTarget;\n onChange(value);\n }, [onChange]);\n\n return (\n
\n {options.map((option) => (\n
\n );\n};\n\nexport default memo(RadioGroup);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\nimport { LoadMoreDirection } from '../types';\n\nimport { areSortedArraysEqual } from '../util/iteratees';\nimport useForceUpdate from './useForceUpdate';\nimport usePrevious from './usePrevious';\n\ntype GetMore = (args: { direction: LoadMoreDirection }) => void;\ntype LoadMoreBackwards = (args: { offsetId?: number }) => void;\n\nconst DEFAULT_LIST_SLICE = 30;\n\nexport default (\n loadMoreBackwards?: LoadMoreBackwards,\n listIds?: number[],\n isDisabled = false,\n listSlice = DEFAULT_LIST_SLICE,\n forceFullPreload = false,\n): [number[]?, GetMore?] => {\n const lastParamsRef = useRef<{\n direction?: LoadMoreDirection;\n offsetId?: number;\n }>();\n\n const viewportIdsRef = useRef((() => {\n // Only run once to initialize\n if (!listIds || lastParamsRef.current) {\n return undefined;\n }\n\n const { newViewportIds } = getViewportSlice(listIds, listIds[0], LoadMoreDirection.Forwards, listSlice);\n return newViewportIds;\n })());\n\n const forceUpdate = useForceUpdate();\n\n const prevListIds = usePrevious(listIds);\n const prevIsDisabled = usePrevious(isDisabled);\n if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) {\n const { offsetId = listIds[0], direction = LoadMoreDirection.Forwards } = lastParamsRef.current || {};\n const { newViewportIds } = getViewportSlice(listIds, offsetId, direction, listSlice);\n\n if (!viewportIdsRef.current || !areSortedArraysEqual(viewportIdsRef.current, newViewportIds)) {\n viewportIdsRef.current = newViewportIds;\n }\n }\n\n useEffect(() => {\n if (listIds && !isDisabled && loadMoreBackwards && forceFullPreload) {\n const viewportIds = viewportIdsRef.current!;\n loadMoreBackwards({ offsetId: viewportIds[viewportIds.length - 1] });\n }\n }, [listIds, isDisabled, loadMoreBackwards, forceFullPreload]);\n\n const getMore: GetMore = useCallback(({\n direction,\n noScroll,\n }: { direction: LoadMoreDirection; noScroll?: boolean }) => {\n const viewportIds = viewportIdsRef.current;\n\n const offsetId = viewportIds\n ? direction === LoadMoreDirection.Backwards ? viewportIds[viewportIds.length - 1] : viewportIds[0]\n : undefined;\n\n if (!listIds) {\n if (loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n\n return;\n }\n\n if (!noScroll) {\n lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\n }\n\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(listIds, offsetId, direction, listSlice);\n\n if (areSomeLocal && !(viewportIds && areSortedArraysEqual(viewportIds, newViewportIds))) {\n viewportIdsRef.current = newViewportIds;\n forceUpdate();\n }\n\n if (!areAllLocal && loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n }, [listIds, listSlice, loadMoreBackwards, forceUpdate]);\n\n return isDisabled ? [listIds] : [viewportIdsRef.current, getMore];\n};\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId = 0,\n direction: LoadMoreDirection,\n listSlice: number,\n) {\n const { length } = sourceIds;\n const index = sourceIds.indexOf(offsetId);\n const isForwards = direction === LoadMoreDirection.Forwards;\n const indexForDirection = isForwards ? index : (index + 1) || length;\n const from = Math.max(0, indexForDirection - listSlice);\n const to = indexForDirection + listSlice - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { STICKER_SIZE_TWO_FA } from '../../config';\nimport { getStickerDimensions } from './helpers/mediaDimensions';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './AnimatedEmoji.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n observeIntersection?: ObserveFn;\n isInline?: boolean;\n lastSyncTime?: number;\n};\n\nconst QUALITY = 1;\nconst RESIZE_FACTOR = 0.5;\n\nconst AnimatedEmoji: FC = ({\n sticker, isInline = false, observeIntersection, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isAnimationLoaded, markAnimationLoaded] = useFlag();\n const localMediaHash = `sticker${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl, lastSyncTime);\n const { transitionClassNames } = useTransitionForMedia(previewBlobUrl, 'slow');\n\n const mediaData = useMedia(localMediaHash, !isIntersecting, ApiMediaFormat.Lottie, lastSyncTime);\n const isMediaLoaded = Boolean(mediaData);\n\n const [playKey, setPlayKey] = useState(String(Math.random()));\n const handleClick = useCallback(() => {\n setPlayKey(String(Math.random()));\n }, []);\n\n let width: number;\n if (isInline) {\n width = getStickerDimensions(sticker).width * RESIZE_FACTOR;\n } else {\n width = STICKER_SIZE_TWO_FA;\n }\n\n const style = `width: ${width}px; height: ${width}px;`;\n\n return (\n \n {previewBlobUrl && !isAnimationLoaded && (\n \"\"\n )}\n {isMediaLoaded && (\n \n )}\n \n );\n};\n\nexport default AnimatedEmoji;\n","export default function focusEditableElement(element: HTMLElement, force?: boolean) {\n if (!force && element === document.activeElement) {\n return;\n }\n const selection = window.getSelection()!;\n const range = document.createRange();\n\n if (!element.lastChild || !element.lastChild.nodeValue) {\n element.focus();\n return;\n }\n\n range.setStart(element.lastChild, element.lastChild.nodeValue.length);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\n};\n","export enum SwipeDirection {\n Up,\n Down,\n Left,\n Right,\n}\n\ninterface CaptureOptions {\n onCapture?: (e: MouseEvent | TouchEvent) => void;\n onRelease?: (e: MouseEvent | TouchEvent) => void;\n onDrag?: (\n e: MouseEvent | TouchEvent,\n captureEvent: MouseEvent | TouchEvent,\n params: {\n dragOffsetX: number;\n dragOffsetY: number;\n },\n ) => void;\n onSwipe?: (e: Event, direction: SwipeDirection) => void;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n excludedClosestSelector?: string;\n withCursor?: boolean;\n}\n\n// https://stackoverflow.com/questions/11287877/how-can-i-get-e-offsetx-on-mobile-ipad\n// Android does not have this value, and iOS has it but as read-only\nexport interface RealTouchEvent extends TouchEvent {\n pageX?: number;\n pageY?: number;\n}\n\ntype TSwipeAxis = 'x' | 'y' | undefined;\n\nconst MOVED_THRESHOLD = 15;\nconst SWIPE_THRESHOLD = 50;\n\nexport function captureEvents(element: HTMLElement, options: CaptureOptions) {\n let captureEvent: MouseEvent | RealTouchEvent | undefined;\n let hasMoved = false;\n let currentSwipeAxis: TSwipeAxis;\n\n function onCapture(e: MouseEvent | RealTouchEvent) {\n if (options.excludedClosestSelector && (\n (e.target as HTMLElement).matches(options.excludedClosestSelector)\n || (e.target as HTMLElement).closest(options.excludedClosestSelector)\n )) {\n return;\n }\n\n captureEvent = e;\n\n if (e.type === 'mousedown') {\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onRelease);\n } else if (e.type === 'touchstart') {\n document.addEventListener('touchmove', onMove);\n document.addEventListener('touchend', onRelease);\n document.addEventListener('touchcancel', onRelease);\n\n if ('touches' in e) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n }\n }\n\n document.body.classList.add('no-selection');\n if (options.withCursor) {\n document.body.classList.add('cursor-grabbing');\n }\n\n if (options.onCapture) {\n options.onCapture(e);\n }\n }\n\n function onRelease(e: MouseEvent | TouchEvent) {\n if (captureEvent) {\n if (options.withCursor) {\n document.body.classList.remove('cursor-grabbing');\n }\n document.body.classList.remove('no-selection');\n\n document.removeEventListener('mouseup', onRelease);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchcancel', onRelease);\n document.removeEventListener('touchend', onRelease);\n document.removeEventListener('touchmove', onMove);\n\n captureEvent = undefined;\n\n if (hasMoved) {\n if (options.onRelease) {\n options.onRelease(e);\n }\n } else if (options.onClick) {\n options.onClick(e);\n }\n }\n\n hasMoved = false;\n currentSwipeAxis = undefined;\n }\n\n function onMove(e: MouseEvent | RealTouchEvent) {\n if (captureEvent) {\n if (e.type === 'touchmove' && ('touches' in e)) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n }\n\n const dragOffsetX = e.pageX! - captureEvent.pageX!;\n const dragOffsetY = e.pageY! - captureEvent.pageY!;\n\n if (Math.abs(dragOffsetX) >= MOVED_THRESHOLD || Math.abs(dragOffsetY) >= MOVED_THRESHOLD) {\n hasMoved = true;\n }\n\n if (options.onDrag) {\n e.preventDefault();\n options.onDrag(e, captureEvent, { dragOffsetX, dragOffsetY });\n }\n\n if (options.onSwipe) {\n onSwipe(e, dragOffsetX, dragOffsetY);\n }\n }\n }\n\n function onSwipe(e: Event, dragOffsetX: number, dragOffsetY: number) {\n if (!currentSwipeAxis) {\n const xAbs = Math.abs(dragOffsetX);\n const yAbs = Math.abs(dragOffsetY);\n\n if (dragOffsetX && dragOffsetY) {\n const ratio = Math.max(xAbs, yAbs) / Math.min(xAbs, yAbs);\n // Diagonal swipe\n if (ratio < 2) {\n return;\n }\n }\n\n if (xAbs >= SWIPE_THRESHOLD) {\n currentSwipeAxis = 'x';\n } else if (yAbs >= SWIPE_THRESHOLD) {\n currentSwipeAxis = 'y';\n }\n }\n\n processSwipe(e, currentSwipeAxis, dragOffsetX, dragOffsetY, options.onSwipe!);\n }\n\n element.addEventListener('mousedown', onCapture);\n element.addEventListener('touchstart', onCapture, { passive: true });\n\n return () => {\n element.removeEventListener('mousedown', onCapture);\n element.removeEventListener('touchstart', onCapture);\n };\n}\n\nfunction processSwipe(\n e: Event,\n currentSwipeAxis:TSwipeAxis,\n dragOffsetX: number,\n dragOffsetY: number,\n onSwipe: (e: Event, direction: SwipeDirection) => void,\n) {\n if (currentSwipeAxis === 'x') {\n if (dragOffsetX < 0) {\n onSwipe(e, SwipeDirection.Left);\n } else {\n onSwipe(e, SwipeDirection.Right);\n }\n } else if (currentSwipeAxis === 'y') {\n if (dragOffsetY < 0) {\n onSwipe(e, SwipeDirection.Up);\n } else {\n onSwipe(e, SwipeDirection.Down);\n }\n }\n}\n","import React, { FC } from '../../lib/teact/teact';\n\nimport './VerifiedIcon.scss';\n\nconst VerifiedIcon: FC = () => {\n return (\n \n );\n};\n\nexport default VerifiedIcon;\n","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\n","import usePrevious from './usePrevious';\n\nexport default function useCurrentOrPrev(\n current: T, shouldSkipUndefined = false, shouldForceCurrent = false,\n): T | undefined {\n const prev = usePrevious(current, shouldSkipUndefined);\n\n // eslint-disable-next-line no-null/no-null\n return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev;\n}\n","import { DEBUG } from '../config';\n\nexport default (mediaEl: HTMLMediaElement) => {\n mediaEl.play().catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n });\n};\n","import React, { useCallback, useMemo, useState } from '../lib/teact/teact';\nimport { debounce } from '../util/schedulers';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\n\ntype BufferingEvent = (e: Event | React.SyntheticEvent) => void;\n\nconst MIN_READY_STATE = 3;\n// Avoid flickering when re-mounting previously buffered video\nconst DEBOUNCE = 200;\n\nexport default (noInitiallyBuffered = false) => {\n const [isBuffered, setIsBuffered] = useState(!noInitiallyBuffered);\n const [bufferedProgress, setBufferedProgress] = useState(0);\n\n const setIsBufferedDebounced = useMemo(() => {\n return debounce(setIsBuffered, DEBOUNCE, false, true);\n }, []);\n\n const handleBuffering = useCallback((e) => {\n const media = e.currentTarget as HTMLMediaElement;\n\n if (!isSafariPatchInProgress(media)) {\n if (media.buffered.length) {\n setBufferedProgress(media.buffered.end(0) / media.duration);\n }\n\n setIsBufferedDebounced(media.readyState >= MIN_READY_STATE || media.currentTime > 0);\n }\n }, [setIsBufferedDebounced]);\n\n const bufferingHandlers = {\n onLoadedData: handleBuffering,\n onPlaying: handleBuffering,\n onLoadStart: handleBuffering, // Needed for Safari to start\n onPause: handleBuffering, // Needed for Chrome when seeking\n onTimeUpdate: handleBuffering, // Needed for audio buffering progress\n onProgress: handleBuffering, // Needed for video buffering progress\n };\n\n return {\n isBuffered,\n bufferedProgress,\n bufferingHandlers,\n checkBuffering(element: HTMLMediaElement) {\n setIsBufferedDebounced(element.readyState >= MIN_READY_STATE);\n },\n };\n};\n","import { ApiMessageEntity, ApiMessageEntityTypes, ApiFormattedText } from '../../../../api/types';\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nconst ENTITY_CLASS_BY_NODE_NAME: Record = {\n B: ApiMessageEntityTypes.Bold,\n STRONG: ApiMessageEntityTypes.Bold,\n I: ApiMessageEntityTypes.Italic,\n EM: ApiMessageEntityTypes.Italic,\n U: ApiMessageEntityTypes.Underline,\n S: ApiMessageEntityTypes.Strike,\n STRIKE: ApiMessageEntityTypes.Strike,\n DEL: ApiMessageEntityTypes.Strike,\n CODE: ApiMessageEntityTypes.Code,\n PRE: ApiMessageEntityTypes.Pre,\n BLOCKQUOTE: ApiMessageEntityTypes.Blockquote,\n};\n\nconst MAX_TAG_DEEPNESS = 3;\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default function parseMessageInput(html: string): ApiFormattedText {\n const fragment = document.createElement('div');\n fragment.innerHTML = parseMarkdown(html);\n const text = fragment.innerText.trim().replace(/\\u200b+/g, '').slice(0, MAX_MESSAGE_LENGTH);\n let textIndex = 0;\n let recursionDeepness = 0;\n const entities: ApiMessageEntity[] = [];\n\n function addEntity(node: ChildNode) {\n const { index, entity } = getEntityDataFromNode(node, text, textIndex);\n\n if (entity) {\n textIndex = index;\n entities.push(entity);\n } else if (node.textContent) {\n textIndex += node.textContent.length;\n }\n\n if (node.hasChildNodes() && recursionDeepness <= MAX_TAG_DEEPNESS) {\n recursionDeepness += 1;\n Array.from(node.childNodes).forEach(addEntity);\n }\n }\n\n Array.from(fragment.childNodes).forEach((node) => {\n recursionDeepness = 1;\n addEntity(node);\n });\n\n return {\n text,\n entities: entities.length ? entities : undefined,\n };\n}\n\nfunction parseMarkdown(html: string) {\n let parsedHtml = html.slice(0);\n\n if (!IS_EMOJI_SUPPORTED) {\n // Emojis\n parsedHtml = parsedHtml.replace(/]+alt=\"([^\"]+)\"[^>]*>/gm, '$1');\n } else {\n parsedHtml = parsedHtml.replace(/([^<]*)<\\/span>/g, '$1');\n }\n // Strip redundant tags\n parsedHtml = parsedHtml.replace(/<\\/?span([^>]*)?>/g, '');\n\n // Strip redundant nbsp's\n parsedHtml = parsedHtml.replace(/ /g, ' ');\n\n // Replace
with newline\n parsedHtml = parsedHtml.replace(/]*)?>/g, '\\n');\n\n // Strip redundant
tags\n parsedHtml = parsedHtml.replace(/<\\/div>(\\s*)
/g, '\\n');\n parsedHtml = parsedHtml.replace(/
/g, '\\n');\n parsedHtml = parsedHtml.replace(/<\\/div>/g, '');\n\n // Pre\n parsedHtml = parsedHtml.replace(/^`{3}(.*[\\n\\r][^]*?^)`{3}/gm, '
$1
');\n parsedHtml = parsedHtml.replace(/[`]{3}([^`]+)[`]{3}/g, '
$1
');\n\n // Code\n parsedHtml = parsedHtml.replace(/[`]{1}([^`\\n]+)[`]{1}/g, '$1');\n\n // Other simple markdown\n parsedHtml = parsedHtml.replace(/[*]{2}([^*\\n]+)[*]{2}/g, '$1');\n parsedHtml = parsedHtml.replace(/[*]{1}([^*\\n]+)[*]{1}/g, '$1');\n parsedHtml = parsedHtml.replace(/[~]{2}([^~\\n]+)[~]{2}/g, '$1');\n\n return parsedHtml;\n}\n\nfunction getEntityDataFromNode(\n node: ChildNode,\n rawText: string,\n textIndex: number,\n): { index: number; entity?: ApiMessageEntity } {\n const type = getEntityTypeFromNode(node);\n if (!type || !node.textContent) {\n return {\n index: textIndex,\n entity: undefined,\n };\n }\n\n const rawIndex = rawText.indexOf(node.textContent, textIndex);\n // In some cases, last text entity ends with a newline (which gets trimmed from `rawText`).\n // In this case, `rawIndex` would return `-1`, so we use `textIndex` instead.\n const index = rawIndex >= 0 ? rawIndex : textIndex;\n const offset = rawText.substring(0, index).length;\n const { length } = rawText.substring(index, index + node.textContent.length);\n\n let url: string | undefined;\n let userId: number | undefined;\n if (type === ApiMessageEntityTypes.TextUrl) {\n url = (node as HTMLAnchorElement).href;\n }\n if (type === ApiMessageEntityTypes.MentionName) {\n userId = Number((node as HTMLAnchorElement).dataset.userId);\n }\n\n return {\n index,\n entity: {\n type,\n offset,\n length,\n ...(url && { url }),\n ...(userId && { userId }),\n },\n };\n}\n\nfunction getEntityTypeFromNode(node: ChildNode) {\n if (ENTITY_CLASS_BY_NODE_NAME[node.nodeName]) {\n return ENTITY_CLASS_BY_NODE_NAME[node.nodeName];\n }\n\n if (node.nodeName === 'A') {\n const anchor = node as HTMLAnchorElement;\n if (anchor.dataset.entityType === ApiMessageEntityTypes.MentionName) {\n return ApiMessageEntityTypes.MentionName;\n }\n if (anchor.href.startsWith('mailto:')) {\n return ApiMessageEntityTypes.Email;\n }\n if (anchor.href.startsWith('tel:')) {\n return ApiMessageEntityTypes.Phone;\n }\n if (anchor.href !== anchor.textContent) {\n return ApiMessageEntityTypes.TextUrl;\n }\n\n return ApiMessageEntityTypes.Url;\n }\n\n if (node.nodeName === 'SPAN') {\n return (node as HTMLElement).dataset.entityType;\n }\n\n return undefined;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport './DropTarget.scss';\n\nexport type OwnProps = {\n isQuick?: boolean;\n onFileSelect: (e: React.DragEvent) => void;\n};\n\nconst DropTarget: FC = ({ isQuick, onFileSelect }) => {\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n\n const handleDragEnter = () => { markHovered(); };\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget } = e;\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const className = buildClassName(\n 'DropTarget',\n isHovered && 'hovered',\n );\n\n return (\n \n
\n
\n
Drop files here to send them
\n
{isQuick ? 'in a quick way' : 'without compression'}
\n
\n
\n );\n};\n\nexport default memo(DropTarget);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport DropTarget from './DropTarget';\n\nimport './DropArea.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n withQuick?: boolean;\n onHide: NoneToVoidFunction;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n};\n\nexport enum DropAreaState {\n None = 'none',\n Document = 'document',\n QuickFile = 'quick_file',\n}\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst DropArea: FC = ({\n isOpen, withQuick, onHide, onFileSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevWithQuick = usePrevious(withQuick);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onHide) : undefined), [isOpen, onHide]);\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), false);\n }\n }, [onFileSelect, onHide]);\n\n const handleQuickFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), true);\n }\n }, [onFileSelect, onHide]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.stopPropagation();\n\n const { target: fromTarget, relatedTarget: toTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.DropTarget, .DropArea') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(() => {\n onHide();\n }, DROP_LEAVE_TIMEOUT_MS);\n }\n }, [onHide]);\n\n const handleDragOver = () => {\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n };\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'DropArea',\n transitionClassNames,\n );\n\n return (\n
\n \n {(withQuick || prevWithQuick) && }\n
\n );\n};\n\nexport default memo(DropArea);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport { getChatTitle, getUserFirstOrLastName, isChatPrivate } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\n\nimport './PickerSelectedItem.scss';\n\ntype OwnProps = {\n chatOrUserId?: number;\n icon?: string;\n title?: string;\n isMinimized?: boolean;\n canClose?: boolean;\n onClick: (arg: any) => void;\n clickArg: any;\n className?: string;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n user?: ApiUser;\n};\n\nconst PickerSelectedItem: FC = ({\n icon,\n title,\n isMinimized,\n canClose,\n onClick,\n clickArg,\n chat,\n user,\n className,\n}) => {\n const lang = useLang();\n\n let iconElement: any;\n let titleText: any;\n\n if (icon && title) {\n iconElement = (\n
\n \n
\n );\n\n titleText = title;\n } else if (chat || user) {\n iconElement = (\n \n );\n\n const name = !chat || (user && !user.isSelf)\n ? getUserFirstOrLastName(user)\n : getChatTitle(lang, chat, user);\n\n titleText = name ? renderText(name) : undefined;\n }\n\n const fullClassName = buildClassName(\n 'PickerSelectedItem',\n className,\n isMinimized && 'minimized',\n canClose && 'closeable',\n );\n\n return (\n onClick(clickArg)}\n title={isMinimized ? titleText : undefined}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n {iconElement}\n {!isMinimized && (\n
\n {titleText}\n
\n )}\n {canClose && (\n
\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n if (!chatOrUserId) {\n return {};\n }\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isChatPrivate(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n\n return {\n chat,\n user,\n };\n },\n)(PickerSelectedItem));\n","import { fastRaf } from './schedulers';\nimport { animate } from './animation';\nimport { IS_IOS } from './environment';\n\nconst DURATION = 450;\n\nexport default function fastSmoothScrollHorizontal(container: HTMLElement, left: number) {\n // Native way seems to be smoother in Chrome\n if (!IS_IOS) {\n container.scrollTo({ left, behavior: 'smooth' });\n } else {\n fastRaf(() => {\n scrollWithJs(container, left);\n });\n }\n}\n\nfunction scrollWithJs(container: HTMLElement, left: number) {\n const { scrollLeft, offsetWidth: containerWidth, scrollWidth } = container;\n let path = left - scrollLeft;\n\n if (path < 0) {\n const remainingPath = -scrollLeft;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollWidth - (scrollLeft + containerWidth);\n path = Math.min(path, remainingPath);\n }\n\n const target = container.scrollLeft + path;\n const startAt = Date.now();\n\n animate(() => {\n const t = Math.min((Date.now() - startAt) / DURATION, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollLeft = Math.round(target - currentPath);\n\n return t < 1;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (container: HTMLElement | null, isDisabled?: boolean) => {\n useEffect(() => {\n if (!container) {\n return undefined;\n }\n\n function handleScroll(e: WheelEvent) {\n // Ignore horizontal scroll and let it work natively (e.g. on touchpad)\n if (!e.deltaX) {\n container!.scrollLeft += e.deltaY / 4;\n }\n }\n\n container.addEventListener('wheel', handleScroll, { passive: true });\n\n return () => {\n container.removeEventListener('wheel', handleScroll);\n };\n }, [container, isDisabled]);\n};\n","import { useEffect, useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiMessage } from '../api/types';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (\n chatId: number,\n messageId?: number,\n message?: ApiMessage,\n replyOriginForId?: number,\n) => {\n const { loadMessage } = getDispatch();\n const loadMessageThrottled = useMemo(() => {\n const throttled = throttle(loadMessage, 500, true);\n return () => {\n throttled({ chatId, messageId, replyOriginForId });\n };\n }, [loadMessage, chatId, messageId, replyOriginForId]);\n\n useEffect(() => {\n if (messageId && !message) {\n loadMessageThrottled();\n }\n });\n};\n","import { RefObject } from 'react';\nimport { useState, useEffect, useCallback } from '../lib/teact/teact';\n\nimport { IAnchorPosition } from '../types';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../util/environment';\n\nconst LONG_TAP_DURATION_MS = 250;\nconst SELECTION_ANIMATION_DURATION_MS = 200;\n\nlet contextMenuCounter = 0;\n\nfunction checkIsDisabledForMobile() {\n return IS_MOBILE_SCREEN\n && window.document.body.classList.contains('enable-symbol-menu-transforms');\n}\n\nexport default (\n elementRef: RefObject,\n isMenuDisabled?: boolean,\n shouldDisableOnLink?: boolean,\n) => {\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuPosition, setContextMenuPosition] = useState(undefined);\n\n const handleBeforeContextMenu = useCallback((e: React.MouseEvent) => {\n if (!isMenuDisabled && e.button === 2) {\n document.body.classList.add('no-selection');\n }\n }, [isMenuDisabled]);\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n document.body.classList.remove('no-selection');\n\n if (isMenuDisabled || (shouldDisableOnLink && (e.target as HTMLElement).matches('a.text-entity-link[href]'))) {\n return;\n }\n e.preventDefault();\n\n if (contextMenuPosition) {\n return;\n }\n document.body.classList.remove('no-selection');\n if (contextMenuCounter === 0) {\n document.body.classList.add('has-context-menu');\n }\n contextMenuCounter++;\n\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: e.clientX, y: e.clientY });\n }, [isMenuDisabled, shouldDisableOnLink, contextMenuPosition]);\n\n const handleContextMenuClose = useCallback(() => {\n setIsContextMenuOpen(false);\n }, []);\n\n const handleContextMenuHide = useCallback(() => {\n setContextMenuPosition(undefined);\n document.body.classList.remove('no-selection');\n\n setTimeout(() => {\n contextMenuCounter--;\n if (contextMenuCounter === 0) {\n document.body.classList.remove('has-context-menu');\n }\n }, SELECTION_ANIMATION_DURATION_MS);\n }, []);\n\n // Support context menu on touch-devices\n useEffect(() => {\n if (isMenuDisabled || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (!element) {\n return undefined;\n }\n\n let timer: number | undefined;\n\n const clearLongPressTimer = () => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const emulateContextMenuEvent = (originalEvent: TouchEvent) => {\n clearLongPressTimer();\n\n const { clientX, clientY } = originalEvent.touches[0];\n\n if (contextMenuPosition) {\n return;\n }\n\n // temporarily intercept and clear the next click\n element.addEventListener('touchend', function cancelClickOnce(e) {\n element.removeEventListener('touchend', cancelClickOnce, true);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n }, true);\n\n document.body.classList.add('no-selection');\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: clientX, y: clientY });\n };\n\n const startLongPressTimer = (e: TouchEvent) => {\n if (isMenuDisabled || checkIsDisabledForMobile()) {\n return;\n }\n clearLongPressTimer();\n\n timer = window.setTimeout(() => emulateContextMenuEvent(e), LONG_TAP_DURATION_MS);\n };\n\n // @perf Consider event delegation\n element.addEventListener('touchstart', startLongPressTimer, { passive: true });\n element.addEventListener('touchcancel', clearLongPressTimer, true);\n element.addEventListener('touchend', clearLongPressTimer, true);\n element.addEventListener('touchmove', clearLongPressTimer, { passive: true });\n\n return () => {\n clearLongPressTimer();\n element.removeEventListener('touchstart', startLongPressTimer);\n element.removeEventListener('touchcancel', clearLongPressTimer, true);\n element.removeEventListener('touchend', clearLongPressTimer, true);\n element.removeEventListener('touchmove', clearLongPressTimer);\n };\n }, [contextMenuPosition, isMenuDisabled, elementRef]);\n\n return {\n isContextMenuOpen,\n contextMenuPosition,\n handleBeforeContextMenu,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n };\n};\n","import { MouseEvent } from 'react';\nimport React from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMessageEntity, ApiMessageEntityTypes, ApiMessage } from '../../../api/types';\n\nimport { getMessageText } from '../../../modules/helpers';\nimport renderText from './renderText';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\nexport type TextPart = string | Element;\n\nexport function renderMessageText(message: ApiMessage, highlight?: string, shouldRenderHqEmoji?: boolean) {\n const formattedText = message.content.text;\n\n if (!formattedText || !formattedText.text) {\n const rawText = getMessageText(message);\n return rawText ? [rawText] : undefined;\n }\n const { text, entities } = formattedText;\n\n return renderTextWithEntities(text, entities, highlight, shouldRenderHqEmoji);\n}\n\ninterface IOrganizedEntity {\n entity: ApiMessageEntity;\n organizedIndexes: Set;\n nestedEntities: IOrganizedEntity[];\n}\n\nfunction organizeEntity(\n entity: ApiMessageEntity,\n index: number,\n entities: ApiMessageEntity[],\n organizedEntityIndexes: Set,\n): IOrganizedEntity | undefined {\n const { offset, length } = entity;\n const organizedIndexes = new Set([index]);\n\n if (organizedEntityIndexes.has(index)) {\n return undefined;\n }\n\n // Determine any nested entities inside current entity\n const nestedEntities = entities\n .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length)\n .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes))\n .filter(Boolean as any);\n\n nestedEntities.forEach((e) => e.organizedIndexes.forEach((i) => organizedIndexes.add(i)));\n\n return {\n entity,\n organizedIndexes,\n nestedEntities,\n };\n}\n\n// Organize entities in a tree-like structure to better represent how the text will be displayed\nfunction organizeEntities(entities: ApiMessageEntity[]) {\n const organizedEntityIndexes: Set = new Set();\n const organizedEntities: IOrganizedEntity[] = [];\n\n entities.forEach((entity, index) => {\n if (organizedEntityIndexes.has(index)) {\n return;\n }\n\n const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes);\n if (organizedEntity) {\n organizedEntity.organizedIndexes.forEach((organizedIndex) => {\n organizedEntityIndexes.add(organizedIndex);\n });\n\n organizedEntities.push(organizedEntity);\n }\n });\n\n return organizedEntities;\n}\n\nexport function renderTextWithEntities(\n text: string,\n entities?: ApiMessageEntity[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (!entities || !entities.length) {\n return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml);\n }\n\n const result: TextPart[] = [];\n let deleteLineBreakAfterPre = false;\n\n const organizedEntites = organizeEntities(entities);\n\n // Recursive function to render regular and nested entities\n function renderEntity(\n textPartStart: number,\n textPartEnd: number,\n organizedEntity: IOrganizedEntity,\n isLastEntity: boolean,\n ) {\n const renderResult: TextPart[] = [];\n const { entity, nestedEntities } = organizedEntity;\n const { offset, length, type } = entity;\n\n // Render text before the entity\n let textBefore = text.substring(textPartStart, offset);\n const textBeforeLength = textBefore.length;\n if (textBefore) {\n if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\\n') {\n textBefore = textBefore.substr(1);\n deleteLineBreakAfterPre = false;\n }\n if (textBefore) {\n renderResult.push(...renderMessagePart(\n textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n const entityStartIndex = textPartStart + textBeforeLength;\n const entityEndIndex = entityStartIndex + length;\n\n let entityContent: TextPart = text.substring(offset, offset + length);\n const nestedEntityContent: TextPart[] = [];\n\n if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\\n') {\n entityContent = entityContent.substr(1);\n deleteLineBreakAfterPre = false;\n }\n\n if (type === ApiMessageEntityTypes.Pre) {\n deleteLineBreakAfterPre = true;\n }\n\n // Render nested entities, if any\n if (nestedEntities.length) {\n let nestedIndex = entityStartIndex;\n\n nestedEntities.forEach((nestedEntity, nestedEntityIndex) => {\n const {\n renderResult: nestedResult,\n entityEndIndex: nestedEntityEndIndex,\n } = renderEntity(\n nestedIndex,\n entityEndIndex,\n nestedEntity,\n nestedEntityIndex === nestedEntities.length - 1,\n );\n\n nestedEntityContent.push(...nestedResult);\n nestedIndex = nestedEntityEndIndex;\n });\n }\n\n // Render the entity itself\n const newEntity = shouldRenderAsHtml\n ? processEntityAsHtml(entity, entityContent, nestedEntityContent)\n : processEntity(entity, entityContent, nestedEntityContent);\n\n if (Array.isArray(newEntity)) {\n renderResult.push(...newEntity);\n } else {\n renderResult.push(newEntity);\n }\n\n // Render text after the entity, if it is the last entity in the text,\n // or the last nested entity inside of another entity\n if (isLastEntity && entityEndIndex < textPartEnd) {\n let textAfter = text.substring(entityEndIndex, textPartEnd);\n if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\\n') {\n textAfter = textAfter.substring(1);\n }\n if (textAfter) {\n renderResult.push(...renderMessagePart(\n textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n return {\n renderResult,\n entityEndIndex,\n };\n }\n\n // Process highest-level entities\n let index = 0;\n\n organizedEntites.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntites.length - 1,\n );\n\n result.push(...renderResult);\n index = entityEndIndex;\n });\n\n return result;\n}\n\nfunction processEntity(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const entityText = typeof entityContent === 'string' && entityContent;\n const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent;\n\n if (!entityText) {\n return renderMessagePart(renderedContent);\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Blockquote:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.BotCommand:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Hashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Cashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Code:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Email:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Italic:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.MentionName:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Mention:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Phone:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Pre:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.Strike:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.TextUrl:\n case ApiMessageEntityTypes.Url:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Underline:\n return {renderMessagePart(renderedContent)};\n default:\n return renderMessagePart(renderedContent);\n }\n}\n\nfunction renderMessagePart(\n content: TextPart | TextPart[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (Array.isArray(content)) {\n const result: TextPart[] = [];\n\n content.forEach((c) => {\n result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml));\n });\n\n return result;\n }\n\n if (shouldRenderAsHtml) {\n return renderText(content, ['escape_html', 'emoji_html', 'br_html']);\n }\n\n const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji';\n\n if (highlight) {\n return renderText(content, [emojiFilter, 'br', 'highlight'], { highlight });\n } else {\n return renderText(content, [emojiFilter, 'br']);\n }\n}\n\nfunction getLinkUrl(entityContent: string, entity: ApiMessageEntity) {\n const { type, url } = entity;\n return type === ApiMessageEntityTypes.TextUrl && url ? url : entityContent;\n}\n\nfunction handleBotCommandClick(e: MouseEvent) {\n getDispatch().sendBotCommand({ command: e.currentTarget.innerText });\n}\n\nfunction handleHashtagClick(e: MouseEvent) {\n getDispatch().setLocalTextSearchQuery({ query: e.currentTarget.innerText });\n getDispatch().searchTextMessagesLocal();\n}\n\nfunction processEntityAsHtml(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const rawEntityText = typeof entityContent === 'string' && entityContent;\n\n const renderedContent = nestedEntityContent.length\n ? nestedEntityContent.join('')\n : renderText(entityContent, ['emoji_html', 'br_html']).join('');\n\n if (!rawEntityText) {\n return renderedContent;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Italic:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Underline:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Code:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Pre:\n return `\\`\\`\\`
${renderedContent}
\\`\\`\\``;\n case ApiMessageEntityTypes.Strike:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.MentionName:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Url:\n case ApiMessageEntityTypes.TextUrl:\n return `${renderedContent}`;\n default:\n return renderedContent;\n }\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\nimport { fastRaf } from '../util/schedulers';\n\n// Fix for memory leak when unmounting video element\nexport default function useVideoCleanup(videoRef: RefObject, dependencies: any[]) {\n useEffect(() => {\n const videoEl = videoRef.current;\n\n return () => {\n if (videoEl) {\n fastRaf(() => {\n videoEl.pause();\n videoEl.src = '';\n videoEl.load();\n });\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n}\n","import { DEBUG } from '../config';\n\nexport const CLIPBOARD_ITEM_SUPPORTED = navigator.clipboard && window.ClipboardItem;\n\nconst textCopyEl = document.createElement('textarea');\ntextCopyEl.setAttribute('readonly', '');\ntextCopyEl.tabIndex = -1;\ntextCopyEl.className = 'visually-hidden';\n\nexport const copyTextToClipboard = (str: string): void => {\n textCopyEl.value = str;\n document.body.appendChild(textCopyEl);\n const selection = document.getSelection();\n\n if (selection) {\n // Store previous selection\n const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0);\n textCopyEl.select();\n document.execCommand('copy');\n // Restore the original selection\n if (rangeToRestore) {\n selection.removeAllRanges();\n selection.addRange(rangeToRestore);\n }\n }\n\n document.body.removeChild(textCopyEl);\n};\n\nexport const copyImageToClipboard = (imageUrl: string) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = new Image();\n imageEl.onload = (e: Event) => {\n if (ctx && e.currentTarget) {\n const img = e.currentTarget as HTMLImageElement;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n canvas.toBlob(copyBlobToClipboard, 'image/png', 1);\n }\n };\n\n imageEl.src = imageUrl;\n};\n\nasync function copyBlobToClipboard(pngBlob: Blob | null) {\n if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) {\n return;\n }\n\n try {\n await navigator.clipboard.write([\n new window.ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","import { RefObject } from 'react';\nimport React, {\n FC, useRef, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from './Loading';\nimport Button from './Button';\n\nimport './SearchInput.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n children?: any;\n parentContainerClassName?: string;\n className?: string;\n inputId?: string;\n value?: string;\n focused?: boolean;\n isLoading?: boolean;\n placeholder?: string;\n disabled?: boolean;\n autoComplete?: string;\n canClose?: boolean;\n onChange: (value: string) => void;\n onReset?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n onBlur?: NoneToVoidFunction;\n};\n\nconst SearchInput: FC = ({\n ref,\n children,\n parentContainerClassName,\n value,\n inputId,\n className,\n focused,\n isLoading,\n placeholder,\n disabled,\n autoComplete,\n canClose,\n onChange,\n onReset,\n onFocus,\n onBlur,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let inputRef = useRef(null);\n if (ref) {\n inputRef = ref;\n }\n\n const [isInputFocused, markInputFocused, unmarkInputFocused] = useFlag(focused);\n\n useEffect(() => {\n if (!inputRef.current) {\n return;\n }\n\n if (focused) {\n inputRef.current.focus();\n } else {\n inputRef.current.blur();\n }\n }, [focused, placeholder]); // Trick for setting focus when selecting a contact to search for\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n onChange(currentTarget.value);\n }\n\n function handleFocus() {\n markInputFocused();\n if (onFocus) {\n onFocus();\n }\n }\n\n function handleBlur() {\n unmarkInputFocused();\n if (onBlur) {\n onBlur();\n }\n }\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n const element = document.querySelector(`.${parentContainerClassName} .ListItem-button`) as HTMLElement;\n if (element) {\n element.focus();\n }\n }\n }, [parentContainerClassName]);\n\n return (\n \n {children}\n \n \n {isLoading && (\n \n )}\n {!isLoading && (value || canClose) && onReset && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SearchInput);\n","import { IS_IOS } from './environment';\n\nexport default (container: HTMLDivElement, scrollTop?: number) => {\n if (IS_IOS) {\n container.style.overflow = 'hidden';\n }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n if (IS_IOS) {\n container.style.overflow = '';\n }\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\n\nimport { selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './TypingStatus.scss';\n\ntype OwnProps = {\n typingStatus: ApiTypingStatus;\n};\n\ntype StateProps = {\n typingUser?: ApiUser;\n};\n\nconst TypingStatus: FC = ({ typingStatus, typingUser }) => {\n const lang = useLang();\n const typingUserName = typingUser && !typingUser.isSelf && getUserFirstOrLastName(typingUser);\n\n return (\n

\n {typingUserName && (\n {renderText(typingUserName)}\n )}\n {/* fix for translation \"username _is_ typing\" */}\n {lang(typingStatus.action).replace('{user}', '').trim()}\n \n

\n );\n};\n\nexport default memo(withGlobal(\n (global, { typingStatus }): StateProps => {\n if (!typingStatus.userId) {\n return {};\n }\n\n const typingUser = selectUser(global, typingStatus.userId);\n\n return { typingUser };\n },\n)(TypingStatus));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n getChatTitle,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Avatar from './Avatar';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './DeleteChatModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n chat: ApiChat;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isChatWithSelf?: boolean;\n isPrivateChat: boolean;\n isBasicGroup: boolean;\n isSuperGroup: boolean;\n canDeleteForAll?: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteChatModal: FC = ({\n isOpen,\n chat,\n isChannel,\n isPrivateChat,\n isChatWithSelf,\n isBasicGroup,\n isSuperGroup,\n canDeleteForAll,\n contactName,\n onClose,\n leaveChannel,\n deleteHistory,\n deleteChannel,\n}) => {\n const lang = useLang();\n const chatTitle = getChatTitle(lang, chat);\n\n const handleDeleteMessageForAll = useCallback(() => {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });\n\n onClose();\n }, [deleteHistory, chat.id, onClose]);\n\n const handleDeleteChat = useCallback(() => {\n if (isPrivateChat || isBasicGroup) {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if ((isChannel || isSuperGroup) && !chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else if ((isChannel || isSuperGroup) && chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n }\n onClose();\n }, [\n isPrivateChat,\n isBasicGroup,\n isChannel,\n isSuperGroup,\n chat.isCreator,\n chat.id,\n onClose,\n deleteHistory,\n leaveChannel,\n deleteChannel,\n ]);\n\n function renderHeader() {\n return (\n
\n \n

{lang(renderTitle())}

\n
\n );\n }\n\n function renderTitle() {\n if (isChannel && !chat.isCreator) {\n return 'LeaveChannel';\n }\n\n if (isChannel && chat.isCreator) {\n return 'ChannelDelete';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Group.LeaveGroup';\n }\n\n return 'DeleteChatUser';\n }\n\n function renderMessage() {\n if (isChannel && chat.isCreator) {\n return

{renderText(lang('ChatList.DeleteAndLeaveGroupConfirmation', chatTitle), ['simple_markdown'])}

;\n }\n\n if ((isChannel && !chat.isCreator) || isBasicGroup || isSuperGroup) {\n return

{renderText(lang('ChannelLeaveAlertWithName', chatTitle), ['simple_markdown'])}

;\n }\n\n return

{renderText(lang('ChatList.DeleteChatConfirmation', contactName), ['simple_markdown'])}

;\n }\n\n function renderActionText() {\n if (isChannel && !chat.isCreator) {\n return 'LeaveChannel';\n }\n if (isChannel && chat.isCreator) {\n return 'Chat.Input.Delete';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Group.LeaveGroup';\n }\n\n return canDeleteForAll ? 'ChatList.DeleteForCurrentUser' : 'Delete';\n }\n\n return (\n \n {renderMessage()}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chat }): StateProps => {\n const isPrivateChat = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, chat.id);\n const canDeleteForAll = (isPrivateChat && !isChatWithSelf);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel: isChatChannel(chat),\n isBasicGroup: isChatBasicGroup(chat),\n isSuperGroup: isChatSuperGroup(chat),\n canDeleteForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['leaveChannel', 'deleteHistory', 'deleteChannel']),\n)(DeleteChatModal));\n","/*\n * Thanks to Ace Monkey for this mind-blowing patch.\n */\n\nexport function patchSafariProgressiveAudio(audioEl: HTMLAudioElement) {\n if (audioEl.dataset.patchedForSafari) {\n return;\n }\n\n audioEl.addEventListener('play', () => {\n const t = audioEl.currentTime;\n\n function onProgress() {\n if (!audioEl.buffered.length) {\n return;\n }\n\n audioEl.dataset.patchForSafariInProgress = 'true';\n audioEl.currentTime = audioEl.duration - 1;\n audioEl.addEventListener('progress', () => {\n delete audioEl.dataset.patchForSafariInProgress;\n audioEl.currentTime = t;\n if (audioEl.paused) {\n audioEl.play();\n }\n }, { once: true });\n\n audioEl.removeEventListener('progress', onProgress);\n }\n\n audioEl.addEventListener('progress', onProgress);\n }, { once: true });\n\n audioEl.dataset.patchedForSafari = 'true';\n}\n\nexport function isSafariPatchInProgress(audioEl: HTMLAudioElement) {\n return Boolean(audioEl.dataset.patchForSafariInProgress);\n}\n","import { useLayoutEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n return useLayoutEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n};\n","import React, {\n FC, useCallback, useEffect, useState, memo, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getDocumentExtension, getDocumentHasPreview } from './helpers/documentInfo';\nimport { getMediaTransferState, getMessageMediaHash, getMessageMediaThumbDataUri } from '../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../hooks/useMedia';\nimport download from '../../util/download';\n\nimport File from './File';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n smaller?: boolean;\n isSelected?: boolean;\n isSelectable?: boolean;\n uploadProgress?: number;\n withDate?: boolean;\n datetime?: number;\n className?: string;\n sender?: string;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: number) => void;\n};\n\nconst Document: FC = ({\n message,\n observeIntersection,\n smaller,\n uploadProgress,\n withDate,\n datetime,\n className,\n sender,\n isSelected,\n isSelectable,\n onCancelUpload,\n onDateClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const document = message.content.document!;\n const extension = getDocumentExtension(document) || '';\n const { fileName, size, timestamp } = document;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, 'download'), !isDownloadAllowed);\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, isDownloadAllowed);\n\n const hasPreview = getDocumentHasPreview(document);\n const thumbDataUri = hasPreview ? getMessageMediaThumbDataUri(message) : undefined;\n const localBlobUrl = hasPreview ? document.previewBlobUrl : undefined;\n const previewData = useMedia(getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [isUploading, onCancelUpload]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n useEffect(() => {\n if (isDownloadAllowed && mediaData) {\n download(mediaData, fileName);\n setIsDownloadAllowed(false);\n }\n }, [fileName, mediaData, isDownloadAllowed]);\n\n return (\n \n );\n};\n\nexport default memo(Document);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './StickerSetModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst StickerSetModalAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerSetModal = useModuleLoader(Bundles.Extra, 'StickerSetModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSetModal ? : undefined;\n};\n\nexport default memo(StickerSetModalAsync);\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useForceUpdate from './useForceUpdate';\nimport { IS_CANVAS_FILTER_SUPPORTED } from '../util/environment';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useCanvasBlur(dataUri?: string, isDisabled = false, withRaf?: boolean) {\n // eslint-disable-next-line no-null/no-null\n const canvasRef = useRef(null);\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n const canvas = canvasRef.current;\n\n if (!dataUri || !canvas || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n const processBlur = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', { alpha: false })!;\n\n if (IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${RADIUS}px)`;\n }\n\n ctx.drawImage(img, -RADIUS * 2, -RADIUS * 2, canvas.width + RADIUS * 4, canvas.height + RADIUS * 4);\n\n if (!IS_CANVAS_FILTER_SUPPORTED) {\n fastBlur(ctx, 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n }\n };\n\n img.onload = () => {\n if (withRaf) {\n requestAnimationFrame(processBlur);\n } else {\n processBlur();\n }\n };\n\n img.src = dataUri;\n }, [canvasRef, dataUri, forceUpdate, isDisabled, withRaf]);\n\n return canvasRef;\n}\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n/* eslint-disable no-multi-assign */\n/* eslint-disable no-cond-assign */\n/* eslint-disable no-param-reassign */\n/* eslint-disable prefer-const */\n/* eslint-disable eqeqeq */\n\n/*\nSuperfast Blur - a fast Box Blur For Canvas\n\nVersion: 0.5\nAuthor: Mario Klingemann\nContact: mario@quasimondo.com\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\nTwitter: @quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr:\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2011 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// eslint-disable-next-line max-len\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\n// eslint-disable-next-line max-len\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\n\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\n if (Number.isNaN(radius) || radius < 1) return;\n\n radius |= 0;\n\n if (Number.isNaN(iterations)) iterations = 1;\n iterations |= 0;\n if (iterations > 3) iterations = 3;\n if (iterations < 1) iterations = 1;\n\n const imageData = context.getImageData(top_x, top_y, width, height);\n\n const pixels = imageData.data;\n\n let rsum;\n let gsum;\n let bsum;\n let x;\n let y;\n let i;\n let p;\n let p1;\n let p2;\n let yp;\n let yi;\n let yw;\n let wm = width - 1;\n let hm = height - 1;\n let rad1 = radius + 1;\n\n let r = [];\n let g = [];\n let b = [];\n\n let mul_sum = mul_table[radius];\n let shg_sum = shg_table[radius];\n\n let vmin = [];\n let vmax = [];\n\n while (iterations-- > 0) {\n yw = yi = 0;\n\n for (y = 0; y < height; y++) {\n rsum = pixels[yw] * rad1;\n gsum = pixels[yw + 1] * rad1;\n bsum = pixels[yw + 2] * rad1;\n\n for (i = 1; i <= radius; i++) {\n p = yw + (((i > wm ? wm : i)) << 2);\n rsum += pixels[p++];\n gsum += pixels[p++];\n bsum += pixels[p++];\n }\n\n for (x = 0; x < width; x++) {\n r[yi] = rsum;\n g[yi] = gsum;\n b[yi] = bsum;\n\n if (y == 0) {\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\n }\n\n p1 = yw + vmin[x];\n p2 = yw + vmax[x];\n\n rsum += pixels[p1++] - pixels[p2++];\n gsum += pixels[p1++] - pixels[p2++];\n bsum += pixels[p1++] - pixels[p2++];\n\n yi++;\n }\n yw += (width << 2);\n }\n\n for (x = 0; x < width; x++) {\n yp = x;\n rsum = r[yp] * rad1;\n gsum = g[yp] * rad1;\n bsum = b[yp] * rad1;\n\n for (i = 1; i <= radius; i++) {\n yp += (i > hm ? 0 : width);\n rsum += r[yp];\n gsum += g[yp];\n bsum += b[yp];\n }\n\n yi = x << 2;\n for (y = 0; y < height; y++) {\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\n\n if (x == 0) {\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\n }\n\n p1 = x + vmin[y];\n p2 = x + vmax[y];\n\n rsum += r[p1] - r[p2];\n gsum += g[p1] - g[p2];\n bsum += b[p1] - b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n context.putImageData(imageData, top_x, top_y);\n}\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IAnchorPosition } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useVirtualBackdrop from '../../../hooks/useVirtualBackdrop';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\nimport './TextFormatter.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n anchorPosition?: IAnchorPosition;\n selectedRange?: Range;\n onClose: () => void;\n};\n\ninterface ISelectedTextFormats {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n monospace?: boolean;\n}\n\nconst TEXT_FORMAT_BY_TAG_NAME: Record = {\n B: 'bold',\n STRONG: 'bold',\n I: 'italic',\n EM: 'italic',\n U: 'underline',\n DEL: 'strikethrough',\n CODE: 'monospace',\n};\n\nconst TextFormatter: FC = ({\n isOpen,\n anchorPosition,\n selectedRange,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const linkUrlInputRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n const [isLinkControlOpen, openLinkControl, closeLinkControl] = useFlag();\n const [linkUrl, setLinkUrl] = useState('');\n const [isEditingLink, setIsEditingLink] = useState(false);\n const [inputClassName, setInputClassName] = useState();\n const [selectedTextFormats, setSelectedTextFormats] = useState({});\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\n useVirtualBackdrop(\n isOpen,\n containerRef,\n onClose,\n );\n\n useEffect(() => {\n if (isLinkControlOpen) {\n linkUrlInputRef.current!.focus();\n } else {\n setLinkUrl('');\n setIsEditingLink(false);\n }\n }, [isLinkControlOpen]);\n\n useEffect(() => {\n if (!shouldRender) {\n closeLinkControl();\n setSelectedTextFormats({});\n setInputClassName(undefined);\n }\n }, [closeLinkControl, shouldRender]);\n\n useEffect(() => {\n if (!isOpen || !selectedRange) {\n return;\n }\n\n const selectedFormats: ISelectedTextFormats = {};\n let { parentElement } = selectedRange.commonAncestorContainer;\n while (parentElement && parentElement.id !== EDITABLE_INPUT_ID) {\n const textFormat = TEXT_FORMAT_BY_TAG_NAME[parentElement.tagName];\n if (textFormat) {\n selectedFormats[textFormat] = true;\n }\n\n parentElement = parentElement.parentElement;\n }\n\n setSelectedTextFormats(selectedFormats);\n }, [isOpen, selectedRange, openLinkControl]);\n\n function restoreSelection() {\n if (!selectedRange) {\n return;\n }\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(selectedRange);\n }\n }\n\n const getSelectedText = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.toString();\n }, [selectedRange]);\n\n const getSelectedElement = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.commonAncestorContainer.parentElement;\n }, [selectedRange]);\n\n function updateInputStyles() {\n const input = linkUrlInputRef.current;\n if (!input) {\n return;\n }\n\n const { offsetWidth, scrollWidth, scrollLeft } = input;\n if (scrollWidth <= offsetWidth) {\n setInputClassName(undefined);\n return;\n }\n\n let className = '';\n if (scrollLeft < scrollWidth - offsetWidth) {\n className = 'mask-right';\n }\n if (scrollLeft > 0) {\n className += ' mask-left';\n }\n\n setInputClassName(className);\n }\n\n function handleLinkUrlChange(e: React.ChangeEvent) {\n setLinkUrl(e.target.value);\n updateInputStyles();\n }\n\n function getFormatButtonClassName(key: keyof ISelectedTextFormats) {\n if (selectedTextFormats[key]) {\n return 'active';\n }\n\n if (key === 'monospace' || key === 'strikethrough') {\n if (Object.keys(selectedTextFormats).some(\n (fKey) => fKey !== key && !!selectedTextFormats[fKey as keyof ISelectedTextFormats],\n )) {\n return 'disabled';\n }\n } else if (selectedTextFormats.monospace || selectedTextFormats.strikethrough) {\n return 'disabled';\n }\n\n return undefined;\n }\n\n const handleBoldText = useCallback(() => {\n setSelectedTextFormats((selectedFormats) => {\n // Somehow re-applying 'bold' command to already bold text doesn't work\n document.execCommand(selectedFormats.bold ? 'removeFormat' : 'bold');\n Object.keys(selectedFormats).forEach((key) => {\n if ((key === 'italic' || key === 'underline') && !!selectedFormats[key]) {\n document.execCommand(key);\n }\n });\n\n return {\n ...selectedFormats,\n bold: !selectedFormats.bold,\n };\n });\n }, []);\n\n const handleItalicText = useCallback(() => {\n document.execCommand('italic');\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n italic: !selectedFormats.italic,\n }));\n }, []);\n\n const handleUnderlineText = useCallback(() => {\n document.execCommand('underline');\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n underline: !selectedFormats.underline,\n }));\n }, []);\n\n const handleStrikethroughText = useCallback(() => {\n if (selectedTextFormats.strikethrough) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'DEL'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n strikethrough: false,\n }));\n\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.strikethrough,\n ]);\n\n const handleMonospaceText = useCallback(() => {\n if (selectedTextFormats.monospace) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'CODE'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n monospace: false,\n }));\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.monospace,\n ]);\n\n function handleLinkUrlConfirm() {\n const formattedLinkUrl = linkUrl.includes('://') ? linkUrl : `http://${linkUrl}`;\n\n if (isEditingLink) {\n const element = getSelectedElement();\n if (!element || element.tagName !== 'A') {\n return;\n }\n\n (element as HTMLAnchorElement).href = formattedLinkUrl;\n\n onClose();\n return;\n }\n\n const text = getSelectedText();\n restoreSelection();\n document.execCommand(\n 'insertHTML',\n false,\n `${text}`,\n );\n onClose();\n }\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n const HANDLERS_BY_KEY_CODE: Record = {\n KeyK: openLinkControl,\n KeyB: handleBoldText,\n KeyU: handleUnderlineText,\n KeyI: handleItalicText,\n KeyM: handleMonospaceText,\n KeyS: handleStrikethroughText,\n };\n\n const handler = HANDLERS_BY_KEY_CODE[e.code];\n\n if (\n e.altKey\n || !(e.ctrlKey || e.metaKey)\n || !handler\n ) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n handler();\n }, [\n handleBoldText, handleItalicText, handleUnderlineText,\n handleMonospaceText, handleStrikethroughText,\n openLinkControl,\n ]);\n\n useEffect(() => {\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, handleKeyDown]);\n\n const lang = useLang();\n\n function handleContainerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' && isLinkControlOpen) {\n handleLinkUrlConfirm();\n e.preventDefault();\n }\n }\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'TextFormatter',\n transitionClassNames,\n isLinkControlOpen && 'link-control-shown',\n );\n\n const linkUrlConfirmClassName = buildClassName(\n 'TextFormatter-link-url-confirm',\n !!linkUrl.length && 'shown',\n );\n\n const style = anchorPosition\n ? `left: ${anchorPosition.x}px; top: ${anchorPosition.y}px;--text-formatter-left: ${anchorPosition.x}px;`\n : '';\n\n return (\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n\n
\n
\n \n
\n\n \n \n
\n\n
\n
\n \n \n \n
\n
\n
\n
\n );\n};\n\nexport default memo(TextFormatter);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport {\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n} from '../../modules/helpers';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\n\nimport './Media.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n idPrefix?: string;\n onClick?: (messageId: number, chatId: number) => void;\n};\n\nconst Media: FC = ({ message, idPrefix = 'shared-media', onClick }) => {\n const handleClick = useCallback(() => {\n onClick!(message.id, message.chatId);\n }, [message.id, message.chatId, onClick]);\n\n const thumbDataUri = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(mediaBlobUrl, 'slow');\n\n const video = getMessageVideo(message);\n\n return (\n
\n {shouldRenderThumb && (\n \"\"\n )}\n {shouldRenderFullMedia && (\n \"\"\n )}\n {video && {video.isGif ? 'GIF' : formatMediaDuration(video.duration)}}\n
\n );\n};\n\nexport default memo(Media);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiAudio, ApiMessage, ApiVoice,\n} from '../../api/types';\nimport { ISettings } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat';\nimport {\n getMediaDuration,\n getMediaTransferState,\n getMessageKey,\n getMessageMediaFormat,\n getMessageMediaHash,\n isMessageLocal,\n isOwnMessage,\n} from '../../modules/helpers';\nimport { renderWaveformToDataUri } from './helpers/waveform';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport { decodeWaveform, interpolateArray } from '../../util/waveform';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './Audio.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n uploadProgress?: number;\n renderingFor?: 'searchResult' | 'sharedMedia';\n date?: number;\n lastSyncTime?: number;\n className?: string;\n isSelectable?: boolean;\n isSelected?: boolean;\n onPlay: (messageId: number, chatId: number) => void;\n onReadMedia?: () => void;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: number) => void;\n};\n\ntype StateProps = {\n theme: ISettings['theme'];\n};\n\ninterface ISeekMethods {\n handleStartSeek: (e: React.MouseEvent) => void;\n handleSeek: (e: React.MouseEvent) => void;\n handleStopSeek: () => void;\n}\n\nconst AVG_VOICE_DURATION = 30;\nconst MIN_SPIKES = IS_MOBILE_SCREEN ? 20 : 25;\nconst MAX_SPIKES = IS_MOBILE_SCREEN ? 50 : 75;\n// This is needed for browsers requiring user interaction before playing.\nconst PRELOAD = true;\n\nconst Audio: FC = ({\n theme,\n message,\n senderTitle,\n uploadProgress,\n renderingFor,\n date,\n lastSyncTime,\n className,\n isSelectable,\n isSelected,\n onPlay,\n onReadMedia,\n onCancelUpload,\n onDateClick,\n}) => {\n const { content: { audio, voice }, isMediaUnread } = message;\n const isVoice = Boolean(voice);\n const isSeeking = useRef(false);\n const lang = useLang();\n\n const [isActivated, setIsActivated] = useState(false);\n const shouldDownload = (isActivated || PRELOAD) && lastSyncTime;\n\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n );\n\n function handleForcePlay() {\n setIsActivated(true);\n onPlay(message.id, message.chatId);\n }\n\n const {\n isBuffered, bufferedProgress, bufferingHandlers, checkBuffering,\n } = useBuffering();\n\n const {\n isPlaying, playProgress, playPause, setCurrentTime, duration,\n } = useAudioPlayer(\n getMessageKey(message),\n getMediaDuration(message)!,\n mediaData,\n bufferingHandlers,\n checkBuffering,\n isActivated,\n handleForcePlay,\n isMessageLocal(message),\n );\n\n useEffect(() => {\n setIsActivated(isPlaying);\n }, [isPlaying]);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, isActivated && !isBuffered);\n\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring);\n\n const handleButtonClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n\n return;\n }\n\n if (!isPlaying) {\n onPlay(message.id, message.chatId);\n }\n\n setIsActivated(!isActivated);\n playPause();\n }, [isPlaying, isUploading, message.id, message.chatId, onCancelUpload, onPlay, playPause, isActivated]);\n\n useEffect(() => {\n if (isPlaying && onReadMedia && isMediaUnread) {\n onReadMedia();\n }\n }, [isPlaying, isMediaUnread, onReadMedia]);\n\n const handleSeek = useCallback((e: React.MouseEvent) => {\n if (isSeeking.current) {\n const seekBar = e.currentTarget.closest('.seekline,.waveform');\n if (seekBar) {\n const { width, left } = seekBar.getBoundingClientRect();\n setCurrentTime(duration * ((e.clientX - left) / width));\n }\n }\n }, [duration, setCurrentTime]);\n\n const handleStartSeek = useCallback((e: React.MouseEvent) => {\n isSeeking.current = true;\n handleSeek(e);\n }, [handleSeek]);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n }, []);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n function getFirstLine() {\n if (isVoice) {\n return senderTitle || 'Voice';\n }\n\n const { title, fileName } = audio!;\n\n return title || fileName;\n }\n\n function getSecondLine() {\n if (isVoice) {\n return formatMediaDuration(voice!.duration);\n }\n\n const { performer } = audio!;\n\n return (\n <>\n {performer && renderText(performer)}\n {performer && senderTitle && }\n {senderTitle && renderText(senderTitle)}\n \n );\n }\n\n const seekHandlers = { handleStartSeek, handleSeek, handleStopSeek };\n const isOwn = isOwnMessage(message);\n const renderedWaveform = useMemo(\n () => voice && renderWaveform(voice, playProgress, isOwn, seekHandlers, theme),\n [voice, playProgress, isOwn, seekHandlers, theme],\n );\n\n const fullClassName = buildClassName(\n 'Audio media-inner',\n className,\n isOwn && !renderingFor && 'own',\n renderingFor && 'bigger',\n isSelected && 'audio-is-selected',\n );\n\n const buttonClassNames = ['toggle-play'];\n if (shouldRenderSpinner) {\n buttonClassNames.push('loading');\n } else if (isPlaying) {\n buttonClassNames.push('pause');\n } else if (!isPlaying) {\n buttonClassNames.push('play');\n }\n\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n const contentClassName = buildClassName('content', showSeekline && 'with-seekline');\n\n function renderSearchResult() {\n return (\n <>\n
\n
\n

{renderText(getFirstLine())}

\n\n
\n {date && (\n \n {formatPastTimeShort(lang, date * 1000)}\n \n )}\n
\n
\n\n {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)}\n {!showSeekline && (\n

\n {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined}\n {getSecondLine()}\n

\n )}\n
\n \n );\n }\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n \n \n \n \n {shouldRenderSpinner && (\n
\n \n
\n )}\n {renderingFor === 'searchResult' && renderSearchResult()}\n {renderingFor !== 'searchResult' && audio && renderAudio(\n lang, audio, isPlaying, playProgress, bufferedProgress, seekHandlers, date,\n onDateClick ? handleDateClick : undefined,\n )}\n {renderingFor !== 'searchResult' && voice && renderVoice(voice, renderedWaveform, isMediaUnread)}\n
\n );\n};\n\nfunction renderAudio(\n lang: LangFn,\n audio: ApiAudio,\n isPlaying: boolean,\n playProgress: number,\n bufferedProgress: number,\n seekHandlers: ISeekMethods,\n date?: number,\n handleDateClick?: () => void,\n) {\n const {\n title, performer, duration, fileName,\n } = audio;\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n\n return (\n
\n

{renderText(title || fileName)}

\n {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)}\n {!showSeekline && (\n
\n {renderText(performer || 'Unknown')}\n {date && (\n <>\n {' '}\n •\n {' '}\n {formatMediaDateTime(lang, date * 1000)}\n \n )}\n
\n )}\n

\n {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined}\n {formatMediaDuration(duration)}\n

\n
\n );\n}\n\nfunction renderVoice(voice: ApiVoice, renderedWaveform: any, isMediaUnread?: boolean) {\n return (\n
\n {renderedWaveform}\n

\n {formatMediaDuration(voice.duration)}\n {isMediaUnread && }\n

\n
\n );\n}\n\nfunction renderWaveform(\n voice: ApiVoice,\n playProgress = 0,\n isOwn = false,\n { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods,\n theme: ISettings['theme'],\n) {\n const { waveform, duration } = voice;\n\n if (!waveform) {\n return undefined;\n }\n\n const fillColor = theme === 'dark' ? '#494B75' : '#CBCBCB';\n const fillOwnColor = theme === 'dark' ? '#C69C85' : '#B0DEA6';\n const progressFillColor = theme === 'dark' ? '#868DF5' : '#54a3e6';\n const progressFillOwnColor = theme === 'dark' ? '#FFFFFF' : '#53ad53';\n const durationFactor = Math.min(duration / AVG_VOICE_DURATION, 1);\n const spikesCount = Math.round(MIN_SPIKES + (MAX_SPIKES - MIN_SPIKES) * durationFactor);\n const decodedWaveform = decodeWaveform(new Uint8Array(waveform));\n const { data: spikes, peak } = interpolateArray(decodedWaveform, spikesCount);\n const { src, width, height } = renderWaveformToDataUri(spikes, playProgress, {\n peak,\n fillStyle: isOwn ? fillOwnColor : fillColor,\n progressFillStyle: isOwn ? progressFillOwnColor : progressFillColor,\n });\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n \n );\n}\n\nfunction renderSeekline(\n playProgress: number,\n bufferedProgress: number,\n { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods,\n) {\n return (\n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nexport default memo(withGlobal((global) => ({ theme: global.settings.byKey.theme }))(Audio));\n","/* eslint-disable no-bitwise */\n\n// eslint-disable-next-line max-len\n// Ref: https://github.com/telegramdesktop/tdesktop/blob/0743e71ab6b928d2ee5bae1aed991849b1e2b291/Telegram/SourceFiles/data/data_document.cpp#L1018\nexport function decodeWaveform(encoded5bit: Uint8Array) {\n const bitsCount = encoded5bit.length * 8;\n const valuesCount = Math.floor(bitsCount / 5);\n if (!valuesCount) {\n return [];\n }\n\n // Read each 5 bit of encoded5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries in a general way except the last one.\n const result = Array(valuesCount);\n const bitsData = encoded5bit;\n for (let i = 0, l = valuesCount - 1; i !== l; ++i) {\n const byteIndex = Math.floor((i * 5) / 8);\n const bitShift = Math.floor((i * 5) % 8);\n const value = bitsData[byteIndex] + (bitsData[byteIndex + 1] << 8);\n result[i] = ((value >> bitShift) & 0x1F);\n }\n const lastByteIndex = Math.floor(((valuesCount - 1) * 5) / 8);\n const lastBitShift = Math.floor(((valuesCount - 1) * 5) % 8);\n const lastValue = bitsData[lastByteIndex] + (bitsData[lastByteIndex + 1] << 8);\n result[valuesCount - 1] = (lastValue >> lastBitShift) & 0x1F;\n\n return result;\n}\n\nexport function interpolateArray(data: number[], fitCount: number) {\n let peak = 0;\n const newData = new Array(fitCount);\n const springFactor = data.length / fitCount;\n const leftFiller = data[0];\n const rightFiller = data[data.length - 1];\n for (let i = 0; i < fitCount; i++) {\n const idx = Math.floor(i * springFactor);\n const val = ((data[idx - 1] ?? leftFiller) + (data[idx] ?? leftFiller) + (data[idx + 1] ?? rightFiller)) / 3;\n newData[i] = val;\n if (peak < val) {\n peak = val;\n }\n }\n return { data: newData, peak };\n}\n","type IWaveformProps = {\n peak: number;\n fillStyle: string;\n progressFillStyle: string;\n};\n\nconst SPIKE_WIDTH = 2;\nconst SPIKE_STEP = 4;\nconst SPIKE_RADIUS = 1;\nconst HEIGHT = 23;\n\nexport function renderWaveformToDataUri(\n spikes: number[],\n progress: number,\n {\n peak, fillStyle, progressFillStyle,\n }: IWaveformProps,\n) {\n const width = spikes.length * SPIKE_STEP;\n const height = HEIGHT;\n\n const canvas = document.createElement('canvas');\n canvas.width = width * 2;\n canvas.height = height * 2;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n\n const ctx = canvas.getContext('2d')!;\n ctx.scale(2, 2);\n\n spikes.forEach((item, i) => {\n ctx.globalAlpha = (i / spikes.length >= progress) ? 0.5 : 1;\n ctx.fillStyle = progress > i / spikes.length ? progressFillStyle : fillStyle;\n const spikeHeight = Math.max(2, HEIGHT * (item / Math.max(1, peak)));\n roundedRectangle(ctx, i * SPIKE_STEP, height, SPIKE_WIDTH, spikeHeight, SPIKE_RADIUS);\n ctx.fill();\n });\n\n return {\n src: canvas.toDataURL(),\n width,\n height,\n };\n}\n\nfunction roundedRectangle(\n ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number,\n) {\n if (width < 2 * radius) {\n radius = width / 2;\n }\n if (height < 2 * radius) {\n radius = height / 2;\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + width, y, x + width, y - height, radius);\n ctx.arcTo(x + width, y - height, x, y - height, radius);\n ctx.arcTo(x, y - height, x, y, radius);\n ctx.arcTo(x, y, x + width, y, radius);\n ctx.closePath();\n}\n","import React, {\n FC, useLayoutEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Tab.scss';\n\ntype OwnProps = {\n className?: string;\n title: string;\n active?: boolean;\n badgeCount?: number;\n isBadgeActive?: boolean;\n previousActiveTab?: number;\n onClick: (arg: number) => void;\n clickArg: number;\n};\n\nconst Tab: FC = ({\n className,\n title,\n active,\n badgeCount,\n isBadgeActive,\n previousActiveTab,\n onClick,\n clickArg,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const tabRef = useRef(null);\n\n useLayoutEffect(() => {\n if (!active || previousActiveTab === undefined) {\n return;\n }\n\n const tab = tabRef.current!;\n const indicator = tab.querySelector('i')!;\n const currentIndicator = tab.parentElement!.children[previousActiveTab].querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement!.offsetLeft - indicator.parentElement!.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // 3 AFs needed here to synchronize animations with Transition component\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n });\n }, [active, previousActiveTab]);\n\n return (\n onClick(clickArg)}\n ref={tabRef}\n >\n \n {title}\n {!!badgeCount && (\n {badgeCount}\n )}\n \n \n \n );\n};\n\nexport default memo(Tab);\n","import React, {\n FC, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport fastSmoothScrollHorizontal from '../../util/fastSmoothScrollHorizontal';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHorizontalScroll from '../../hooks/useHorizontalScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Tab from './Tab';\n\nimport './TabList.scss';\n\nexport type TabWithProperties = {\n title: string;\n badgeCount?: number;\n isBadgeActive?: boolean;\n};\n\ntype OwnProps = {\n tabs: readonly TabWithProperties[];\n activeTab: number;\n big?: boolean;\n onSwitchTab: (index: number) => void;\n};\n\nconst TAB_SCROLL_THRESHOLD_PX = 16;\n\nconst TabList: FC = ({\n tabs, activeTab, big, onSwitchTab,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const previousActiveTab = usePrevious(activeTab);\n\n useHorizontalScroll(containerRef.current);\n\n // Scroll container to place active tab in the center\n useEffect(() => {\n const container = containerRef.current!;\n if (container.scrollWidth <= container.offsetWidth) {\n return;\n }\n\n const activeTabElement = container.querySelector('.Tab.active') as HTMLElement | null;\n if (activeTabElement) {\n const newLeft = activeTabElement.offsetLeft - (container.offsetWidth / 2) + (activeTabElement.offsetWidth / 2);\n\n // Prevent scrolling by only a couple of pixels, which doesn't look smooth\n if (Math.abs(newLeft - container.scrollLeft) < TAB_SCROLL_THRESHOLD_PX) {\n return;\n }\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n }, [activeTab]);\n\n const lang = useLang();\n\n return (\n \n {tabs.map((tab, i) => (\n \n ))}\n
\n );\n};\n\nexport default memo(TabList);\n","import { ApiError } from '../api/types';\n\nconst READABLE_ERROR_MESSAGES: Record = {\n CHAT_RESTRICTED: 'You can\\'t send messages in this chat, you were restricted',\n CHAT_WRITE_FORBIDDEN: 'You can\\'t write in this chat',\n CHAT_SEND_POLL_FORBIDDEN: 'You can\\'t create polls in this chat',\n CHAT_SEND_STICKERS_FORBIDDEN: 'You can\\'t send stickers in this chat',\n CHAT_SEND_GIFS_FORBIDDEN: 'You can\\'t send gifs in this chat',\n CHAT_SEND_MEDIA_FORBIDDEN: 'You can\\'t send media in this chat',\n CHAT_LINK_EXISTS: 'The chat is public, you can\\'t hide the history to new users',\n // eslint-disable-next-line max-len\n SLOWMODE_WAIT_X: 'Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.',\n USER_BANNED_IN_CHANNEL: 'You\\'re banned from sending messages in supergroups / channels',\n USER_IS_BLOCKED: 'You were blocked by this user',\n YOU_BLOCKED_USER: 'You blocked this user',\n IMAGE_PROCESS_FAILED: 'Failure while processing image',\n MEDIA_EMPTY: 'The provided media object is invalid',\n MEDIA_INVALID: 'Media invalid',\n PHOTO_EXT_INVALID: 'The extension of the photo is invalid',\n PHOTO_INVALID_DIMENSIONS: 'The photo dimensions are invalid',\n PHOTO_SAVE_FILE_INVALID: 'Internal issues, try again later',\n // eslint-disable-next-line max-len\n MESSAGE_DELETE_FORBIDDEN: 'You can\\'t delete one of the messages you tried to delete, most likely because it is a service message.',\n MESSAGE_POLL_CLOSED: 'Poll closed',\n MESSAGE_EDIT_TIME_EXPIRED: 'You can\\'t edit this message anymore.',\n CHAT_ADMIN_REQUIRED: 'You must be an admin in this chat to do this',\n PINNED_DIALOGS_TOO_MUCH: 'Sorry, you can only pin 5 chats to the top',\n DIALOG_FILTERS_TOO_MUCH: 'Sorry, you can\\'t have more than 10 folders',\n CHANNEL_PRIVATE: 'This channel is private',\n MEDIA_CAPTION_TOO_LONG: 'The provided caption is too long',\n ADDRESS_STREET_LINE1_INVALID: 'The address you provided is not valid',\n ADDRESS_STREET_LINE2_INVALID: 'The address you provided is not valid',\n ADDRESS_CITY_INVALID: 'The city you provided is not valid',\n ADDRESS_COUNTRY_INVALID: 'The country you provided is not valid',\n ADDRESS_POSTCODE_INVALID: 'The postcode you provided is not valid',\n ADDRESS_STATE_INVALID: 'The state you provided is not valid',\n REQ_INFO_NAME_INVALID: 'The name you provided is not valid',\n REQ_INFO_PHONE_INVALID: 'The phone you provided is not valid',\n REQ_INFO_EMAIL_INVALID: 'The email you provided is not valid',\n // TODO Bring back after fixing the weird bug\n // CHANNEL_INVALID: 'An error occurred. Please try again later',\n LINK_NOT_MODIFIED: 'This discussion is already linked to the channel',\n\n // Non-API errors\n SERVICE_WORKER_DISABLED: 'Service Worker is disabled. Please reload the page without holding key.',\n // eslint-disable-next-line max-len\n CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.',\n // eslint-disable-next-line max-len\n FRESH_RESET_AUTHORISATION_FORBIDDEN: 'You can’t logout other sessions if less than 24 hours have passed since you logged on the current session',\n\n BOTS_TOO_MUCH: 'There are too many bots in this chat/channel',\n BOT_GROUPS_BLOCKED: 'This bot can\\'t be added to groups',\n USERS_TOO_MUCH: 'The maximum number of users has been exceeded',\n USER_CHANNELS_TOO_MUCH: 'One of the users you tried to add is already in too many channels/supergroups',\n USER_KICKED: 'This user was kicked from this supergroup/channel',\n USER_NOT_MUTUAL_CONTACT: 'The provided user is not a mutual contact',\n USER_PRIVACY_RESTRICTED: 'The user\\'s privacy settings do not allow you to do this',\n INVITE_HASH_EMPTY: 'The invite hash is empty',\n INVITE_HASH_EXPIRED: 'The invite link has expired',\n INVITE_HASH_INVALID: 'The invite hash is invalid',\n CHANNELS_TOO_MUCH: 'You have joined too many channels/supergroups',\n USER_ALREADY_PARTICIPANT: 'You already in the group',\n};\n\nexport default function getReadableErrorText(error: ApiError) {\n const { message, isSlowMode, textParams } = error;\n // Currently Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs\n if (isSlowMode) {\n const extraPartIndex = message.indexOf(' (caused by');\n return extraPartIndex > 0 ? message.substring(0, extraPartIndex) : message;\n }\n let errorMessage = READABLE_ERROR_MESSAGES[message];\n if (errorMessage && textParams) {\n errorMessage = Object.keys(textParams).reduce((acc, current) => {\n return acc.replace(current, textParams[current]);\n }, errorMessage as string);\n }\n return errorMessage;\n}\n","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { ApiChat, ApiUser } from '../api/types';\nimport {\n isChatArchived, getCanDeleteChat, isChatPrivate, isChatChannel,\n} from '../modules/helpers';\nimport useLang from './useLang';\n\nexport default ({\n chat,\n privateChatUser,\n handleDelete,\n folderId,\n isPinned,\n}: {\n chat: ApiChat | undefined;\n privateChatUser: ApiUser | undefined;\n handleDelete: () => void;\n folderId?: number;\n isPinned?: boolean;\n}) => {\n const lang = useLang();\n\n const {\n toggleChatPinned,\n updateChatMutedState,\n toggleChatArchived,\n toggleChatUnread,\n } = getDispatch();\n\n return useMemo(() => {\n if (!chat) {\n return undefined;\n }\n\n const isChatWithSelf = privateChatUser && privateChatUser.isSelf;\n\n const actionUnreadMark = chat.unreadCount || chat.hasUnreadMark\n ? { title: lang('MarkAsRead'), icon: 'readchats', handler: () => toggleChatUnread({ id: chat.id }) }\n : { title: lang('MarkAsUnread'), icon: 'unread', handler: () => toggleChatUnread({ id: chat.id }) };\n\n const actionPin = isPinned\n ? {\n title: lang('UnpinFromTop'),\n icon: 'unpin',\n handler: () => toggleChatPinned({ id: chat.id, folderId }),\n }\n : { title: lang('PinToTop'), icon: 'pin', handler: () => toggleChatPinned({ id: chat.id, folderId }) };\n\n const actionMute = chat.isMuted\n ? {\n title: lang('ChatList.Unmute'),\n icon: 'unmute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: false }),\n }\n : {\n title: lang('ChatList.Mute'),\n icon: 'mute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: true }),\n };\n\n const actionArchive = isChatArchived(chat)\n ? { title: lang('Unarchive'), icon: 'unarchive', handler: () => toggleChatArchived({ id: chat.id }) }\n : { title: lang('Archive'), icon: 'archive', handler: () => toggleChatArchived({ id: chat.id }) };\n\n const actionDelete = {\n title: isChatPrivate(chat.id)\n ? lang('Delete')\n : lang(getCanDeleteChat(chat)\n ? 'DeleteChat'\n : (isChatChannel(chat) ? 'LeaveChannel' : 'Group.LeaveGroup')),\n icon: 'delete',\n destructive: true,\n handler: handleDelete,\n };\n\n return [\n actionUnreadMark,\n actionPin,\n ...(!isChatWithSelf ? [\n actionMute,\n actionArchive,\n ] : []),\n actionDelete,\n ];\n }, [\n chat, privateChatUser, lang, isPinned, handleDelete, toggleChatUnread, toggleChatPinned, folderId,\n updateChatMutedState, toggleChatArchived,\n ]);\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../api/types';\n\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport MessageOutgoingStatus from './MessageOutgoingStatus';\n\nimport './LastMessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n};\n\nconst LastMessageMeta: FC = ({ message, outgoingStatus }) => {\n const lang = useLang();\n return (\n
\n {outgoingStatus && (\n \n )}\n {formatPastTimeShort(lang, message.date * 1000)}\n
\n );\n};\n\nexport default memo(LastMessageMeta);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessageOutgoingStatus } from '../../api/types';\n\nimport Transition from '../ui/Transition';\n\nimport './MessageOutgoingStatus.scss';\n\ntype OwnProps = {\n status: ApiMessageOutgoingStatus;\n};\n\nenum Keys {\n failed, pending, succeeded, read,\n}\n\nconst MessageOutgoingStatus: FC = ({ status }) => {\n return (\n
\n \n {() => (\n \n )}\n \n
\n );\n};\n\nexport default memo(MessageOutgoingStatus);\n","import { useState, useEffect } from '../lib/teact/teact';\nimport { IAnchorPosition } from '../types';\n\nexport default (\n anchor: IAnchorPosition | undefined,\n getTriggerElement: () => HTMLElement | null,\n getRootElement: () => HTMLElement | null,\n getMenuElement: () => HTMLElement | null,\n extraPaddingX = 0,\n extraTopPadding = 0,\n) => {\n const [positionX, setPositionX] = useState<'right' | 'left'>('right');\n const [positionY, setPositionY] = useState<'top' | 'bottom'>('bottom');\n const [style, setStyle] = useState('');\n\n useEffect(() => {\n const triggerEl = getTriggerElement();\n if (!anchor || !triggerEl) {\n return;\n }\n\n let { x, y } = anchor;\n const emptyRect = {\n width: 0, left: 0, height: 0, top: 0,\n };\n\n const menuEl = getMenuElement();\n const rootEl = getRootElement();\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const menuRect = menuEl ? { width: menuEl.offsetWidth, height: menuEl.offsetHeight } : emptyRect;\n const rootRect = rootEl ? rootEl.getBoundingClientRect() : emptyRect;\n\n if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) {\n setPositionX('left');\n x += 3;\n } else if (x - menuRect.width > 0) {\n setPositionX('right');\n x -= 3;\n } else {\n setPositionX('left');\n x = 16;\n }\n\n if (y + menuRect.height < rootRect.height + rootRect.top) {\n setPositionY('top');\n } else {\n setPositionY('bottom');\n\n if (y - menuRect.height < rootRect.top + extraTopPadding) {\n y = rootRect.top + extraTopPadding + menuRect.height;\n }\n }\n\n setStyle(`left: ${x - triggerRect.left}px; top: ${y - triggerRect.top}px;`);\n }, [\n anchor, extraPaddingX, extraTopPadding,\n getMenuElement, getRootElement, getTriggerElement,\n ]);\n\n return {\n positionX,\n positionY,\n style,\n };\n};\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\n\ntype ChildrenFn = () => any;\n\ntype OwnProps = {\n isOpen: boolean;\n isCustom?: boolean;\n id?: string;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n children: ChildrenFn;\n};\n\nconst ShowTransition: FC = ({\n isOpen, isCustom, id, className, onClick, children,\n}) => {\n const { shouldRender, transitionClassNames } = useShowTransition(\n isOpen, undefined, undefined, isCustom ? false : undefined,\n );\n const prevIsOpen = usePrevious(isOpen);\n const prevChildren = usePrevious(children);\n const fromChildrenRef = useRef();\n\n if (prevIsOpen && !isOpen) {\n fromChildrenRef.current = prevChildren;\n }\n\n return (\n shouldRender && (\n
\n {isOpen ? children() : fromChildrenRef.current!()}\n
\n )\n );\n};\n\nexport default ShowTransition;\n","import { useRef } from '../lib/teact/teact';\n\nimport usePrevious from './usePrevious';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport default function usePrevDuringAnimation(current: any, duration?: number) {\n const prev = usePrevious(current, true);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n // eslint-disable-next-line no-null/no-null\n const isCurrentPresent = current !== undefined && current !== null;\n // eslint-disable-next-line no-null/no-null\n const isPrevPresent = prev !== undefined && prev !== null;\n\n if (isCurrentPresent && timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useOnChange(() => {\n // When `current` becomes empty\n if (duration && !isCurrentPresent && isPrevPresent && !timeoutRef.current) {\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = undefined;\n forceUpdate();\n }, duration);\n }\n }, [current]);\n\n return !timeoutRef.current || !duration || isCurrentPresent ? current : prev;\n}\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { register } from '../util/audioPlayer';\nimport useEffectWithPrevDeps from './useEffectWithPrevDeps';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\nimport useOnChange from './useOnChange';\n\ntype Handler = (e: Event) => void;\n\nexport default (\n trackId: string,\n originalDuration: number, // Sometimes incorrect for voice messages\n src?: string,\n handlers?: Record,\n onInit?: (element: HTMLAudioElement) => void,\n shouldPlay = false,\n onForcePlay?: NoneToVoidFunction,\n noPlaylist = false,\n) => {\n // eslint-disable-next-line no-null/no-null\n const controllerRef = useRef>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n let isPlayingSync = isPlaying;\n\n const [playProgress, setPlayProgress] = useState(0);\n\n useOnChange(() => {\n controllerRef.current = register(trackId, (eventName, e) => {\n switch (eventName) {\n case 'onPlay':\n setIsPlaying(true);\n break;\n case 'onPause':\n setIsPlaying(false);\n break;\n case 'onTimeUpdate': {\n const { proxy } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n setPlayProgress(proxy.currentTime / duration);\n break;\n }\n }\n\n if (handlers && handlers[eventName]) {\n handlers[eventName](e);\n }\n }, onForcePlay);\n\n const { proxy } = controllerRef.current!;\n\n if (!isPlaying && !proxy.paused) {\n setIsPlaying(true);\n isPlayingSync = true;\n }\n\n if (onInit) {\n onInit(proxy);\n }\n }, [trackId]);\n\n const {\n play, pause, setCurrentTime, proxy, destroy,\n } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n\n // RAF progress\n useEffect(() => {\n if (duration && !isSafariPatchInProgress(proxy)) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, playProgress, proxy]);\n\n // Cleanup\n useEffect(() => () => {\n destroy(noPlaylist);\n }, [destroy, noPlaylist]);\n\n // Autoplay once `src` is present\n useEffectWithPrevDeps(([prevShouldPlay, prevSrc]) => {\n if (prevShouldPlay === shouldPlay && src === prevSrc) {\n return;\n }\n\n // When paused by another player\n if (proxy.src && proxy.paused) {\n return;\n }\n\n if (shouldPlay && src && !isPlaying) {\n play(src);\n }\n }, [shouldPlay, src, isPlaying, play, proxy.src, proxy.paused]);\n\n const playPause = useCallback(() => {\n if (isPlaying) {\n pause();\n } else if (src) {\n play(src);\n }\n }, [src, pause, play, isPlaying]);\n\n return {\n isPlaying: isPlayingSync,\n playProgress,\n playPause,\n setCurrentTime,\n audioProxy: proxy,\n duration,\n };\n};\n","import { IS_SAFARI } from './environment';\nimport safePlay from './safePlay';\nimport { patchSafariProgressiveAudio, isSafariPatchInProgress } from './patchSafariProgressiveAudio';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { parseMessageKey } from '../modules/helpers';\n\ntype Handler = (eventName: string, e: Event) => void;\n\ninterface Track {\n audio: HTMLAudioElement;\n proxy: HTMLAudioElement;\n handlers: Handler[];\n onForcePlay?: NoneToVoidFunction;\n}\n\nconst tracks = new Map();\nlet queue: string[] = [];\n\nlet currentTrackId: string | undefined;\n\nfunction createAudio(trackId: string, onForcePlay?: NoneToVoidFunction) {\n const audio = new Audio();\n\n function handleEvent(eventName: string) {\n return (e: Event) => {\n if (!tracks.has(trackId)) {\n return;\n }\n\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n tracks.get(trackId)!.handlers.forEach((handler) => {\n handler(eventName, e);\n });\n };\n }\n\n audio.addEventListener('timeupdate', handleEvent('onTimeUpdate'));\n audio.addEventListener('play', handleEvent('onPlay'));\n audio.addEventListener('pause', handleEvent('onPause'));\n audio.addEventListener('loadstart', handleEvent('onLoadStart'));\n audio.addEventListener('loadeddata', handleEvent('onLoadedData'));\n audio.addEventListener('playing', handleEvent('onPlaying'));\n audio.addEventListener('ended', () => {\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n const nextTrackId = queue[queue.indexOf(trackId) + 1];\n if (!nextTrackId) {\n return;\n }\n\n if (!tracks.has(nextTrackId)) {\n // A bit hacky way to continue playlist when switching chat\n getDispatch().openAudioPlayer(parseMessageKey(nextTrackId));\n\n return;\n }\n\n const nextTrack = tracks.get(nextTrackId)!;\n\n if (nextTrack.onForcePlay) {\n nextTrack.onForcePlay();\n }\n\n currentTrackId = nextTrackId;\n\n if (nextTrack.audio.src) {\n safePlay(nextTrack.audio);\n }\n });\n\n return {\n audio,\n proxy: new Proxy(audio, {\n get: (origin, key: keyof HTMLAudioElement) => origin[key],\n }),\n handlers: [],\n onForcePlay,\n };\n}\n\nexport function stopCurrentAudio() {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n }\n}\n\nexport function register(trackId: string, handler: Handler, onForcePlay?: NoneToVoidFunction) {\n if (!tracks.has(trackId)) {\n tracks.set(trackId, createAudio(trackId, onForcePlay));\n\n if (!queue.includes(trackId)) {\n queue.push(trackId);\n }\n }\n\n const { audio, proxy, handlers } = tracks.get(trackId)!;\n\n handlers.push(handler);\n\n return {\n play(src: string) {\n if (currentTrackId && currentTrackId !== trackId) {\n tracks.get(currentTrackId)!.audio.pause();\n }\n\n currentTrackId = trackId;\n\n if (!audio.src) {\n audio.src = src;\n audio.preload = 'auto';\n\n if (src.includes('/progressive/') && IS_SAFARI) {\n patchSafariProgressiveAudio(audio);\n }\n }\n\n safePlay(audio);\n },\n\n pause() {\n if (currentTrackId === trackId) {\n audio.pause();\n }\n },\n\n setCurrentTime(time: number) {\n if (currentTrackId === trackId) {\n audio.currentTime = time;\n }\n },\n\n proxy,\n\n destroy(shouldRemoveFromQueue = false) {\n const track = tracks.get(trackId);\n if (!track) {\n return;\n }\n\n track.handlers = track.handlers.filter((h) => h !== handler);\n\n if (!track.handlers.length) {\n track.audio.pause();\n tracks.delete(trackId);\n\n if (shouldRemoveFromQueue) {\n queue = queue.filter((id) => id !== trackId);\n }\n\n if (trackId === currentTrackId) {\n currentTrackId = undefined;\n }\n }\n },\n };\n}\n","export default function download(url: string, filename: string) {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n}\n","import { RefObject } from 'react';\nimport React, { FC, memo, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport buildClassName from '../../util/buildClassName';\nimport { formatMediaDateTime, formatPastTimeShort } from '../../util/dateFormat';\nimport { getColorFromExtension, getFileSizeString } from './helpers/documentInfo';\nimport { getDocumentThumbnailDimensions } from './helpers/mediaDimensions';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './File.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n name: string;\n extension?: string;\n size: number;\n timestamp?: number;\n sender?: string;\n thumbnailDataUri?: string;\n previewData?: string;\n className?: string;\n smaller?: boolean;\n isTransferring?: boolean;\n isUploading?: boolean;\n isSelectable?: boolean;\n isSelected?: boolean;\n transferProgress?: number;\n onClick?: () => void;\n onDateClick?: (e: React.MouseEvent) => void;\n};\n\nconst File: FC = ({\n ref,\n name,\n size,\n extension = '',\n timestamp,\n sender,\n thumbnailDataUri,\n previewData,\n className,\n smaller,\n isTransferring,\n isUploading,\n isSelectable,\n isSelected,\n transferProgress,\n onClick,\n onDateClick,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, true);\n const color = getColorFromExtension(extension);\n const sizeString = getFileSizeString(size);\n\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewData, 'slow');\n const { width, height } = getDocumentThumbnailDimensions(smaller);\n\n const fullClassName = buildClassName(\n 'File',\n className,\n smaller && 'smaller',\n onClick && !isUploading && 'interactive',\n isSelected && 'file-is-selected',\n );\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n
\n {thumbnailDataUri || previewData ? (\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n
\n ) : (\n
\n {extension.length <= 4 && (\n {extension}\n )}\n
\n )}\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {onClick && }\n
\n
\n
{renderText(name)}
\n
\n \n {isTransferring && transferProgress ? `${Math.round(transferProgress * 100)}%` : sizeString}\n \n {sender && {renderText(sender)}}\n {!sender && timestamp && (\n <>\n {' '}\n {formatMediaDateTime(lang, timestamp * 1000)}\n \n )}\n
\n
\n {sender && timestamp && (\n {formatPastTimeShort(lang, timestamp * 1000)}\n )}\n
\n );\n};\n\nexport default memo(File);\n","import React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../lib/teact/teact';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\n\nimport Portal from './Portal';\n\nimport './Notification.scss';\n\ntype OwnProps = {\n containerId?: string;\n message: TextPart[];\n duration?: number;\n onDismiss: () => void;\n};\n\nconst DEFAULT_DURATION = 3000;\nconst ANIMATION_DURATION = 150;\n\nconst Notification: FC = ({\n message, duration = DEFAULT_DURATION, containerId, onDismiss,\n}) => {\n const [isOpen, setIsOpen] = useState(true);\n // eslint-disable-next-line no-null/no-null\n const timerRef = useRef(null);\n\n const { transitionClassNames } = useShowTransition(isOpen);\n\n const closeAndDismiss = useCallback(() => {\n setIsOpen(false);\n setTimeout(onDismiss, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [onDismiss]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(closeAndDismiss) : undefined), [isOpen, closeAndDismiss]);\n\n useEffect(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n };\n }, [duration, closeAndDismiss]);\n\n const handleMouseEnter = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n }, [duration, closeAndDismiss]);\n\n return (\n \n \n
\n {message}\n
\n \n
\n );\n};\n\nexport default memo(Notification);\n","import { EDITABLE_INPUT_ID } from '../../../../config';\n\nconst MAX_NESTING_PARENTS = 5;\n\nexport function isSelectionInsideInput(selectionRange: Range) {\n const { commonAncestorContainer } = selectionRange;\n let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement;\n let iterations = 1;\n while (parentNode && parentNode.id !== EDITABLE_INPUT_ID && iterations < MAX_NESTING_PARENTS) {\n parentNode = parentNode.parentElement;\n iterations++;\n }\n\n return Boolean(parentNode && parentNode.id === EDITABLE_INPUT_ID);\n}\n","import {\n useCallback, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport {\n EmojiData, EmojiModule, EmojiRawData, uncompressEmoji,\n} from '../../../../util/emoji';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport {\n buildCollectionByKey, flatten, mapValues, pickTruthy, unique,\n} from '../../../../util/iteratees';\nimport useFlag from '../../../../hooks/useFlag';\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst RE_NOT_EMOJI_SEARCH = /[^-_:\\p{L}\\p{N}]+/iu;\nconst EMOJIS_LIMIT = 36;\n\nexport default function useEmojiTooltip(\n isAllowed: boolean,\n html: string,\n recentEmojiIds: string[],\n inputId = EDITABLE_INPUT_ID,\n onUpdateHtml: (html: string) => void,\n emojiKeywords?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n\n const [byId, setById] = useState | undefined>();\n const [byKeyword, setByKeyword] = useState>({});\n const [byName, setByName] = useState>({});\n\n const [filteredEmojis, setFilteredEmojis] = useState([]);\n\n const recentEmojis = useMemo(\n () => {\n if (!byId || !recentEmojiIds.length) {\n return [];\n }\n\n return Object.values(pickTruthy(byId, recentEmojiIds));\n },\n [byId, recentEmojiIds],\n );\n\n // Initialize data on first render.\n useEffect(() => {\n const exec = () => {\n setById(emojiData.emojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, []);\n\n useEffect(() => {\n if (!byId) {\n return;\n }\n\n const emojis = Object.values(byId);\n\n if (emojiKeywords) {\n const byNative = buildCollectionByKey(emojis, 'native');\n setByKeyword(mapValues(emojiKeywords, (natives) => {\n return Object.values(pickTruthy(byNative, natives));\n }));\n }\n\n setByName(emojis.reduce((result, emoji) => {\n emoji.names.forEach((name) => {\n if (!result[name]) {\n result[name] = [];\n }\n\n result[name].push(emoji);\n });\n\n return result;\n }, {} as Record));\n }, [byId, emojiKeywords]);\n\n useEffect(() => {\n if (!isAllowed || !html || !byId) {\n unmarkIsOpen();\n return;\n }\n\n const code = getEmojiCode(html);\n if (!code) {\n setFilteredEmojis([]);\n unmarkIsOpen();\n return;\n }\n\n const filter = code.substr(1);\n let matched: Emoji[] = [];\n\n if (!filter) {\n matched = recentEmojis;\n } else {\n const matchedKeywords = Object.keys(byKeyword).filter((keyword) => keyword.startsWith(filter));\n matched = matched.concat(flatten(Object.values(pickTruthy(byKeyword, matchedKeywords))));\n\n // Also search by names, which is useful for non-English languages\n const matchedNames = Object.keys(byName).filter((name) => name.startsWith(filter));\n matched = matched.concat(flatten(Object.values(pickTruthy(byName, matchedNames))));\n\n matched = unique(matched);\n }\n\n if (matched.length) {\n markIsOpen();\n setFilteredEmojis(matched.slice(0, EMOJIS_LIMIT));\n } else {\n unmarkIsOpen();\n }\n }, [byId, byKeyword, byName, html, isAllowed, markIsOpen, recentEmojis, unmarkIsOpen]);\n\n const insertEmoji = useCallback((textEmoji: string) => {\n const atIndex = html.lastIndexOf(':');\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${textEmoji}`);\n const messageInput = document.getElementById(inputId)!;\n if (!IS_MOBILE_SCREEN) {\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, true);\n });\n }\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isEmojiTooltipOpen: isOpen,\n closeEmojiTooltip: unmarkIsOpen,\n filteredEmojis,\n insertEmoji,\n };\n}\n\nfunction getEmojiCode(html: string) {\n const tempEl = document.createElement('div');\n tempEl.innerHTML = html.replace('
', '\\n');\n const text = tempEl.innerText;\n\n const lastSymbol = text[text.length - 1];\n const lastWord = text.split(RE_NOT_EMOJI_SEARCH).pop();\n\n if (\n !text.length || RE_NOT_EMOJI_SEARCH.test(lastSymbol)\n || !lastWord || !lastWord.startsWith(':')\n ) {\n return undefined;\n }\n\n return lastWord.toLowerCase();\n}\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './EmojiTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst EmojiTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const EmojiTooltip = useModuleLoader(Bundles.Extra, 'EmojiTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return EmojiTooltip ? : undefined;\n};\n\nexport default memo(EmojiTooltipAsync);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useEffect, useRef, memo, useState, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { IAnchorPosition, ISettings } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { selectCurrentMessageList, selectReplyingToId } from '../../../modules/selectors';\nimport { debounce } from '../../../util/schedulers';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport {\n IS_ANDROID, IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport useLayoutEffectWithPrevDeps from '../../../hooks/useLayoutEffectWithPrevDeps';\nimport useFlag from '../../../hooks/useFlag';\nimport parseEmojiOnlyString from '../../common/helpers/parseEmojiOnlyString';\nimport { isSelectionInsideInput } from './helpers/selection';\nimport useLang from '../../../hooks/useLang';\n\nimport TextFormatter from './TextFormatter';\n\nconst CONTEXT_MENU_CLOSE_DELAY_MS = 100;\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 350;\nconst TRANSITION_DURATION_FACTOR = 50;\n\ntype OwnProps = {\n id: string;\n editableInputId?: string;\n html: string;\n placeholder: string;\n shouldSetFocus: boolean;\n shouldSupressFocus?: boolean;\n shouldSupressTextFormatter?: boolean;\n onUpdate: (html: string) => void;\n onSupressedFocus?: () => void;\n onSend: () => void;\n};\n\ntype StateProps = {\n currentChatId?: number;\n replyingToId?: number;\n noTabCapture?: boolean;\n messageSendKeyCombo?: ISettings['messageSendKeyCombo'];\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_INPUT_HEIGHT = IS_MOBILE_SCREEN ? 256 : 416;\nconst TAB_INDEX_PRIORITY_TIMEOUT = 2000;\nconst TEXT_FORMATTER_SAFE_AREA_PX = 90;\n// For some reason Safari inserts `
` after user removes text from input\nconst SAFARI_BR = '
';\n\nfunction clearSelection() {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n } else if (selection.empty) {\n selection.empty();\n }\n}\n\nconst MessageInput: FC = ({\n id,\n editableInputId,\n html,\n placeholder,\n shouldSetFocus,\n shouldSupressFocus,\n shouldSupressTextFormatter,\n onUpdate,\n onSupressedFocus,\n onSend,\n currentChatId,\n replyingToId,\n noTabCapture,\n messageSendKeyCombo,\n editLastMessage,\n replyToNextMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const cloneRef = useRef(null);\n\n const lang = useLang();\n const isContextMenuOpenRef = useRef(false);\n const [isTextFormatterOpen, openTextFormatter, closeTextFormatter] = useFlag();\n const [textFormatterAnchorPosition, setTextFormatterAnchorPosition] = useState();\n const [selectedRange, setSelectedRange] = useState();\n\n useEffect(() => {\n updateInputHeight(false);\n }, []);\n\n useLayoutEffectWithPrevDeps(([prevHtml]) => {\n if (html !== inputRef.current!.innerHTML) {\n inputRef.current!.innerHTML = html;\n }\n\n if (html !== cloneRef.current!.innerHTML) {\n cloneRef.current!.innerHTML = html;\n }\n\n if (prevHtml !== undefined && prevHtml !== html) {\n updateInputHeight(!html.length);\n }\n }, [html]);\n\n const focusInput = useCallback(() => {\n // Avoid focusing during animation\n if (inputRef.current!.closest('.from, .to')) {\n setTimeout(focusInput, FOCUS_DELAY_MS);\n return;\n }\n\n focusEditableElement(inputRef.current!);\n }, []);\n\n const handleCloseTextFormatter = useCallback(() => {\n closeTextFormatter();\n clearSelection();\n }, [closeTextFormatter]);\n\n function checkSelection() {\n // Disable the formatter on iOS devices for now.\n if (IS_IOS) {\n return;\n }\n\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount || isContextMenuOpenRef.current) {\n closeTextFormatter();\n return;\n }\n\n const selectionRange = selection.getRangeAt(0);\n const selectedText = selectionRange.toString().trim();\n if (\n shouldSupressTextFormatter\n || !isSelectionInsideInput(selectionRange)\n || !selectedText\n || parseEmojiOnlyString(selectedText)\n || !selectionRange.START_TO_END\n ) {\n closeTextFormatter();\n return;\n }\n\n const selectionRect = selectionRange.getBoundingClientRect();\n const inputRect = inputRef.current!.getBoundingClientRect();\n\n let x = (selectionRect.left + selectionRect.width / 2) - inputRect.left;\n\n if (x < TEXT_FORMATTER_SAFE_AREA_PX) {\n x = TEXT_FORMATTER_SAFE_AREA_PX;\n } else if (x > inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX) {\n x = inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX;\n }\n\n setTextFormatterAnchorPosition({\n x,\n y: selectionRect.top - inputRect.top,\n });\n\n setSelectedRange(selectionRange);\n openTextFormatter();\n }\n\n function handleMouseDown(event: React.MouseEvent) {\n function handleMouseUp() {\n checkSelection();\n\n event.target.removeEventListener('mouseup', handleMouseUp);\n }\n\n if (event.button !== 2) {\n event.target.addEventListener('mouseup', handleMouseUp);\n return;\n }\n\n if (isContextMenuOpenRef.current === true) {\n return;\n }\n\n isContextMenuOpenRef.current = true;\n\n function closeContextMenuMouseListener() {\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('mouseup', closeContextMenuMouseListener);\n }\n\n function closeContextMenuKeyListener(e: KeyboardEvent) {\n if (e.key !== 'Esc' && e.key !== 'Escape') {\n return;\n }\n\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('keydown', closeContextMenuKeyListener);\n }\n\n document.addEventListener('mousedown', closeContextMenuMouseListener);\n document.addEventListener('keydown', closeContextMenuKeyListener);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n function handleKeyUp() {\n checkSelection();\n\n e.target.removeEventListener('keyup', handleKeyUp);\n }\n\n if (e.metaKey) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (targetIndexDelta) {\n e.preventDefault();\n\n replyToNextMessage({ targetIndexDelta });\n return;\n }\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n if (\n !(IS_IOS || IS_ANDROID)\n && (\n (messageSendKeyCombo === 'enter' && !e.shiftKey)\n || (messageSendKeyCombo === 'ctrl-enter' && (e.ctrlKey || e.metaKey))\n )\n ) {\n e.preventDefault();\n\n closeTextFormatter();\n onSend();\n }\n } else if (e.key === 'ArrowUp' && !html.length && !e.metaKey) {\n e.preventDefault();\n editLastMessage();\n } else {\n e.target.addEventListener('keyup', handleKeyUp);\n }\n }\n\n function handleTouchSelection() {\n if (!IS_ANDROID) {\n return;\n }\n\n checkSelection();\n }\n\n function handleChange(e: ChangeEvent) {\n const { innerHTML, textContent } = e.currentTarget;\n\n onUpdate(innerHTML === SAFARI_BR ? '' : innerHTML);\n\n // Reset focus on the input to remove any active styling when input is cleared\n if (!IS_TOUCH_ENV && (!textContent || !textContent.length)) {\n const selection = window.getSelection()!;\n if (selection) {\n inputRef.current!.blur();\n selection.removeAllRanges();\n focusEditableElement(inputRef.current!, true);\n }\n }\n }\n\n function stopEvent(e: React.MouseEvent) {\n if (!IS_ANDROID) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n function updateInputHeight(willSend = false) {\n const input = inputRef.current!;\n const clone = cloneRef.current!;\n const currentHeight = Number(input.style.height.replace('px', ''));\n const newHeight = Math.min(clone.scrollHeight, MAX_INPUT_HEIGHT);\n if (newHeight === currentHeight) {\n return;\n }\n\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\n );\n\n const exec = () => {\n input.style.height = `${newHeight}px`;\n input.style.transitionDuration = `${transitionDuration}ms`;\n input.classList.toggle('overflown', clone.scrollHeight > MAX_INPUT_HEIGHT);\n };\n\n if (willSend) {\n // Sync with sending animation\n requestAnimationFrame(exec);\n } else {\n exec();\n }\n }\n\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n focusInput();\n }, [currentChatId, focusInput, replyingToId, shouldSetFocus]);\n\n useEffect(() => {\n if (noTabCapture) {\n return undefined;\n }\n\n const captureFirstTab = debounce((e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n requestAnimationFrame(focusInput);\n }\n }, TAB_INDEX_PRIORITY_TIMEOUT, true, false);\n\n return captureKeyboardListeners({ onTab: captureFirstTab });\n }, [focusInput, noTabCapture]);\n\n useEffect(() => {\n const input = inputRef.current!;\n\n function supressFocus() {\n input.blur();\n }\n\n if (shouldSupressFocus) {\n input.addEventListener('focus', supressFocus);\n }\n\n return () => {\n input.removeEventListener('focus', supressFocus);\n };\n }, [shouldSupressFocus]);\n\n const className = buildClassName(\n 'form-control custom-scroll',\n html.length > 0 && 'touched',\n shouldSupressFocus && 'focus-disabled',\n );\n\n return (\n
\n \n
\n {placeholder}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: currentChatId, threadId } = selectCurrentMessageList(global) || {};\n const { messageSendKeyCombo } = global.settings.byKey;\n\n return {\n currentChatId,\n messageSendKeyCombo,\n replyingToId: currentChatId && threadId ? selectReplyingToId(global, currentChatId, threadId) : undefined,\n noTabCapture: global.isPollModalOpen || global.payment.isPaymentModalOpen,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editLastMessage', 'replyToNextMessage']),\n)(MessageInput));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiWebPage } from '../../api/types';\n\nimport { getFirstLinkInMessage, getMessageSummaryText, getMessageWebPage } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport trimText from '../../util/trimText';\nimport renderText from './helpers/renderText';\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport Media from './Media';\nimport Link from '../ui/Link';\nimport SafeLink from './SafeLink';\n\nimport './WebLink.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n onMessageClick: (messageId: number, chatId: number) => void;\n};\n\nconst WebLink: FC = ({ message, senderTitle, onMessageClick }) => {\n const lang = useLang();\n\n let linkData: ApiWebPage | undefined = getMessageWebPage(message);\n\n if (!linkData) {\n const link = getFirstLinkInMessage(message);\n if (link) {\n const { url, domain } = link;\n const messageText = getMessageSummaryText(lang, message);\n\n linkData = {\n siteName: domain.replace(/^www./, ''),\n url: url.includes('://') ? url : url.includes('@') ? `mailto:${url}` : `http://${url}`,\n description: messageText !== url ? messageText : undefined,\n } as ApiWebPage;\n }\n }\n\n const handleMessageClick = useCallback(() => {\n onMessageClick(message.id, message.chatId);\n }, [onMessageClick, message.id, message.chatId]);\n\n if (!linkData) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n } = linkData;\n\n const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebLink scroll-item',\n !photo && 'without-photo',\n );\n\n return (\n \n {photo && (\n \n )}\n
\n \n {renderText(title || siteName || displayUrl)}\n \n {truncatedDescription && (\n \n {renderText(truncatedDescription)}\n \n )}\n \n {url.replace('mailto:', '') || displayUrl}\n \n {senderTitle &&
{renderText(senderTitle)}
}\n
\n {senderTitle && (\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n )}\n
\n );\n};\n\nexport default memo(WebLink);\n","import { useCallback } from '../../../../lib/teact/teact';\n\nexport enum ChatAnimationTypes {\n Move,\n Opacity,\n None,\n}\n\nexport function useChatAnimationType(orderDiffById: Record) {\n const movesUp = useCallback((id: number) => orderDiffById[id] < 0, [orderDiffById]);\n const movesDown = useCallback((id: number) => orderDiffById[id] > 0, [orderDiffById]);\n\n const orderDiffIds = Object.keys(orderDiffById).map(Number);\n const numberOfUp = orderDiffIds.filter(movesUp).length;\n const numberOfDown = orderDiffIds.filter(movesDown).length;\n\n return useCallback((chatId: number): ChatAnimationTypes => {\n const orderDiff = orderDiffById[chatId];\n\n if (orderDiff === 0) {\n return ChatAnimationTypes.None;\n }\n\n if (\n orderDiff === Infinity\n || orderDiff === -Infinity\n || (movesUp(chatId) && numberOfUp <= numberOfDown)\n || (movesDown(chatId) && numberOfDown < numberOfUp)\n ) {\n return ChatAnimationTypes.Opacity;\n }\n\n return ChatAnimationTypes.Move;\n }, [movesDown, movesUp, numberOfDown, numberOfUp, orderDiffById]);\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\n\nimport ShowTransition from '../../ui/ShowTransition';\n\nimport './Badge.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst Badge: FC = ({ chat, isPinned, isMuted }) => {\n const isShown = Boolean(chat.unreadCount || chat.hasUnreadMark || isPinned);\n const className = buildClassName(\n 'Badge',\n isMuted && 'muted',\n isPinned && 'pinned',\n Boolean(chat.unreadCount || chat.hasUnreadMark) && 'unread',\n );\n\n function renderContent() {\n if (chat.unreadCount) {\n if (chat.unreadMentionsCount) {\n return (\n
\n
\n \n
\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n
\n );\n }\n\n return (\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n );\n } else if (chat.hasUnreadMark) {\n return (\n
\n );\n } else if (isPinned) {\n return (\n
\n \n
\n );\n }\n\n return undefined;\n }\n\n return (\n \n {renderContent}\n \n );\n};\n\nexport default memo(Badge);\n","import React, {\n FC, memo, useCallback, useLayoutEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, ApiFormattedText, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n getChatTitle,\n isChatPrivate,\n isActionMessage,\n getPrivateChatUserId,\n getMessageAction,\n getMessageSenderName,\n isChatChannel,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageSticker,\n selectIsChatMuted,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList,\n selectNotifySettings, selectNotifyExceptions,\n} from '../../../modules/selectors';\nimport { renderActionMessageText } from '../../common/helpers/renderActionMessageText';\nimport renderText from '../../common/helpers/renderText';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport useMedia from '../../../hooks/useMedia';\nimport { ChatAnimationTypes } from './hooks';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport TypingStatus from '../../common/TypingStatus';\nimport LastMessageMeta from '../../common/LastMessageMeta';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\nimport Badge from './Badge';\n\nimport './Chat.scss';\n\ntype OwnProps = {\n style?: string;\n chatId: number;\n folderId?: number;\n orderDiff: number;\n animationType: ChatAnimationTypes;\n isSelected: boolean;\n isPinned?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isMuted?: boolean;\n privateChatUser?: ApiUser;\n actionTargetUser?: ApiUser;\n actionTargetMessage?: ApiMessage;\n actionTargetChatId?: number;\n lastMessageSender?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n draft?: ApiFormattedText;\n messageListType?: MessageListType;\n animationLevel?: number;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 200;\n\nconst Chat: FC = ({\n style,\n chatId,\n folderId,\n orderDiff,\n animationType,\n isSelected,\n isPinned,\n chat,\n isMuted,\n privateChatUser,\n actionTargetUser,\n lastMessageSender,\n lastMessageOutgoingStatus,\n actionTargetMessage,\n actionTargetChatId,\n draft,\n messageListType,\n animationLevel,\n lastSyncTime,\n openChat,\n focusLastMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const { lastMessage, typingStatus } = chat || {};\n const isAction = lastMessage && isActionMessage(lastMessage);\n\n useEnsureMessage(chatId, isAction ? lastMessage!.replyToMessageId : undefined, actionTargetMessage);\n\n const mediaThumbnail = lastMessage && !getMessageSticker(lastMessage)\n ? getMessageMediaThumbDataUri(lastMessage)\n : undefined;\n const mediaBlobUrl = useMedia(lastMessage ? getMessageMediaHash(lastMessage, 'micro') : undefined);\n const isRoundVideo = Boolean(lastMessage && getMessageRoundVideo(lastMessage));\n\n // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.\n useLayoutEffect(() => {\n if (animationLevel === 0) {\n return;\n }\n\n const element = ref.current!;\n\n // TODO Refactor animation: create `useListAnimation` that owns `orderDiff` and `animationType`\n if (animationType === ChatAnimationTypes.Opacity) {\n element.style.opacity = '0';\n\n fastRaf(() => {\n element.classList.add('animate-opacity');\n element.style.opacity = '1';\n });\n } else if (animationType === ChatAnimationTypes.Move) {\n element.style.transform = `translate3d(0, ${-orderDiff * 100}%, 0)`;\n\n fastRaf(() => {\n element.classList.add('animate-transform');\n element.style.transform = '';\n });\n } else {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n element.classList.remove('animate-opacity', 'animate-transform');\n element.style.opacity = '';\n element.style.transform = '';\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [animationLevel, orderDiff, animationType]);\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId });\n\n if (isSelected && messageListType === 'thread') {\n focusLastMessage();\n }\n }, [\n isSelected,\n messageListType,\n openChat,\n chatId,\n focusLastMessage,\n ]);\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n handleDelete: openDeleteModal,\n folderId,\n isPinned,\n });\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderLastMessageOrTyping() {\n if (typingStatus && lastMessage && typingStatus.timestamp > lastMessage.date * 1000) {\n return ;\n }\n\n if (draft && draft.text.length) {\n return (\n

\n {lang('Draft')}\n {renderText(draft.text)}\n

\n );\n }\n\n if (!lastMessage) {\n return undefined;\n }\n\n if (isAction) {\n const actionOrigin = chat && (isChatChannel(chat) || lastMessage.senderId === lastMessage.chatId)\n ? chat\n : lastMessageSender;\n\n return (\n

\n {renderText(renderActionMessageText(\n lang,\n lastMessage,\n actionOrigin,\n actionTargetUser,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string)}\n

\n );\n }\n\n const senderName = getMessageSenderName(lang, chatId, lastMessageSender);\n\n return (\n

\n {senderName && (\n <>\n {renderText(senderName)}\n :\n \n )}\n {renderMessageSummary(lang, lastMessage!, mediaBlobUrl || mediaThumbnail, isRoundVideo)}\n

\n );\n }\n\n const className = buildClassName(\n 'Chat chat-item-clickable',\n isChatPrivate(chatId) ? 'private' : 'group',\n isSelected && !IS_MOBILE_SCREEN && 'selected',\n );\n\n return (\n \n
\n \n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n {isMuted && }\n {chat.lastMessage && (\n \n )}\n
\n
\n {renderLastMessageOrTyping()}\n \n
\n
\n \n \n );\n};\n\nfunction renderMessageSummary(lang: LangFn, message: ApiMessage, blobUrl?: string, isRoundVideo?: boolean) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, message, true))}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return {};\n }\n\n const { senderId, replyToMessageId, isOutgoing } = chat.lastMessage;\n const lastMessageSender = senderId ? selectUser(global, senderId) : undefined;\n const lastMessageAction = getMessageAction(chat.lastMessage);\n const actionTargetMessage = lastMessageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const { targetUserId: actionTargetUserId, targetChatId: actionTargetChatId } = lastMessageAction || {};\n const privateChatUserId = getPrivateChatUserId(chat);\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n lastMessageSender,\n ...(isOutgoing && { lastMessageOutgoingStatus: selectOutgoingStatus(global, chat.lastMessage) }),\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n ...(actionTargetUserId && { actionTargetUser: selectUser(global, actionTargetUserId) }),\n actionTargetChatId,\n actionTargetMessage,\n draft: selectDraft(global, chatId, MAIN_THREAD_ID),\n messageListType,\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'focusLastMessage',\n ]),\n)(Chat));\n","import React, {\n FC, memo, useMemo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiChatFolder, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { NotifyException, NotifySettings } from '../../../types';\n\nimport { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config';\nimport { IS_ANDROID } from '../../../util/environment';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { mapValues, pick } from '../../../util/iteratees';\nimport { getChatOrder, prepareChatList, prepareFolderListIds } from '../../../modules/helpers';\nimport {\n selectChatFolder, selectCurrentMessageList, selectNotifyExceptions, selectNotifySettings,\n} from '../../../modules/selectors';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport { useChatAnimationType } from './hooks';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Loading from '../../ui/Loading';\nimport Chat from './Chat';\n\ntype OwnProps = {\n folderType: 'all' | 'archived' | 'folder';\n folderId?: number;\n noChatsText?: string;\n isActive: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFolder?: ApiChatFolder;\n listIds?: number[];\n currentChatId?: number;\n orderedPinnedIds?: number[];\n lastSyncTime?: number;\n isInDiscussionThread?: boolean;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nenum FolderTypeToListType {\n 'all' = 'active',\n 'archived' = 'archived'\n}\n\nconst ChatList: FC = ({\n folderType,\n folderId,\n noChatsText = 'Chat list is empty.',\n isActive,\n chatFolder,\n chatsById,\n usersById,\n listIds,\n currentChatId,\n orderedPinnedIds,\n lastSyncTime,\n isInDiscussionThread,\n notifySettings,\n notifyExceptions,\n loadMoreChats,\n preloadTopChatMessages,\n openChat,\n}) => {\n const [currentListIds, currentPinnedIds] = useMemo(() => {\n return folderType === 'folder' && chatFolder\n ? prepareFolderListIds(chatsById, usersById, chatFolder, notifySettings, notifyExceptions)\n : [listIds, orderedPinnedIds];\n }, [folderType, chatFolder, chatsById, usersById, notifySettings, notifyExceptions, listIds, orderedPinnedIds]);\n\n const [orderById, orderedIds] = useMemo(() => {\n if (!currentListIds || (folderType === 'folder' && !chatFolder)) {\n return [];\n }\n const newChatArrays = prepareChatList(chatsById, currentListIds, currentPinnedIds, folderType);\n const singleList = [...newChatArrays.pinnedChats, ...newChatArrays.otherChats];\n const newOrderedIds = singleList.map(({ id }) => id);\n const newOrderById = singleList.reduce((acc, chat, i) => {\n acc[chat.id] = i;\n return acc;\n }, {} as Record);\n\n return [newOrderById, newOrderedIds];\n }, [currentListIds, currentPinnedIds, folderType, chatFolder, chatsById]);\n\n const prevOrderById = usePrevious(orderById);\n\n const orderDiffById = orderById && prevOrderById\n ? mapValues(orderById, (order, id) => {\n return order - (prevOrderById[id] !== undefined ? prevOrderById[id] : Infinity);\n })\n : {};\n\n const loadMoreOfType = useCallback(() => {\n loadMoreChats({ listType: folderType === 'archived' ? 'archived' : 'active' });\n }, [loadMoreChats, folderType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? loadMoreOfType : undefined,\n orderedIds,\n undefined,\n CHAT_LIST_SLICE,\n folderType === 'all' && !ALL_CHATS_PRELOAD_DISABLED,\n );\n\n // TODO Refactor to not call `prepareChatList` twice\n const chatArrays = viewportIds && prepareChatList(chatsById, viewportIds, currentPinnedIds, folderType);\n\n useEffect(() => {\n if (lastSyncTime && folderType === 'all') {\n preloadTopChatMessages();\n }\n }, [lastSyncTime, folderType, preloadTopChatMessages]);\n\n const getAnimationType = useChatAnimationType(orderDiffById);\n\n function renderChats() {\n const viewportOffset = orderedIds!.indexOf(viewportIds![0]);\n const pinnedOffset = viewportOffset + chatArrays!.pinnedChats.length;\n\n return (\n \n {chatArrays!.pinnedChats.map(({ id }, i) => (\n \n ))}\n {chatArrays!.otherChats.map((chat, i) => (\n \n ))}\n
\n );\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isActive && orderedIds) {\n if (e.ctrlKey && e.code.startsWith('Digit')) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n const position = Number(digit) - 1;\n if (position > orderedIds.length - 1) return;\n\n openChat({ id: orderedIds[position] });\n }\n\n if (e.altKey) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (!targetIndexDelta) return;\n\n if (!currentChatId) {\n e.preventDefault();\n openChat({ id: orderedIds[0] });\n return;\n }\n\n const position = orderedIds.indexOf(currentChatId);\n\n if (position === -1) {\n return;\n }\n const nextId = orderedIds[position + targetIndexDelta];\n\n e.preventDefault();\n openChat({ id: nextId });\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n return (\n \n {viewportIds && viewportIds.length && chatArrays ? (\n renderChats()\n ) : viewportIds && !viewportIds.length ? (\n
{noChatsText}
\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { folderType, folderId }): StateProps => {\n const {\n chats: {\n listIds,\n byId: chatsById,\n orderedPinnedIds,\n },\n users: { byId: usersById },\n lastSyncTime,\n } = global;\n const { chatId: currentChatId, threadId: currentThreadId } = selectCurrentMessageList(global) || {};\n\n const listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined;\n const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatsById,\n usersById,\n currentChatId,\n lastSyncTime,\n ...(listType ? {\n listIds: listIds[listType],\n orderedPinnedIds: orderedPinnedIds[listType],\n } : {\n chatFolder,\n }),\n isInDiscussionThread: currentThreadId !== MAIN_THREAD_ID,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadMoreChats',\n 'preloadTopChatMessages',\n 'openChat',\n ]),\n)(ChatList));\n","import { useCallback, useEffect, useState } from '../../../../lib/teact/teact';\n\nimport { ApiMessageEntityTypes, ApiChatMember, ApiUser } from '../../../../api/types';\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { getUserFirstOrLastName } from '../../../../modules/helpers';\nimport searchUserName from '../helpers/searchUserName';\nimport { IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport useFlag from '../../../../hooks/useFlag';\n\nconst RE_NOT_USERNAME_SEARCH = /[^@_\\d\\wа-яё]+/i;\n\nexport default function useMentionTooltip(\n canSuggestMembers: boolean | undefined,\n html: string,\n onUpdateHtml: (html: string) => void,\n inputId: string = EDITABLE_INPUT_ID,\n groupChatMembers?: ApiChatMember[],\n currentUserId?: number,\n usersById?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [currentFilter, setCurrentFilter] = useState('');\n const [filteredMembers, setFilteredMembers] = useState([]);\n\n const getFilteredMembers = useCallback((filter) => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return groupChatMembers.filter(({ userId }) => {\n const user = usersById[userId];\n if (userId === currentUserId || !user) {\n return false;\n }\n\n return !filter || searchUserName(filter, user);\n });\n }, [groupChatMembers, currentUserId, usersById]);\n\n useEffect(() => {\n if (!canSuggestMembers || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const usernameFilter = getUsernameFilter(html);\n\n if (usernameFilter) {\n const filter = usernameFilter ? usernameFilter.substr(1) : '';\n const membersToMention = getFilteredMembers(filter);\n if (membersToMention && membersToMention.length) {\n markIsOpen();\n setCurrentFilter(filter);\n setFilteredMembers(membersToMention);\n } else {\n unmarkIsOpen();\n }\n } else {\n unmarkIsOpen();\n }\n }, [canSuggestMembers, html, getFilteredMembers, markIsOpen, unmarkIsOpen]);\n\n const insertMention = useCallback((user: ApiUser, forceFocus = false) => {\n if (!user.username && !getUserFirstOrLastName(user)) {\n return;\n }\n\n const insertedHtml = user.username\n ? `@${user.username}`\n : `${getUserFirstOrLastName(user)}`;\n\n const atIndex = html.lastIndexOf('@');\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${insertedHtml} `);\n const messageInput = document.getElementById(inputId)!;\n if (!IS_MOBILE_SCREEN) {\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, forceFocus);\n });\n }\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isMentionTooltipOpen: isOpen,\n mentionFilter: currentFilter,\n closeMentionTooltip: unmarkIsOpen,\n insertMention,\n mentionFilteredMembers: filteredMembers,\n };\n}\n\nfunction getUsernameFilter(html: string) {\n const tempEl = document.createElement('div');\n tempEl.innerHTML = html;\n const text = tempEl.innerText;\n\n const lastSymbol = text[text.length - 1];\n const lastWord = text.split(RE_NOT_USERNAME_SEARCH).pop();\n\n if (\n !text.length || RE_NOT_USERNAME_SEARCH.test(lastSymbol)\n || !lastWord || !lastWord.startsWith('@')\n ) {\n return undefined;\n }\n\n return lastWord;\n}\n","import { ApiUser } from '../../../../api/types';\nimport { getUserFullName } from '../../../../modules/helpers';\nimport searchWords from '../../../../util/searchWords';\n\n// TODO: Support cyrillic translit search\nexport default function searchUserName(filter: string, user: ApiUser) {\n const usernameLowered = user.username.toLowerCase();\n const fullName = getUserFullName(user);\n const fullNameLowered = fullName && fullName.toLowerCase();\n const filterLowered = filter.toLowerCase();\n\n return usernameLowered.startsWith(filterLowered) || (\n fullNameLowered && searchWords(fullNameLowered, filterLowered)\n );\n}\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport { imgToCanvas } from '../util/files';\nimport useForceUpdate from './useForceUpdate';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\nconst MAX_CACHE_SIZE = 1000;\n\nconst cache = new Map();\n\nexport default function useBlur(dataUri?: string, isDisabled = false, delay?: number) {\n const blurredRef = useRef(dataUri ? cache.get(dataUri) : undefined);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n if (timeoutRef.current && isDisabled) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useEffect(() => {\n if (!dataUri || blurredRef.current || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n img.onload = () => {\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n const blurredDataUri = canvas.toDataURL();\n\n blurredRef.current = blurredDataUri;\n forceUpdate();\n\n if (cache.size >= MAX_CACHE_SIZE) {\n cache.clear();\n }\n cache.set(dataUri, blurredDataUri);\n };\n\n if (delay) {\n timeoutRef.current = window.setTimeout(() => {\n img.src = dataUri;\n }, delay);\n } else {\n img.src = dataUri;\n }\n }, [dataUri, delay, forceUpdate, isDisabled]);\n\n return blurredRef.current;\n}\n","import { useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useOnChange from './useOnChange';\nimport useBlur from './useBlur';\nimport { imgToCanvas } from '../util/files';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useBlurSync(dataUri: string | false | undefined) {\n const blurredRef = useRef();\n\n let isChanged = false;\n\n useOnChange(() => {\n isChanged = true;\n\n blurredRef.current = undefined;\n\n if (!dataUri) {\n return;\n }\n\n const img = new Image();\n img.src = dataUri;\n if (!img.width) {\n return;\n }\n\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n\n blurredRef.current = canvas.toDataURL();\n }, [dataUri]);\n\n // Sometimes `Image` do not manage to load synchronously,\n // so we fall back the non-blurred variant and prepare the async one at least for the next time\n const blurredAsync = useBlur(dataUri || undefined, Boolean(blurredRef.current));\n\n return blurredRef.current || (!isChanged && blurredAsync) || dataUri || undefined;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/1.fb539fa72ec126e2a2cc.js b/dist/1.6e0d9af6c6bece6b9cdc.js similarity index 99% rename from dist/1.fb539fa72ec126e2a2cc.js rename to dist/1.6e0d9af6c6bece6b9cdc.js index c0eaf6017..5e399b272 100644 --- a/dist/1.fb539fa72ec126e2a2cc.js +++ b/dist/1.6e0d9af6c6bece6b9cdc.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{314:function(F){F.exports=JSON.parse('[["people",["Smileys & People"]],[["1F600",["grinning"]],["1F603",["smiley"]],["1F604",["smile"]],["1F601",["grin"]],["1F606",["laughing","satisfied"]],["1F605",["sweat_smile"]],["1F923",["rolling_on_the_floor_laughing"]],["1F602",["joy"]],["1F642",["slightly_smiling_face"]],["1F643",["upside_down_face"]],["1F609",["wink"]],["1F60A",["blush"]],["1F607",["innocent"]],["1F970",["smiling_face_with_3_hearts"]],["1F60D",["heart_eyes"]],["1F929",["star-struck","grinning_face_with_star_eyes"]],["1F618",["kissing_heart"]],["1F617",["kissing"]],["263A-FE0F",["relaxed"]],["1F61A",["kissing_closed_eyes"]],["1F619",["kissing_smiling_eyes"]],["1F972",["smiling_face_with_tear"]],["1F60B",["yum"]],["1F61B",["stuck_out_tongue"]],["1F61C",["stuck_out_tongue_winking_eye"]],["1F92A",["zany_face","grinning_face_with_one_large_and_one_small_eye"]],["1F61D",["stuck_out_tongue_closed_eyes"]],["1F911",["money_mouth_face"]],["1F917",["hugging_face"]],["1F92D",["face_with_hand_over_mouth","smiling_face_with_smiling_eyes_and_hand_covering_mouth"]],["1F92B",["shushing_face","face_with_finger_covering_closed_lips"]],["1F914",["thinking_face"]],["1F910",["zipper_mouth_face"]],["1F928",["face_with_raised_eyebrow","face_with_one_eyebrow_raised"]],["1F610",["neutral_face"]],["1F611",["expressionless"]],["1F636",["no_mouth"]],["1F636-200D-1F32B-FE0F",["face_in_clouds"]],["1F60F",["smirk"]],["1F612",["unamused"]],["1F644",["face_with_rolling_eyes"]],["1F62C",["grimacing"]],["1F62E-200D-1F4A8",["face_exhaling"]],["1F925",["lying_face"]],["1F60C",["relieved"]],["1F614",["pensive"]],["1F62A",["sleepy"]],["1F924",["drooling_face"]],["1F634",["sleeping"]],["1F637",["mask"]],["1F912",["face_with_thermometer"]],["1F915",["face_with_head_bandage"]],["1F922",["nauseated_face"]],["1F92E",["face_vomiting","face_with_open_mouth_vomiting"]],["1F927",["sneezing_face"]],["1F975",["hot_face"]],["1F976",["cold_face"]],["1F974",["woozy_face"]],["1F635",["dizzy_face"]],["1F635-200D-1F4AB",["face_with_spiral_eyes"]],["1F92F",["exploding_head","shocked_face_with_exploding_head"]],["1F920",["face_with_cowboy_hat"]],["1F973",["partying_face"]],["1F978",["disguised_face"]],["1F60E",["sunglasses"]],["1F913",["nerd_face"]],["1F9D0",["face_with_monocle"]],["1F615",["confused"]],["1F61F",["worried"]],["1F641",["slightly_frowning_face"]],["2639-FE0F",["white_frowning_face"]],["1F62E",["open_mouth"]],["1F62F",["hushed"]],["1F632",["astonished"]],["1F633",["flushed"]],["1F97A",["pleading_face"]],["1F626",["frowning"]],["1F627",["anguished"]],["1F628",["fearful"]],["1F630",["cold_sweat"]],["1F625",["disappointed_relieved"]],["1F622",["cry"]],["1F62D",["sob"]],["1F631",["scream"]],["1F616",["confounded"]],["1F623",["persevere"]],["1F61E",["disappointed"]],["1F613",["sweat"]],["1F629",["weary"]],["1F62B",["tired_face"]],["1F971",["yawning_face"]],["1F624",["triumph"]],["1F621",["rage"]],["1F620",["angry"]],["1F92C",["face_with_symbols_on_mouth","serious_face_with_symbols_covering_mouth"]],["1F608",["smiling_imp"]],["1F47F",["imp"]],["1F480",["skull"]],["2620-FE0F",["skull_and_crossbones"]],["1F4A9",["hankey","poop","shit"]],["1F921",["clown_face"]],["1F479",["japanese_ogre"]],["1F47A",["japanese_goblin"]],["1F47B",["ghost"]],["1F47D",["alien"]],["1F47E",["space_invader"]],["1F916",["robot_face"]],["1F63A",["smiley_cat"]],["1F638",["smile_cat"]],["1F639",["joy_cat"]],["1F63B",["heart_eyes_cat"]],["1F63C",["smirk_cat"]],["1F63D",["kissing_cat"]],["1F640",["scream_cat"]],["1F63F",["crying_cat_face"]],["1F63E",["pouting_cat"]],["1F648",["see_no_evil"]],["1F649",["hear_no_evil"]],["1F64A",["speak_no_evil"]],["1F48B",["kiss"]],["1F48C",["love_letter"]],["1F498",["cupid"]],["1F49D",["gift_heart"]],["1F496",["sparkling_heart"]],["1F497",["heartpulse"]],["1F493",["heartbeat"]],["1F49E",["revolving_hearts"]],["1F495",["two_hearts"]],["1F49F",["heart_decoration"]],["2763-FE0F",["heavy_heart_exclamation_mark_ornament"]],["1F494",["broken_heart"]],["2764-FE0F-200D-1F525",["heart_on_fire"]],["2764-FE0F-200D-1FA79",["mending_heart"]],["2764-FE0F",["heart"]],["1F9E1",["orange_heart"]],["1F49B",["yellow_heart"]],["1F49A",["green_heart"]],["1F499",["blue_heart"]],["1F49C",["purple_heart"]],["1F90E",["brown_heart"]],["1F5A4",["black_heart"]],["1F90D",["white_heart"]],["1F4AF",["100"]],["1F4A2",["anger"]],["1F4A5",["boom","collision"]],["1F4AB",["dizzy"]],["1F4A6",["sweat_drops"]],["1F4A8",["dash"]],["1F573-FE0F",["hole"]],["1F4A3",["bomb"]],["1F4AC",["speech_balloon"]],["1F441-FE0F-200D-1F5E8-FE0F",["eye-in-speech-bubble"]],["1F5E8-FE0F",["left_speech_bubble"]],["1F5EF-FE0F",["right_anger_bubble"]],["1F4AD",["thought_balloon"]],["1F4A4",["zzz"]],["1F44B",["wave"]],["1F91A",["raised_back_of_hand"]],["1F590-FE0F",["raised_hand_with_fingers_splayed"]],["270B",["hand","raised_hand"]],["1F596",["spock-hand"]],["1F44C",["ok_hand"]],["1F90C",["pinched_fingers"]],["1F90F",["pinching_hand"]],["270C-FE0F",["v"]],["1F91E",["crossed_fingers","hand_with_index_and_middle_fingers_crossed"]],["1F91F",["i_love_you_hand_sign"]],["1F918",["the_horns","sign_of_the_horns"]],["1F919",["call_me_hand"]],["1F448",["point_left"]],["1F449",["point_right"]],["1F446",["point_up_2"]],["1F595",["middle_finger","reversed_hand_with_middle_finger_extended"]],["1F447",["point_down"]],["261D-FE0F",["point_up"]],["1F44D",["+1","thumbsup"]],["1F44E",["-1","thumbsdown"]],["270A",["fist"]],["1F44A",["facepunch","punch"]],["1F91B",["left-facing_fist"]],["1F91C",["right-facing_fist"]],["1F44F",["clap"]],["1F64C",["raised_hands"]],["1F450",["open_hands"]],["1F932",["palms_up_together"]],["1F91D",["handshake"]],["1F64F",["pray"]],["270D-FE0F",["writing_hand"]],["1F485",["nail_care"]],["1F933",["selfie"]],["1F4AA",["muscle"]],["1F9BE",["mechanical_arm"]],["1F9BF",["mechanical_leg"]],["1F9B5",["leg"]],["1F9B6",["foot"]],["1F442",["ear"]],["1F9BB",["ear_with_hearing_aid"]],["1F443",["nose"]],["1F9E0",["brain"]],["1FAC0",["anatomical_heart"]],["1FAC1",["lungs"]],["1F9B7",["tooth"]],["1F9B4",["bone"]],["1F440",["eyes"]],["1F441-FE0F",["eye"]],["1F445",["tongue"]],["1F444",["lips"]],["1F476",["baby"]],["1F9D2",["child"]],["1F466",["boy"]],["1F467",["girl"]],["1F9D1",["adult"]],["1F471",["person_with_blond_hair"]],["1F468",["man"]],["1F9D4",["bearded_person"]],["1F9D4-200D-2642-FE0F",["man_with_beard"]],["1F9D4-200D-2640-FE0F",["woman_with_beard"]],["1F468-200D-1F9B0",["red_haired_man"]],["1F468-200D-1F9B1",["curly_haired_man"]],["1F468-200D-1F9B3",["white_haired_man"]],["1F468-200D-1F9B2",["bald_man"]],["1F469",["woman"]],["1F469-200D-1F9B0",["red_haired_woman"]],["1F9D1-200D-1F9B0",["red_haired_person"]],["1F469-200D-1F9B1",["curly_haired_woman"]],["1F9D1-200D-1F9B1",["curly_haired_person"]],["1F469-200D-1F9B3",["white_haired_woman"]],["1F9D1-200D-1F9B3",["white_haired_person"]],["1F469-200D-1F9B2",["bald_woman"]],["1F9D1-200D-1F9B2",["bald_person"]],["1F471-200D-2640-FE0F",["blond-haired-woman"]],["1F471-200D-2642-FE0F",["blond-haired-man"]],["1F9D3",["older_adult"]],["1F474",["older_man"]],["1F475",["older_woman"]],["1F64D",["person_frowning"]],["1F64D-200D-2642-FE0F",["man-frowning"]],["1F64D-200D-2640-FE0F",["woman-frowning"]],["1F64E",["person_with_pouting_face"]],["1F64E-200D-2642-FE0F",["man-pouting"]],["1F64E-200D-2640-FE0F",["woman-pouting"]],["1F645",["no_good"]],["1F645-200D-2642-FE0F",["man-gesturing-no"]],["1F645-200D-2640-FE0F",["woman-gesturing-no"]],["1F646",["ok_woman"]],["1F646-200D-2642-FE0F",["man-gesturing-ok"]],["1F646-200D-2640-FE0F",["woman-gesturing-ok"]],["1F481",["information_desk_person"]],["1F481-200D-2642-FE0F",["man-tipping-hand"]],["1F481-200D-2640-FE0F",["woman-tipping-hand"]],["1F64B",["raising_hand"]],["1F64B-200D-2642-FE0F",["man-raising-hand"]],["1F64B-200D-2640-FE0F",["woman-raising-hand"]],["1F9CF",["deaf_person"]],["1F9CF-200D-2642-FE0F",["deaf_man"]],["1F9CF-200D-2640-FE0F",["deaf_woman"]],["1F647",["bow"]],["1F647-200D-2642-FE0F",["man-bowing"]],["1F647-200D-2640-FE0F",["woman-bowing"]],["1F926",["face_palm"]],["1F926-200D-2642-FE0F",["man-facepalming"]],["1F926-200D-2640-FE0F",["woman-facepalming"]],["1F937",["shrug"]],["1F937-200D-2642-FE0F",["man-shrugging"]],["1F937-200D-2640-FE0F",["woman-shrugging"]],["1F9D1-200D-2695-FE0F",["health_worker"]],["1F468-200D-2695-FE0F",["male-doctor"]],["1F469-200D-2695-FE0F",["female-doctor"]],["1F9D1-200D-1F393",["student"]],["1F468-200D-1F393",["male-student"]],["1F469-200D-1F393",["female-student"]],["1F9D1-200D-1F3EB",["teacher"]],["1F468-200D-1F3EB",["male-teacher"]],["1F469-200D-1F3EB",["female-teacher"]],["1F9D1-200D-2696-FE0F",["judge"]],["1F468-200D-2696-FE0F",["male-judge"]],["1F469-200D-2696-FE0F",["female-judge"]],["1F9D1-200D-1F33E",["farmer"]],["1F468-200D-1F33E",["male-farmer"]],["1F469-200D-1F33E",["female-farmer"]],["1F9D1-200D-1F373",["cook"]],["1F468-200D-1F373",["male-cook"]],["1F469-200D-1F373",["female-cook"]],["1F9D1-200D-1F527",["mechanic"]],["1F468-200D-1F527",["male-mechanic"]],["1F469-200D-1F527",["female-mechanic"]],["1F9D1-200D-1F3ED",["factory_worker"]],["1F468-200D-1F3ED",["male-factory-worker"]],["1F469-200D-1F3ED",["female-factory-worker"]],["1F9D1-200D-1F4BC",["office_worker"]],["1F468-200D-1F4BC",["male-office-worker"]],["1F469-200D-1F4BC",["female-office-worker"]],["1F9D1-200D-1F52C",["scientist"]],["1F468-200D-1F52C",["male-scientist"]],["1F469-200D-1F52C",["female-scientist"]],["1F9D1-200D-1F4BB",["technologist"]],["1F468-200D-1F4BB",["male-technologist"]],["1F469-200D-1F4BB",["female-technologist"]],["1F9D1-200D-1F3A4",["singer"]],["1F468-200D-1F3A4",["male-singer"]],["1F469-200D-1F3A4",["female-singer"]],["1F9D1-200D-1F3A8",["artist"]],["1F468-200D-1F3A8",["male-artist"]],["1F469-200D-1F3A8",["female-artist"]],["1F9D1-200D-2708-FE0F",["pilot"]],["1F468-200D-2708-FE0F",["male-pilot"]],["1F469-200D-2708-FE0F",["female-pilot"]],["1F9D1-200D-1F680",["astronaut"]],["1F468-200D-1F680",["male-astronaut"]],["1F469-200D-1F680",["female-astronaut"]],["1F9D1-200D-1F692",["firefighter"]],["1F468-200D-1F692",["male-firefighter"]],["1F469-200D-1F692",["female-firefighter"]],["1F46E",["cop"]],["1F46E-200D-2642-FE0F",["male-police-officer"]],["1F46E-200D-2640-FE0F",["female-police-officer"]],["1F575-FE0F",["sleuth_or_spy"]],["1F575-FE0F-200D-2642-FE0F",["male-detective"]],["1F575-FE0F-200D-2640-FE0F",["female-detective"]],["1F482",["guardsman"]],["1F482-200D-2642-FE0F",["male-guard"]],["1F482-200D-2640-FE0F",["female-guard"]],["1F977",["ninja"]],["1F477",["construction_worker"]],["1F477-200D-2642-FE0F",["male-construction-worker"]],["1F477-200D-2640-FE0F",["female-construction-worker"]],["1F934",["prince"]],["1F478",["princess"]],["1F473",["man_with_turban"]],["1F473-200D-2642-FE0F",["man-wearing-turban"]],["1F473-200D-2640-FE0F",["woman-wearing-turban"]],["1F472",["man_with_gua_pi_mao"]],["1F9D5",["person_with_headscarf"]],["1F935",["person_in_tuxedo"]],["1F935-200D-2642-FE0F",["man_in_tuxedo"]],["1F935-200D-2640-FE0F",["woman_in_tuxedo"]],["1F470",["bride_with_veil"]],["1F470-200D-2642-FE0F",["man_with_veil"]],["1F470-200D-2640-FE0F",["woman_with_veil"]],["1F930",["pregnant_woman"]],["1F931",["breast-feeding"]],["1F469-200D-1F37C",["woman_feeding_baby"]],["1F468-200D-1F37C",["man_feeding_baby"]],["1F9D1-200D-1F37C",["person_feeding_baby"]],["1F47C",["angel"]],["1F385",["santa"]],["1F936",["mrs_claus","mother_christmas"]],["1F9D1-200D-1F384",["mx_claus"]],["1F9B8",["superhero"]],["1F9B8-200D-2642-FE0F",["male_superhero"]],["1F9B8-200D-2640-FE0F",["female_superhero"]],["1F9B9",["supervillain"]],["1F9B9-200D-2642-FE0F",["male_supervillain"]],["1F9B9-200D-2640-FE0F",["female_supervillain"]],["1F9D9",["mage"]],["1F9D9-200D-2642-FE0F",["male_mage"]],["1F9D9-200D-2640-FE0F",["female_mage"]],["1F9DA",["fairy"]],["1F9DA-200D-2642-FE0F",["male_fairy"]],["1F9DA-200D-2640-FE0F",["female_fairy"]],["1F9DB",["vampire"]],["1F9DB-200D-2642-FE0F",["male_vampire"]],["1F9DB-200D-2640-FE0F",["female_vampire"]],["1F9DC",["merperson"]],["1F9DC-200D-2642-FE0F",["merman"]],["1F9DC-200D-2640-FE0F",["mermaid"]],["1F9DD",["elf"]],["1F9DD-200D-2642-FE0F",["male_elf"]],["1F9DD-200D-2640-FE0F",["female_elf"]],["1F9DE",["genie"]],["1F9DE-200D-2642-FE0F",["male_genie"]],["1F9DE-200D-2640-FE0F",["female_genie"]],["1F9DF",["zombie"]],["1F9DF-200D-2642-FE0F",["male_zombie"]],["1F9DF-200D-2640-FE0F",["female_zombie"]],["1F486",["massage"]],["1F486-200D-2642-FE0F",["man-getting-massage"]],["1F486-200D-2640-FE0F",["woman-getting-massage"]],["1F487",["haircut"]],["1F487-200D-2642-FE0F",["man-getting-haircut"]],["1F487-200D-2640-FE0F",["woman-getting-haircut"]],["1F6B6",["walking"]],["1F6B6-200D-2642-FE0F",["man-walking"]],["1F6B6-200D-2640-FE0F",["woman-walking"]],["1F9CD",["standing_person"]],["1F9CD-200D-2642-FE0F",["man_standing"]],["1F9CD-200D-2640-FE0F",["woman_standing"]],["1F9CE",["kneeling_person"]],["1F9CE-200D-2642-FE0F",["man_kneeling"]],["1F9CE-200D-2640-FE0F",["woman_kneeling"]],["1F9D1-200D-1F9AF",["person_with_probing_cane"]],["1F468-200D-1F9AF",["man_with_probing_cane"]],["1F469-200D-1F9AF",["woman_with_probing_cane"]],["1F9D1-200D-1F9BC",["person_in_motorized_wheelchair"]],["1F468-200D-1F9BC",["man_in_motorized_wheelchair"]],["1F469-200D-1F9BC",["woman_in_motorized_wheelchair"]],["1F9D1-200D-1F9BD",["person_in_manual_wheelchair"]],["1F468-200D-1F9BD",["man_in_manual_wheelchair"]],["1F469-200D-1F9BD",["woman_in_manual_wheelchair"]],["1F3C3",["runner","running"]],["1F3C3-200D-2642-FE0F",["man-running"]],["1F3C3-200D-2640-FE0F",["woman-running"]],["1F483",["dancer"]],["1F57A",["man_dancing"]],["1F574-FE0F",["man_in_business_suit_levitating"]],["1F46F",["dancers"]],["1F46F-200D-2642-FE0F",["men-with-bunny-ears-partying","man-with-bunny-ears-partying"]],["1F46F-200D-2640-FE0F",["women-with-bunny-ears-partying","woman-with-bunny-ears-partying"]],["1F9D6",["person_in_steamy_room"]],["1F9D6-200D-2642-FE0F",["man_in_steamy_room"]],["1F9D6-200D-2640-FE0F",["woman_in_steamy_room"]],["1F9D7",["person_climbing"]],["1F9D7-200D-2642-FE0F",["man_climbing"]],["1F9D7-200D-2640-FE0F",["woman_climbing"]],["1F93A",["fencer"]],["1F3C7",["horse_racing"]],["26F7-FE0F",["skier"]],["1F3C2",["snowboarder"]],["1F3CC-FE0F",["golfer"]],["1F3CC-FE0F-200D-2642-FE0F",["man-golfing"]],["1F3CC-FE0F-200D-2640-FE0F",["woman-golfing"]],["1F3C4",["surfer"]],["1F3C4-200D-2642-FE0F",["man-surfing"]],["1F3C4-200D-2640-FE0F",["woman-surfing"]],["1F6A3",["rowboat"]],["1F6A3-200D-2642-FE0F",["man-rowing-boat"]],["1F6A3-200D-2640-FE0F",["woman-rowing-boat"]],["1F3CA",["swimmer"]],["1F3CA-200D-2642-FE0F",["man-swimming"]],["1F3CA-200D-2640-FE0F",["woman-swimming"]],["26F9-FE0F",["person_with_ball"]],["26F9-FE0F-200D-2642-FE0F",["man-bouncing-ball"]],["26F9-FE0F-200D-2640-FE0F",["woman-bouncing-ball"]],["1F3CB-FE0F",["weight_lifter"]],["1F3CB-FE0F-200D-2642-FE0F",["man-lifting-weights"]],["1F3CB-FE0F-200D-2640-FE0F",["woman-lifting-weights"]],["1F6B4",["bicyclist"]],["1F6B4-200D-2642-FE0F",["man-biking"]],["1F6B4-200D-2640-FE0F",["woman-biking"]],["1F6B5",["mountain_bicyclist"]],["1F6B5-200D-2642-FE0F",["man-mountain-biking"]],["1F6B5-200D-2640-FE0F",["woman-mountain-biking"]],["1F938",["person_doing_cartwheel"]],["1F938-200D-2642-FE0F",["man-cartwheeling"]],["1F938-200D-2640-FE0F",["woman-cartwheeling"]],["1F93C",["wrestlers"]],["1F93C-200D-2642-FE0F",["man-wrestling"]],["1F93C-200D-2640-FE0F",["woman-wrestling"]],["1F93D",["water_polo"]],["1F93D-200D-2642-FE0F",["man-playing-water-polo"]],["1F93D-200D-2640-FE0F",["woman-playing-water-polo"]],["1F93E",["handball"]],["1F93E-200D-2642-FE0F",["man-playing-handball"]],["1F93E-200D-2640-FE0F",["woman-playing-handball"]],["1F939",["juggling"]],["1F939-200D-2642-FE0F",["man-juggling"]],["1F939-200D-2640-FE0F",["woman-juggling"]],["1F9D8",["person_in_lotus_position"]],["1F9D8-200D-2642-FE0F",["man_in_lotus_position"]],["1F9D8-200D-2640-FE0F",["woman_in_lotus_position"]],["1F6C0",["bath"]],["1F6CC",["sleeping_accommodation"]],["1F9D1-200D-1F91D-200D-1F9D1",["people_holding_hands"]],["1F46D",["two_women_holding_hands","women_holding_hands"]],["1F46B",["man_and_woman_holding_hands","woman_and_man_holding_hands","couple"]],["1F46C",["two_men_holding_hands","men_holding_hands"]],["1F48F",["couplekiss"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F468",["woman-kiss-man"]],["1F468-200D-2764-FE0F-200D-1F48B-200D-1F468",["man-kiss-man"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F469",["woman-kiss-woman"]],["1F491",["couple_with_heart"]],["1F469-200D-2764-FE0F-200D-1F468",["woman-heart-man"]],["1F468-200D-2764-FE0F-200D-1F468",["man-heart-man"]],["1F469-200D-2764-FE0F-200D-1F469",["woman-heart-woman"]],["1F46A",["family"]],["1F468-200D-1F469-200D-1F466",["man-woman-boy"]],["1F468-200D-1F469-200D-1F467",["man-woman-girl"]],["1F468-200D-1F469-200D-1F467-200D-1F466",["man-woman-girl-boy"]],["1F468-200D-1F469-200D-1F466-200D-1F466",["man-woman-boy-boy"]],["1F468-200D-1F469-200D-1F467-200D-1F467",["man-woman-girl-girl"]],["1F468-200D-1F468-200D-1F466",["man-man-boy"]],["1F468-200D-1F468-200D-1F467",["man-man-girl"]],["1F468-200D-1F468-200D-1F467-200D-1F466",["man-man-girl-boy"]],["1F468-200D-1F468-200D-1F466-200D-1F466",["man-man-boy-boy"]],["1F468-200D-1F468-200D-1F467-200D-1F467",["man-man-girl-girl"]],["1F469-200D-1F469-200D-1F466",["woman-woman-boy"]],["1F469-200D-1F469-200D-1F467",["woman-woman-girl"]],["1F469-200D-1F469-200D-1F467-200D-1F466",["woman-woman-girl-boy"]],["1F469-200D-1F469-200D-1F466-200D-1F466",["woman-woman-boy-boy"]],["1F469-200D-1F469-200D-1F467-200D-1F467",["woman-woman-girl-girl"]],["1F468-200D-1F466",["man-boy"]],["1F468-200D-1F466-200D-1F466",["man-boy-boy"]],["1F468-200D-1F467",["man-girl"]],["1F468-200D-1F467-200D-1F466",["man-girl-boy"]],["1F468-200D-1F467-200D-1F467",["man-girl-girl"]],["1F469-200D-1F466",["woman-boy"]],["1F469-200D-1F466-200D-1F466",["woman-boy-boy"]],["1F469-200D-1F467",["woman-girl"]],["1F469-200D-1F467-200D-1F466",["woman-girl-boy"]],["1F469-200D-1F467-200D-1F467",["woman-girl-girl"]],["1F5E3-FE0F",["speaking_head_in_silhouette"]],["1F464",["bust_in_silhouette"]],["1F465",["busts_in_silhouette"]],["1FAC2",["people_hugging"]],["1F463",["footprints"]]],["nature",["Animals & Nature"]],[["1F435",["monkey_face"]],["1F412",["monkey"]],["1F98D",["gorilla"]],["1F9A7",["orangutan"]],["1F436",["dog"]],["1F415",["dog2"]],["1F9AE",["guide_dog"]],["1F415-200D-1F9BA",["service_dog"]],["1F429",["poodle"]],["1F43A",["wolf"]],["1F98A",["fox_face"]],["1F99D",["raccoon"]],["1F431",["cat"]],["1F408",["cat2"]],["1F408-200D-2B1B",["black_cat"]],["1F981",["lion_face"]],["1F42F",["tiger"]],["1F405",["tiger2"]],["1F406",["leopard"]],["1F434",["horse"]],["1F40E",["racehorse"]],["1F984",["unicorn_face"]],["1F993",["zebra_face"]],["1F98C",["deer"]],["1F9AC",["bison"]],["1F42E",["cow"]],["1F402",["ox"]],["1F403",["water_buffalo"]],["1F404",["cow2"]],["1F437",["pig"]],["1F416",["pig2"]],["1F417",["boar"]],["1F43D",["pig_nose"]],["1F40F",["ram"]],["1F411",["sheep"]],["1F410",["goat"]],["1F42A",["dromedary_camel"]],["1F42B",["camel"]],["1F999",["llama"]],["1F992",["giraffe_face"]],["1F418",["elephant"]],["1F9A3",["mammoth"]],["1F98F",["rhinoceros"]],["1F99B",["hippopotamus"]],["1F42D",["mouse"]],["1F401",["mouse2"]],["1F400",["rat"]],["1F439",["hamster"]],["1F430",["rabbit"]],["1F407",["rabbit2"]],["1F43F-FE0F",["chipmunk"]],["1F9AB",["beaver"]],["1F994",["hedgehog"]],["1F987",["bat"]],["1F43B",["bear"]],["1F43B-200D-2744-FE0F",["polar_bear"]],["1F428",["koala"]],["1F43C",["panda_face"]],["1F9A5",["sloth"]],["1F9A6",["otter"]],["1F9A8",["skunk"]],["1F998",["kangaroo"]],["1F9A1",["badger"]],["1F43E",["feet","paw_prints"]],["1F983",["turkey"]],["1F414",["chicken"]],["1F413",["rooster"]],["1F423",["hatching_chick"]],["1F424",["baby_chick"]],["1F425",["hatched_chick"]],["1F426",["bird"]],["1F427",["penguin"]],["1F54A-FE0F",["dove_of_peace"]],["1F985",["eagle"]],["1F986",["duck"]],["1F9A2",["swan"]],["1F989",["owl"]],["1F9A4",["dodo"]],["1FAB6",["feather"]],["1F9A9",["flamingo"]],["1F99A",["peacock"]],["1F99C",["parrot"]],["1F438",["frog"]],["1F40A",["crocodile"]],["1F422",["turtle"]],["1F98E",["lizard"]],["1F40D",["snake"]],["1F432",["dragon_face"]],["1F409",["dragon"]],["1F995",["sauropod"]],["1F996",["t-rex"]],["1F433",["whale"]],["1F40B",["whale2"]],["1F42C",["dolphin","flipper"]],["1F9AD",["seal"]],["1F41F",["fish"]],["1F420",["tropical_fish"]],["1F421",["blowfish"]],["1F988",["shark"]],["1F419",["octopus"]],["1F41A",["shell"]],["1F40C",["snail"]],["1F98B",["butterfly"]],["1F41B",["bug"]],["1F41C",["ant"]],["1F41D",["bee","honeybee"]],["1FAB2",["beetle"]],["1F41E",["ladybug","lady_beetle"]],["1F997",["cricket"]],["1FAB3",["cockroach"]],["1F577-FE0F",["spider"]],["1F578-FE0F",["spider_web"]],["1F982",["scorpion"]],["1F99F",["mosquito"]],["1FAB0",["fly"]],["1FAB1",["worm"]],["1F9A0",["microbe"]],["1F490",["bouquet"]],["1F338",["cherry_blossom"]],["1F4AE",["white_flower"]],["1F3F5-FE0F",["rosette"]],["1F339",["rose"]],["1F940",["wilted_flower"]],["1F33A",["hibiscus"]],["1F33B",["sunflower"]],["1F33C",["blossom"]],["1F337",["tulip"]],["1F331",["seedling"]],["1FAB4",["potted_plant"]],["1F332",["evergreen_tree"]],["1F333",["deciduous_tree"]],["1F334",["palm_tree"]],["1F335",["cactus"]],["1F33E",["ear_of_rice"]],["1F33F",["herb"]],["2618-FE0F",["shamrock"]],["1F340",["four_leaf_clover"]],["1F341",["maple_leaf"]],["1F342",["fallen_leaf"]],["1F343",["leaves"]]],["foods",["Food & Drink"]],[["1F347",["grapes"]],["1F348",["melon"]],["1F349",["watermelon"]],["1F34A",["tangerine"]],["1F34B",["lemon"]],["1F34C",["banana"]],["1F34D",["pineapple"]],["1F96D",["mango"]],["1F34E",["apple"]],["1F34F",["green_apple"]],["1F350",["pear"]],["1F351",["peach"]],["1F352",["cherries"]],["1F353",["strawberry"]],["1FAD0",["blueberries"]],["1F95D",["kiwifruit"]],["1F345",["tomato"]],["1FAD2",["olive"]],["1F965",["coconut"]],["1F951",["avocado"]],["1F346",["eggplant"]],["1F954",["potato"]],["1F955",["carrot"]],["1F33D",["corn"]],["1F336-FE0F",["hot_pepper"]],["1FAD1",["bell_pepper"]],["1F952",["cucumber"]],["1F96C",["leafy_green"]],["1F966",["broccoli"]],["1F9C4",["garlic"]],["1F9C5",["onion"]],["1F344",["mushroom"]],["1F95C",["peanuts"]],["1F330",["chestnut"]],["1F35E",["bread"]],["1F950",["croissant"]],["1F956",["baguette_bread"]],["1FAD3",["flatbread"]],["1F968",["pretzel"]],["1F96F",["bagel"]],["1F95E",["pancakes"]],["1F9C7",["waffle"]],["1F9C0",["cheese_wedge"]],["1F356",["meat_on_bone"]],["1F357",["poultry_leg"]],["1F969",["cut_of_meat"]],["1F953",["bacon"]],["1F354",["hamburger"]],["1F35F",["fries"]],["1F355",["pizza"]],["1F32D",["hotdog"]],["1F96A",["sandwich"]],["1F32E",["taco"]],["1F32F",["burrito"]],["1FAD4",["tamale"]],["1F959",["stuffed_flatbread"]],["1F9C6",["falafel"]],["1F95A",["egg"]],["1F373",["fried_egg","cooking"]],["1F958",["shallow_pan_of_food"]],["1F372",["stew"]],["1FAD5",["fondue"]],["1F963",["bowl_with_spoon"]],["1F957",["green_salad"]],["1F37F",["popcorn"]],["1F9C8",["butter"]],["1F9C2",["salt"]],["1F96B",["canned_food"]],["1F371",["bento"]],["1F358",["rice_cracker"]],["1F359",["rice_ball"]],["1F35A",["rice"]],["1F35B",["curry"]],["1F35C",["ramen"]],["1F35D",["spaghetti"]],["1F360",["sweet_potato"]],["1F362",["oden"]],["1F363",["sushi"]],["1F364",["fried_shrimp"]],["1F365",["fish_cake"]],["1F96E",["moon_cake"]],["1F361",["dango"]],["1F95F",["dumpling"]],["1F960",["fortune_cookie"]],["1F961",["takeout_box"]],["1F980",["crab"]],["1F99E",["lobster"]],["1F990",["shrimp"]],["1F991",["squid"]],["1F9AA",["oyster"]],["1F366",["icecream"]],["1F367",["shaved_ice"]],["1F368",["ice_cream"]],["1F369",["doughnut"]],["1F36A",["cookie"]],["1F382",["birthday"]],["1F370",["cake"]],["1F9C1",["cupcake"]],["1F967",["pie"]],["1F36B",["chocolate_bar"]],["1F36C",["candy"]],["1F36D",["lollipop"]],["1F36E",["custard"]],["1F36F",["honey_pot"]],["1F37C",["baby_bottle"]],["1F95B",["glass_of_milk"]],["2615",["coffee"]],["1FAD6",["teapot"]],["1F375",["tea"]],["1F376",["sake"]],["1F37E",["champagne"]],["1F377",["wine_glass"]],["1F378",["cocktail"]],["1F379",["tropical_drink"]],["1F37A",["beer"]],["1F37B",["beers"]],["1F942",["clinking_glasses"]],["1F943",["tumbler_glass"]],["1F964",["cup_with_straw"]],["1F9CB",["bubble_tea"]],["1F9C3",["beverage_box"]],["1F9C9",["mate_drink"]],["1F9CA",["ice_cube"]],["1F962",["chopsticks"]],["1F37D-FE0F",["knife_fork_plate"]],["1F374",["fork_and_knife"]],["1F944",["spoon"]],["1F52A",["hocho","knife"]],["1F3FA",["amphora"]]],["activity",["Activities"]],[["1F383",["jack_o_lantern"]],["1F384",["christmas_tree"]],["1F386",["fireworks"]],["1F387",["sparkler"]],["1F9E8",["firecracker"]],["2728",["sparkles"]],["1F388",["balloon"]],["1F389",["tada"]],["1F38A",["confetti_ball"]],["1F38B",["tanabata_tree"]],["1F38D",["bamboo"]],["1F38E",["dolls"]],["1F38F",["flags"]],["1F390",["wind_chime"]],["1F391",["rice_scene"]],["1F9E7",["red_envelope"]],["1F380",["ribbon"]],["1F381",["gift"]],["1F397-FE0F",["reminder_ribbon"]],["1F39F-FE0F",["admission_tickets"]],["1F3AB",["ticket"]],["1F396-FE0F",["medal"]],["1F3C6",["trophy"]],["1F3C5",["sports_medal"]],["1F947",["first_place_medal"]],["1F948",["second_place_medal"]],["1F949",["third_place_medal"]],["26BD",["soccer"]],["26BE",["baseball"]],["1F94E",["softball"]],["1F3C0",["basketball"]],["1F3D0",["volleyball"]],["1F3C8",["football"]],["1F3C9",["rugby_football"]],["1F3BE",["tennis"]],["1F94F",["flying_disc"]],["1F3B3",["bowling"]],["1F3CF",["cricket_bat_and_ball"]],["1F3D1",["field_hockey_stick_and_ball"]],["1F3D2",["ice_hockey_stick_and_puck"]],["1F94D",["lacrosse"]],["1F3D3",["table_tennis_paddle_and_ball"]],["1F3F8",["badminton_racquet_and_shuttlecock"]],["1F94A",["boxing_glove"]],["1F94B",["martial_arts_uniform"]],["1F945",["goal_net"]],["26F3",["golf"]],["26F8-FE0F",["ice_skate"]],["1F3A3",["fishing_pole_and_fish"]],["1F93F",["diving_mask"]],["1F3BD",["running_shirt_with_sash"]],["1F3BF",["ski"]],["1F6F7",["sled"]],["1F94C",["curling_stone"]],["1F3AF",["dart"]],["1FA80",["yo-yo"]],["1FA81",["kite"]],["1F3B1",["8ball"]],["1F52E",["crystal_ball"]],["1FA84",["magic_wand"]],["1F9FF",["nazar_amulet"]],["1F3AE",["video_game"]],["1F579-FE0F",["joystick"]],["1F3B0",["slot_machine"]],["1F3B2",["game_die"]],["1F9E9",["jigsaw"]],["1F9F8",["teddy_bear"]],["1FA85",["pinata"]],["1FA86",["nesting_dolls"]],["2660-FE0F",["spades"]],["2665-FE0F",["hearts"]],["2666-FE0F",["diamonds"]],["2663-FE0F",["clubs"]],["265F-FE0F",["chess_pawn"]],["1F0CF",["black_joker"]],["1F004",["mahjong"]],["1F3B4",["flower_playing_cards"]],["1F3AD",["performing_arts"]],["1F5BC-FE0F",["frame_with_picture"]],["1F3A8",["art"]],["1F9F5",["thread"]],["1FAA1",["sewing_needle"]],["1F9F6",["yarn"]],["1FAA2",["knot"]]],["places",["Travel & Places"]],[["1F30D",["earth_africa"]],["1F30E",["earth_americas"]],["1F30F",["earth_asia"]],["1F310",["globe_with_meridians"]],["1F5FA-FE0F",["world_map"]],["1F5FE",["japan"]],["1F9ED",["compass"]],["1F3D4-FE0F",["snow_capped_mountain"]],["26F0-FE0F",["mountain"]],["1F30B",["volcano"]],["1F5FB",["mount_fuji"]],["1F3D5-FE0F",["camping"]],["1F3D6-FE0F",["beach_with_umbrella"]],["1F3DC-FE0F",["desert"]],["1F3DD-FE0F",["desert_island"]],["1F3DE-FE0F",["national_park"]],["1F3DF-FE0F",["stadium"]],["1F3DB-FE0F",["classical_building"]],["1F3D7-FE0F",["building_construction"]],["1F9F1",["bricks"]],["1FAA8",["rock"]],["1FAB5",["wood"]],["1F6D6",["hut"]],["1F3D8-FE0F",["house_buildings"]],["1F3DA-FE0F",["derelict_house_building"]],["1F3E0",["house"]],["1F3E1",["house_with_garden"]],["1F3E2",["office"]],["1F3E3",["post_office"]],["1F3E4",["european_post_office"]],["1F3E5",["hospital"]],["1F3E6",["bank"]],["1F3E8",["hotel"]],["1F3E9",["love_hotel"]],["1F3EA",["convenience_store"]],["1F3EB",["school"]],["1F3EC",["department_store"]],["1F3ED",["factory"]],["1F3EF",["japanese_castle"]],["1F3F0",["european_castle"]],["1F492",["wedding"]],["1F5FC",["tokyo_tower"]],["1F5FD",["statue_of_liberty"]],["26EA",["church"]],["1F54C",["mosque"]],["1F6D5",["hindu_temple"]],["1F54D",["synagogue"]],["26E9-FE0F",["shinto_shrine"]],["1F54B",["kaaba"]],["26F2",["fountain"]],["26FA",["tent"]],["1F301",["foggy"]],["1F303",["night_with_stars"]],["1F3D9-FE0F",["cityscape"]],["1F304",["sunrise_over_mountains"]],["1F305",["sunrise"]],["1F306",["city_sunset"]],["1F307",["city_sunrise"]],["1F309",["bridge_at_night"]],["2668-FE0F",["hotsprings"]],["1F3A0",["carousel_horse"]],["1F3A1",["ferris_wheel"]],["1F3A2",["roller_coaster"]],["1F488",["barber"]],["1F3AA",["circus_tent"]],["1F682",["steam_locomotive"]],["1F683",["railway_car"]],["1F684",["bullettrain_side"]],["1F685",["bullettrain_front"]],["1F686",["train2"]],["1F687",["metro"]],["1F688",["light_rail"]],["1F689",["station"]],["1F68A",["tram"]],["1F69D",["monorail"]],["1F69E",["mountain_railway"]],["1F68B",["train"]],["1F68C",["bus"]],["1F68D",["oncoming_bus"]],["1F68E",["trolleybus"]],["1F690",["minibus"]],["1F691",["ambulance"]],["1F692",["fire_engine"]],["1F693",["police_car"]],["1F694",["oncoming_police_car"]],["1F695",["taxi"]],["1F696",["oncoming_taxi"]],["1F697",["car","red_car"]],["1F698",["oncoming_automobile"]],["1F699",["blue_car"]],["1F6FB",["pickup_truck"]],["1F69A",["truck"]],["1F69B",["articulated_lorry"]],["1F69C",["tractor"]],["1F3CE-FE0F",["racing_car"]],["1F3CD-FE0F",["racing_motorcycle"]],["1F6F5",["motor_scooter"]],["1F9BD",["manual_wheelchair"]],["1F9BC",["motorized_wheelchair"]],["1F6FA",["auto_rickshaw"]],["1F6B2",["bike"]],["1F6F4",["scooter"]],["1F6F9",["skateboard"]],["1F6FC",["roller_skate"]],["1F68F",["busstop"]],["1F6E3-FE0F",["motorway"]],["1F6E4-FE0F",["railway_track"]],["1F6E2-FE0F",["oil_drum"]],["26FD",["fuelpump"]],["1F6A8",["rotating_light"]],["1F6A5",["traffic_light"]],["1F6A6",["vertical_traffic_light"]],["1F6D1",["octagonal_sign"]],["1F6A7",["construction"]],["2693",["anchor"]],["26F5",["boat","sailboat"]],["1F6F6",["canoe"]],["1F6A4",["speedboat"]],["1F6F3-FE0F",["passenger_ship"]],["26F4-FE0F",["ferry"]],["1F6E5-FE0F",["motor_boat"]],["1F6A2",["ship"]],["2708-FE0F",["airplane"]],["1F6E9-FE0F",["small_airplane"]],["1F6EB",["airplane_departure"]],["1F6EC",["airplane_arriving"]],["1FA82",["parachute"]],["1F4BA",["seat"]],["1F681",["helicopter"]],["1F69F",["suspension_railway"]],["1F6A0",["mountain_cableway"]],["1F6A1",["aerial_tramway"]],["1F6F0-FE0F",["satellite"]],["1F680",["rocket"]],["1F6F8",["flying_saucer"]],["1F6CE-FE0F",["bellhop_bell"]],["1F9F3",["luggage"]],["231B",["hourglass"]],["23F3",["hourglass_flowing_sand"]],["231A",["watch"]],["23F0",["alarm_clock"]],["23F1-FE0F",["stopwatch"]],["23F2-FE0F",["timer_clock"]],["1F570-FE0F",["mantelpiece_clock"]],["1F55B",["clock12"]],["1F567",["clock1230"]],["1F550",["clock1"]],["1F55C",["clock130"]],["1F551",["clock2"]],["1F55D",["clock230"]],["1F552",["clock3"]],["1F55E",["clock330"]],["1F553",["clock4"]],["1F55F",["clock430"]],["1F554",["clock5"]],["1F560",["clock530"]],["1F555",["clock6"]],["1F561",["clock630"]],["1F556",["clock7"]],["1F562",["clock730"]],["1F557",["clock8"]],["1F563",["clock830"]],["1F558",["clock9"]],["1F564",["clock930"]],["1F559",["clock10"]],["1F565",["clock1030"]],["1F55A",["clock11"]],["1F566",["clock1130"]],["1F311",["new_moon"]],["1F312",["waxing_crescent_moon"]],["1F313",["first_quarter_moon"]],["1F314",["moon","waxing_gibbous_moon"]],["1F315",["full_moon"]],["1F316",["waning_gibbous_moon"]],["1F317",["last_quarter_moon"]],["1F318",["waning_crescent_moon"]],["1F319",["crescent_moon"]],["1F31A",["new_moon_with_face"]],["1F31B",["first_quarter_moon_with_face"]],["1F31C",["last_quarter_moon_with_face"]],["1F321-FE0F",["thermometer"]],["2600-FE0F",["sunny"]],["1F31D",["full_moon_with_face"]],["1F31E",["sun_with_face"]],["1FA90",["ringed_planet"]],["2B50",["star"]],["1F31F",["star2"]],["1F320",["stars"]],["1F30C",["milky_way"]],["2601-FE0F",["cloud"]],["26C5",["partly_sunny"]],["26C8-FE0F",["thunder_cloud_and_rain"]],["1F324-FE0F",["mostly_sunny","sun_small_cloud"]],["1F325-FE0F",["barely_sunny","sun_behind_cloud"]],["1F326-FE0F",["partly_sunny_rain","sun_behind_rain_cloud"]],["1F327-FE0F",["rain_cloud"]],["1F328-FE0F",["snow_cloud"]],["1F329-FE0F",["lightning","lightning_cloud"]],["1F32A-FE0F",["tornado","tornado_cloud"]],["1F32B-FE0F",["fog"]],["1F32C-FE0F",["wind_blowing_face"]],["1F300",["cyclone"]],["1F308",["rainbow"]],["1F302",["closed_umbrella"]],["2602-FE0F",["umbrella"]],["2614",["umbrella_with_rain_drops"]],["26F1-FE0F",["umbrella_on_ground"]],["26A1",["zap"]],["2744-FE0F",["snowflake"]],["2603-FE0F",["snowman"]],["26C4",["snowman_without_snow"]],["2604-FE0F",["comet"]],["1F525",["fire"]],["1F4A7",["droplet"]],["1F30A",["ocean"]]],["objects",["Objects"]],[["1F453",["eyeglasses"]],["1F576-FE0F",["dark_sunglasses"]],["1F97D",["goggles"]],["1F97C",["lab_coat"]],["1F9BA",["safety_vest"]],["1F454",["necktie"]],["1F455",["shirt","tshirt"]],["1F456",["jeans"]],["1F9E3",["scarf"]],["1F9E4",["gloves"]],["1F9E5",["coat"]],["1F9E6",["socks"]],["1F457",["dress"]],["1F458",["kimono"]],["1F97B",["sari"]],["1FA71",["one-piece_swimsuit"]],["1FA72",["briefs"]],["1FA73",["shorts"]],["1F459",["bikini"]],["1F45A",["womans_clothes"]],["1F45B",["purse"]],["1F45C",["handbag"]],["1F45D",["pouch"]],["1F6CD-FE0F",["shopping_bags"]],["1F392",["school_satchel"]],["1FA74",["thong_sandal"]],["1F45E",["mans_shoe","shoe"]],["1F45F",["athletic_shoe"]],["1F97E",["hiking_boot"]],["1F97F",["womans_flat_shoe"]],["1F460",["high_heel"]],["1F461",["sandal"]],["1FA70",["ballet_shoes"]],["1F462",["boot"]],["1F451",["crown"]],["1F452",["womans_hat"]],["1F3A9",["tophat"]],["1F393",["mortar_board"]],["1F9E2",["billed_cap"]],["1FA96",["military_helmet"]],["26D1-FE0F",["helmet_with_white_cross"]],["1F4FF",["prayer_beads"]],["1F484",["lipstick"]],["1F48D",["ring"]],["1F48E",["gem"]],["1F507",["mute"]],["1F508",["speaker"]],["1F509",["sound"]],["1F50A",["loud_sound"]],["1F4E2",["loudspeaker"]],["1F4E3",["mega"]],["1F4EF",["postal_horn"]],["1F514",["bell"]],["1F515",["no_bell"]],["1F3BC",["musical_score"]],["1F3B5",["musical_note"]],["1F3B6",["notes"]],["1F399-FE0F",["studio_microphone"]],["1F39A-FE0F",["level_slider"]],["1F39B-FE0F",["control_knobs"]],["1F3A4",["microphone"]],["1F3A7",["headphones"]],["1F4FB",["radio"]],["1F3B7",["saxophone"]],["1FA97",["accordion"]],["1F3B8",["guitar"]],["1F3B9",["musical_keyboard"]],["1F3BA",["trumpet"]],["1F3BB",["violin"]],["1FA95",["banjo"]],["1F941",["drum_with_drumsticks"]],["1FA98",["long_drum"]],["1F4F1",["iphone"]],["1F4F2",["calling"]],["260E-FE0F",["phone","telephone"]],["1F4DE",["telephone_receiver"]],["1F4DF",["pager"]],["1F4E0",["fax"]],["1F50B",["battery"]],["1F50C",["electric_plug"]],["1F4BB",["computer"]],["1F5A5-FE0F",["desktop_computer"]],["1F5A8-FE0F",["printer"]],["2328-FE0F",["keyboard"]],["1F5B1-FE0F",["three_button_mouse"]],["1F5B2-FE0F",["trackball"]],["1F4BD",["minidisc"]],["1F4BE",["floppy_disk"]],["1F4BF",["cd"]],["1F4C0",["dvd"]],["1F9EE",["abacus"]],["1F3A5",["movie_camera"]],["1F39E-FE0F",["film_frames"]],["1F4FD-FE0F",["film_projector"]],["1F3AC",["clapper"]],["1F4FA",["tv"]],["1F4F7",["camera"]],["1F4F8",["camera_with_flash"]],["1F4F9",["video_camera"]],["1F4FC",["vhs"]],["1F50D",["mag"]],["1F50E",["mag_right"]],["1F56F-FE0F",["candle"]],["1F4A1",["bulb"]],["1F526",["flashlight"]],["1F3EE",["izakaya_lantern","lantern"]],["1FA94",["diya_lamp"]],["1F4D4",["notebook_with_decorative_cover"]],["1F4D5",["closed_book"]],["1F4D6",["book","open_book"]],["1F4D7",["green_book"]],["1F4D8",["blue_book"]],["1F4D9",["orange_book"]],["1F4DA",["books"]],["1F4D3",["notebook"]],["1F4D2",["ledger"]],["1F4C3",["page_with_curl"]],["1F4DC",["scroll"]],["1F4C4",["page_facing_up"]],["1F4F0",["newspaper"]],["1F5DE-FE0F",["rolled_up_newspaper"]],["1F4D1",["bookmark_tabs"]],["1F516",["bookmark"]],["1F3F7-FE0F",["label"]],["1F4B0",["moneybag"]],["1FA99",["coin"]],["1F4B4",["yen"]],["1F4B5",["dollar"]],["1F4B6",["euro"]],["1F4B7",["pound"]],["1F4B8",["money_with_wings"]],["1F4B3",["credit_card"]],["1F9FE",["receipt"]],["1F4B9",["chart"]],["2709-FE0F",["email","envelope"]],["1F4E7",["e-mail"]],["1F4E8",["incoming_envelope"]],["1F4E9",["envelope_with_arrow"]],["1F4E4",["outbox_tray"]],["1F4E5",["inbox_tray"]],["1F4E6",["package"]],["1F4EB",["mailbox"]],["1F4EA",["mailbox_closed"]],["1F4EC",["mailbox_with_mail"]],["1F4ED",["mailbox_with_no_mail"]],["1F4EE",["postbox"]],["1F5F3-FE0F",["ballot_box_with_ballot"]],["270F-FE0F",["pencil2"]],["2712-FE0F",["black_nib"]],["1F58B-FE0F",["lower_left_fountain_pen"]],["1F58A-FE0F",["lower_left_ballpoint_pen"]],["1F58C-FE0F",["lower_left_paintbrush"]],["1F58D-FE0F",["lower_left_crayon"]],["1F4DD",["memo","pencil"]],["1F4BC",["briefcase"]],["1F4C1",["file_folder"]],["1F4C2",["open_file_folder"]],["1F5C2-FE0F",["card_index_dividers"]],["1F4C5",["date"]],["1F4C6",["calendar"]],["1F5D2-FE0F",["spiral_note_pad"]],["1F5D3-FE0F",["spiral_calendar_pad"]],["1F4C7",["card_index"]],["1F4C8",["chart_with_upwards_trend"]],["1F4C9",["chart_with_downwards_trend"]],["1F4CA",["bar_chart"]],["1F4CB",["clipboard"]],["1F4CC",["pushpin"]],["1F4CD",["round_pushpin"]],["1F4CE",["paperclip"]],["1F587-FE0F",["linked_paperclips"]],["1F4CF",["straight_ruler"]],["1F4D0",["triangular_ruler"]],["2702-FE0F",["scissors"]],["1F5C3-FE0F",["card_file_box"]],["1F5C4-FE0F",["file_cabinet"]],["1F5D1-FE0F",["wastebasket"]],["1F512",["lock"]],["1F513",["unlock"]],["1F50F",["lock_with_ink_pen"]],["1F510",["closed_lock_with_key"]],["1F511",["key"]],["1F5DD-FE0F",["old_key"]],["1F528",["hammer"]],["1FA93",["axe"]],["26CF-FE0F",["pick"]],["2692-FE0F",["hammer_and_pick"]],["1F6E0-FE0F",["hammer_and_wrench"]],["1F5E1-FE0F",["dagger_knife"]],["2694-FE0F",["crossed_swords"]],["1F52B",["gun"]],["1FA83",["boomerang"]],["1F3F9",["bow_and_arrow"]],["1F6E1-FE0F",["shield"]],["1FA9A",["carpentry_saw"]],["1F527",["wrench"]],["1FA9B",["screwdriver"]],["1F529",["nut_and_bolt"]],["2699-FE0F",["gear"]],["1F5DC-FE0F",["compression"]],["2696-FE0F",["scales"]],["1F9AF",["probing_cane"]],["1F517",["link"]],["26D3-FE0F",["chains"]],["1FA9D",["hook"]],["1F9F0",["toolbox"]],["1F9F2",["magnet"]],["1FA9C",["ladder"]],["2697-FE0F",["alembic"]],["1F9EA",["test_tube"]],["1F9EB",["petri_dish"]],["1F9EC",["dna"]],["1F52C",["microscope"]],["1F52D",["telescope"]],["1F4E1",["satellite_antenna"]],["1F489",["syringe"]],["1FA78",["drop_of_blood"]],["1F48A",["pill"]],["1FA79",["adhesive_bandage"]],["1FA7A",["stethoscope"]],["1F6AA",["door"]],["1F6D7",["elevator"]],["1FA9E",["mirror"]],["1FA9F",["window"]],["1F6CF-FE0F",["bed"]],["1F6CB-FE0F",["couch_and_lamp"]],["1FA91",["chair"]],["1F6BD",["toilet"]],["1FAA0",["plunger"]],["1F6BF",["shower"]],["1F6C1",["bathtub"]],["1FAA4",["mouse_trap"]],["1FA92",["razor"]],["1F9F4",["lotion_bottle"]],["1F9F7",["safety_pin"]],["1F9F9",["broom"]],["1F9FA",["basket"]],["1F9FB",["roll_of_paper"]],["1FAA3",["bucket"]],["1F9FC",["soap"]],["1FAA5",["toothbrush"]],["1F9FD",["sponge"]],["1F9EF",["fire_extinguisher"]],["1F6D2",["shopping_trolley"]],["1F6AC",["smoking"]],["26B0-FE0F",["coffin"]],["1FAA6",["headstone"]],["26B1-FE0F",["funeral_urn"]],["1F5FF",["moyai"]],["1FAA7",["placard"]]],["symbols",["Symbols"]],[["1F3E7",["atm"]],["1F6AE",["put_litter_in_its_place"]],["1F6B0",["potable_water"]],["267F",["wheelchair"]],["1F6B9",["mens"]],["1F6BA",["womens"]],["1F6BB",["restroom"]],["1F6BC",["baby_symbol"]],["1F6BE",["wc"]],["1F6C2",["passport_control"]],["1F6C3",["customs"]],["1F6C4",["baggage_claim"]],["1F6C5",["left_luggage"]],["26A0-FE0F",["warning"]],["1F6B8",["children_crossing"]],["26D4",["no_entry"]],["1F6AB",["no_entry_sign"]],["1F6B3",["no_bicycles"]],["1F6AD",["no_smoking"]],["1F6AF",["do_not_litter"]],["1F6B1",["non-potable_water"]],["1F6B7",["no_pedestrians"]],["1F4F5",["no_mobile_phones"]],["1F51E",["underage"]],["2622-FE0F",["radioactive_sign"]],["2623-FE0F",["biohazard_sign"]],["2B06-FE0F",["arrow_up"]],["2197-FE0F",["arrow_upper_right"]],["27A1-FE0F",["arrow_right"]],["2198-FE0F",["arrow_lower_right"]],["2B07-FE0F",["arrow_down"]],["2199-FE0F",["arrow_lower_left"]],["2B05-FE0F",["arrow_left"]],["2196-FE0F",["arrow_upper_left"]],["2195-FE0F",["arrow_up_down"]],["2194-FE0F",["left_right_arrow"]],["21A9-FE0F",["leftwards_arrow_with_hook"]],["21AA-FE0F",["arrow_right_hook"]],["2934-FE0F",["arrow_heading_up"]],["2935-FE0F",["arrow_heading_down"]],["1F503",["arrows_clockwise"]],["1F504",["arrows_counterclockwise"]],["1F519",["back"]],["1F51A",["end"]],["1F51B",["on"]],["1F51C",["soon"]],["1F51D",["top"]],["1F6D0",["place_of_worship"]],["269B-FE0F",["atom_symbol"]],["1F549-FE0F",["om_symbol"]],["2721-FE0F",["star_of_david"]],["2638-FE0F",["wheel_of_dharma"]],["262F-FE0F",["yin_yang"]],["271D-FE0F",["latin_cross"]],["2626-FE0F",["orthodox_cross"]],["262A-FE0F",["star_and_crescent"]],["262E-FE0F",["peace_symbol"]],["1F54E",["menorah_with_nine_branches"]],["1F52F",["six_pointed_star"]],["2648",["aries"]],["2649",["taurus"]],["264A",["gemini"]],["264B",["cancer"]],["264C",["leo"]],["264D",["virgo"]],["264E",["libra"]],["264F",["scorpius"]],["2650",["sagittarius"]],["2651",["capricorn"]],["2652",["aquarius"]],["2653",["pisces"]],["26CE",["ophiuchus"]],["1F500",["twisted_rightwards_arrows"]],["1F501",["repeat"]],["1F502",["repeat_one"]],["25B6-FE0F",["arrow_forward"]],["23E9",["fast_forward"]],["23ED-FE0F",["black_right_pointing_double_triangle_with_vertical_bar"]],["23EF-FE0F",["black_right_pointing_triangle_with_double_vertical_bar"]],["25C0-FE0F",["arrow_backward"]],["23EA",["rewind"]],["23EE-FE0F",["black_left_pointing_double_triangle_with_vertical_bar"]],["1F53C",["arrow_up_small"]],["23EB",["arrow_double_up"]],["1F53D",["arrow_down_small"]],["23EC",["arrow_double_down"]],["23F8-FE0F",["double_vertical_bar"]],["23F9-FE0F",["black_square_for_stop"]],["23FA-FE0F",["black_circle_for_record"]],["23CF-FE0F",["eject"]],["1F3A6",["cinema"]],["1F505",["low_brightness"]],["1F506",["high_brightness"]],["1F4F6",["signal_strength"]],["1F4F3",["vibration_mode"]],["1F4F4",["mobile_phone_off"]],["2640-FE0F",["female_sign"]],["2642-FE0F",["male_sign"]],["26A7-FE0F",["transgender_symbol"]],["2716-FE0F",["heavy_multiplication_x"]],["2795",["heavy_plus_sign"]],["2796",["heavy_minus_sign"]],["2797",["heavy_division_sign"]],["267E-FE0F",["infinity"]],["203C-FE0F",["bangbang"]],["2049-FE0F",["interrobang"]],["2753",["question"]],["2754",["grey_question"]],["2755",["grey_exclamation"]],["2757",["exclamation","heavy_exclamation_mark"]],["3030-FE0F",["wavy_dash"]],["1F4B1",["currency_exchange"]],["1F4B2",["heavy_dollar_sign"]],["2695-FE0F",["medical_symbol","staff_of_aesculapius"]],["267B-FE0F",["recycle"]],["269C-FE0F",["fleur_de_lis"]],["1F531",["trident"]],["1F4DB",["name_badge"]],["1F530",["beginner"]],["2B55",["o"]],["2705",["white_check_mark"]],["2611-FE0F",["ballot_box_with_check"]],["2714-FE0F",["heavy_check_mark"]],["274C",["x"]],["274E",["negative_squared_cross_mark"]],["27B0",["curly_loop"]],["27BF",["loop"]],["303D-FE0F",["part_alternation_mark"]],["2733-FE0F",["eight_spoked_asterisk"]],["2734-FE0F",["eight_pointed_black_star"]],["2747-FE0F",["sparkle"]],["00A9-FE0F",["copyright"]],["00AE-FE0F",["registered"]],["2122-FE0F",["tm"]],["0023-FE0F-20E3",["hash"]],["002A-FE0F-20E3",["keycap_star"]],["0030-FE0F-20E3",["zero"]],["0031-FE0F-20E3",["one"]],["0032-FE0F-20E3",["two"]],["0033-FE0F-20E3",["three"]],["0034-FE0F-20E3",["four"]],["0035-FE0F-20E3",["five"]],["0036-FE0F-20E3",["six"]],["0037-FE0F-20E3",["seven"]],["0038-FE0F-20E3",["eight"]],["0039-FE0F-20E3",["nine"]],["1F51F",["keycap_ten"]],["1F520",["capital_abcd"]],["1F521",["abcd"]],["1F522",["1234"]],["1F523",["symbols"]],["1F524",["abc"]],["1F170-FE0F",["a"]],["1F18E",["ab"]],["1F171-FE0F",["b"]],["1F191",["cl"]],["1F192",["cool"]],["1F193",["free"]],["2139-FE0F",["information_source"]],["1F194",["id"]],["24C2-FE0F",["m"]],["1F195",["new"]],["1F196",["ng"]],["1F17E-FE0F",["o2"]],["1F197",["ok"]],["1F17F-FE0F",["parking"]],["1F198",["sos"]],["1F199",["up"]],["1F19A",["vs"]],["1F201",["koko"]],["1F202-FE0F",["sa"]],["1F237-FE0F",["u6708"]],["1F236",["u6709"]],["1F22F",["u6307"]],["1F250",["ideograph_advantage"]],["1F239",["u5272"]],["1F21A",["u7121"]],["1F232",["u7981"]],["1F251",["accept"]],["1F238",["u7533"]],["1F234",["u5408"]],["1F233",["u7a7a"]],["3297-FE0F",["congratulations"]],["3299-FE0F",["secret"]],["1F23A",["u55b6"]],["1F235",["u6e80"]],["1F534",["red_circle"]],["1F7E0",["large_orange_circle"]],["1F7E1",["large_yellow_circle"]],["1F7E2",["large_green_circle"]],["1F535",["large_blue_circle"]],["1F7E3",["large_purple_circle"]],["1F7E4",["large_brown_circle"]],["26AB",["black_circle"]],["26AA",["white_circle"]],["1F7E5",["large_red_square"]],["1F7E7",["large_orange_square"]],["1F7E8",["large_yellow_square"]],["1F7E9",["large_green_square"]],["1F7E6",["large_blue_square"]],["1F7EA",["large_purple_square"]],["1F7EB",["large_brown_square"]],["2B1B",["black_large_square"]],["2B1C",["white_large_square"]],["25FC-FE0F",["black_medium_square"]],["25FB-FE0F",["white_medium_square"]],["25FE",["black_medium_small_square"]],["25FD",["white_medium_small_square"]],["25AA-FE0F",["black_small_square"]],["25AB-FE0F",["white_small_square"]],["1F536",["large_orange_diamond"]],["1F537",["large_blue_diamond"]],["1F538",["small_orange_diamond"]],["1F539",["small_blue_diamond"]],["1F53A",["small_red_triangle"]],["1F53B",["small_red_triangle_down"]],["1F4A0",["diamond_shape_with_a_dot_inside"]],["1F518",["radio_button"]],["1F533",["white_square_button"]],["1F532",["black_square_button"]]],["flags",["Flags"]],[["1F3C1",["checkered_flag"]],["1F6A9",["triangular_flag_on_post"]],["1F38C",["crossed_flags"]],["1F3F4",["waving_black_flag"]],["1F3F3-FE0F",["waving_white_flag"]],["1F3F3-FE0F-200D-1F308",["rainbow-flag"]],["1F3F3-FE0F-200D-26A7-FE0F",["transgender_flag"]],["1F3F4-200D-2620-FE0F",["pirate_flag"]],["1F1E6-1F1E8",["flag-ac"]],["1F1E6-1F1E9",["flag-ad"]],["1F1E6-1F1EA",["flag-ae"]],["1F1E6-1F1EB",["flag-af"]],["1F1E6-1F1EC",["flag-ag"]],["1F1E6-1F1EE",["flag-ai"]],["1F1E6-1F1F1",["flag-al"]],["1F1E6-1F1F2",["flag-am"]],["1F1E6-1F1F4",["flag-ao"]],["1F1E6-1F1F6",["flag-aq"]],["1F1E6-1F1F7",["flag-ar"]],["1F1E6-1F1F8",["flag-as"]],["1F1E6-1F1F9",["flag-at"]],["1F1E6-1F1FA",["flag-au"]],["1F1E6-1F1FC",["flag-aw"]],["1F1E6-1F1FD",["flag-ax"]],["1F1E6-1F1FF",["flag-az"]],["1F1E7-1F1E6",["flag-ba"]],["1F1E7-1F1E7",["flag-bb"]],["1F1E7-1F1E9",["flag-bd"]],["1F1E7-1F1EA",["flag-be"]],["1F1E7-1F1EB",["flag-bf"]],["1F1E7-1F1EC",["flag-bg"]],["1F1E7-1F1ED",["flag-bh"]],["1F1E7-1F1EE",["flag-bi"]],["1F1E7-1F1EF",["flag-bj"]],["1F1E7-1F1F1",["flag-bl"]],["1F1E7-1F1F2",["flag-bm"]],["1F1E7-1F1F3",["flag-bn"]],["1F1E7-1F1F4",["flag-bo"]],["1F1E7-1F1F6",["flag-bq"]],["1F1E7-1F1F7",["flag-br"]],["1F1E7-1F1F8",["flag-bs"]],["1F1E7-1F1F9",["flag-bt"]],["1F1E7-1F1FB",["flag-bv"]],["1F1E7-1F1FC",["flag-bw"]],["1F1E7-1F1FE",["flag-by"]],["1F1E7-1F1FF",["flag-bz"]],["1F1E8-1F1E6",["flag-ca"]],["1F1E8-1F1E8",["flag-cc"]],["1F1E8-1F1E9",["flag-cd"]],["1F1E8-1F1EB",["flag-cf"]],["1F1E8-1F1EC",["flag-cg"]],["1F1E8-1F1ED",["flag-ch"]],["1F1E8-1F1EE",["flag-ci"]],["1F1E8-1F1F0",["flag-ck"]],["1F1E8-1F1F1",["flag-cl"]],["1F1E8-1F1F2",["flag-cm"]],["1F1E8-1F1F3",["cn","flag-cn"]],["1F1E8-1F1F4",["flag-co"]],["1F1E8-1F1F5",["flag-cp"]],["1F1E8-1F1F7",["flag-cr"]],["1F1E8-1F1FA",["flag-cu"]],["1F1E8-1F1FB",["flag-cv"]],["1F1E8-1F1FC",["flag-cw"]],["1F1E8-1F1FD",["flag-cx"]],["1F1E8-1F1FE",["flag-cy"]],["1F1E8-1F1FF",["flag-cz"]],["1F1E9-1F1EA",["de","flag-de"]],["1F1E9-1F1EC",["flag-dg"]],["1F1E9-1F1EF",["flag-dj"]],["1F1E9-1F1F0",["flag-dk"]],["1F1E9-1F1F2",["flag-dm"]],["1F1E9-1F1F4",["flag-do"]],["1F1E9-1F1FF",["flag-dz"]],["1F1EA-1F1E6",["flag-ea"]],["1F1EA-1F1E8",["flag-ec"]],["1F1EA-1F1EA",["flag-ee"]],["1F1EA-1F1EC",["flag-eg"]],["1F1EA-1F1ED",["flag-eh"]],["1F1EA-1F1F7",["flag-er"]],["1F1EA-1F1F8",["es","flag-es"]],["1F1EA-1F1F9",["flag-et"]],["1F1EA-1F1FA",["flag-eu"]],["1F1EB-1F1EE",["flag-fi"]],["1F1EB-1F1EF",["flag-fj"]],["1F1EB-1F1F0",["flag-fk"]],["1F1EB-1F1F2",["flag-fm"]],["1F1EB-1F1F4",["flag-fo"]],["1F1EB-1F1F7",["fr","flag-fr"]],["1F1EC-1F1E6",["flag-ga"]],["1F1EC-1F1E7",["gb","uk","flag-gb"]],["1F1EC-1F1E9",["flag-gd"]],["1F1EC-1F1EA",["flag-ge"]],["1F1EC-1F1EB",["flag-gf"]],["1F1EC-1F1EC",["flag-gg"]],["1F1EC-1F1ED",["flag-gh"]],["1F1EC-1F1EE",["flag-gi"]],["1F1EC-1F1F1",["flag-gl"]],["1F1EC-1F1F2",["flag-gm"]],["1F1EC-1F1F3",["flag-gn"]],["1F1EC-1F1F5",["flag-gp"]],["1F1EC-1F1F6",["flag-gq"]],["1F1EC-1F1F7",["flag-gr"]],["1F1EC-1F1F8",["flag-gs"]],["1F1EC-1F1F9",["flag-gt"]],["1F1EC-1F1FA",["flag-gu"]],["1F1EC-1F1FC",["flag-gw"]],["1F1EC-1F1FE",["flag-gy"]],["1F1ED-1F1F0",["flag-hk"]],["1F1ED-1F1F2",["flag-hm"]],["1F1ED-1F1F3",["flag-hn"]],["1F1ED-1F1F7",["flag-hr"]],["1F1ED-1F1F9",["flag-ht"]],["1F1ED-1F1FA",["flag-hu"]],["1F1EE-1F1E8",["flag-ic"]],["1F1EE-1F1E9",["flag-id"]],["1F1EE-1F1EA",["flag-ie"]],["1F1EE-1F1F1",["flag-il"]],["1F1EE-1F1F2",["flag-im"]],["1F1EE-1F1F3",["flag-in"]],["1F1EE-1F1F4",["flag-io"]],["1F1EE-1F1F6",["flag-iq"]],["1F1EE-1F1F7",["flag-ir"]],["1F1EE-1F1F8",["flag-is"]],["1F1EE-1F1F9",["it","flag-it"]],["1F1EF-1F1EA",["flag-je"]],["1F1EF-1F1F2",["flag-jm"]],["1F1EF-1F1F4",["flag-jo"]],["1F1EF-1F1F5",["jp","flag-jp"]],["1F1F0-1F1EA",["flag-ke"]],["1F1F0-1F1EC",["flag-kg"]],["1F1F0-1F1ED",["flag-kh"]],["1F1F0-1F1EE",["flag-ki"]],["1F1F0-1F1F2",["flag-km"]],["1F1F0-1F1F3",["flag-kn"]],["1F1F0-1F1F5",["flag-kp"]],["1F1F0-1F1F7",["kr","flag-kr"]],["1F1F0-1F1FC",["flag-kw"]],["1F1F0-1F1FE",["flag-ky"]],["1F1F0-1F1FF",["flag-kz"]],["1F1F1-1F1E6",["flag-la"]],["1F1F1-1F1E7",["flag-lb"]],["1F1F1-1F1E8",["flag-lc"]],["1F1F1-1F1EE",["flag-li"]],["1F1F1-1F1F0",["flag-lk"]],["1F1F1-1F1F7",["flag-lr"]],["1F1F1-1F1F8",["flag-ls"]],["1F1F1-1F1F9",["flag-lt"]],["1F1F1-1F1FA",["flag-lu"]],["1F1F1-1F1FB",["flag-lv"]],["1F1F1-1F1FE",["flag-ly"]],["1F1F2-1F1E6",["flag-ma"]],["1F1F2-1F1E8",["flag-mc"]],["1F1F2-1F1E9",["flag-md"]],["1F1F2-1F1EA",["flag-me"]],["1F1F2-1F1EB",["flag-mf"]],["1F1F2-1F1EC",["flag-mg"]],["1F1F2-1F1ED",["flag-mh"]],["1F1F2-1F1F0",["flag-mk"]],["1F1F2-1F1F1",["flag-ml"]],["1F1F2-1F1F2",["flag-mm"]],["1F1F2-1F1F3",["flag-mn"]],["1F1F2-1F1F4",["flag-mo"]],["1F1F2-1F1F5",["flag-mp"]],["1F1F2-1F1F6",["flag-mq"]],["1F1F2-1F1F7",["flag-mr"]],["1F1F2-1F1F8",["flag-ms"]],["1F1F2-1F1F9",["flag-mt"]],["1F1F2-1F1FA",["flag-mu"]],["1F1F2-1F1FB",["flag-mv"]],["1F1F2-1F1FC",["flag-mw"]],["1F1F2-1F1FD",["flag-mx"]],["1F1F2-1F1FE",["flag-my"]],["1F1F2-1F1FF",["flag-mz"]],["1F1F3-1F1E6",["flag-na"]],["1F1F3-1F1E8",["flag-nc"]],["1F1F3-1F1EA",["flag-ne"]],["1F1F3-1F1EB",["flag-nf"]],["1F1F3-1F1EC",["flag-ng"]],["1F1F3-1F1EE",["flag-ni"]],["1F1F3-1F1F1",["flag-nl"]],["1F1F3-1F1F4",["flag-no"]],["1F1F3-1F1F5",["flag-np"]],["1F1F3-1F1F7",["flag-nr"]],["1F1F3-1F1FA",["flag-nu"]],["1F1F3-1F1FF",["flag-nz"]],["1F1F4-1F1F2",["flag-om"]],["1F1F5-1F1E6",["flag-pa"]],["1F1F5-1F1EA",["flag-pe"]],["1F1F5-1F1EB",["flag-pf"]],["1F1F5-1F1EC",["flag-pg"]],["1F1F5-1F1ED",["flag-ph"]],["1F1F5-1F1F0",["flag-pk"]],["1F1F5-1F1F1",["flag-pl"]],["1F1F5-1F1F2",["flag-pm"]],["1F1F5-1F1F3",["flag-pn"]],["1F1F5-1F1F7",["flag-pr"]],["1F1F5-1F1F8",["flag-ps"]],["1F1F5-1F1F9",["flag-pt"]],["1F1F5-1F1FC",["flag-pw"]],["1F1F5-1F1FE",["flag-py"]],["1F1F6-1F1E6",["flag-qa"]],["1F1F7-1F1EA",["flag-re"]],["1F1F7-1F1F4",["flag-ro"]],["1F1F7-1F1F8",["flag-rs"]],["1F1F7-1F1FA",["ru","flag-ru"]],["1F1F7-1F1FC",["flag-rw"]],["1F1F8-1F1E6",["flag-sa"]],["1F1F8-1F1E7",["flag-sb"]],["1F1F8-1F1E8",["flag-sc"]],["1F1F8-1F1E9",["flag-sd"]],["1F1F8-1F1EA",["flag-se"]],["1F1F8-1F1EC",["flag-sg"]],["1F1F8-1F1ED",["flag-sh"]],["1F1F8-1F1EE",["flag-si"]],["1F1F8-1F1EF",["flag-sj"]],["1F1F8-1F1F0",["flag-sk"]],["1F1F8-1F1F1",["flag-sl"]],["1F1F8-1F1F2",["flag-sm"]],["1F1F8-1F1F3",["flag-sn"]],["1F1F8-1F1F4",["flag-so"]],["1F1F8-1F1F7",["flag-sr"]],["1F1F8-1F1F8",["flag-ss"]],["1F1F8-1F1F9",["flag-st"]],["1F1F8-1F1FB",["flag-sv"]],["1F1F8-1F1FD",["flag-sx"]],["1F1F8-1F1FE",["flag-sy"]],["1F1F8-1F1FF",["flag-sz"]],["1F1F9-1F1E6",["flag-ta"]],["1F1F9-1F1E8",["flag-tc"]],["1F1F9-1F1E9",["flag-td"]],["1F1F9-1F1EB",["flag-tf"]],["1F1F9-1F1EC",["flag-tg"]],["1F1F9-1F1ED",["flag-th"]],["1F1F9-1F1EF",["flag-tj"]],["1F1F9-1F1F0",["flag-tk"]],["1F1F9-1F1F1",["flag-tl"]],["1F1F9-1F1F2",["flag-tm"]],["1F1F9-1F1F3",["flag-tn"]],["1F1F9-1F1F4",["flag-to"]],["1F1F9-1F1F7",["flag-tr"]],["1F1F9-1F1F9",["flag-tt"]],["1F1F9-1F1FB",["flag-tv"]],["1F1F9-1F1FC",["flag-tw"]],["1F1F9-1F1FF",["flag-tz"]],["1F1FA-1F1E6",["flag-ua"]],["1F1FA-1F1EC",["flag-ug"]],["1F1FA-1F1F2",["flag-um"]],["1F1FA-1F1F3",["flag-un"]],["1F1FA-1F1F8",["us","flag-us"]],["1F1FA-1F1FE",["flag-uy"]],["1F1FA-1F1FF",["flag-uz"]],["1F1FB-1F1E6",["flag-va"]],["1F1FB-1F1E8",["flag-vc"]],["1F1FB-1F1EA",["flag-ve"]],["1F1FB-1F1EC",["flag-vg"]],["1F1FB-1F1EE",["flag-vi"]],["1F1FB-1F1F3",["flag-vn"]],["1F1FB-1F1FA",["flag-vu"]],["1F1FC-1F1EB",["flag-wf"]],["1F1FC-1F1F8",["flag-ws"]],["1F1FD-1F1F0",["flag-xk"]],["1F1FE-1F1EA",["flag-ye"]],["1F1FE-1F1F9",["flag-yt"]],["1F1FF-1F1E6",["flag-za"]],["1F1FF-1F1F2",["flag-zm"]],["1F1FF-1F1FC",["flag-zw"]],["1F3F4-E0067-E0062-E0065-E006E-E0067-E007F",["flag-england"]],["1F3F4-E0067-E0062-E0073-E0063-E0074-E007F",["flag-scotland"]],["1F3F4-E0067-E0062-E0077-E006C-E0073-E007F",["flag-wales"]]]]')}}]); -//# sourceMappingURL=1.fb539fa72ec126e2a2cc.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{315:function(F){F.exports=JSON.parse('[["people",["Smileys & People"]],[["1F600",["grinning"]],["1F603",["smiley"]],["1F604",["smile"]],["1F601",["grin"]],["1F606",["laughing","satisfied"]],["1F605",["sweat_smile"]],["1F923",["rolling_on_the_floor_laughing"]],["1F602",["joy"]],["1F642",["slightly_smiling_face"]],["1F643",["upside_down_face"]],["1F609",["wink"]],["1F60A",["blush"]],["1F607",["innocent"]],["1F970",["smiling_face_with_3_hearts"]],["1F60D",["heart_eyes"]],["1F929",["star-struck","grinning_face_with_star_eyes"]],["1F618",["kissing_heart"]],["1F617",["kissing"]],["263A-FE0F",["relaxed"]],["1F61A",["kissing_closed_eyes"]],["1F619",["kissing_smiling_eyes"]],["1F972",["smiling_face_with_tear"]],["1F60B",["yum"]],["1F61B",["stuck_out_tongue"]],["1F61C",["stuck_out_tongue_winking_eye"]],["1F92A",["zany_face","grinning_face_with_one_large_and_one_small_eye"]],["1F61D",["stuck_out_tongue_closed_eyes"]],["1F911",["money_mouth_face"]],["1F917",["hugging_face"]],["1F92D",["face_with_hand_over_mouth","smiling_face_with_smiling_eyes_and_hand_covering_mouth"]],["1F92B",["shushing_face","face_with_finger_covering_closed_lips"]],["1F914",["thinking_face"]],["1F910",["zipper_mouth_face"]],["1F928",["face_with_raised_eyebrow","face_with_one_eyebrow_raised"]],["1F610",["neutral_face"]],["1F611",["expressionless"]],["1F636",["no_mouth"]],["1F636-200D-1F32B-FE0F",["face_in_clouds"]],["1F60F",["smirk"]],["1F612",["unamused"]],["1F644",["face_with_rolling_eyes"]],["1F62C",["grimacing"]],["1F62E-200D-1F4A8",["face_exhaling"]],["1F925",["lying_face"]],["1F60C",["relieved"]],["1F614",["pensive"]],["1F62A",["sleepy"]],["1F924",["drooling_face"]],["1F634",["sleeping"]],["1F637",["mask"]],["1F912",["face_with_thermometer"]],["1F915",["face_with_head_bandage"]],["1F922",["nauseated_face"]],["1F92E",["face_vomiting","face_with_open_mouth_vomiting"]],["1F927",["sneezing_face"]],["1F975",["hot_face"]],["1F976",["cold_face"]],["1F974",["woozy_face"]],["1F635",["dizzy_face"]],["1F635-200D-1F4AB",["face_with_spiral_eyes"]],["1F92F",["exploding_head","shocked_face_with_exploding_head"]],["1F920",["face_with_cowboy_hat"]],["1F973",["partying_face"]],["1F978",["disguised_face"]],["1F60E",["sunglasses"]],["1F913",["nerd_face"]],["1F9D0",["face_with_monocle"]],["1F615",["confused"]],["1F61F",["worried"]],["1F641",["slightly_frowning_face"]],["2639-FE0F",["white_frowning_face"]],["1F62E",["open_mouth"]],["1F62F",["hushed"]],["1F632",["astonished"]],["1F633",["flushed"]],["1F97A",["pleading_face"]],["1F626",["frowning"]],["1F627",["anguished"]],["1F628",["fearful"]],["1F630",["cold_sweat"]],["1F625",["disappointed_relieved"]],["1F622",["cry"]],["1F62D",["sob"]],["1F631",["scream"]],["1F616",["confounded"]],["1F623",["persevere"]],["1F61E",["disappointed"]],["1F613",["sweat"]],["1F629",["weary"]],["1F62B",["tired_face"]],["1F971",["yawning_face"]],["1F624",["triumph"]],["1F621",["rage"]],["1F620",["angry"]],["1F92C",["face_with_symbols_on_mouth","serious_face_with_symbols_covering_mouth"]],["1F608",["smiling_imp"]],["1F47F",["imp"]],["1F480",["skull"]],["2620-FE0F",["skull_and_crossbones"]],["1F4A9",["hankey","poop","shit"]],["1F921",["clown_face"]],["1F479",["japanese_ogre"]],["1F47A",["japanese_goblin"]],["1F47B",["ghost"]],["1F47D",["alien"]],["1F47E",["space_invader"]],["1F916",["robot_face"]],["1F63A",["smiley_cat"]],["1F638",["smile_cat"]],["1F639",["joy_cat"]],["1F63B",["heart_eyes_cat"]],["1F63C",["smirk_cat"]],["1F63D",["kissing_cat"]],["1F640",["scream_cat"]],["1F63F",["crying_cat_face"]],["1F63E",["pouting_cat"]],["1F648",["see_no_evil"]],["1F649",["hear_no_evil"]],["1F64A",["speak_no_evil"]],["1F48B",["kiss"]],["1F48C",["love_letter"]],["1F498",["cupid"]],["1F49D",["gift_heart"]],["1F496",["sparkling_heart"]],["1F497",["heartpulse"]],["1F493",["heartbeat"]],["1F49E",["revolving_hearts"]],["1F495",["two_hearts"]],["1F49F",["heart_decoration"]],["2763-FE0F",["heavy_heart_exclamation_mark_ornament"]],["1F494",["broken_heart"]],["2764-FE0F-200D-1F525",["heart_on_fire"]],["2764-FE0F-200D-1FA79",["mending_heart"]],["2764-FE0F",["heart"]],["1F9E1",["orange_heart"]],["1F49B",["yellow_heart"]],["1F49A",["green_heart"]],["1F499",["blue_heart"]],["1F49C",["purple_heart"]],["1F90E",["brown_heart"]],["1F5A4",["black_heart"]],["1F90D",["white_heart"]],["1F4AF",["100"]],["1F4A2",["anger"]],["1F4A5",["boom","collision"]],["1F4AB",["dizzy"]],["1F4A6",["sweat_drops"]],["1F4A8",["dash"]],["1F573-FE0F",["hole"]],["1F4A3",["bomb"]],["1F4AC",["speech_balloon"]],["1F441-FE0F-200D-1F5E8-FE0F",["eye-in-speech-bubble"]],["1F5E8-FE0F",["left_speech_bubble"]],["1F5EF-FE0F",["right_anger_bubble"]],["1F4AD",["thought_balloon"]],["1F4A4",["zzz"]],["1F44B",["wave"]],["1F91A",["raised_back_of_hand"]],["1F590-FE0F",["raised_hand_with_fingers_splayed"]],["270B",["hand","raised_hand"]],["1F596",["spock-hand"]],["1F44C",["ok_hand"]],["1F90C",["pinched_fingers"]],["1F90F",["pinching_hand"]],["270C-FE0F",["v"]],["1F91E",["crossed_fingers","hand_with_index_and_middle_fingers_crossed"]],["1F91F",["i_love_you_hand_sign"]],["1F918",["the_horns","sign_of_the_horns"]],["1F919",["call_me_hand"]],["1F448",["point_left"]],["1F449",["point_right"]],["1F446",["point_up_2"]],["1F595",["middle_finger","reversed_hand_with_middle_finger_extended"]],["1F447",["point_down"]],["261D-FE0F",["point_up"]],["1F44D",["+1","thumbsup"]],["1F44E",["-1","thumbsdown"]],["270A",["fist"]],["1F44A",["facepunch","punch"]],["1F91B",["left-facing_fist"]],["1F91C",["right-facing_fist"]],["1F44F",["clap"]],["1F64C",["raised_hands"]],["1F450",["open_hands"]],["1F932",["palms_up_together"]],["1F91D",["handshake"]],["1F64F",["pray"]],["270D-FE0F",["writing_hand"]],["1F485",["nail_care"]],["1F933",["selfie"]],["1F4AA",["muscle"]],["1F9BE",["mechanical_arm"]],["1F9BF",["mechanical_leg"]],["1F9B5",["leg"]],["1F9B6",["foot"]],["1F442",["ear"]],["1F9BB",["ear_with_hearing_aid"]],["1F443",["nose"]],["1F9E0",["brain"]],["1FAC0",["anatomical_heart"]],["1FAC1",["lungs"]],["1F9B7",["tooth"]],["1F9B4",["bone"]],["1F440",["eyes"]],["1F441-FE0F",["eye"]],["1F445",["tongue"]],["1F444",["lips"]],["1F476",["baby"]],["1F9D2",["child"]],["1F466",["boy"]],["1F467",["girl"]],["1F9D1",["adult"]],["1F471",["person_with_blond_hair"]],["1F468",["man"]],["1F9D4",["bearded_person"]],["1F9D4-200D-2642-FE0F",["man_with_beard"]],["1F9D4-200D-2640-FE0F",["woman_with_beard"]],["1F468-200D-1F9B0",["red_haired_man"]],["1F468-200D-1F9B1",["curly_haired_man"]],["1F468-200D-1F9B3",["white_haired_man"]],["1F468-200D-1F9B2",["bald_man"]],["1F469",["woman"]],["1F469-200D-1F9B0",["red_haired_woman"]],["1F9D1-200D-1F9B0",["red_haired_person"]],["1F469-200D-1F9B1",["curly_haired_woman"]],["1F9D1-200D-1F9B1",["curly_haired_person"]],["1F469-200D-1F9B3",["white_haired_woman"]],["1F9D1-200D-1F9B3",["white_haired_person"]],["1F469-200D-1F9B2",["bald_woman"]],["1F9D1-200D-1F9B2",["bald_person"]],["1F471-200D-2640-FE0F",["blond-haired-woman"]],["1F471-200D-2642-FE0F",["blond-haired-man"]],["1F9D3",["older_adult"]],["1F474",["older_man"]],["1F475",["older_woman"]],["1F64D",["person_frowning"]],["1F64D-200D-2642-FE0F",["man-frowning"]],["1F64D-200D-2640-FE0F",["woman-frowning"]],["1F64E",["person_with_pouting_face"]],["1F64E-200D-2642-FE0F",["man-pouting"]],["1F64E-200D-2640-FE0F",["woman-pouting"]],["1F645",["no_good"]],["1F645-200D-2642-FE0F",["man-gesturing-no"]],["1F645-200D-2640-FE0F",["woman-gesturing-no"]],["1F646",["ok_woman"]],["1F646-200D-2642-FE0F",["man-gesturing-ok"]],["1F646-200D-2640-FE0F",["woman-gesturing-ok"]],["1F481",["information_desk_person"]],["1F481-200D-2642-FE0F",["man-tipping-hand"]],["1F481-200D-2640-FE0F",["woman-tipping-hand"]],["1F64B",["raising_hand"]],["1F64B-200D-2642-FE0F",["man-raising-hand"]],["1F64B-200D-2640-FE0F",["woman-raising-hand"]],["1F9CF",["deaf_person"]],["1F9CF-200D-2642-FE0F",["deaf_man"]],["1F9CF-200D-2640-FE0F",["deaf_woman"]],["1F647",["bow"]],["1F647-200D-2642-FE0F",["man-bowing"]],["1F647-200D-2640-FE0F",["woman-bowing"]],["1F926",["face_palm"]],["1F926-200D-2642-FE0F",["man-facepalming"]],["1F926-200D-2640-FE0F",["woman-facepalming"]],["1F937",["shrug"]],["1F937-200D-2642-FE0F",["man-shrugging"]],["1F937-200D-2640-FE0F",["woman-shrugging"]],["1F9D1-200D-2695-FE0F",["health_worker"]],["1F468-200D-2695-FE0F",["male-doctor"]],["1F469-200D-2695-FE0F",["female-doctor"]],["1F9D1-200D-1F393",["student"]],["1F468-200D-1F393",["male-student"]],["1F469-200D-1F393",["female-student"]],["1F9D1-200D-1F3EB",["teacher"]],["1F468-200D-1F3EB",["male-teacher"]],["1F469-200D-1F3EB",["female-teacher"]],["1F9D1-200D-2696-FE0F",["judge"]],["1F468-200D-2696-FE0F",["male-judge"]],["1F469-200D-2696-FE0F",["female-judge"]],["1F9D1-200D-1F33E",["farmer"]],["1F468-200D-1F33E",["male-farmer"]],["1F469-200D-1F33E",["female-farmer"]],["1F9D1-200D-1F373",["cook"]],["1F468-200D-1F373",["male-cook"]],["1F469-200D-1F373",["female-cook"]],["1F9D1-200D-1F527",["mechanic"]],["1F468-200D-1F527",["male-mechanic"]],["1F469-200D-1F527",["female-mechanic"]],["1F9D1-200D-1F3ED",["factory_worker"]],["1F468-200D-1F3ED",["male-factory-worker"]],["1F469-200D-1F3ED",["female-factory-worker"]],["1F9D1-200D-1F4BC",["office_worker"]],["1F468-200D-1F4BC",["male-office-worker"]],["1F469-200D-1F4BC",["female-office-worker"]],["1F9D1-200D-1F52C",["scientist"]],["1F468-200D-1F52C",["male-scientist"]],["1F469-200D-1F52C",["female-scientist"]],["1F9D1-200D-1F4BB",["technologist"]],["1F468-200D-1F4BB",["male-technologist"]],["1F469-200D-1F4BB",["female-technologist"]],["1F9D1-200D-1F3A4",["singer"]],["1F468-200D-1F3A4",["male-singer"]],["1F469-200D-1F3A4",["female-singer"]],["1F9D1-200D-1F3A8",["artist"]],["1F468-200D-1F3A8",["male-artist"]],["1F469-200D-1F3A8",["female-artist"]],["1F9D1-200D-2708-FE0F",["pilot"]],["1F468-200D-2708-FE0F",["male-pilot"]],["1F469-200D-2708-FE0F",["female-pilot"]],["1F9D1-200D-1F680",["astronaut"]],["1F468-200D-1F680",["male-astronaut"]],["1F469-200D-1F680",["female-astronaut"]],["1F9D1-200D-1F692",["firefighter"]],["1F468-200D-1F692",["male-firefighter"]],["1F469-200D-1F692",["female-firefighter"]],["1F46E",["cop"]],["1F46E-200D-2642-FE0F",["male-police-officer"]],["1F46E-200D-2640-FE0F",["female-police-officer"]],["1F575-FE0F",["sleuth_or_spy"]],["1F575-FE0F-200D-2642-FE0F",["male-detective"]],["1F575-FE0F-200D-2640-FE0F",["female-detective"]],["1F482",["guardsman"]],["1F482-200D-2642-FE0F",["male-guard"]],["1F482-200D-2640-FE0F",["female-guard"]],["1F977",["ninja"]],["1F477",["construction_worker"]],["1F477-200D-2642-FE0F",["male-construction-worker"]],["1F477-200D-2640-FE0F",["female-construction-worker"]],["1F934",["prince"]],["1F478",["princess"]],["1F473",["man_with_turban"]],["1F473-200D-2642-FE0F",["man-wearing-turban"]],["1F473-200D-2640-FE0F",["woman-wearing-turban"]],["1F472",["man_with_gua_pi_mao"]],["1F9D5",["person_with_headscarf"]],["1F935",["person_in_tuxedo"]],["1F935-200D-2642-FE0F",["man_in_tuxedo"]],["1F935-200D-2640-FE0F",["woman_in_tuxedo"]],["1F470",["bride_with_veil"]],["1F470-200D-2642-FE0F",["man_with_veil"]],["1F470-200D-2640-FE0F",["woman_with_veil"]],["1F930",["pregnant_woman"]],["1F931",["breast-feeding"]],["1F469-200D-1F37C",["woman_feeding_baby"]],["1F468-200D-1F37C",["man_feeding_baby"]],["1F9D1-200D-1F37C",["person_feeding_baby"]],["1F47C",["angel"]],["1F385",["santa"]],["1F936",["mrs_claus","mother_christmas"]],["1F9D1-200D-1F384",["mx_claus"]],["1F9B8",["superhero"]],["1F9B8-200D-2642-FE0F",["male_superhero"]],["1F9B8-200D-2640-FE0F",["female_superhero"]],["1F9B9",["supervillain"]],["1F9B9-200D-2642-FE0F",["male_supervillain"]],["1F9B9-200D-2640-FE0F",["female_supervillain"]],["1F9D9",["mage"]],["1F9D9-200D-2642-FE0F",["male_mage"]],["1F9D9-200D-2640-FE0F",["female_mage"]],["1F9DA",["fairy"]],["1F9DA-200D-2642-FE0F",["male_fairy"]],["1F9DA-200D-2640-FE0F",["female_fairy"]],["1F9DB",["vampire"]],["1F9DB-200D-2642-FE0F",["male_vampire"]],["1F9DB-200D-2640-FE0F",["female_vampire"]],["1F9DC",["merperson"]],["1F9DC-200D-2642-FE0F",["merman"]],["1F9DC-200D-2640-FE0F",["mermaid"]],["1F9DD",["elf"]],["1F9DD-200D-2642-FE0F",["male_elf"]],["1F9DD-200D-2640-FE0F",["female_elf"]],["1F9DE",["genie"]],["1F9DE-200D-2642-FE0F",["male_genie"]],["1F9DE-200D-2640-FE0F",["female_genie"]],["1F9DF",["zombie"]],["1F9DF-200D-2642-FE0F",["male_zombie"]],["1F9DF-200D-2640-FE0F",["female_zombie"]],["1F486",["massage"]],["1F486-200D-2642-FE0F",["man-getting-massage"]],["1F486-200D-2640-FE0F",["woman-getting-massage"]],["1F487",["haircut"]],["1F487-200D-2642-FE0F",["man-getting-haircut"]],["1F487-200D-2640-FE0F",["woman-getting-haircut"]],["1F6B6",["walking"]],["1F6B6-200D-2642-FE0F",["man-walking"]],["1F6B6-200D-2640-FE0F",["woman-walking"]],["1F9CD",["standing_person"]],["1F9CD-200D-2642-FE0F",["man_standing"]],["1F9CD-200D-2640-FE0F",["woman_standing"]],["1F9CE",["kneeling_person"]],["1F9CE-200D-2642-FE0F",["man_kneeling"]],["1F9CE-200D-2640-FE0F",["woman_kneeling"]],["1F9D1-200D-1F9AF",["person_with_probing_cane"]],["1F468-200D-1F9AF",["man_with_probing_cane"]],["1F469-200D-1F9AF",["woman_with_probing_cane"]],["1F9D1-200D-1F9BC",["person_in_motorized_wheelchair"]],["1F468-200D-1F9BC",["man_in_motorized_wheelchair"]],["1F469-200D-1F9BC",["woman_in_motorized_wheelchair"]],["1F9D1-200D-1F9BD",["person_in_manual_wheelchair"]],["1F468-200D-1F9BD",["man_in_manual_wheelchair"]],["1F469-200D-1F9BD",["woman_in_manual_wheelchair"]],["1F3C3",["runner","running"]],["1F3C3-200D-2642-FE0F",["man-running"]],["1F3C3-200D-2640-FE0F",["woman-running"]],["1F483",["dancer"]],["1F57A",["man_dancing"]],["1F574-FE0F",["man_in_business_suit_levitating"]],["1F46F",["dancers"]],["1F46F-200D-2642-FE0F",["men-with-bunny-ears-partying","man-with-bunny-ears-partying"]],["1F46F-200D-2640-FE0F",["women-with-bunny-ears-partying","woman-with-bunny-ears-partying"]],["1F9D6",["person_in_steamy_room"]],["1F9D6-200D-2642-FE0F",["man_in_steamy_room"]],["1F9D6-200D-2640-FE0F",["woman_in_steamy_room"]],["1F9D7",["person_climbing"]],["1F9D7-200D-2642-FE0F",["man_climbing"]],["1F9D7-200D-2640-FE0F",["woman_climbing"]],["1F93A",["fencer"]],["1F3C7",["horse_racing"]],["26F7-FE0F",["skier"]],["1F3C2",["snowboarder"]],["1F3CC-FE0F",["golfer"]],["1F3CC-FE0F-200D-2642-FE0F",["man-golfing"]],["1F3CC-FE0F-200D-2640-FE0F",["woman-golfing"]],["1F3C4",["surfer"]],["1F3C4-200D-2642-FE0F",["man-surfing"]],["1F3C4-200D-2640-FE0F",["woman-surfing"]],["1F6A3",["rowboat"]],["1F6A3-200D-2642-FE0F",["man-rowing-boat"]],["1F6A3-200D-2640-FE0F",["woman-rowing-boat"]],["1F3CA",["swimmer"]],["1F3CA-200D-2642-FE0F",["man-swimming"]],["1F3CA-200D-2640-FE0F",["woman-swimming"]],["26F9-FE0F",["person_with_ball"]],["26F9-FE0F-200D-2642-FE0F",["man-bouncing-ball"]],["26F9-FE0F-200D-2640-FE0F",["woman-bouncing-ball"]],["1F3CB-FE0F",["weight_lifter"]],["1F3CB-FE0F-200D-2642-FE0F",["man-lifting-weights"]],["1F3CB-FE0F-200D-2640-FE0F",["woman-lifting-weights"]],["1F6B4",["bicyclist"]],["1F6B4-200D-2642-FE0F",["man-biking"]],["1F6B4-200D-2640-FE0F",["woman-biking"]],["1F6B5",["mountain_bicyclist"]],["1F6B5-200D-2642-FE0F",["man-mountain-biking"]],["1F6B5-200D-2640-FE0F",["woman-mountain-biking"]],["1F938",["person_doing_cartwheel"]],["1F938-200D-2642-FE0F",["man-cartwheeling"]],["1F938-200D-2640-FE0F",["woman-cartwheeling"]],["1F93C",["wrestlers"]],["1F93C-200D-2642-FE0F",["man-wrestling"]],["1F93C-200D-2640-FE0F",["woman-wrestling"]],["1F93D",["water_polo"]],["1F93D-200D-2642-FE0F",["man-playing-water-polo"]],["1F93D-200D-2640-FE0F",["woman-playing-water-polo"]],["1F93E",["handball"]],["1F93E-200D-2642-FE0F",["man-playing-handball"]],["1F93E-200D-2640-FE0F",["woman-playing-handball"]],["1F939",["juggling"]],["1F939-200D-2642-FE0F",["man-juggling"]],["1F939-200D-2640-FE0F",["woman-juggling"]],["1F9D8",["person_in_lotus_position"]],["1F9D8-200D-2642-FE0F",["man_in_lotus_position"]],["1F9D8-200D-2640-FE0F",["woman_in_lotus_position"]],["1F6C0",["bath"]],["1F6CC",["sleeping_accommodation"]],["1F9D1-200D-1F91D-200D-1F9D1",["people_holding_hands"]],["1F46D",["two_women_holding_hands","women_holding_hands"]],["1F46B",["man_and_woman_holding_hands","woman_and_man_holding_hands","couple"]],["1F46C",["two_men_holding_hands","men_holding_hands"]],["1F48F",["couplekiss"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F468",["woman-kiss-man"]],["1F468-200D-2764-FE0F-200D-1F48B-200D-1F468",["man-kiss-man"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F469",["woman-kiss-woman"]],["1F491",["couple_with_heart"]],["1F469-200D-2764-FE0F-200D-1F468",["woman-heart-man"]],["1F468-200D-2764-FE0F-200D-1F468",["man-heart-man"]],["1F469-200D-2764-FE0F-200D-1F469",["woman-heart-woman"]],["1F46A",["family"]],["1F468-200D-1F469-200D-1F466",["man-woman-boy"]],["1F468-200D-1F469-200D-1F467",["man-woman-girl"]],["1F468-200D-1F469-200D-1F467-200D-1F466",["man-woman-girl-boy"]],["1F468-200D-1F469-200D-1F466-200D-1F466",["man-woman-boy-boy"]],["1F468-200D-1F469-200D-1F467-200D-1F467",["man-woman-girl-girl"]],["1F468-200D-1F468-200D-1F466",["man-man-boy"]],["1F468-200D-1F468-200D-1F467",["man-man-girl"]],["1F468-200D-1F468-200D-1F467-200D-1F466",["man-man-girl-boy"]],["1F468-200D-1F468-200D-1F466-200D-1F466",["man-man-boy-boy"]],["1F468-200D-1F468-200D-1F467-200D-1F467",["man-man-girl-girl"]],["1F469-200D-1F469-200D-1F466",["woman-woman-boy"]],["1F469-200D-1F469-200D-1F467",["woman-woman-girl"]],["1F469-200D-1F469-200D-1F467-200D-1F466",["woman-woman-girl-boy"]],["1F469-200D-1F469-200D-1F466-200D-1F466",["woman-woman-boy-boy"]],["1F469-200D-1F469-200D-1F467-200D-1F467",["woman-woman-girl-girl"]],["1F468-200D-1F466",["man-boy"]],["1F468-200D-1F466-200D-1F466",["man-boy-boy"]],["1F468-200D-1F467",["man-girl"]],["1F468-200D-1F467-200D-1F466",["man-girl-boy"]],["1F468-200D-1F467-200D-1F467",["man-girl-girl"]],["1F469-200D-1F466",["woman-boy"]],["1F469-200D-1F466-200D-1F466",["woman-boy-boy"]],["1F469-200D-1F467",["woman-girl"]],["1F469-200D-1F467-200D-1F466",["woman-girl-boy"]],["1F469-200D-1F467-200D-1F467",["woman-girl-girl"]],["1F5E3-FE0F",["speaking_head_in_silhouette"]],["1F464",["bust_in_silhouette"]],["1F465",["busts_in_silhouette"]],["1FAC2",["people_hugging"]],["1F463",["footprints"]]],["nature",["Animals & Nature"]],[["1F435",["monkey_face"]],["1F412",["monkey"]],["1F98D",["gorilla"]],["1F9A7",["orangutan"]],["1F436",["dog"]],["1F415",["dog2"]],["1F9AE",["guide_dog"]],["1F415-200D-1F9BA",["service_dog"]],["1F429",["poodle"]],["1F43A",["wolf"]],["1F98A",["fox_face"]],["1F99D",["raccoon"]],["1F431",["cat"]],["1F408",["cat2"]],["1F408-200D-2B1B",["black_cat"]],["1F981",["lion_face"]],["1F42F",["tiger"]],["1F405",["tiger2"]],["1F406",["leopard"]],["1F434",["horse"]],["1F40E",["racehorse"]],["1F984",["unicorn_face"]],["1F993",["zebra_face"]],["1F98C",["deer"]],["1F9AC",["bison"]],["1F42E",["cow"]],["1F402",["ox"]],["1F403",["water_buffalo"]],["1F404",["cow2"]],["1F437",["pig"]],["1F416",["pig2"]],["1F417",["boar"]],["1F43D",["pig_nose"]],["1F40F",["ram"]],["1F411",["sheep"]],["1F410",["goat"]],["1F42A",["dromedary_camel"]],["1F42B",["camel"]],["1F999",["llama"]],["1F992",["giraffe_face"]],["1F418",["elephant"]],["1F9A3",["mammoth"]],["1F98F",["rhinoceros"]],["1F99B",["hippopotamus"]],["1F42D",["mouse"]],["1F401",["mouse2"]],["1F400",["rat"]],["1F439",["hamster"]],["1F430",["rabbit"]],["1F407",["rabbit2"]],["1F43F-FE0F",["chipmunk"]],["1F9AB",["beaver"]],["1F994",["hedgehog"]],["1F987",["bat"]],["1F43B",["bear"]],["1F43B-200D-2744-FE0F",["polar_bear"]],["1F428",["koala"]],["1F43C",["panda_face"]],["1F9A5",["sloth"]],["1F9A6",["otter"]],["1F9A8",["skunk"]],["1F998",["kangaroo"]],["1F9A1",["badger"]],["1F43E",["feet","paw_prints"]],["1F983",["turkey"]],["1F414",["chicken"]],["1F413",["rooster"]],["1F423",["hatching_chick"]],["1F424",["baby_chick"]],["1F425",["hatched_chick"]],["1F426",["bird"]],["1F427",["penguin"]],["1F54A-FE0F",["dove_of_peace"]],["1F985",["eagle"]],["1F986",["duck"]],["1F9A2",["swan"]],["1F989",["owl"]],["1F9A4",["dodo"]],["1FAB6",["feather"]],["1F9A9",["flamingo"]],["1F99A",["peacock"]],["1F99C",["parrot"]],["1F438",["frog"]],["1F40A",["crocodile"]],["1F422",["turtle"]],["1F98E",["lizard"]],["1F40D",["snake"]],["1F432",["dragon_face"]],["1F409",["dragon"]],["1F995",["sauropod"]],["1F996",["t-rex"]],["1F433",["whale"]],["1F40B",["whale2"]],["1F42C",["dolphin","flipper"]],["1F9AD",["seal"]],["1F41F",["fish"]],["1F420",["tropical_fish"]],["1F421",["blowfish"]],["1F988",["shark"]],["1F419",["octopus"]],["1F41A",["shell"]],["1F40C",["snail"]],["1F98B",["butterfly"]],["1F41B",["bug"]],["1F41C",["ant"]],["1F41D",["bee","honeybee"]],["1FAB2",["beetle"]],["1F41E",["ladybug","lady_beetle"]],["1F997",["cricket"]],["1FAB3",["cockroach"]],["1F577-FE0F",["spider"]],["1F578-FE0F",["spider_web"]],["1F982",["scorpion"]],["1F99F",["mosquito"]],["1FAB0",["fly"]],["1FAB1",["worm"]],["1F9A0",["microbe"]],["1F490",["bouquet"]],["1F338",["cherry_blossom"]],["1F4AE",["white_flower"]],["1F3F5-FE0F",["rosette"]],["1F339",["rose"]],["1F940",["wilted_flower"]],["1F33A",["hibiscus"]],["1F33B",["sunflower"]],["1F33C",["blossom"]],["1F337",["tulip"]],["1F331",["seedling"]],["1FAB4",["potted_plant"]],["1F332",["evergreen_tree"]],["1F333",["deciduous_tree"]],["1F334",["palm_tree"]],["1F335",["cactus"]],["1F33E",["ear_of_rice"]],["1F33F",["herb"]],["2618-FE0F",["shamrock"]],["1F340",["four_leaf_clover"]],["1F341",["maple_leaf"]],["1F342",["fallen_leaf"]],["1F343",["leaves"]]],["foods",["Food & Drink"]],[["1F347",["grapes"]],["1F348",["melon"]],["1F349",["watermelon"]],["1F34A",["tangerine"]],["1F34B",["lemon"]],["1F34C",["banana"]],["1F34D",["pineapple"]],["1F96D",["mango"]],["1F34E",["apple"]],["1F34F",["green_apple"]],["1F350",["pear"]],["1F351",["peach"]],["1F352",["cherries"]],["1F353",["strawberry"]],["1FAD0",["blueberries"]],["1F95D",["kiwifruit"]],["1F345",["tomato"]],["1FAD2",["olive"]],["1F965",["coconut"]],["1F951",["avocado"]],["1F346",["eggplant"]],["1F954",["potato"]],["1F955",["carrot"]],["1F33D",["corn"]],["1F336-FE0F",["hot_pepper"]],["1FAD1",["bell_pepper"]],["1F952",["cucumber"]],["1F96C",["leafy_green"]],["1F966",["broccoli"]],["1F9C4",["garlic"]],["1F9C5",["onion"]],["1F344",["mushroom"]],["1F95C",["peanuts"]],["1F330",["chestnut"]],["1F35E",["bread"]],["1F950",["croissant"]],["1F956",["baguette_bread"]],["1FAD3",["flatbread"]],["1F968",["pretzel"]],["1F96F",["bagel"]],["1F95E",["pancakes"]],["1F9C7",["waffle"]],["1F9C0",["cheese_wedge"]],["1F356",["meat_on_bone"]],["1F357",["poultry_leg"]],["1F969",["cut_of_meat"]],["1F953",["bacon"]],["1F354",["hamburger"]],["1F35F",["fries"]],["1F355",["pizza"]],["1F32D",["hotdog"]],["1F96A",["sandwich"]],["1F32E",["taco"]],["1F32F",["burrito"]],["1FAD4",["tamale"]],["1F959",["stuffed_flatbread"]],["1F9C6",["falafel"]],["1F95A",["egg"]],["1F373",["fried_egg","cooking"]],["1F958",["shallow_pan_of_food"]],["1F372",["stew"]],["1FAD5",["fondue"]],["1F963",["bowl_with_spoon"]],["1F957",["green_salad"]],["1F37F",["popcorn"]],["1F9C8",["butter"]],["1F9C2",["salt"]],["1F96B",["canned_food"]],["1F371",["bento"]],["1F358",["rice_cracker"]],["1F359",["rice_ball"]],["1F35A",["rice"]],["1F35B",["curry"]],["1F35C",["ramen"]],["1F35D",["spaghetti"]],["1F360",["sweet_potato"]],["1F362",["oden"]],["1F363",["sushi"]],["1F364",["fried_shrimp"]],["1F365",["fish_cake"]],["1F96E",["moon_cake"]],["1F361",["dango"]],["1F95F",["dumpling"]],["1F960",["fortune_cookie"]],["1F961",["takeout_box"]],["1F980",["crab"]],["1F99E",["lobster"]],["1F990",["shrimp"]],["1F991",["squid"]],["1F9AA",["oyster"]],["1F366",["icecream"]],["1F367",["shaved_ice"]],["1F368",["ice_cream"]],["1F369",["doughnut"]],["1F36A",["cookie"]],["1F382",["birthday"]],["1F370",["cake"]],["1F9C1",["cupcake"]],["1F967",["pie"]],["1F36B",["chocolate_bar"]],["1F36C",["candy"]],["1F36D",["lollipop"]],["1F36E",["custard"]],["1F36F",["honey_pot"]],["1F37C",["baby_bottle"]],["1F95B",["glass_of_milk"]],["2615",["coffee"]],["1FAD6",["teapot"]],["1F375",["tea"]],["1F376",["sake"]],["1F37E",["champagne"]],["1F377",["wine_glass"]],["1F378",["cocktail"]],["1F379",["tropical_drink"]],["1F37A",["beer"]],["1F37B",["beers"]],["1F942",["clinking_glasses"]],["1F943",["tumbler_glass"]],["1F964",["cup_with_straw"]],["1F9CB",["bubble_tea"]],["1F9C3",["beverage_box"]],["1F9C9",["mate_drink"]],["1F9CA",["ice_cube"]],["1F962",["chopsticks"]],["1F37D-FE0F",["knife_fork_plate"]],["1F374",["fork_and_knife"]],["1F944",["spoon"]],["1F52A",["hocho","knife"]],["1F3FA",["amphora"]]],["activity",["Activities"]],[["1F383",["jack_o_lantern"]],["1F384",["christmas_tree"]],["1F386",["fireworks"]],["1F387",["sparkler"]],["1F9E8",["firecracker"]],["2728",["sparkles"]],["1F388",["balloon"]],["1F389",["tada"]],["1F38A",["confetti_ball"]],["1F38B",["tanabata_tree"]],["1F38D",["bamboo"]],["1F38E",["dolls"]],["1F38F",["flags"]],["1F390",["wind_chime"]],["1F391",["rice_scene"]],["1F9E7",["red_envelope"]],["1F380",["ribbon"]],["1F381",["gift"]],["1F397-FE0F",["reminder_ribbon"]],["1F39F-FE0F",["admission_tickets"]],["1F3AB",["ticket"]],["1F396-FE0F",["medal"]],["1F3C6",["trophy"]],["1F3C5",["sports_medal"]],["1F947",["first_place_medal"]],["1F948",["second_place_medal"]],["1F949",["third_place_medal"]],["26BD",["soccer"]],["26BE",["baseball"]],["1F94E",["softball"]],["1F3C0",["basketball"]],["1F3D0",["volleyball"]],["1F3C8",["football"]],["1F3C9",["rugby_football"]],["1F3BE",["tennis"]],["1F94F",["flying_disc"]],["1F3B3",["bowling"]],["1F3CF",["cricket_bat_and_ball"]],["1F3D1",["field_hockey_stick_and_ball"]],["1F3D2",["ice_hockey_stick_and_puck"]],["1F94D",["lacrosse"]],["1F3D3",["table_tennis_paddle_and_ball"]],["1F3F8",["badminton_racquet_and_shuttlecock"]],["1F94A",["boxing_glove"]],["1F94B",["martial_arts_uniform"]],["1F945",["goal_net"]],["26F3",["golf"]],["26F8-FE0F",["ice_skate"]],["1F3A3",["fishing_pole_and_fish"]],["1F93F",["diving_mask"]],["1F3BD",["running_shirt_with_sash"]],["1F3BF",["ski"]],["1F6F7",["sled"]],["1F94C",["curling_stone"]],["1F3AF",["dart"]],["1FA80",["yo-yo"]],["1FA81",["kite"]],["1F3B1",["8ball"]],["1F52E",["crystal_ball"]],["1FA84",["magic_wand"]],["1F9FF",["nazar_amulet"]],["1F3AE",["video_game"]],["1F579-FE0F",["joystick"]],["1F3B0",["slot_machine"]],["1F3B2",["game_die"]],["1F9E9",["jigsaw"]],["1F9F8",["teddy_bear"]],["1FA85",["pinata"]],["1FA86",["nesting_dolls"]],["2660-FE0F",["spades"]],["2665-FE0F",["hearts"]],["2666-FE0F",["diamonds"]],["2663-FE0F",["clubs"]],["265F-FE0F",["chess_pawn"]],["1F0CF",["black_joker"]],["1F004",["mahjong"]],["1F3B4",["flower_playing_cards"]],["1F3AD",["performing_arts"]],["1F5BC-FE0F",["frame_with_picture"]],["1F3A8",["art"]],["1F9F5",["thread"]],["1FAA1",["sewing_needle"]],["1F9F6",["yarn"]],["1FAA2",["knot"]]],["places",["Travel & Places"]],[["1F30D",["earth_africa"]],["1F30E",["earth_americas"]],["1F30F",["earth_asia"]],["1F310",["globe_with_meridians"]],["1F5FA-FE0F",["world_map"]],["1F5FE",["japan"]],["1F9ED",["compass"]],["1F3D4-FE0F",["snow_capped_mountain"]],["26F0-FE0F",["mountain"]],["1F30B",["volcano"]],["1F5FB",["mount_fuji"]],["1F3D5-FE0F",["camping"]],["1F3D6-FE0F",["beach_with_umbrella"]],["1F3DC-FE0F",["desert"]],["1F3DD-FE0F",["desert_island"]],["1F3DE-FE0F",["national_park"]],["1F3DF-FE0F",["stadium"]],["1F3DB-FE0F",["classical_building"]],["1F3D7-FE0F",["building_construction"]],["1F9F1",["bricks"]],["1FAA8",["rock"]],["1FAB5",["wood"]],["1F6D6",["hut"]],["1F3D8-FE0F",["house_buildings"]],["1F3DA-FE0F",["derelict_house_building"]],["1F3E0",["house"]],["1F3E1",["house_with_garden"]],["1F3E2",["office"]],["1F3E3",["post_office"]],["1F3E4",["european_post_office"]],["1F3E5",["hospital"]],["1F3E6",["bank"]],["1F3E8",["hotel"]],["1F3E9",["love_hotel"]],["1F3EA",["convenience_store"]],["1F3EB",["school"]],["1F3EC",["department_store"]],["1F3ED",["factory"]],["1F3EF",["japanese_castle"]],["1F3F0",["european_castle"]],["1F492",["wedding"]],["1F5FC",["tokyo_tower"]],["1F5FD",["statue_of_liberty"]],["26EA",["church"]],["1F54C",["mosque"]],["1F6D5",["hindu_temple"]],["1F54D",["synagogue"]],["26E9-FE0F",["shinto_shrine"]],["1F54B",["kaaba"]],["26F2",["fountain"]],["26FA",["tent"]],["1F301",["foggy"]],["1F303",["night_with_stars"]],["1F3D9-FE0F",["cityscape"]],["1F304",["sunrise_over_mountains"]],["1F305",["sunrise"]],["1F306",["city_sunset"]],["1F307",["city_sunrise"]],["1F309",["bridge_at_night"]],["2668-FE0F",["hotsprings"]],["1F3A0",["carousel_horse"]],["1F3A1",["ferris_wheel"]],["1F3A2",["roller_coaster"]],["1F488",["barber"]],["1F3AA",["circus_tent"]],["1F682",["steam_locomotive"]],["1F683",["railway_car"]],["1F684",["bullettrain_side"]],["1F685",["bullettrain_front"]],["1F686",["train2"]],["1F687",["metro"]],["1F688",["light_rail"]],["1F689",["station"]],["1F68A",["tram"]],["1F69D",["monorail"]],["1F69E",["mountain_railway"]],["1F68B",["train"]],["1F68C",["bus"]],["1F68D",["oncoming_bus"]],["1F68E",["trolleybus"]],["1F690",["minibus"]],["1F691",["ambulance"]],["1F692",["fire_engine"]],["1F693",["police_car"]],["1F694",["oncoming_police_car"]],["1F695",["taxi"]],["1F696",["oncoming_taxi"]],["1F697",["car","red_car"]],["1F698",["oncoming_automobile"]],["1F699",["blue_car"]],["1F6FB",["pickup_truck"]],["1F69A",["truck"]],["1F69B",["articulated_lorry"]],["1F69C",["tractor"]],["1F3CE-FE0F",["racing_car"]],["1F3CD-FE0F",["racing_motorcycle"]],["1F6F5",["motor_scooter"]],["1F9BD",["manual_wheelchair"]],["1F9BC",["motorized_wheelchair"]],["1F6FA",["auto_rickshaw"]],["1F6B2",["bike"]],["1F6F4",["scooter"]],["1F6F9",["skateboard"]],["1F6FC",["roller_skate"]],["1F68F",["busstop"]],["1F6E3-FE0F",["motorway"]],["1F6E4-FE0F",["railway_track"]],["1F6E2-FE0F",["oil_drum"]],["26FD",["fuelpump"]],["1F6A8",["rotating_light"]],["1F6A5",["traffic_light"]],["1F6A6",["vertical_traffic_light"]],["1F6D1",["octagonal_sign"]],["1F6A7",["construction"]],["2693",["anchor"]],["26F5",["boat","sailboat"]],["1F6F6",["canoe"]],["1F6A4",["speedboat"]],["1F6F3-FE0F",["passenger_ship"]],["26F4-FE0F",["ferry"]],["1F6E5-FE0F",["motor_boat"]],["1F6A2",["ship"]],["2708-FE0F",["airplane"]],["1F6E9-FE0F",["small_airplane"]],["1F6EB",["airplane_departure"]],["1F6EC",["airplane_arriving"]],["1FA82",["parachute"]],["1F4BA",["seat"]],["1F681",["helicopter"]],["1F69F",["suspension_railway"]],["1F6A0",["mountain_cableway"]],["1F6A1",["aerial_tramway"]],["1F6F0-FE0F",["satellite"]],["1F680",["rocket"]],["1F6F8",["flying_saucer"]],["1F6CE-FE0F",["bellhop_bell"]],["1F9F3",["luggage"]],["231B",["hourglass"]],["23F3",["hourglass_flowing_sand"]],["231A",["watch"]],["23F0",["alarm_clock"]],["23F1-FE0F",["stopwatch"]],["23F2-FE0F",["timer_clock"]],["1F570-FE0F",["mantelpiece_clock"]],["1F55B",["clock12"]],["1F567",["clock1230"]],["1F550",["clock1"]],["1F55C",["clock130"]],["1F551",["clock2"]],["1F55D",["clock230"]],["1F552",["clock3"]],["1F55E",["clock330"]],["1F553",["clock4"]],["1F55F",["clock430"]],["1F554",["clock5"]],["1F560",["clock530"]],["1F555",["clock6"]],["1F561",["clock630"]],["1F556",["clock7"]],["1F562",["clock730"]],["1F557",["clock8"]],["1F563",["clock830"]],["1F558",["clock9"]],["1F564",["clock930"]],["1F559",["clock10"]],["1F565",["clock1030"]],["1F55A",["clock11"]],["1F566",["clock1130"]],["1F311",["new_moon"]],["1F312",["waxing_crescent_moon"]],["1F313",["first_quarter_moon"]],["1F314",["moon","waxing_gibbous_moon"]],["1F315",["full_moon"]],["1F316",["waning_gibbous_moon"]],["1F317",["last_quarter_moon"]],["1F318",["waning_crescent_moon"]],["1F319",["crescent_moon"]],["1F31A",["new_moon_with_face"]],["1F31B",["first_quarter_moon_with_face"]],["1F31C",["last_quarter_moon_with_face"]],["1F321-FE0F",["thermometer"]],["2600-FE0F",["sunny"]],["1F31D",["full_moon_with_face"]],["1F31E",["sun_with_face"]],["1FA90",["ringed_planet"]],["2B50",["star"]],["1F31F",["star2"]],["1F320",["stars"]],["1F30C",["milky_way"]],["2601-FE0F",["cloud"]],["26C5",["partly_sunny"]],["26C8-FE0F",["thunder_cloud_and_rain"]],["1F324-FE0F",["mostly_sunny","sun_small_cloud"]],["1F325-FE0F",["barely_sunny","sun_behind_cloud"]],["1F326-FE0F",["partly_sunny_rain","sun_behind_rain_cloud"]],["1F327-FE0F",["rain_cloud"]],["1F328-FE0F",["snow_cloud"]],["1F329-FE0F",["lightning","lightning_cloud"]],["1F32A-FE0F",["tornado","tornado_cloud"]],["1F32B-FE0F",["fog"]],["1F32C-FE0F",["wind_blowing_face"]],["1F300",["cyclone"]],["1F308",["rainbow"]],["1F302",["closed_umbrella"]],["2602-FE0F",["umbrella"]],["2614",["umbrella_with_rain_drops"]],["26F1-FE0F",["umbrella_on_ground"]],["26A1",["zap"]],["2744-FE0F",["snowflake"]],["2603-FE0F",["snowman"]],["26C4",["snowman_without_snow"]],["2604-FE0F",["comet"]],["1F525",["fire"]],["1F4A7",["droplet"]],["1F30A",["ocean"]]],["objects",["Objects"]],[["1F453",["eyeglasses"]],["1F576-FE0F",["dark_sunglasses"]],["1F97D",["goggles"]],["1F97C",["lab_coat"]],["1F9BA",["safety_vest"]],["1F454",["necktie"]],["1F455",["shirt","tshirt"]],["1F456",["jeans"]],["1F9E3",["scarf"]],["1F9E4",["gloves"]],["1F9E5",["coat"]],["1F9E6",["socks"]],["1F457",["dress"]],["1F458",["kimono"]],["1F97B",["sari"]],["1FA71",["one-piece_swimsuit"]],["1FA72",["briefs"]],["1FA73",["shorts"]],["1F459",["bikini"]],["1F45A",["womans_clothes"]],["1F45B",["purse"]],["1F45C",["handbag"]],["1F45D",["pouch"]],["1F6CD-FE0F",["shopping_bags"]],["1F392",["school_satchel"]],["1FA74",["thong_sandal"]],["1F45E",["mans_shoe","shoe"]],["1F45F",["athletic_shoe"]],["1F97E",["hiking_boot"]],["1F97F",["womans_flat_shoe"]],["1F460",["high_heel"]],["1F461",["sandal"]],["1FA70",["ballet_shoes"]],["1F462",["boot"]],["1F451",["crown"]],["1F452",["womans_hat"]],["1F3A9",["tophat"]],["1F393",["mortar_board"]],["1F9E2",["billed_cap"]],["1FA96",["military_helmet"]],["26D1-FE0F",["helmet_with_white_cross"]],["1F4FF",["prayer_beads"]],["1F484",["lipstick"]],["1F48D",["ring"]],["1F48E",["gem"]],["1F507",["mute"]],["1F508",["speaker"]],["1F509",["sound"]],["1F50A",["loud_sound"]],["1F4E2",["loudspeaker"]],["1F4E3",["mega"]],["1F4EF",["postal_horn"]],["1F514",["bell"]],["1F515",["no_bell"]],["1F3BC",["musical_score"]],["1F3B5",["musical_note"]],["1F3B6",["notes"]],["1F399-FE0F",["studio_microphone"]],["1F39A-FE0F",["level_slider"]],["1F39B-FE0F",["control_knobs"]],["1F3A4",["microphone"]],["1F3A7",["headphones"]],["1F4FB",["radio"]],["1F3B7",["saxophone"]],["1FA97",["accordion"]],["1F3B8",["guitar"]],["1F3B9",["musical_keyboard"]],["1F3BA",["trumpet"]],["1F3BB",["violin"]],["1FA95",["banjo"]],["1F941",["drum_with_drumsticks"]],["1FA98",["long_drum"]],["1F4F1",["iphone"]],["1F4F2",["calling"]],["260E-FE0F",["phone","telephone"]],["1F4DE",["telephone_receiver"]],["1F4DF",["pager"]],["1F4E0",["fax"]],["1F50B",["battery"]],["1F50C",["electric_plug"]],["1F4BB",["computer"]],["1F5A5-FE0F",["desktop_computer"]],["1F5A8-FE0F",["printer"]],["2328-FE0F",["keyboard"]],["1F5B1-FE0F",["three_button_mouse"]],["1F5B2-FE0F",["trackball"]],["1F4BD",["minidisc"]],["1F4BE",["floppy_disk"]],["1F4BF",["cd"]],["1F4C0",["dvd"]],["1F9EE",["abacus"]],["1F3A5",["movie_camera"]],["1F39E-FE0F",["film_frames"]],["1F4FD-FE0F",["film_projector"]],["1F3AC",["clapper"]],["1F4FA",["tv"]],["1F4F7",["camera"]],["1F4F8",["camera_with_flash"]],["1F4F9",["video_camera"]],["1F4FC",["vhs"]],["1F50D",["mag"]],["1F50E",["mag_right"]],["1F56F-FE0F",["candle"]],["1F4A1",["bulb"]],["1F526",["flashlight"]],["1F3EE",["izakaya_lantern","lantern"]],["1FA94",["diya_lamp"]],["1F4D4",["notebook_with_decorative_cover"]],["1F4D5",["closed_book"]],["1F4D6",["book","open_book"]],["1F4D7",["green_book"]],["1F4D8",["blue_book"]],["1F4D9",["orange_book"]],["1F4DA",["books"]],["1F4D3",["notebook"]],["1F4D2",["ledger"]],["1F4C3",["page_with_curl"]],["1F4DC",["scroll"]],["1F4C4",["page_facing_up"]],["1F4F0",["newspaper"]],["1F5DE-FE0F",["rolled_up_newspaper"]],["1F4D1",["bookmark_tabs"]],["1F516",["bookmark"]],["1F3F7-FE0F",["label"]],["1F4B0",["moneybag"]],["1FA99",["coin"]],["1F4B4",["yen"]],["1F4B5",["dollar"]],["1F4B6",["euro"]],["1F4B7",["pound"]],["1F4B8",["money_with_wings"]],["1F4B3",["credit_card"]],["1F9FE",["receipt"]],["1F4B9",["chart"]],["2709-FE0F",["email","envelope"]],["1F4E7",["e-mail"]],["1F4E8",["incoming_envelope"]],["1F4E9",["envelope_with_arrow"]],["1F4E4",["outbox_tray"]],["1F4E5",["inbox_tray"]],["1F4E6",["package"]],["1F4EB",["mailbox"]],["1F4EA",["mailbox_closed"]],["1F4EC",["mailbox_with_mail"]],["1F4ED",["mailbox_with_no_mail"]],["1F4EE",["postbox"]],["1F5F3-FE0F",["ballot_box_with_ballot"]],["270F-FE0F",["pencil2"]],["2712-FE0F",["black_nib"]],["1F58B-FE0F",["lower_left_fountain_pen"]],["1F58A-FE0F",["lower_left_ballpoint_pen"]],["1F58C-FE0F",["lower_left_paintbrush"]],["1F58D-FE0F",["lower_left_crayon"]],["1F4DD",["memo","pencil"]],["1F4BC",["briefcase"]],["1F4C1",["file_folder"]],["1F4C2",["open_file_folder"]],["1F5C2-FE0F",["card_index_dividers"]],["1F4C5",["date"]],["1F4C6",["calendar"]],["1F5D2-FE0F",["spiral_note_pad"]],["1F5D3-FE0F",["spiral_calendar_pad"]],["1F4C7",["card_index"]],["1F4C8",["chart_with_upwards_trend"]],["1F4C9",["chart_with_downwards_trend"]],["1F4CA",["bar_chart"]],["1F4CB",["clipboard"]],["1F4CC",["pushpin"]],["1F4CD",["round_pushpin"]],["1F4CE",["paperclip"]],["1F587-FE0F",["linked_paperclips"]],["1F4CF",["straight_ruler"]],["1F4D0",["triangular_ruler"]],["2702-FE0F",["scissors"]],["1F5C3-FE0F",["card_file_box"]],["1F5C4-FE0F",["file_cabinet"]],["1F5D1-FE0F",["wastebasket"]],["1F512",["lock"]],["1F513",["unlock"]],["1F50F",["lock_with_ink_pen"]],["1F510",["closed_lock_with_key"]],["1F511",["key"]],["1F5DD-FE0F",["old_key"]],["1F528",["hammer"]],["1FA93",["axe"]],["26CF-FE0F",["pick"]],["2692-FE0F",["hammer_and_pick"]],["1F6E0-FE0F",["hammer_and_wrench"]],["1F5E1-FE0F",["dagger_knife"]],["2694-FE0F",["crossed_swords"]],["1F52B",["gun"]],["1FA83",["boomerang"]],["1F3F9",["bow_and_arrow"]],["1F6E1-FE0F",["shield"]],["1FA9A",["carpentry_saw"]],["1F527",["wrench"]],["1FA9B",["screwdriver"]],["1F529",["nut_and_bolt"]],["2699-FE0F",["gear"]],["1F5DC-FE0F",["compression"]],["2696-FE0F",["scales"]],["1F9AF",["probing_cane"]],["1F517",["link"]],["26D3-FE0F",["chains"]],["1FA9D",["hook"]],["1F9F0",["toolbox"]],["1F9F2",["magnet"]],["1FA9C",["ladder"]],["2697-FE0F",["alembic"]],["1F9EA",["test_tube"]],["1F9EB",["petri_dish"]],["1F9EC",["dna"]],["1F52C",["microscope"]],["1F52D",["telescope"]],["1F4E1",["satellite_antenna"]],["1F489",["syringe"]],["1FA78",["drop_of_blood"]],["1F48A",["pill"]],["1FA79",["adhesive_bandage"]],["1FA7A",["stethoscope"]],["1F6AA",["door"]],["1F6D7",["elevator"]],["1FA9E",["mirror"]],["1FA9F",["window"]],["1F6CF-FE0F",["bed"]],["1F6CB-FE0F",["couch_and_lamp"]],["1FA91",["chair"]],["1F6BD",["toilet"]],["1FAA0",["plunger"]],["1F6BF",["shower"]],["1F6C1",["bathtub"]],["1FAA4",["mouse_trap"]],["1FA92",["razor"]],["1F9F4",["lotion_bottle"]],["1F9F7",["safety_pin"]],["1F9F9",["broom"]],["1F9FA",["basket"]],["1F9FB",["roll_of_paper"]],["1FAA3",["bucket"]],["1F9FC",["soap"]],["1FAA5",["toothbrush"]],["1F9FD",["sponge"]],["1F9EF",["fire_extinguisher"]],["1F6D2",["shopping_trolley"]],["1F6AC",["smoking"]],["26B0-FE0F",["coffin"]],["1FAA6",["headstone"]],["26B1-FE0F",["funeral_urn"]],["1F5FF",["moyai"]],["1FAA7",["placard"]]],["symbols",["Symbols"]],[["1F3E7",["atm"]],["1F6AE",["put_litter_in_its_place"]],["1F6B0",["potable_water"]],["267F",["wheelchair"]],["1F6B9",["mens"]],["1F6BA",["womens"]],["1F6BB",["restroom"]],["1F6BC",["baby_symbol"]],["1F6BE",["wc"]],["1F6C2",["passport_control"]],["1F6C3",["customs"]],["1F6C4",["baggage_claim"]],["1F6C5",["left_luggage"]],["26A0-FE0F",["warning"]],["1F6B8",["children_crossing"]],["26D4",["no_entry"]],["1F6AB",["no_entry_sign"]],["1F6B3",["no_bicycles"]],["1F6AD",["no_smoking"]],["1F6AF",["do_not_litter"]],["1F6B1",["non-potable_water"]],["1F6B7",["no_pedestrians"]],["1F4F5",["no_mobile_phones"]],["1F51E",["underage"]],["2622-FE0F",["radioactive_sign"]],["2623-FE0F",["biohazard_sign"]],["2B06-FE0F",["arrow_up"]],["2197-FE0F",["arrow_upper_right"]],["27A1-FE0F",["arrow_right"]],["2198-FE0F",["arrow_lower_right"]],["2B07-FE0F",["arrow_down"]],["2199-FE0F",["arrow_lower_left"]],["2B05-FE0F",["arrow_left"]],["2196-FE0F",["arrow_upper_left"]],["2195-FE0F",["arrow_up_down"]],["2194-FE0F",["left_right_arrow"]],["21A9-FE0F",["leftwards_arrow_with_hook"]],["21AA-FE0F",["arrow_right_hook"]],["2934-FE0F",["arrow_heading_up"]],["2935-FE0F",["arrow_heading_down"]],["1F503",["arrows_clockwise"]],["1F504",["arrows_counterclockwise"]],["1F519",["back"]],["1F51A",["end"]],["1F51B",["on"]],["1F51C",["soon"]],["1F51D",["top"]],["1F6D0",["place_of_worship"]],["269B-FE0F",["atom_symbol"]],["1F549-FE0F",["om_symbol"]],["2721-FE0F",["star_of_david"]],["2638-FE0F",["wheel_of_dharma"]],["262F-FE0F",["yin_yang"]],["271D-FE0F",["latin_cross"]],["2626-FE0F",["orthodox_cross"]],["262A-FE0F",["star_and_crescent"]],["262E-FE0F",["peace_symbol"]],["1F54E",["menorah_with_nine_branches"]],["1F52F",["six_pointed_star"]],["2648",["aries"]],["2649",["taurus"]],["264A",["gemini"]],["264B",["cancer"]],["264C",["leo"]],["264D",["virgo"]],["264E",["libra"]],["264F",["scorpius"]],["2650",["sagittarius"]],["2651",["capricorn"]],["2652",["aquarius"]],["2653",["pisces"]],["26CE",["ophiuchus"]],["1F500",["twisted_rightwards_arrows"]],["1F501",["repeat"]],["1F502",["repeat_one"]],["25B6-FE0F",["arrow_forward"]],["23E9",["fast_forward"]],["23ED-FE0F",["black_right_pointing_double_triangle_with_vertical_bar"]],["23EF-FE0F",["black_right_pointing_triangle_with_double_vertical_bar"]],["25C0-FE0F",["arrow_backward"]],["23EA",["rewind"]],["23EE-FE0F",["black_left_pointing_double_triangle_with_vertical_bar"]],["1F53C",["arrow_up_small"]],["23EB",["arrow_double_up"]],["1F53D",["arrow_down_small"]],["23EC",["arrow_double_down"]],["23F8-FE0F",["double_vertical_bar"]],["23F9-FE0F",["black_square_for_stop"]],["23FA-FE0F",["black_circle_for_record"]],["23CF-FE0F",["eject"]],["1F3A6",["cinema"]],["1F505",["low_brightness"]],["1F506",["high_brightness"]],["1F4F6",["signal_strength"]],["1F4F3",["vibration_mode"]],["1F4F4",["mobile_phone_off"]],["2640-FE0F",["female_sign"]],["2642-FE0F",["male_sign"]],["26A7-FE0F",["transgender_symbol"]],["2716-FE0F",["heavy_multiplication_x"]],["2795",["heavy_plus_sign"]],["2796",["heavy_minus_sign"]],["2797",["heavy_division_sign"]],["267E-FE0F",["infinity"]],["203C-FE0F",["bangbang"]],["2049-FE0F",["interrobang"]],["2753",["question"]],["2754",["grey_question"]],["2755",["grey_exclamation"]],["2757",["exclamation","heavy_exclamation_mark"]],["3030-FE0F",["wavy_dash"]],["1F4B1",["currency_exchange"]],["1F4B2",["heavy_dollar_sign"]],["2695-FE0F",["medical_symbol","staff_of_aesculapius"]],["267B-FE0F",["recycle"]],["269C-FE0F",["fleur_de_lis"]],["1F531",["trident"]],["1F4DB",["name_badge"]],["1F530",["beginner"]],["2B55",["o"]],["2705",["white_check_mark"]],["2611-FE0F",["ballot_box_with_check"]],["2714-FE0F",["heavy_check_mark"]],["274C",["x"]],["274E",["negative_squared_cross_mark"]],["27B0",["curly_loop"]],["27BF",["loop"]],["303D-FE0F",["part_alternation_mark"]],["2733-FE0F",["eight_spoked_asterisk"]],["2734-FE0F",["eight_pointed_black_star"]],["2747-FE0F",["sparkle"]],["00A9-FE0F",["copyright"]],["00AE-FE0F",["registered"]],["2122-FE0F",["tm"]],["0023-FE0F-20E3",["hash"]],["002A-FE0F-20E3",["keycap_star"]],["0030-FE0F-20E3",["zero"]],["0031-FE0F-20E3",["one"]],["0032-FE0F-20E3",["two"]],["0033-FE0F-20E3",["three"]],["0034-FE0F-20E3",["four"]],["0035-FE0F-20E3",["five"]],["0036-FE0F-20E3",["six"]],["0037-FE0F-20E3",["seven"]],["0038-FE0F-20E3",["eight"]],["0039-FE0F-20E3",["nine"]],["1F51F",["keycap_ten"]],["1F520",["capital_abcd"]],["1F521",["abcd"]],["1F522",["1234"]],["1F523",["symbols"]],["1F524",["abc"]],["1F170-FE0F",["a"]],["1F18E",["ab"]],["1F171-FE0F",["b"]],["1F191",["cl"]],["1F192",["cool"]],["1F193",["free"]],["2139-FE0F",["information_source"]],["1F194",["id"]],["24C2-FE0F",["m"]],["1F195",["new"]],["1F196",["ng"]],["1F17E-FE0F",["o2"]],["1F197",["ok"]],["1F17F-FE0F",["parking"]],["1F198",["sos"]],["1F199",["up"]],["1F19A",["vs"]],["1F201",["koko"]],["1F202-FE0F",["sa"]],["1F237-FE0F",["u6708"]],["1F236",["u6709"]],["1F22F",["u6307"]],["1F250",["ideograph_advantage"]],["1F239",["u5272"]],["1F21A",["u7121"]],["1F232",["u7981"]],["1F251",["accept"]],["1F238",["u7533"]],["1F234",["u5408"]],["1F233",["u7a7a"]],["3297-FE0F",["congratulations"]],["3299-FE0F",["secret"]],["1F23A",["u55b6"]],["1F235",["u6e80"]],["1F534",["red_circle"]],["1F7E0",["large_orange_circle"]],["1F7E1",["large_yellow_circle"]],["1F7E2",["large_green_circle"]],["1F535",["large_blue_circle"]],["1F7E3",["large_purple_circle"]],["1F7E4",["large_brown_circle"]],["26AB",["black_circle"]],["26AA",["white_circle"]],["1F7E5",["large_red_square"]],["1F7E7",["large_orange_square"]],["1F7E8",["large_yellow_square"]],["1F7E9",["large_green_square"]],["1F7E6",["large_blue_square"]],["1F7EA",["large_purple_square"]],["1F7EB",["large_brown_square"]],["2B1B",["black_large_square"]],["2B1C",["white_large_square"]],["25FC-FE0F",["black_medium_square"]],["25FB-FE0F",["white_medium_square"]],["25FE",["black_medium_small_square"]],["25FD",["white_medium_small_square"]],["25AA-FE0F",["black_small_square"]],["25AB-FE0F",["white_small_square"]],["1F536",["large_orange_diamond"]],["1F537",["large_blue_diamond"]],["1F538",["small_orange_diamond"]],["1F539",["small_blue_diamond"]],["1F53A",["small_red_triangle"]],["1F53B",["small_red_triangle_down"]],["1F4A0",["diamond_shape_with_a_dot_inside"]],["1F518",["radio_button"]],["1F533",["white_square_button"]],["1F532",["black_square_button"]]],["flags",["Flags"]],[["1F3C1",["checkered_flag"]],["1F6A9",["triangular_flag_on_post"]],["1F38C",["crossed_flags"]],["1F3F4",["waving_black_flag"]],["1F3F3-FE0F",["waving_white_flag"]],["1F3F3-FE0F-200D-1F308",["rainbow-flag"]],["1F3F3-FE0F-200D-26A7-FE0F",["transgender_flag"]],["1F3F4-200D-2620-FE0F",["pirate_flag"]],["1F1E6-1F1E8",["flag-ac"]],["1F1E6-1F1E9",["flag-ad"]],["1F1E6-1F1EA",["flag-ae"]],["1F1E6-1F1EB",["flag-af"]],["1F1E6-1F1EC",["flag-ag"]],["1F1E6-1F1EE",["flag-ai"]],["1F1E6-1F1F1",["flag-al"]],["1F1E6-1F1F2",["flag-am"]],["1F1E6-1F1F4",["flag-ao"]],["1F1E6-1F1F6",["flag-aq"]],["1F1E6-1F1F7",["flag-ar"]],["1F1E6-1F1F8",["flag-as"]],["1F1E6-1F1F9",["flag-at"]],["1F1E6-1F1FA",["flag-au"]],["1F1E6-1F1FC",["flag-aw"]],["1F1E6-1F1FD",["flag-ax"]],["1F1E6-1F1FF",["flag-az"]],["1F1E7-1F1E6",["flag-ba"]],["1F1E7-1F1E7",["flag-bb"]],["1F1E7-1F1E9",["flag-bd"]],["1F1E7-1F1EA",["flag-be"]],["1F1E7-1F1EB",["flag-bf"]],["1F1E7-1F1EC",["flag-bg"]],["1F1E7-1F1ED",["flag-bh"]],["1F1E7-1F1EE",["flag-bi"]],["1F1E7-1F1EF",["flag-bj"]],["1F1E7-1F1F1",["flag-bl"]],["1F1E7-1F1F2",["flag-bm"]],["1F1E7-1F1F3",["flag-bn"]],["1F1E7-1F1F4",["flag-bo"]],["1F1E7-1F1F6",["flag-bq"]],["1F1E7-1F1F7",["flag-br"]],["1F1E7-1F1F8",["flag-bs"]],["1F1E7-1F1F9",["flag-bt"]],["1F1E7-1F1FB",["flag-bv"]],["1F1E7-1F1FC",["flag-bw"]],["1F1E7-1F1FE",["flag-by"]],["1F1E7-1F1FF",["flag-bz"]],["1F1E8-1F1E6",["flag-ca"]],["1F1E8-1F1E8",["flag-cc"]],["1F1E8-1F1E9",["flag-cd"]],["1F1E8-1F1EB",["flag-cf"]],["1F1E8-1F1EC",["flag-cg"]],["1F1E8-1F1ED",["flag-ch"]],["1F1E8-1F1EE",["flag-ci"]],["1F1E8-1F1F0",["flag-ck"]],["1F1E8-1F1F1",["flag-cl"]],["1F1E8-1F1F2",["flag-cm"]],["1F1E8-1F1F3",["cn","flag-cn"]],["1F1E8-1F1F4",["flag-co"]],["1F1E8-1F1F5",["flag-cp"]],["1F1E8-1F1F7",["flag-cr"]],["1F1E8-1F1FA",["flag-cu"]],["1F1E8-1F1FB",["flag-cv"]],["1F1E8-1F1FC",["flag-cw"]],["1F1E8-1F1FD",["flag-cx"]],["1F1E8-1F1FE",["flag-cy"]],["1F1E8-1F1FF",["flag-cz"]],["1F1E9-1F1EA",["de","flag-de"]],["1F1E9-1F1EC",["flag-dg"]],["1F1E9-1F1EF",["flag-dj"]],["1F1E9-1F1F0",["flag-dk"]],["1F1E9-1F1F2",["flag-dm"]],["1F1E9-1F1F4",["flag-do"]],["1F1E9-1F1FF",["flag-dz"]],["1F1EA-1F1E6",["flag-ea"]],["1F1EA-1F1E8",["flag-ec"]],["1F1EA-1F1EA",["flag-ee"]],["1F1EA-1F1EC",["flag-eg"]],["1F1EA-1F1ED",["flag-eh"]],["1F1EA-1F1F7",["flag-er"]],["1F1EA-1F1F8",["es","flag-es"]],["1F1EA-1F1F9",["flag-et"]],["1F1EA-1F1FA",["flag-eu"]],["1F1EB-1F1EE",["flag-fi"]],["1F1EB-1F1EF",["flag-fj"]],["1F1EB-1F1F0",["flag-fk"]],["1F1EB-1F1F2",["flag-fm"]],["1F1EB-1F1F4",["flag-fo"]],["1F1EB-1F1F7",["fr","flag-fr"]],["1F1EC-1F1E6",["flag-ga"]],["1F1EC-1F1E7",["gb","uk","flag-gb"]],["1F1EC-1F1E9",["flag-gd"]],["1F1EC-1F1EA",["flag-ge"]],["1F1EC-1F1EB",["flag-gf"]],["1F1EC-1F1EC",["flag-gg"]],["1F1EC-1F1ED",["flag-gh"]],["1F1EC-1F1EE",["flag-gi"]],["1F1EC-1F1F1",["flag-gl"]],["1F1EC-1F1F2",["flag-gm"]],["1F1EC-1F1F3",["flag-gn"]],["1F1EC-1F1F5",["flag-gp"]],["1F1EC-1F1F6",["flag-gq"]],["1F1EC-1F1F7",["flag-gr"]],["1F1EC-1F1F8",["flag-gs"]],["1F1EC-1F1F9",["flag-gt"]],["1F1EC-1F1FA",["flag-gu"]],["1F1EC-1F1FC",["flag-gw"]],["1F1EC-1F1FE",["flag-gy"]],["1F1ED-1F1F0",["flag-hk"]],["1F1ED-1F1F2",["flag-hm"]],["1F1ED-1F1F3",["flag-hn"]],["1F1ED-1F1F7",["flag-hr"]],["1F1ED-1F1F9",["flag-ht"]],["1F1ED-1F1FA",["flag-hu"]],["1F1EE-1F1E8",["flag-ic"]],["1F1EE-1F1E9",["flag-id"]],["1F1EE-1F1EA",["flag-ie"]],["1F1EE-1F1F1",["flag-il"]],["1F1EE-1F1F2",["flag-im"]],["1F1EE-1F1F3",["flag-in"]],["1F1EE-1F1F4",["flag-io"]],["1F1EE-1F1F6",["flag-iq"]],["1F1EE-1F1F7",["flag-ir"]],["1F1EE-1F1F8",["flag-is"]],["1F1EE-1F1F9",["it","flag-it"]],["1F1EF-1F1EA",["flag-je"]],["1F1EF-1F1F2",["flag-jm"]],["1F1EF-1F1F4",["flag-jo"]],["1F1EF-1F1F5",["jp","flag-jp"]],["1F1F0-1F1EA",["flag-ke"]],["1F1F0-1F1EC",["flag-kg"]],["1F1F0-1F1ED",["flag-kh"]],["1F1F0-1F1EE",["flag-ki"]],["1F1F0-1F1F2",["flag-km"]],["1F1F0-1F1F3",["flag-kn"]],["1F1F0-1F1F5",["flag-kp"]],["1F1F0-1F1F7",["kr","flag-kr"]],["1F1F0-1F1FC",["flag-kw"]],["1F1F0-1F1FE",["flag-ky"]],["1F1F0-1F1FF",["flag-kz"]],["1F1F1-1F1E6",["flag-la"]],["1F1F1-1F1E7",["flag-lb"]],["1F1F1-1F1E8",["flag-lc"]],["1F1F1-1F1EE",["flag-li"]],["1F1F1-1F1F0",["flag-lk"]],["1F1F1-1F1F7",["flag-lr"]],["1F1F1-1F1F8",["flag-ls"]],["1F1F1-1F1F9",["flag-lt"]],["1F1F1-1F1FA",["flag-lu"]],["1F1F1-1F1FB",["flag-lv"]],["1F1F1-1F1FE",["flag-ly"]],["1F1F2-1F1E6",["flag-ma"]],["1F1F2-1F1E8",["flag-mc"]],["1F1F2-1F1E9",["flag-md"]],["1F1F2-1F1EA",["flag-me"]],["1F1F2-1F1EB",["flag-mf"]],["1F1F2-1F1EC",["flag-mg"]],["1F1F2-1F1ED",["flag-mh"]],["1F1F2-1F1F0",["flag-mk"]],["1F1F2-1F1F1",["flag-ml"]],["1F1F2-1F1F2",["flag-mm"]],["1F1F2-1F1F3",["flag-mn"]],["1F1F2-1F1F4",["flag-mo"]],["1F1F2-1F1F5",["flag-mp"]],["1F1F2-1F1F6",["flag-mq"]],["1F1F2-1F1F7",["flag-mr"]],["1F1F2-1F1F8",["flag-ms"]],["1F1F2-1F1F9",["flag-mt"]],["1F1F2-1F1FA",["flag-mu"]],["1F1F2-1F1FB",["flag-mv"]],["1F1F2-1F1FC",["flag-mw"]],["1F1F2-1F1FD",["flag-mx"]],["1F1F2-1F1FE",["flag-my"]],["1F1F2-1F1FF",["flag-mz"]],["1F1F3-1F1E6",["flag-na"]],["1F1F3-1F1E8",["flag-nc"]],["1F1F3-1F1EA",["flag-ne"]],["1F1F3-1F1EB",["flag-nf"]],["1F1F3-1F1EC",["flag-ng"]],["1F1F3-1F1EE",["flag-ni"]],["1F1F3-1F1F1",["flag-nl"]],["1F1F3-1F1F4",["flag-no"]],["1F1F3-1F1F5",["flag-np"]],["1F1F3-1F1F7",["flag-nr"]],["1F1F3-1F1FA",["flag-nu"]],["1F1F3-1F1FF",["flag-nz"]],["1F1F4-1F1F2",["flag-om"]],["1F1F5-1F1E6",["flag-pa"]],["1F1F5-1F1EA",["flag-pe"]],["1F1F5-1F1EB",["flag-pf"]],["1F1F5-1F1EC",["flag-pg"]],["1F1F5-1F1ED",["flag-ph"]],["1F1F5-1F1F0",["flag-pk"]],["1F1F5-1F1F1",["flag-pl"]],["1F1F5-1F1F2",["flag-pm"]],["1F1F5-1F1F3",["flag-pn"]],["1F1F5-1F1F7",["flag-pr"]],["1F1F5-1F1F8",["flag-ps"]],["1F1F5-1F1F9",["flag-pt"]],["1F1F5-1F1FC",["flag-pw"]],["1F1F5-1F1FE",["flag-py"]],["1F1F6-1F1E6",["flag-qa"]],["1F1F7-1F1EA",["flag-re"]],["1F1F7-1F1F4",["flag-ro"]],["1F1F7-1F1F8",["flag-rs"]],["1F1F7-1F1FA",["ru","flag-ru"]],["1F1F7-1F1FC",["flag-rw"]],["1F1F8-1F1E6",["flag-sa"]],["1F1F8-1F1E7",["flag-sb"]],["1F1F8-1F1E8",["flag-sc"]],["1F1F8-1F1E9",["flag-sd"]],["1F1F8-1F1EA",["flag-se"]],["1F1F8-1F1EC",["flag-sg"]],["1F1F8-1F1ED",["flag-sh"]],["1F1F8-1F1EE",["flag-si"]],["1F1F8-1F1EF",["flag-sj"]],["1F1F8-1F1F0",["flag-sk"]],["1F1F8-1F1F1",["flag-sl"]],["1F1F8-1F1F2",["flag-sm"]],["1F1F8-1F1F3",["flag-sn"]],["1F1F8-1F1F4",["flag-so"]],["1F1F8-1F1F7",["flag-sr"]],["1F1F8-1F1F8",["flag-ss"]],["1F1F8-1F1F9",["flag-st"]],["1F1F8-1F1FB",["flag-sv"]],["1F1F8-1F1FD",["flag-sx"]],["1F1F8-1F1FE",["flag-sy"]],["1F1F8-1F1FF",["flag-sz"]],["1F1F9-1F1E6",["flag-ta"]],["1F1F9-1F1E8",["flag-tc"]],["1F1F9-1F1E9",["flag-td"]],["1F1F9-1F1EB",["flag-tf"]],["1F1F9-1F1EC",["flag-tg"]],["1F1F9-1F1ED",["flag-th"]],["1F1F9-1F1EF",["flag-tj"]],["1F1F9-1F1F0",["flag-tk"]],["1F1F9-1F1F1",["flag-tl"]],["1F1F9-1F1F2",["flag-tm"]],["1F1F9-1F1F3",["flag-tn"]],["1F1F9-1F1F4",["flag-to"]],["1F1F9-1F1F7",["flag-tr"]],["1F1F9-1F1F9",["flag-tt"]],["1F1F9-1F1FB",["flag-tv"]],["1F1F9-1F1FC",["flag-tw"]],["1F1F9-1F1FF",["flag-tz"]],["1F1FA-1F1E6",["flag-ua"]],["1F1FA-1F1EC",["flag-ug"]],["1F1FA-1F1F2",["flag-um"]],["1F1FA-1F1F3",["flag-un"]],["1F1FA-1F1F8",["us","flag-us"]],["1F1FA-1F1FE",["flag-uy"]],["1F1FA-1F1FF",["flag-uz"]],["1F1FB-1F1E6",["flag-va"]],["1F1FB-1F1E8",["flag-vc"]],["1F1FB-1F1EA",["flag-ve"]],["1F1FB-1F1EC",["flag-vg"]],["1F1FB-1F1EE",["flag-vi"]],["1F1FB-1F1F3",["flag-vn"]],["1F1FB-1F1FA",["flag-vu"]],["1F1FC-1F1EB",["flag-wf"]],["1F1FC-1F1F8",["flag-ws"]],["1F1FD-1F1F0",["flag-xk"]],["1F1FE-1F1EA",["flag-ye"]],["1F1FE-1F1F9",["flag-yt"]],["1F1FF-1F1E6",["flag-za"]],["1F1FF-1F1F2",["flag-zm"]],["1F1FF-1F1FC",["flag-zw"]],["1F3F4-E0067-E0062-E0065-E006E-E0067-E007F",["flag-england"]],["1F3F4-E0067-E0062-E0073-E0063-E0074-E007F",["flag-scotland"]],["1F3F4-E0067-E0062-E0077-E006C-E0073-E007F",["flag-wales"]]]]')}}]); +//# sourceMappingURL=1.6e0d9af6c6bece6b9cdc.js.map \ No newline at end of file diff --git a/dist/1.6e0d9af6c6bece6b9cdc.js.map b/dist/1.6e0d9af6c6bece6b9cdc.js.map new file mode 100644 index 000000000..a8d32aea0 --- /dev/null +++ b/dist/1.6e0d9af6c6bece6b9cdc.js.map @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mappings":"","file":"1.6e0d9af6c6bece6b9cdc.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/1.fb539fa72ec126e2a2cc.js.map b/dist/1.fb539fa72ec126e2a2cc.js.map deleted file mode 100644 index 28c392554..000000000 --- a/dist/1.fb539fa72ec126e2a2cc.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"1.fb539fa72ec126e2a2cc.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/3.ac6afd4be1c32f54938b.js b/dist/3.ac6afd4be1c32f54938b.js deleted file mode 100644 index c870a03a8..000000000 --- a/dist/3.ac6afd4be1c32f54938b.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],Array(103).concat([function(e,t,a){"use strict";a.r(t),a.d(t,"MediaViewer",(function(){return de})),a.d(t,"ForwardPicker",(function(){return je})),a.d(t,"Errors",(function(){return ke})),a.d(t,"Notifications",(function(){return Ie})),a.d(t,"SafeLinkModal",(function(){return Pe})),a.d(t,"HistoryCalendar",(function(){return Te})),a.d(t,"CalendarModal",(function(){return Ae})),a.d(t,"DeleteMessageModal",(function(){return Re})),a.d(t,"PinMessageModal",(function(){return De})),a.d(t,"UnpinAllMessagesModal",(function(){return Be})),a.d(t,"MessageSelectToolbar",(function(){return qe})),a.d(t,"LeftSearch",(function(){return Nt})),a.d(t,"Settings",(function(){return on})),a.d(t,"ContactList",(function(){return mn})),a.d(t,"NewChat",(function(){return pn})),a.d(t,"NewChatStep1",(function(){return hn})),a.d(t,"NewChatStep2",(function(){return bn})),a.d(t,"ArchivedChats",(function(){return En})),a.d(t,"ContextMenuContainer",(function(){return Mn})),a.d(t,"StickerSetModal",(function(){return Fn})),a.d(t,"HeaderMenuContainer",(function(){return An})),a.d(t,"MobileSearch",(function(){return Dn})),a.d(t,"AttachmentModal",(function(){return Wn})),a.d(t,"PollModal",(function(){return Zn})),a.d(t,"SymbolMenu",(function(){return jc})),a.d(t,"AttachMenu",(function(){return Cc})),a.d(t,"MentionTooltip",(function(){return Vn})),a.d(t,"StickerTooltip",(function(){return yc})),a.d(t,"BotKeyboardMenu",(function(){return kc})),a.d(t,"CustomSendMenu",(function(){return Nc})),a.d(t,"DropArea",(function(){return Ic.b})),a.d(t,"TextFormatter",(function(){return Sc.a})),a.d(t,"EmojiTooltip",(function(){return Pc})),a.d(t,"RightSearch",(function(){return Fc})),a.d(t,"StickerSearch",(function(){return Rc})),a.d(t,"GifSearch",(function(){return Dc})),a.d(t,"PollResults",(function(){return xc})),a.d(t,"Management",(function(){return Jc})),a.d(t,"PaymentModal",(function(){return kr})),a.d(t,"ReceiptModal",(function(){return Sr}));var n=a(0),c=a(2),r=a(5),s=a(20),l=a(1),o=a(7),i=a(115),d=a(6),m=a(4),u=a(3),h=a(132),b=a(47),g=a(177),p=a(26),v=a(108),E=a(120),O=a(191),f=a(38),j=a(48),C=a(146),y=a(56);function k(e,t,a,n){const{mediaEl:c}=P(t,n);if(!c)return;const{width:r}=y.a.get();let o,d=!1;if(n){const{photo:e,video:t,webPage:a}=Object(m.v)(n);d=Boolean(t),o=t?Object(m.bb)(t):Object(m.S)(e||a.photo)}else o=i.a;const{width:u,height:h}=Object(i.j)(e,d),{width:b,height:g}=Object(i.e)(u,h,o.width,o.height),p=(r-b)/2,v=function(e){const t=window.matchMedia(i.b);let a=4.125;e&&(a+=t.matches?.875:3.375);return a*i.c}(e)+(h-g)/2;let{top:E,left:O,width:f,height:j}=c.getBoundingClientRect();if([s.h.SharedMedia,s.h.Album,s.h.ScheduledAlbum,s.h.SearchResult].includes(t)){const e=function(e,t,a,n,c,r){if(e===t){const s=Math.max(c,r)*(e/t);n-=(s-c)/2,a-=(s-r)/2,c=s,r=s}else if(e>t){const a=c;n-=((c=r*(e/t))-a)/2}else if(t>e){const n=r;a-=((r=c*(t/e))-n)/2}return{top:a,left:n,width:c,height:r}}(b,g,E,O,f,j);E=e.top,O=e.left,f=e.width,j=e.height}const C=O+f/2-(p+b/2),k=E+j/2-(v+g/2),N=f/b,S=j/g,F=I(a||c);w(F,{top:v+"px",left:p+"px",width:b+"px",height:g+"px",transform:`translate3d(${C}px, ${k}px, 0) scale(${N}, ${S})`}),M(F,t),document.body.classList.add("ghost-animating"),requestAnimationFrame(()=>{document.body.appendChild(F),requestAnimationFrame(()=>{F.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(F),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(F)&&document.body.removeChild(F),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function N(e,t,a){const{container:n,mediaEl:c}=P(e,a);if(!c)return;const r=document.getElementById("MediaViewer").querySelector(".active .media-viewer-content img, .active .media-viewer-content video");if(!r||!c)return;const{top:o,left:i,width:d,height:m}=r.getBoundingClientRect(),{top:u,left:h,width:b,height:g}=c.getBoundingClientRect();let p=u;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:a}=y.a.get();return t.top<=a&&t.top+t.height>=0}(n)){const{height:e}=y.a.get();p=uf?O=f:f>O&&(f=O));const C=document.getElementsByClassName("ghost")[0],k=C||I(t||c,e===s.h.ProfileAvatar);C||w(k,{top:p+"px",left:h+"px",width:b+"px",height:g+"px",transform:`translate3d(${v}px, ${E}px, 0) scale(${O}, ${f})`}),requestAnimationFrame(()=>{if(C){const{top:e,left:t,width:a,height:n}=C.getBoundingClientRect();w(k,{transition:"none",top:p+"px",left:h+"px",transformOrigin:"top left",transform:`translate3d(${t-h}px, ${e-p}px, 0) scale(${a/b}, ${n/g})`,width:b+"px",height:g+"px"})}document.body.classList.add("ghost-animating"),C||document.body.appendChild(k),requestAnimationFrame(()=>{C&&(C.style.transition=""),k.style.transform="",j&&(k.style.opacity="0"),M(k,e),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(k)&&document.body.removeChild(k),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function I(e,t=!1){const a=document.createElement("div");a.classList.add("ghost");const n=new Image;if("string"==typeof e?n.src=e:e instanceof HTMLVideoElement?n.src=e.poster:n.src=e.src,a.appendChild(n),t){a.classList.add("ProfileInfo");const e=document.querySelector("#RightColumn .ProfileInfo .info");e&&a.appendChild(e.cloneNode(!0))}return a}function S(e,t){const a=document.querySelector(".active > .MessageList");let n=e.offsetTop+t.closest(".content-inner, .WebPage").offsetTop;return e.id.includes("album-media-")&&(n+=e.parentElement.offsetTop+e.closest(".Message").offsetTop),n>a.scrollTop&&n+t.offsetHeight{if(n&&t)return{sender:Object(m.lb)(t)?Object(d.Gb)(e,t):Object(d.f)(e,t)};if(!a||!t)return{};const c=Object(d.k)(e,t,a);return{message:c,sender:c&&Object(d.tb)(e,c)}},(e,t)=>Object(u.l)(t,["closeMediaViewer","focusMessage"]))(({chatId:e,messageId:t,sender:a,isAvatar:c,message:r,closeMediaViewer:s,focusMessage:l})=>{const o=Object(n.m)(()=>{s(),l({chatId:e,messageId:t})},[e,l,t,s]),i=Object(F.a)();if(!a||!r&&!c)return;const d=a.id<0,u=Object(m.V)(i,a);return n.a.createElement("div",{className:"SenderInfo",onClick:o},d?n.a.createElement(x.a,{key:a.id,size:"medium",chat:a}):n.a.createElement(x.a,{key:a.id,size:"medium",user:a}),n.a.createElement("div",{className:"meta"},n.a.createElement("div",{className:"title",dir:"auto"},u&&Object(B.a)(u)),n.a.createElement("div",{className:"date",dir:"auto"},c?i("lng_mediaview_profile_photo"):Object(D.d)(i,1e3*r.date))))}),G=a(178),q=a(62),z=a(42),H=a(121);a(253);var $=({mediaData:e,isVideo:t,isZoomed:a,message:c,fileName:r,isAvatar:s,onCloseMediaViewer:l,onForward:i,onZoomToggle:d})=>{const[u,h]=Object(n.r)(!1),b=t&&c?Object(m.D)(c,"download"):void 0,{mediaData:g,downloadProgress:p}=Object(E.a)(b,!u);Object(n.n)(()=>{u&&g&&(Object(G.a)(g,r),h(!1))},[r,g,u]),Object(n.n)(()=>{h(!1)},[b]);const v=Object(n.m)(e=>{e.stopPropagation(),h(e=>!e)},[]),O=Object(F.a)(),f=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]);return o.g?n.a.createElement("div",{className:"MediaViewerActions-mobile"},n.a.createElement(q.a,{trigger:f,positionX:"right"},!s&&n.a.createElement(z.a,{icon:"forward",onClick:i},O("Forward")),t?n.a.createElement(z.a,{icon:u?"close":"download",onClick:v},u?Math.round(100*p)+"% Downloading...":"Download"):n.a.createElement(z.a,{icon:"download",href:e,download:r},O("AccActionDownload"))),u&&n.a.createElement(H.a,{progress:p,size:"s",noCross:!0})):n.a.createElement("div",{className:"MediaViewerActions"},!s&&n.a.createElement(n.a.Fragment,null,n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("Forward"),onClick:i},n.a.createElement("i",{className:"icon-forward"}))),t?n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("AccActionDownload"),onClick:v},u?n.a.createElement(H.a,{progress:p,size:"s",onClick:v}):n.a.createElement("i",{className:"icon-download"})):n.a.createElement(R.a,{href:e,download:r,round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("AccActionDownload")},n.a.createElement("i",{className:"icon-download"})),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:a?"Zoom Out":"Zoom In",onClick:d},n.a.createElement("i",{className:a?"icon-zoom-out":"icon-zoom-in"})),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:O("Close"),onClick:l},n.a.createElement("i",{className:"icon-close"})))},_=a(9);a(254);var V=({text:e="",isHideable:t,onClick:a})=>{const[c,r]=Object(n.r)(!1);return Object(n.n)(()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;r(t>2*i.c)};t();const a=Object(_.g)(t,500,!0);return window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[]),n.a.createElement("div",{className:"MediaViewerFooter "+(t?"hideable":""),onClick:function(t){e&&t.stopPropagation()}},e&&n.a.createElement("div",{className:"media-viewer-footer-content",onClick:a},n.a.createElement("p",{className:"media-text custom-scroll "+(c?"multiline":""),dir:"auto"},e)))},K=a(35),W=a(137);const Y=function(){if(void 0!==document.fullscreenElement)return"fullscreenElement";if(void 0!==document.mozFullScreenElement)return"mozFullScreenElement";if(void 0!==document.webkitFullscreenElement)return"webkitFullscreenElement";return""}();var Z=a(147),Q=a(136);const X=["bytes","kB","MB","GB","TB","PB"];var J=e=>{const t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**Math.floor(t)).toFixed(1)} ${X[t]}`};a(255);const ee=e=>{e.stopPropagation()};var te=({bufferedProgress:e,currentTime:t,duration:a,fileSize:c,isForceVisible:r,isForceMobileVersion:s,isPlayed:l,isFullscreenSupported:i,isFullscreen:d,onChangeFullscreen:m,onPlayPause:u,onSeek:h})=>{const[b,g]=Object(n.r)(!0);Object(n.n)(()=>{r&&g(r)},[r]),Object(n.n)(()=>{let e;return r||(o.g?g(!1):e=window.setTimeout(()=>{g(!1)},800)),()=>{e&&window.clearTimeout(e)}},[r]),Object(n.n)(()=>((b||r)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")}),[r,b]);const p=Object(F.a)();var v,E;if(b||r)return n.a.createElement("div",{className:"VideoPlayerControls "+(s?"mobile":""),onClick:ee},function(e,t,a,c){const r=e/t*100,s=100*a;return n.a.createElement("div",{className:"player-seekline"},n.a.createElement("div",{className:"player-seekline-track"},n.a.createElement("div",{className:"player-seekline-buffered",style:`width: ${s||0}%`}),n.a.createElement("div",{className:"player-seekline-played",style:`width: ${r||0}%`}),n.a.createElement("input",{min:"0",max:"100",step:.01,type:"range",onInput:c,className:"player-seekline-input",value:r||0})))}(t,a,e,h),n.a.createElement(R.a,{ariaLabel:p("AccActionPlay"),size:"tiny",ripple:!o.g,color:"translucent-white",className:"play",onClick:u},n.a.createElement("i",{className:l?"icon-pause":"icon-play"})),function(e,t){return n.a.createElement("div",{className:"player-time"},`${Object(D.e)(e)} / ${Object(D.e)(t)}`)}(t,a),e<1&&(v=e,E=c,n.a.createElement("div",{className:"player-file-size"},`${J(E*v)} / ${J(E)}`)),i&&n.a.createElement(R.a,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:m},n.a.createElement("i",{className:""+(d?"icon-smallscreen":"icon-fullscreen")})))};a(256);function ae(){return(ae=Object.assign||function(e){for(var t=1;t{const m=Object(n.q)(null),[u,h]=Object(n.r)(!o.l||!o.e),[b,g]=Object(n.r)(0),[p,v]=Object(n.r)(!0),[E,O,f]=function(e,t){const[a,c]=Object(n.r)(Boolean(Y&&document[Y]));return Object(n.o)(()=>{const a=()=>{c(Boolean(Y&&document[Y]))},n=()=>{c(!0)},r=()=>{c(!1),t(!1)},s=e.current;return document.addEventListener("fullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),s&&(s.addEventListener("webkitbeginfullscreen",n,!1),s.addEventListener("webkitendfullscreen",r,!1)),()=>{document.removeEventListener("fullscreenchange",a,!1),document.removeEventListener("webkitfullscreenchange",a,!1),document.removeEventListener("mozfullscreenchange",a,!1),s&&(s.removeEventListener("webkitbeginfullscreen",n,!1),s.removeEventListener("webkitendfullscreen",r,!1))}},[]),Y||"iOS"===o.o?[a,()=>{e.current&&(Y||"iOS"===o.o)&&(e.current.requestFullscreen?e.current.requestFullscreen():e.current.webkitRequestFullscreen?e.current.webkitRequestFullscreen():e.current.webkitEnterFullscreen?e.current.webkitEnterFullscreen():e.current.mozRequestFullScreen&&e.current.mozRequestFullScreen(),c(!0))},()=>{e.current&&(document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen(),c(!1))}]:[!1]}(m,h),{isBuffered:j,bufferedProgress:C,bufferingHandlers:y}=Object(W.a)(),{shouldRender:k,transitionClassNames:N}=Object(K.a)(!j,void 0,void 0,"slow");Object(n.n)(()=>{i||!l?m.current.pause():e&&!o.l&&Object(Q.a)(m.current)},[i,l,e]),Object(n.n)(()=>{m.current.currentTime===m.current.duration?(g(0),h(!1)):g(m.current.currentTime)},[b]);const I=Object(n.m)(e=>{e.stopPropagation(),u?(m.current.pause(),h(!1)):(m.current.play(),h(!0))},[u]);Object(Z.a)(m,[]);const S=Object(n.m)(()=>{v(!0)},[]),w=Object(n.m)(()=>{v(!1)},[]),P=Object(n.m)(e=>{g(e.currentTarget.currentTime)},[]),M=Object(n.m)(()=>{g(0),h(!1)},[]),F=Object(n.m)(()=>{E&&f?f():!E&&O&&O()},[f,E,O]),L=Object(n.m)(e=>{e.stopPropagation(),m.current.currentTime=Number(e.target.value)*m.current.duration/100},[]),A=Object(n.m)(e=>{e.stopPropagation(),v(!p)},[p]);Object(n.n)(()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||I(e)};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}},[I]);const T=c&&`width: ${c.width}px; height: ${c.height}px`,R=`background-image: url(${a})`;return n.a.createElement("div",{className:"VideoPlayer",onClick:!t&&o.g?A:void 0,onMouseOver:t?void 0:S,onMouseOut:t?void 0:w},n.a.createElement("div",{style:T},n.a.createElement("video",ae({ref:m,autoPlay:o.l,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:R,onEnded:M,onClick:I},y,{onTimeUpdate:P}),e&&n.a.createElement("source",{src:e}))),k&&n.a.createElement("div",{className:["spinner-container",N].join(" ")},!j&&n.a.createElement("div",{className:"buffering"},"Buffering..."),n.a.createElement(H.a,{size:"xl",progress:j?1:r,square:!0,onClick:d})),!t&&!k&&n.a.createElement(te,{isPlayed:u,bufferedProgress:C,currentTime:b,isFullscreenSupported:Boolean(O),isFullscreen:E,fileSize:s,duration:m.current?m.current.duration:0,isForceVisible:!u||p,isForceMobileVersion:c&&c.width<400,onSeek:L,onChangeFullscreen:F,onPlayPause:I}))}),ce=a(8);a(257);var re=Object(n.h)(({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:a}=Object(K.a)(e),c=Object(f.a)(e),r=Object(n.q)(null),[s,l]=Object(n.r)(1),i=Object(n.q)(!1);Object(n.n)(()=>{e&&!c&&l(1.5)},[e,c]);const d=Object(n.m)(()=>{i.current=!0},[]),m=Object(n.m)(()=>{i.current=!1,1===s&&t(s,!i.current)},[t,s]);Object(n.n)(()=>{t(s,!i.current)},[s,t]);const u=Object(F.a)(),h=Object(ce.a)("ZoomControls",a);return n.a.createElement("div",{className:h},n.a.createElement(R.a,{disabled:1===s,size:"tiny",color:"translucent-white",ariaLabel:u("ZoomOut"),className:"zoom-out",ripple:!o.g,onClick:()=>{r.current&&l(Math.max(1,s-.5))}},n.a.createElement("i",{className:"icon-zoom-out"})),n.a.createElement(R.a,{disabled:3===s,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!o.g,onClick:()=>{r.current&&l(Math.min(3,s+.5))}},n.a.createElement("i",{className:"icon-zoom-in"})),n.a.createElement("div",{className:"seekline"},n.a.createElement("div",{className:"seekline-track"},n.a.createElement("div",{className:"seekline-played",style:`width: ${50*(s-1)}%`}),n.a.createElement("input",{ref:r,min:1,max:3,step:"0.5",value:s,type:"range",className:"seekline-input",onChange:e=>{l(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:d,onMouseUp:m}))))});a(258);const se=[1,0,0,1,0,0],le={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5};var oe=Object(n.h)(({children:e,className:t,noWrap:a,canPan:c,zoomLevel:r,panDeltaX:s,panDeltaY:l,onPan:o})=>{const i=le[r]||r,[d,m]=Object(n.r)(!1),[h,b]=Object(n.r)({dx:s,dy:l,x:0,y:0}),[g,p]=Object(n.r)(se),v=Object(n.q)(null),E=Object(n.q)(null);Object(n.n)(()=>{const e=i||g[0],t=s||g[4],a=l||g[5],n=[...g];g[0]!==e&&(n[0]=e||n[0],n[3]=e||n[3]),g[4]!==t&&(n[4]=t),g[5]!==a&&(n[5]=a),Object(u.a)(g,n)||p(function(e,t,a){const n=a&&a.querySelector(".active img");if(!a||!n)return t;const c=a.getBoundingClientRect(),r=n.getBoundingClientRect(),s=r.width/e*t[0],l=r.height/e*t[3],o=(c.width-s)/2+t[4],i=(c.height-l)/2+t[5];return c.width&&c.width-150{c||p(se)},[c]),Object(n.n)(()=>{E.current&&(E.current.style.transform=`matrix(${g.toString()})`)},[a,g]);return a?e:n.a.createElement("div",{ref:v,className:"pan-wrapper "+(t||""),onMouseDown:e=>{if(!c)return;e.stopPropagation(),e.preventDefault();const t={dx:g[4],dy:g[5],x:e.pageX,y:e.pageY};b(t),m(!0),v.current&&v.current.classList.add("move")},onMouseUp:()=>{m(!1),v.current&&v.current.classList.remove("move"),o&&o(g[4],g[5])},onMouseMove:e=>{if(d){const t=function(e,t){const a=[...g],n=h.x-e,c=h.y-t;return a[4]=h.dx-n,a[5]=h.dy-c,a}(e.pageX,e.pageY);p(t),E.current&&(E.current.style.transform=`matrix(${g.toString()})`)}}},n.a.createElement("div",{ref:E,className:"pan-container"},e))});a(259);function ie(e,t,a){return e?n.a.createElement("img",{src:e,alt:"",style:t?`width: ${t.width}px`:"",draggable:Boolean(a)}):n.a.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},n.a.createElement(L.a,{color:"white"}))}var de=Object(n.h)(Object(c.h)(e=>{const{chatId:t,threadId:a,messageId:n,avatarOwnerId:c,profilePhotoIndex:r,origin:l}=e.mediaViewer,{animationLevel:o}=e.settings.byKey;if(l===s.h.SearchResult){if(!t||!n)return{animationLevel:o};const a=Object(d.k)(e,t,n);return a?{chatId:t,messageId:n,senderId:a.senderId,origin:l,message:a,animationLevel:o}:{animationLevel:o}}if(c){return{messageId:-1,senderId:c,avatarOwner:Object(d.Gb)(e,c)||Object(d.f)(e,c),profilePhotoIndex:r||0,animationLevel:o,origin:l}}if(!(t&&a&&n))return{animationLevel:o};let i,m,u;if(i=l&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(l)?Object(d.pb)(e,t,n):Object(d.k)(e,t,n),!i)return{animationLevel:o};if(m=l&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(l)?Object(d.qb)(e,t):Object(d.m)(e,t),l===s.h.Inline||l===s.h.Album)u=Object(d.gb)(e,t,a)||Object(d.Y)(e,t,a);else if(l===s.h.SharedMedia){const t=Object(d.v)(e),{foundIds:a}=t&&t.resultsByType&&t.resultsByType.media||{};u=a}return{chatId:t,threadId:a,messageId:n,senderId:i.senderId,origin:l,message:i,chatMessages:m,collectionIds:u,animationLevel:o}},(e,t)=>Object(u.l)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"]))(({chatId:e,threadId:t,messageId:a,senderId:c,origin:d,avatarOwner:u,profilePhotoIndex:y,message:I,chatMessages:S,collectionIds:w,openMediaViewer:P,closeMediaViewer:M,openForwardMenu:L,focusMessage:D,animationLevel:B})=>{const x=Object(n.q)(null),G=Boolean(u||a),q=I?Object(m.R)(I):void 0,z=I?Object(m.G)(I):void 0,H=I?Object(m.P)(I):void 0,_=Boolean(q),K=Boolean(z||q),W=Boolean(H),Y=H?H.isGif:void 0,Z=d===s.h.SharedMedia,Q=d===s.h.SearchResult,X=B>=1?"mv-slide":"none",J=2===B?"slide-fade":"none",ee=2===B,te=u?`avatar${u.id}-${y}.jpg`:I&&Object(m.B)(I),ae=Object(f.a)(c),[ce,se]=Object(n.r)(!1),[le,de]=Object(n.r)(!1),[me,ue]=Object(n.r)(1),[he,be]=Object(n.r)({x:0,y:0}),ge=Object(n.p)(()=>_&&a?[a]:Object(m.i)(S||{},w||[],Z),[_,a,S,w,Z]),pe=a?ge.indexOf(a):-1,ve=0===pe||-1===pe,Ee=pe===ge.length-1||-1===pe;function Oe(e){if(u&&void 0!==y){const{photos:t}=u;return t&&t[y]?`photo${t[y].id}?size=c`:Object(m.f)(u,e?"big":"normal")}return I&&Object(m.D)(I,e?"viewerFull":"viewerPreview")}!G||ae&&ae===c&&x.current||(x.current=pe);const fe=Object(v.a)(I&&(Z||Q)&&Object(m.D)(I,"pictogram"),void 0,r.ApiMediaFormat.BlobUrl,void 0,ee&&350),je=Oe(),Ce=Object(v.a)(je,void 0,u&&je&&je.startsWith("profilePhoto")?r.ApiMediaFormat.DataUri:r.ApiMediaFormat.BlobUrl,void 0,ee&&350),{mediaData:ye,downloadProgress:ke}=Object(E.a)(Oe(!0),void 0,I&&Object(m.C)(I,"viewerFull"),void 0,ee&&350),Ne=z||H?(z||H).blobUrl:void 0;let Ie=!W&&(Ne||ye)||Ce||fe;const Se=Object(O.a)(!Ie&&I&&Object(m.E)(I));Ie||d===s.h.SearchResult||(Ie=Se);const we=K?Object(m.S)(_?Object(m.R)(I):Object(m.G)(I)):void 0,Pe=W?Object(m.bb)(Object(m.P)(I)):void 0;Object(n.n)(()=>{o.g&&document.body.classList.toggle("is-media-viewer-open",G)},[G]);const Me=Object(p.a)();Object(n.n)(()=>{const e=window.matchMedia(i.b);return"function"==typeof e.addEventListener?e.addEventListener("change",Me):"function"==typeof e.addListener&&e.addListener(Me),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",Me):"function"==typeof e.removeListener&&e.removeListener(Me)}},[Me]);const Fe=Object(f.a)(I),Le=Object(f.a)(d),Ae=Object(f.a)(u),Te=Object(f.a)(Ie);Object(n.n)(()=>{if(ee&&G&&!Fe&&!Ae){Object(j.b)(350+l.c);const e=I?Object(C.a)(I):void 0;k(Boolean(e),d,Ie,I)}ee&&!G&&(Fe||Ae)&&(Object(j.b)(350+l.c),N(Le,Te,Fe||void 0))},[ee,G,d,Le,I,Fe,Ae,Ie,Te]),Object(n.n)(()=>{let e;return le?se(!0):e=window.setTimeout(()=>{se(!1)},350),()=>{e&&window.clearTimeout(e)}},[le]);const Re=()=>{de(!1),ue(1),be({x:0,y:0})},De=Object(n.m)(()=>{de(!le),ue(le?1:1.5),le&&be({x:0,y:0})},[le]),Be=Object(n.m)((e,t=!1)=>{ue(e),1===e&&t&&Re()},[]),xe=Object(n.m)(()=>{M(),Re()},[M]),Ue=Object(n.m)(()=>{xe(),D({chatId:e,threadId:t,messageId:a})},[xe,e,t,D,a]),Ge=Object(n.m)(()=>{L({fromChatId:e,messageIds:[a]}),Re()},[L,e,a]);Object(n.n)(()=>G?Object(b.a)(()=>{le?Re():xe()}):void 0,[xe,G,le]),Object(n.n)(()=>{W&&!Y&&Object(g.b)()},[Y,W]);const qe=Object(n.m)((e,t)=>{let a=ge.indexOf(e);return(-1===t&&a>0||1===t&&a{ve||P({chatId:e,threadId:t,messageId:a?qe(a,-1):void 0,origin:d})},[e,t,qe,ve,a,P,d]),He=Object(n.m)(()=>{Ee||P({chatId:e,threadId:t,messageId:a?qe(a,1):void 0,origin:d})},[e,t,qe,Ee,a,P,d]);Object(n.n)(()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":ze();break;case"Right":case"ArrowRight":He()}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),Object(n.n)(()=>{const e=document.querySelector(".slide-container > .active, .slide-container > .to");if(!e)return;const t=Y&&!o.e;return Object(h.b)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:()=>{le||xe()},onSwipe:o.l?(e,t)=>{t===h.a.Right?ze():t===h.a.Left?He():xe()}:void 0})},[xe,Y,le,He,ze,ce]);const $e=Object(n.m)((e,t)=>{be({x:e,y:t})},[]),_e=Object(F.a)();function Ve(t){if(u)return n.a.createElement("div",{key:e,className:"media-viewer-content"},ie(ye||Ce,Object(i.g)(i.a,!1),!o.g&&!le));if(I){const e=Object(C.a)(I),c=Boolean(e);return n.a.createElement("div",{key:a,className:"media-viewer-content "+(c?"has-footer":"")},K&&ie(Ne||ye||Ce||fe,I&&Object(i.g)(we,c),!o.g&&!le),W&&n.a.createElement(ne,{key:a,url:Ne||ye,isGif:Y,posterData:Ie,posterSize:I&&Object(i.g)(Pe,c,!0),downloadProgress:ke,fileSize:H.size,isMediaViewerOpen:G,noPlay:!t,onClose:xe}),e&&n.a.createElement(V,{text:e,onClick:Ue,isHideable:W}))}}function Ke(){return n.a.createElement(U,{key:u?u.id:a,chatId:u?u.id:e,messageId:a,isAvatar:Boolean(u)})}return n.a.createElement(A.a,{id:"MediaViewer",className:le?"zoomed":"",isOpen:G},()=>n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"media-viewer-head",dir:_e.isRtl?"rtl":void 0},o.g&&n.a.createElement(R.a,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:_e("Close"),onClick:xe},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(T.a,{activeKey:x.current,name:J},Ke),n.a.createElement($,{mediaData:ye||Ce,isVideo:W,isZoomed:le,message:I,fileName:te,onCloseMediaViewer:xe,onForward:Ge,onZoomToggle:De,isAvatar:Boolean(u)})),n.a.createElement(oe,{noWrap:!ce,canPan:le,panDeltaX:he.x,panDeltaY:he.y,zoomLevel:me,onPan:$e},n.a.createElement(T.a,{className:"slide-container",activeKey:pe,name:X},Ve)),!ve&&n.a.createElement("button",{type:"button",className:"navigation prev "+(W&&!Y&&"inline"),"aria-label":_e("AccDescrPrevious"),dir:_e.isRtl?"rtl":void 0,onClick:ze}),!Ee&&n.a.createElement("button",{type:"button",className:"navigation next "+(W&&!Y&&"inline"),"aria-label":_e("Next"),dir:_e.isRtl?"rtl":void 0,onClick:He}),n.a.createElement(re,{isShown:le,onChangeZoom:Be})))})),me=a(52),ue=a(127),he=a(63),be=a(16),ge=a(110),pe=a(45),ve=a(113),Ee=a(106),Oe=a(109),fe=a(123);a(260);var je=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a},currentUserId:n}=e;return{chatsById:t,activeListIds:a.active,archivedListIds:a.archived,currentUserId:n}},(e,t)=>Object(u.l)(t,["setForwardChatId","exitForwardMode","loadMoreChats"]))(({chatsById:e,activeListIds:t,archivedListIds:a,currentUserId:c,isOpen:s,setForwardChatId:l,exitForwardMode:i,loadMoreChats:d})=>{const[u,h]=Object(n.r)(""),b=Object(n.q)(null),g=Object(F.a)();Object(n.n)(()=>{s?o.g||setTimeout(()=>{requestAnimationFrame(()=>{b.current&&b.current.focus()})},500):(b.current&&b.current.blur(),setTimeout(()=>{h("")},300))},[s]);const p=Object(n.p)(()=>{const n=[...t||[],...a||[]];return Object(m.Db)([...n.filter(t=>{const a=e[t];return!a||!!Object(m.e)(a,r.MAIN_THREAD_ID)&&(!u||Object(me.a)(Object(m.l)(g,e[t],void 0,t===c),u))})],e,void 0,c?[c]:void 0)},[t,a,e,c,u,g]),[v,E]=Object(ue.a)(d,p,Boolean(u)),O=Object(n.m)(e=>{h(e.currentTarget.value)},[]),f=Object(n.q)(null),j=Object(he.a)(f,s,e=>{v&&l({id:v[e]})},".ListItem-button",!0),C=n.a.createElement("div",{className:"modal-header",dir:g.isRtl?"rtl":void 0},n.a.createElement(R.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:g("Close"),onClick:i},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(pe.a,{ref:b,value:u,onChange:O,onKeyDown:j,placeholder:g("ForwardTo")}));return n.a.createElement(ge.a,{isOpen:s,onClose:i,className:"ForwardPicker",header:C},v&&v.length?n.a.createElement(ve.a,{className:"picker-list custom-scroll",items:v,onLoadMore:E,noScrollRestore:Boolean(u),ref:f,onKeyDown:j},v.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>l({id:e})},Object(m.lb)(e)?n.a.createElement(Oe.a,{status:e===c?g("SavedMessagesInfo"):void 0,userId:e}):n.a.createElement(fe.a,{chatId:e})))):v&&!v.length?n.a.createElement("p",{className:"no-results"},"Sorry, nothing found."):n.a.createElement(be.a,null))})),Ce=a(169);a(261);function ye(e){return e.isSlowMode?"Slowmode enabled":"Something went wrong"}var ke=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["errors"]),(e,t)=>Object(u.l)(t,["dismissError"]))(({errors:e,dismissError:t})=>{const a=Object(F.a)();if(e.length)return n.a.createElement("div",{id:"Errors"},e.map(e=>n.a.createElement(ge.a,{isOpen:!0,onClose:t,className:"error",title:ye(e)},n.a.createElement("p",null,Object(Ce.a)(e)),n.a.createElement(R.a,{isText:!0,onClick:t},a("OK")))))})),Ne=a(180);var Ie=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["notifications"]),(e,t)=>Object(u.l)(t,["dismissNotification"]))(({notifications:e,dismissNotification:t})=>{if(e.length)return n.a.createElement("div",{id:"Notifications"},e.map(({message:e})=>n.a.createElement(Ne.a,{message:Object(B.a)(e,["emoji","br","links"]),onDismiss:t})))})),Se=a(135),we=a(117);var Pe=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(u.l)(t,["toggleSafeLinkModal"]))(({url:e,toggleSafeLinkModal:t})=>{const a=Object(F.a)(),c=Object(n.m)(()=>{window.open(e),t({url:void 0})},[t,e]),r=Object(n.m)(()=>{t({url:void 0})},[t]),s=Object(Se.a)(e);return n.a.createElement(we.a,{isOpen:Boolean(e),onClose:r,title:a("OpenUrlTitle"),textParts:Object(B.a)(a("OpenUrlAlert2",s),["links"]),confirmLabel:a("OpenUrlTitle"),confirmHandler:c})}));a(262);const Me=["M","T","W","T","F","S","S"];function Fe(e,t,a,n,c){const r=new Date(e,t,a,0,0,0,0),s=n&&new Date(n.getFullYear(),n.getMonth(),n.getDate(),0,0,0,0),l=c&&new Date(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0,0);return!!(l&&r>l)||!!(s&&r{const h=Object(F.a)(),b=new Date,g=Object(n.p)(()=>e?new Date(e):new Date,[e]),p=t?new Date(t):void 0,[v,E]=Object(n.r)(g),[O,f]=Object(n.r)(Le(g.getHours())),[j,C]=Object(n.r)(Le(g.getMinutes())),y=v.getFullYear(),k=v.getMonth(),N=v.getDate();Object(n.n)(()=>{r&&E(g)},[r,g]);const I=c&&y>=b.getFullYear()&&k>=b.getMonth()||p&&y>=p.getFullYear()&&k>=p.getMonth(),S=a&&y<=b.getFullYear()&&k<=b.getMonth(),w=Object(n.p)(()=>function(e,t){const a=[],n=new Date;n.setFullYear(e),n.setMonth(t),n.setDate(1);const c=n.getDay();for(let e=1;e{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return f(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),23)),n=new Date(v.getTime());n.setHours(a),E(n);const c=Le(a);f(c),e.target.value=c},[v]),M=Object(n.m)(e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return C(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),59)),n=new Date(v.getTime());n.setMinutes(a),E(n);const c=Le(a);C(c),e.target.value=c},[v]);return n.a.createElement(ge.a,{isOpen:r,onClose:d,className:"CalendarModal"},n.a.createElement("div",{className:"container"},n.a.createElement("div",{className:"month-selector"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:d},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h4",null,Object(D.f)(h,v,o.g)),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",disabled:S,onClick:S?void 0:function(){E(e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t})}},n.a.createElement("i",{className:"icon-previous"})),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",disabled:I,onClick:I?void 0:function(){E(e=>{const t=new Date(e);return t.setMonth(t.getMonth()+1),t})}},n.a.createElement("i",{className:"icon-next"})))),n.a.createElement("div",{className:"calendar-wrapper"},n.a.createElement("div",{className:"calendar-grid"},Me.map(e=>n.a.createElement("div",{className:"day-button faded weekday"},n.a.createElement("span",null,e))),w.map(e=>n.a.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void E(e=>{const a=new Date(e);return a.setDate(t),a});var t},className:Object(ce.a)("day-button",Fe(y,k,e,a?b:void 0,c?b:p)?"disabled":""+(e?"clickable":""),e===N&&"selected")},!!e&&n.a.createElement("span",null,e))))),s&&n.a.createElement("div",{className:"timepicker"},n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:O,onChange:P}),":",n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:j,onChange:M})),n.a.createElement("div",{className:"footer"},n.a.createElement(R.a,{onClick:function(){m(v)}},s?function(e,t){const a=Object(D.c)(e,t,!0);if("Today"===a)return e("Conversation.ScheduleMessage.SendToday",Object(D.h)(t));return e("Conversation.ScheduleMessage.SendOn",a).replace("%@",Object(D.h)(t))}(h,v):l),i&&n.a.createElement(R.a,{onClick:u,isText:!0},i)))});var Te=Object(n.h)(Object(c.h)(e=>({selectedAt:e.historyCalendarSelectedAt}),(e,t)=>Object(u.l)(t,["searchMessagesByDate","closeHistoryCalendar"]))(({isOpen:e,selectedAt:t,searchMessagesByDate:a,closeHistoryCalendar:c})=>{const r=Object(n.m)(e=>{a({timestamp:e.valueOf()/1e3}),c()},[c,a]),s=Object(F.a)();return n.a.createElement(Ae,{isOpen:e,selectedAt:t,isPastMode:!0,submitButtonLabel:s("JumpToDate"),onClose:c,onSubmit:r})}));var Re=Object(n.h)(Object(c.h)((e,{message:t,isSchedule:a})=>{const{threadId:n}=Object(d.y)(e)||{},{canDeleteForAll:c}=n&&Object(d.b)(e,t,n)||{},r=Object(d.f)(e,t.chatId);return{canDeleteForAll:!a&&c,contactName:r&&Object(m.lb)(r.id)?Object(m.Y)(Object(d.Gb)(e,Object(m.U)(r))):void 0,willDeleteForCurrentUserOnly:r&&Object(m.ib)(r)&&!c,willDeleteForAll:r&&Object(m.nb)(r)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages"]))(({isOpen:e,isSchedule:t,message:a,album:c,canDeleteForAll:r,contactName:s,willDeleteForCurrentUserOnly:l,willDeleteForAll:o,onClose:i,deleteMessages:d,deleteScheduledMessages:m})=>{const u=Object(n.m)(()=>{const e=c&&c.messages?c.messages.map(({id:e})=>e):[a.id];d({messageIds:e,shouldDeleteForAll:!0}),i()},[d,a.id,i,c]),h=Object(n.m)(()=>{const e=c&&c.messages?c.messages.map(({id:e})=>e):[a.id];t?m({messageIds:e}):d({messageIds:e,shouldDeleteForAll:!1}),i()},[c,a.id,t,i,m,d]),b=Object(F.a)();return n.a.createElement(ge.a,{isOpen:e,onClose:i,onEnter:e&&!r?h:void 0,className:"delete",title:b("DeleteSingleMessagesTitle")},n.a.createElement("p",null,b("AreYouSureDeleteSingleMessage")),l&&n.a.createElement("p",null,b("lng_delete_for_me_chat_hint")),o&&n.a.createElement("p",null,b("lng_delete_for_everyone_hint",1,"i")),r&&n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},s&&b("Conversation.DeleteMessagesFor",Object(B.a)(s)),!s&&b("Conversation.DeleteMessagesForEveryone")),n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},b(r?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:i},b("Cancel")))}));var De=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.lb)(t),n=Object(d.P)(e,t),c=Object(d.f)(e,t),r=!!c&&Object(m.jb)(c),s=!!c&&Object(m.ib)(c),l=!!c&&Object(m.nb)(c);return{isPrivateChat:a,isChatWithSelf:n,isChannel:r,isGroup:s,isSuperGroup:l,canPinForAll:a&&!n||l||s,contactName:c&&Object(m.lb)(c.id)?Object(m.Y)(Object(d.Gb)(e,Object(m.U)(c))):void 0}},(e,t)=>Object(u.l)(t,["pinMessage"]))(({isOpen:e,messageId:t,chatId:a,isChannel:c,isGroup:r,isSuperGroup:s,canPinForAll:l,contactName:o,onClose:i,pinMessage:d})=>{const m=Object(n.m)(()=>{d({chatId:a,messageId:t,isUnpin:!1}),i()},[d,a,t,i]),u=Object(n.m)(()=>{d({chatId:a,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),i()},[a,t,i,d]),h=Object(F.a)();return n.a.createElement(ge.a,{isOpen:e,onClose:i,className:"pin",title:h("PinMessageAlertTitle")},n.a.createElement("p",null,h(c?"PinMessageAlertChannel":r||s?"PinMessageAlert":"PinMessageAlertChat")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:u},h("DialogPin")),l&&n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:m},o?h("Conversation.PinMessagesFor",o):h("Conversation.PinMessageAlert.PinAndNotifyMembers")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:i},h("Cancel")))}));var Be=Object(n.h)(({isOpen:e,pinnedMessagesCount:t=0,onClose:a,onUnpin:c})=>{const r=Object(F.a)();return n.a.createElement(ge.a,{isOpen:e,onClose:a,className:"unpin-all",title:r("Chat.PanelUnpinAllMessages")},n.a.createElement("p",null,r("Chat.UnpinAllMessagesConfirmation",t,"i")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:c},r("DialogUnpin")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:a},r("Cancel")))}),xe=a(34),Ue=a(55);var Ge=Object(n.h)(Object(c.h)((e,{isSchedule:t})=>{const{messageIds:a}=e.selectedMessages||{},{canDeleteForAll:n}=Object(d.e)(e),c=Object(d.r)(e);return{selectedMessageIds:a,canDeleteForAll:!t&&n,contactName:c&&Object(m.lb)(c.id)?Object(m.Y)(Object(d.Gb)(e,Object(m.U)(c))):void 0,willDeleteForCurrentUserOnly:c&&Object(m.ib)(c)&&!n,willDeleteForAll:c&&Object(m.nb)(c)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"]))(({isOpen:e,isSchedule:t,selectedMessageIds:a,canDeleteForAll:c,contactName:r,willDeleteForCurrentUserOnly:s,willDeleteForAll:l,onClose:o,deleteMessages:i,deleteScheduledMessages:d,exitMessageSelectMode:m})=>{const u=Object(n.m)(()=>{i({messageIds:a,shouldDeleteForAll:!0}),m(),o()},[i,m,a,o]),h=Object(n.m)(()=>{t?d({messageIds:a}):i({messageIds:a,shouldDeleteForAll:!1}),m(),o()},[t,m,o,d,a,i]),b=Object(F.a)();if(a)return n.a.createElement(ge.a,{isOpen:e,onClose:o,onEnter:c?void 0:h,className:"delete",title:b("Conversation.DeleteManyMessages")},n.a.createElement("p",null,b("AreYouSureDeleteFewMessages")),s&&n.a.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),l&&n.a.createElement("p",null,"This will delete them for everyone in this chat."),c&&n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},r?b("ChatList.DeleteForEveryone",Object(B.a)(r)):b("Conversation.DeleteMessagesForEveryone")),n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},b(c?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:o},b("Cancel")))}));a(263);var qe=Object(n.h)(Object(c.h)(e=>{const{type:t}=Object(d.y)(e)||{},{canDelete:a}=Object(d.e)(e);return{isSchedule:"scheduled"===t,selectedMessagesCount:Object(d.sb)(e),canDeleteMessages:a}},(e,t)=>Object(u.l)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages"]))(({canPost:e,isActive:t,messageListType:a,isSchedule:c,selectedMessagesCount:r,canDeleteMessages:s,exitMessageSelectMode:l,openForwardMenuForSelectedMessages:o})=>{const[i,d,m]=Object(xe.a)();Object(n.n)(()=>t&&!i?Object(Ue.a)({onBackspace:d,onDelete:d,onEsc:l}):void 0,[t,i,d,l]);const u=Object(f.a)(r||void 0,!0),h=t?r:u,b=Object(F.a)(),g=b("VoiceOver.Chat.MessagesSelected",h),p=Object(ce.a)("MessageSelectToolbar",e&&"with-composer",t&&"shown");return n.a.createElement("div",{className:p},n.a.createElement("div",{className:"MessageSelectToolbar-inner"},n.a.createElement(R.a,{color:"translucent",round:!0,onClick:l,ariaLabel:"Exit select mode"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("span",{className:"MessageSelectToolbar-count",title:g},g),!!r&&n.a.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==a&&n.a.createElement(z.a,{icon:"forward",ariaLabel:"Forward Messages",onClick:o},n.a.createElement("span",{className:"item-text"},b("Forward"))),n.a.createElement(z.a,{destructive:!0,icon:"delete",onClick:d,disabled:!s,ariaLabel:b("EditAdminGroupDeleteMessages")},n.a.createElement("span",{className:"item-text"},b("Delete"))))),n.a.createElement(Ge,{isOpen:i,isSchedule:c,onClose:m}))})),ze=a(168),He=a(50),$e=a(170),_e=e=>{const t=Object(n.q)(null),a=Object(n.m)(a=>{if("Enter"!==a.key)return;t.current===document.activeElement&&e()},[e]);return Object(n.n)(()=>(window.addEventListener("keydown",a,!1),()=>window.removeEventListener("keydown",a)),[a]),t},Ve=a(157);var Ke=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),n=a&&Object(m.U)(a);return{chat:a,privateChatUser:n?Object(d.Gb)(e,n):void 0,isPinned:Object(d.N)(e,t)}})(({chatId:e,chat:t,privateChatUser:a,isPinned:c,withUsername:r,onClick:s})=>{const[l,o,i]=Object(xe.a)(),d=Object($e.a)({chat:t,privateChatUser:a,isPinned:c,handleDelete:o}),u=()=>{s(e)},h=_e(u);if(t)return n.a.createElement(Ee.a,{className:"chat-item-clickable search-result",onClick:u,contextActions:d,buttonRef:h},Object(m.lb)(e)?n.a.createElement(Oe.a,{userId:e,withUsername:r,avatarSize:"large"}):n.a.createElement(fe.a,{chatId:e,withUsername:r,avatarSize:"large"}),n.a.createElement(Ve.a,{isOpen:l,onClose:i,chat:t}))})),We=a(143);a(264);const Ye=Object(_.g)(e=>e(),6e4,!0);var Ze=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.topPeers,a=e.users.byId,{recentlyFoundChatIds:n}=e.globalSearch;return{topUserIds:t,usersById:a,recentlyFoundChatIds:n}},(e,t)=>Object(u.l)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"]))(({topUserIds:e,usersById:t,recentlyFoundChatIds:a,onReset:c,loadTopUsers:r,loadContactList:s,openChat:l,addRecentlyFoundChatId:o,clearRecentlyFoundChats:i})=>{const d=Object(n.q)(null);Object(n.n)(()=>{Ye(()=>{r(),s()})},[r,s]),Object(We.a)(d.current,!e);const u=Object(n.m)(e=>{l({id:e}),c(),setTimeout(()=>{o({id:e})},250)},[l,o,c]),h=Object(F.a)();return n.a.createElement("div",{className:"RecentContacts custom-scroll"},e&&n.a.createElement("div",{className:"top-peers-section",dir:h.isRtl?"rtl":void 0},n.a.createElement("div",{ref:d,className:"top-peers no-selection"},e.map(e=>n.a.createElement("div",{className:"top-peer-item",onClick:()=>u(e),dir:h.isRtl?"rtl":void 0},n.a.createElement(x.a,{user:t[e]}),n.a.createElement("div",{className:"top-peer-name"},Object(B.a)(Object(m.Y)(t[e])||" ")))))),a&&n.a.createElement("div",{className:"search-section pt-1"},n.a.createElement("h3",{className:"section-heading mt-0 recent-chats-header",dir:h.isRtl?"rtl":void 0},h("Recent"),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:i,isRtl:h.isRtl},n.a.createElement("i",{className:"icon-close"}))),a.map(e=>n.a.createElement(Ke,{chatId:e,onClick:u}))))})),Qe=a(133),Xe=a(27);a(265);var Je=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t);if(!a)return{};const n=Object(m.U)(a);return{chat:a,...n&&{privateChatUser:Object(d.Gb)(e,n)},lastSyncTime:e.lastSyncTime}},(e,t)=>Object(u.l)(t,["focusMessage"]))(({message:e,searchQuery:t,chatId:a,chat:c,privateChatUser:r,focusMessage:s,lastSyncTime:l})=>{const i=Object(m.E)(e),d=Object(v.a)(Object(m.D)(e,"micro")),u=Boolean(Object(m.I)(e)),h=Object(n.m)(()=>{s({chatId:a,messageId:e.id})},[a,s,e.id]),b=Object(F.a)(),g=_e(h);if(c)return n.a.createElement(Ee.a,{className:"ChatMessage chat-item-clickable",ripple:!o.g,onClick:h,buttonRef:g},n.a.createElement(x.a,{chat:c,user:r,withOnlineStatus:!0,isSavedMessages:r&&r.isSelf,lastSyncTime:l}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"info-row"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",{dir:"auto"},Object(B.a)(Object(m.l)(b,c,r))),c.isVerified&&n.a.createElement(Qe.a,null)),n.a.createElement("div",{className:"message-date"},n.a.createElement(Xe.a,{className:"date"},Object(D.g)(b,1e3*e.date)))),n.a.createElement("div",{className:"subtitle"},n.a.createElement("div",{className:"message",dir:"auto"},function(e,t,a,c,r){if(!a)return Object(B.a)(Object(m.N)(e,t));return n.a.createElement("span",{className:"media-preview"},n.a.createElement("img",{src:a,alt:"",className:r?"round":void 0}),Object(m.P)(t)&&n.a.createElement("i",{className:"icon-play"}),Object(B.a)(Object(m.N)(e,t,!0),["emoji","highlight"],{highlight:c}))}(b,e,d||i,t,u)))))}));a(266);var et=Object(n.h)(({searchDate:e,onSelect:t})=>{const a=Object(n.p)(()=>function(e){if(e.match(/^\d{2,4}-\d{2}-\d{2}$/g)){const t=new Date(e);return[{date:t,text:Object(D.a)(t)}]}const t=[],a=new Date,n=a.getFullYear(),c=a.getTime()>new Date(`${n}-${e}`).getTime()?n:n-1;for(let a=0;a<8;a++){const n=new Date(`${c-a}-${e}`);t.push({date:n,text:Object(D.a)(n)})}return t}(e),[e]);return n.a.createElement("section",{className:"DateSuggest custom-scroll custom-scroll-x"},a.map(({date:e,text:a})=>n.a.createElement("div",{onClick:()=>t(e),className:"date-item",key:a},n.a.createElement("i",{className:"icon-calendar"}),n.a.createElement("span",null,a))))}),tt=a(118),at=a(141);const nt=Object(_.g)(e=>e(),500,!0);var ct=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{byId:a}=e.users,{userIds:n}=e.contactList||{};if(!n)return{chatsById:t,usersById:a};const{currentUserId:c,messages:r,lastSyncTime:s}=e,{fetchingStatus:l,globalResults:o,localResults:i,resultsByType:d}=e.globalSearch,{chatIds:m,userIds:u}=o||{},{chatIds:h,userIds:b}=i||{},{byChatId:g}=r,{foundIds:p}=d&&d.text||{};return{currentUserId:c,localContactIds:n,localChatIds:h,localUserIds:b,globalChatIds:m,globalUserIds:u,foundIds:p,globalMessagesByChatId:g,chatsById:t,usersById:a,fetchingStatus:l,lastSyncTime:s}},(e,t)=>Object(u.l)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"]))(({searchQuery:e,searchDate:t,dateSearchQuery:a,currentUserId:c,localContactIds:r,localChatIds:l,localUserIds:i,globalChatIds:d,globalUserIds:h,foundIds:b,globalMessagesByChatId:g,chatsById:p,usersById:v,fetchingStatus:E,lastSyncTime:O,onReset:f,onSearchDateSelect:j,openChat:C,addRecentlyFoundChatId:y,searchMessagesGlobal:k,setGlobalSearchChatId:N})=>{const I=Object(F.a)(),[S,w]=Object(n.r)(!1),[P,M]=Object(n.r)(!1),L=Object(n.m)(({direction:t})=>{O&&t===s.e.Backwards&&nt(()=>{k({type:"text",query:e})})},[O,k,e]),A=Object(n.m)(e=>{C({id:e}),e!==c&&y({id:e}),o.g||f()},[c,C,y,f]),T=Object(n.m)(e=>{N({id:e})},[N]),R=Object(n.p)(()=>{if(!e||e.startsWith("@")&&e.length<2)return He.a;const t=r?r.filter(t=>{const a=v[t];if(!a)return!1;const n=Object(m.Z)(a);return n&&Object(me.a)(n,e)||Object(me.a)(a.username,e)}):[];return[...c&&Object(me.a)(I("SavedMessages"),e)?[c]:[],...Object(m.Db)(Object(u.o)([...t,...l||[],...i||[]]),p)]},[e,r,c,I,l,i,p,v]),D=Object(n.p)(()=>!e||e.length<4||!d||!h?He.a:Object(m.Db)(Object(u.o)([...d,...h]),p,!0),[p,d,h,e]),B=Object(n.p)(()=>(e||t)&&b&&0!==b.length?b.map(e=>{const[t,a]=e.split("_").map(Number);return g&&g[t]&&g[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):He.a,[b,g,e,t]),x=Object(n.m)(()=>{w(!S)},[S]),U=Object(n.m)(()=>{M(!P)},[P]);const G=E&&!E.chats&&!E.messages&&!R.length&&!D.length&&!B.length;return e||t?n.a.createElement(ve.a,{className:"LeftSearch custom-scroll",items:B,onLoadMore:L,noScrollRestoreOnTop:!0,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(et,{searchDate:a,onSelect:j})),G&&n.a.createElement(tt.a,{text:I("ChatList.Search.NoResults"),description:I("ChatList.Search.NoResultsDescription")}),!!R.length&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar",dir:I.isRtl?"rtl":void 0},R.map(e=>n.a.createElement(at.a,{chatOrUserId:e,onClick:T,clickArg:e}))),!!R.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:I.isRtl?"auto":void 0},R.length>3&&n.a.createElement(Xe.a,{onClick:x},I(S?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),I("DialogList.SearchSectionDialogs")),R.map((e,t)=>{if(S||!(t>=3))return n.a.createElement(Ke,{chatId:e,onClick:A})})),!!D.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:I.isRtl?"auto":void 0},D.length>3&&n.a.createElement(Xe.a,{onClick:U},I(P?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),I("DialogList.SearchSectionGlobal")),D.map((e,t)=>{if(P||!(t>=3))return n.a.createElement(Ke,{chatId:e,withUsername:!0,onClick:A})})),!!B.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:I.isRtl?"auto":void 0},I("SearchMessages")),B.map((function(t){const a=Object(m.N)(I,t),c=p[t.chatId];if(a&&c)return n.a.createElement(Je,{chatId:t.chatId,message:t,searchQuery:e})})))):n.a.createElement(Ze,{onReset:f})}));const rt=Object(_.g)(e=>e(),500,!0);var st=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{currentUserId:a,messages:{byChatId:n},lastSyncTime:c}=e,{fetchingStatus:r,resultsByType:s}=e.globalSearch,{foundIds:l}=s&&s.text||{};return{currentUserId:a,foundIds:l,globalMessagesByChatId:n,chatsById:t,fetchingStatus:r,lastSyncTime:c}},(e,t)=>Object(u.l)(t,["searchMessagesGlobal"]))(({searchQuery:e,currentUserId:t,dateSearchQuery:a,foundIds:c,globalMessagesByChatId:r,chatsById:l,fetchingStatus:o,lastSyncTime:i,searchMessagesGlobal:d,onSearchDateSelect:u})=>{const h=Object(F.a)(),b=Object(n.m)(({direction:a})=>{i&&a===s.e.Backwards&&rt(()=>{d({type:"text",query:e,chatId:t})})},[t,i,d,e]),g=Object(n.p)(()=>c&&0!==c.length?c.map(e=>{const[t,a]=e.split("_").map(Number);return r&&r[t]&&r[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):He.a,[c,r]);const p=o&&!o.chats&&!o.messages&&!g.length;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content custom-scroll chat-list",items:g,onLoadMore:b,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(et,{searchDate:a,onSelect:u})),p&&n.a.createElement(tt.a,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),!!g.length&&g.map((function(t){const a=Object(m.N)(h,t),c=l[t.chatId];if(a&&c)return n.a.createElement(Je,{chatId:t.chatId,message:t,searchQuery:e})}))))}));function lt(e){return(t,a)=>{const{byId:n}=t.chats,{byId:c}=t.users,{fetchingStatus:r,resultsByType:s,chatId:l}=t.globalSearch,o="audio"!==e?e:a&&a.isVoice?"voice":"audio",{byChatId:i}=t.messages,{foundIds:d}=s&&s[o]||{};return{isLoading:void 0===d||!!r&&Boolean(r.chats||r.messages),chatsById:n,usersById:c,globalMessagesByChatId:i,foundIds:d,searchChatId:l,lastSyncTime:t.lastSyncTime}}}var ot=a(119),it=a(165);const dt=Object(_.g)(e=>e(),500,!0);var mt=Object(n.h)(Object(c.h)(lt("media"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","openMediaViewer"]))(({searchQuery:e,searchChatId:t,isLoading:a,globalMessagesByChatId:c,foundIds:r,lastSyncTime:o,searchMessagesGlobal:i,openMediaViewer:d})=>{const m=Object(F.a)(),u=Object(n.m)(({direction:a})=>{o&&a===s.e.Backwards&&dt(()=>{i({type:"media",query:e,chatId:t})})},[o,i,e,t]),h=Object(n.p)(()=>r&&c?r.map(e=>{const[t,a]=e.split("_").map(Number);return c[t]&&c[t].byId[a]}).filter(Boolean):He.a,[c,r]),b=Object(n.m)((e,t)=>{d({chatId:t,messageId:e,origin:s.h.SearchResult})},[d]);const g=Object(ot.a)([e],l.pb)&&!a,p=g&&r&&r.length>0&&!e,v=g&&r&&r.length>0&&e,E=Object(ce.a)("search-content custom-scroll",v&&"chat-list");return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:E,items:h,itemSelector:e?".ListItem":".Media",onLoadMore:u,noFastList:!0},!g&&n.a.createElement(be.a,null),g&&(!r||0===r.length)&&n.a.createElement(tt.a,{text:m("ChatList.Search.NoResults"),description:m("ChatList.Search.NoResultsDescription")}),p&&n.a.createElement("div",{className:"media-list",dir:m.isRtl?"rtl":void 0},h.map(e=>n.a.createElement(it.a,{key:e.id,idPrefix:"search-media",message:e,onClick:b}))),v&&h.map(e=>n.a.createElement(Je,{key:e.id,chatId:e.chatId,message:e}))))}));function ut(e,t,a,n){const{senderId:c}=t;if(!c)return;const r=Object(m.lb)(c)?n[c]:a[c];let s=Object(m.V)(e,r);const l=a[t.chatId];return l&&(Object(m.lb)(c)&&r.isSelf?s=`${e("FromYou")} → ${Object(m.l)(e,l)}`:Object(m.kb)(l)&&(s+=" → "+Object(m.l)(e,l))),s}var ht=a(185);const bt=Object(_.g)(e=>e(),500,!0);var gt=Object(n.h)(Object(c.h)(lt("links"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:u})=>{const h=Object(F.a)(),b=Object(n.m)(({direction:a})=>{d&&a===s.e.Backwards&&bt(()=>{m({type:"links",query:e,chatId:t})})},[d,m,e,t]),g=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number);return o[t]&&o[t].byId[a]}).filter(Boolean):He.a,[o,i]),p=Object(n.m)((e,t)=>{u({chatId:t,messageId:e})},[u]);const v=Object(ot.a)([e],l.pb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content documents-list custom-scroll",items:g,onLoadMore:b,noFastList:!0},!v&&n.a.createElement(be.a,null),v&&(!i||0===i.length)&&n.a.createElement(tt.a,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),v&&i&&i.length>0&&g.map((e,t)=>{const a=0===t||Object(D.n)(e.date)!==Object(D.n)(g[t-1].date);return n.a.createElement("div",{className:"ListItem",dir:h.isRtl?"rtl":void 0,key:e.id},a&&n.a.createElement("p",{className:"section-heading",dir:h.isRtl?"rtl":void 0},Object(D.f)(h,new Date(1e3*e.date))),n.a.createElement(ht.a,{key:e.id,message:e,senderTitle:ut(h,e,c,r),onMessageClick:p}))})))})),pt=a(160);const vt=Object(_.g)(e=>e(),500,!0);var Et=Object(n.h)(Object(c.h)(lt("documents"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:d,searchMessagesGlobal:u,focusMessage:h})=>{const b=Object(F.a)(),g=Object(n.m)(({direction:a})=>{d&&a===s.e.Backwards&&vt(()=>{u({type:"documents",query:e,chatId:t})})},[d,u,e,t]),p=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number),n=o[t]&&o[t].byId[a];return n&&Object(m.y)(n)?n:void 0}).filter(Boolean):He.a,[o,i]),v=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]);const E=Object(ot.a)([e],l.pb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:g,noFastList:!0},!E&&n.a.createElement(be.a,null),E&&(!i||0===i.length)&&n.a.createElement(tt.a,{text:b("ChatList.Search.NoResults"),description:b("ChatList.Search.NoResultsDescription")}),E&&i&&i.length>0&&p.map((e,t)=>{const a=0===t||Object(D.n)(e.date)!==Object(D.n)(p[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(D.f)(b,new Date(1e3*e.date))),n.a.createElement(pt.a,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:ut(b,e,c,r),className:"scroll-item",onDateClick:v}))})))})),Ot=a(167);const ft=Object(_.g)(e=>e(),500,!0);var jt=Object(n.h)(Object(c.h)(lt("audio"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"]))(({isVoice:e,searchQuery:t,searchChatId:a,isLoading:c,chatsById:r,usersById:o,globalMessagesByChatId:i,foundIds:d,lastSyncTime:m,searchMessagesGlobal:u,focusMessage:h,openAudioPlayer:b})=>{const g=Object(F.a)(),p=e?"voice":"audio",v=Object(n.m)(({direction:e})=>{m&&e===s.e.Backwards&&ft(()=>{u({type:p,query:t,chatId:a})})},[p,m,u,t,a]),E=Object(n.p)(()=>d&&i?d.map(e=>{const[t,a]=e.split("_").map(Number);return i[t]&&i[t].byId[a]}).filter(Boolean):He.a,[i,d]),O=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]),f=Object(n.m)((e,t)=>{b({chatId:t,messageId:e})},[b]);const j=Object(ot.a)([t],l.pb)&&!c;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content documents-list custom-scroll",items:E,onLoadMore:v,noFastList:!0},!j&&n.a.createElement(be.a,null),j&&(!d||0===d.length)&&n.a.createElement(tt.a,{text:g("ChatList.Search.NoResults"),description:g("ChatList.Search.NoResultsDescription")}),j&&d&&d.length>0&&E.map((e,t)=>{const a=0===t||Object(D.n)(e.date)!==Object(D.n)(E[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading",dir:g.isRtl?"rtl":void 0},Object(D.f)(g,new Date(1e3*e.date))),n.a.createElement(Ot.a,{key:e.id,message:e,renderingFor:"searchResult",senderTitle:ut(g,e,r,o),date:e.date,lastSyncTime:m,className:"scroll-item",onPlay:f,onDateClick:O}))})))}));a(267);const Ct=[{type:s.c.ChatList,title:"SearchAllChatsShort"},{type:s.c.Media,title:"SharedMediaTab2"},{type:s.c.Links,title:"SharedLinksTab2"},{type:s.c.Files,title:"SharedFilesTab2"},{type:s.c.Music,title:"SharedMusicTab2"},{type:s.c.Voice,title:"SharedVoiceTab2"}],yt=[{type:s.c.ChatList,title:"All Messages"},...Ct.slice(1)],kt=Object.keys(s.c).length/2;var Nt=Object(n.h)(Object(c.h)(e=>{const{currentContent:t,chatId:a}=e.globalSearch;return{currentContent:t,chatId:a}},(e,t)=>Object(u.l)(t,["setGlobalSearchContent","setGlobalSearchDate"]))(({searchQuery:e,searchDate:t,isActive:a,currentContent:c=s.c.ChatList,chatId:r,setGlobalSearchContent:l,setGlobalSearchDate:o,onReset:i})=>{const d=Object(F.a)(),[m,u]=Object(n.r)(0),h=Object(n.p)(()=>Object(D.l)(e),[e]),b=Object(n.m)(e=>{const t=Ct[e];l({content:t.type}),u(e)},[l]),g=Object(n.m)(e=>{o({date:e.getTime()/1e3})},[o]),p=Object(n.q)(null),v=Object(he.a)(p,a,void 0,".ListItem-button",!0);return n.a.createElement("div",{className:"LeftSearch",ref:p,onKeyDown:v},n.a.createElement(ze.a,{activeTab:m,tabs:r?yt:Ct,onSwitchTab:b}),n.a.createElement(T.a,{name:d.isRtl?"slide-reversed":"slide",renderCount:kt,activeKey:c},()=>{switch(c){case s.c.ChatList:return r?n.a.createElement(st,{searchQuery:e,dateSearchQuery:h,onReset:i,onSearchDateSelect:g}):n.a.createElement(ct,{searchQuery:e,searchDate:t,dateSearchQuery:h,onReset:i,onSearchDateSelect:g});case s.c.Media:return n.a.createElement(mt,{searchQuery:e});case s.c.Links:return n.a.createElement(gt,{searchQuery:e});case s.c.Files:return n.a.createElement(Et,{searchQuery:e});case s.c.Music:return n.a.createElement(jt,{key:"audio",searchQuery:e});case s.c.Voice:return n.a.createElement(jt,{key:"voice",isVoice:!0,searchQuery:e});default:return}}))}));function It(e,t){const a=Object(n.q)(e),[c,r]=Object(n.r)(t);return[c,Object(n.m)(e=>{r(t=>a.current(t,e))},[])]}const St=[{icon:"user",title:"FilterContacts",key:"contacts"},{icon:"non-contacts",title:"FilterNonContacts",key:"nonContacts"},{icon:"group",title:"FilterGroups",key:"groups"},{icon:"channel",title:"FilterChannels",key:"channels"},{icon:"bots",title:"FilterBots",key:"bots"}],wt=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],Pt=["includedChatIds","bots","channels","groups","contacts","nonContacts"],Mt=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function Ft(e,t,a){let n=[],c=[];if("included"===t){const{includedChatIds:t,...r}=a?e.includeFilters||{}:Object(u.l)(e.folder,Pt);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}else{const{excludedChatIds:t,...r}=a?e.excludeFilters||{}:Object(u.l)(e.folder,Mt);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}return{selectedChatIds:n,selectedChatTypes:c}}function Lt(e){if(e){const{includedChatIds:t,...a}=e;if(Object.values(a).filter(Boolean).length>1||t&&t.length)return"";if(a.bots)return"Bots";if(a.groups)return"Groups";if(a.channels)return"Channels";if(a.contacts)return"Contacts";if(a.nonContacts)return"Non-Contacts"}return""}const At={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},Tt=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:Object(u.l)(e.folder,Pt)};case"editExcludeFilters":return{...e,excludeFilters:Object(u.l)(e.folder,Mt)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...Object(u.j)(e.folder,Pt),title:e.folder.title?e.folder.title:Lt(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...Object(u.j)(e.folder,Mt),...e.excludeFilters},excludeFilters:void 0,chatFilter:"",isTouched:!0}:e;case"editFolder":{const{id:e,description:a,...n}=t.payload;return{mode:"edit",folderId:e,folder:n,chatFilter:""}}case"setChatFilter":return{...e,chatFilter:t.payload};case"setIsLoading":return{...e,isLoading:t.payload};case"setError":return{...e,error:t.payload};case"reset":return At;default:return e}};const Rt={currentPassword:"",password:"",hint:"",email:""},Dt=(e,t)=>{switch(t.type){case"setCurrentPassword":return{...e,currentPassword:t.payload};case"setPassword":return{...e,password:t.payload};case"setHint":return{...e,hint:t.payload};case"setEmail":return{...e,email:t.payload};case"reset":return Rt;default:return e}};var Bt=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(u.l)(t,["signOut","deleteChatFolder"]))(({currentScreen:e,editedFolderId:t,onReset:a,onSaveFilter:c,signOut:r,deleteChatFolder:l})=>{const[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),h=Object(n.m)(()=>{d(!0)},[]),b=Object(n.m)(()=>{d(!1)},[]),g=Object(n.m)(()=>{u(!0)},[]),p=Object(n.m)(()=>{u(!1)},[]),v=Object(n.m)(()=>{b(),r()},[b,r]),E=Object(n.m)(()=>{p(),l({id:t}),a()},[t,p,l,a]),O=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(R.a,{round:!0,ripple:!o.g,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]),f=Object(F.a)();return n.a.createElement("div",{className:"left-header"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:a,ariaLabel:f("AccDescrGoBack")},n.a.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case s.m.EditProfile:return n.a.createElement("h3",null,f("lng_settings_information"));case s.m.General:return n.a.createElement("h3",null,f("General"));case s.m.Notifications:return n.a.createElement("h3",null,f("Notifications"));case s.m.Privacy:return n.a.createElement("h3",null,f("PrivacySettings"));case s.m.Language:return n.a.createElement("h3",null,f("Language"));case s.m.GeneralChatBackground:return n.a.createElement("h3",null,f("ChatBackground"));case s.m.GeneralChatBackgroundColor:return n.a.createElement("h3",null,f("SetColor"));case s.m.PrivacyPhoneNumber:return n.a.createElement("h3",null,f("PrivacyPhone"));case s.m.PrivacyLastSeen:return n.a.createElement("h3",null,f("PrivacyLastSeen"));case s.m.PrivacyProfilePhoto:return n.a.createElement("h3",null,f("Privacy.ProfilePhoto"));case s.m.PrivacyForwarding:return n.a.createElement("h3",null,f("PrivacyForwards"));case s.m.PrivacyGroupChats:return n.a.createElement("h3",null,f("AutodownloadGroupChats"));case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement("h3",null,f("AlwaysShareWith"));case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement("h3",null,f("NeverShareWith"));case s.m.PrivacyActiveSessions:return n.a.createElement("h3",null,f("SessionsTitle"));case s.m.PrivacyBlockedUsers:return n.a.createElement("h3",null,f("BlockedUsers"));case s.m.TwoFaDisabled:case s.m.TwoFaEnabled:return n.a.createElement("h3",null,f("TwoStepVerification"));case s.m.TwoFaNewPassword:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:return n.a.createElement("h3",null,f("EnterPassword"));case s.m.TwoFaNewPasswordConfirm:return n.a.createElement("h3",null,f("PleaseReEnterPassword"));case s.m.TwoFaNewPasswordHint:case s.m.TwoFaChangePasswordHint:return n.a.createElement("h3",null,f("PasswordHint"));case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaRecoveryEmail:return n.a.createElement("h3",null,f("RecoveryEmailTitle"));case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement("h3",null,"Recovery Email Code");case s.m.TwoFaCongratulations:return n.a.createElement("h3",null,f("TwoStepVerificationPasswordSet"));case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement("h3",null,f("PleaseEnterCurrentPassword"));case s.m.Folders:return n.a.createElement("h3",null,f("Filters"));case s.m.FoldersCreateFolder:return n.a.createElement("h3",null,f("FilterNew"));case s.m.FoldersEditFolder:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,f("FilterEdit")),t&&n.a.createElement(q.a,{className:"settings-more-menu",trigger:O,positionX:"right"},n.a.createElement(z.a,{icon:"delete",destructive:!0,onClick:g},"Delete Folder")));case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement("div",{className:"settings-main-header"},e===s.m.FoldersIncludedChats?n.a.createElement("h3",null,f("FilterInclude")):n.a.createElement("h3",null,f("FilterExclude")),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:c,ariaLabel:f("AutoDeleteConfirm")},n.a.createElement("i",{className:"icon-check"})));default:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,f("SETTINGS")),n.a.createElement(q.a,{className:"settings-more-menu",trigger:O,positionX:"right"},n.a.createElement(z.a,{icon:"logout",onClick:h},f("LogOutTitle"))))}}(),n.a.createElement(we.a,{isOpen:i,onClose:b,text:"Are you sure you want to log out?",confirmLabel:"Log Out",confirmHandler:v,confirmIsDestructive:!0}),n.a.createElement(we.a,{isOpen:m,onClose:p,text:"Are you sure you want to delete this folder?",confirmLabel:"Delete",confirmHandler:E,confirmIsDestructive:!0}))})),xt=a(18);var Ut=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e;return{currentUser:t?Object(d.Gb)(e,t):void 0}})(({onScreenSelect:e,currentUser:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-main-menu"},t&&n.a.createElement("div",{className:"settings-current-user"},n.a.createElement(x.a,{user:t,size:"jumbo"}),n.a.createElement("p",{className:"name"},Object(m.Z)(t)),n.a.createElement("p",{className:"phone"},Object(xt.c)(t.phoneNumber))),n.a.createElement(Ee.a,{icon:"edit",onClick:()=>e(s.m.EditProfile)},a("lng_settings_information")),n.a.createElement(Ee.a,{icon:"folder",onClick:()=>e(s.m.Folders)},a("Filters")),n.a.createElement(Ee.a,{icon:"settings",onClick:()=>e(s.m.General)},a("Telegram.GeneralSettingsViewController")),n.a.createElement(Ee.a,{icon:"unmute",onClick:()=>e(s.m.Notifications)},a("Notifications")),n.a.createElement(Ee.a,{icon:"lock",onClick:()=>e(s.m.Privacy)},a("PrivacySettings")),n.a.createElement(Ee.a,{icon:"language",onClick:()=>e(s.m.Language)},a("Language"))))})),Gt=a(130);a(268);var qt=({isShown:e,className:t,color:a="primary",ariaLabel:c,disabled:r,onClick:s,children:l})=>{const o=Object(ce.a)("FloatingActionButton",e&&"revealed",t);return n.a.createElement(R.a,{className:o,color:a,round:!0,disabled:r,onClick:e&&!r?s:void 0,ariaLabel:c,tabIndex:-1},l)};const zt=/https:\/\/t\.me\/?/i,Ht=/^([a-zA-Z0-9_]+)$/,$t=Object(_.a)(e=>e(),250,!1);var _t=Object(n.h)(({currentUsername:e,asLink:t,isLoading:a,isUsernameAvailable:c,checkUsername:r,onChange:s})=>{const[l,o]=Object(n.r)(e||""),i=Object(F.a)(),d=t?"SetUrl":"Username",m=i(t?"SetUrlPlaceholder":"Username"),[u,h]=Object(n.p)(()=>l.length?l.length<5?[void 0,m+" is too short"]:l.length>32?[void 0,m+" is too long"]:Ht.test(l)?void 0===c?[]:[c?i(d+"Available","Username"):void 0,!1===c?i(d+"InUse"):void 0]:[void 0,m+" contains invalid characters"]:[],[l,c,i,d,m]);Object(n.n)(()=>{o(e||"")},[t,e]);const b=Object(n.m)(e=>{const a=e.target.value.trim().replace(zt,"");o(a),e.target.value=`${t?"https://t.me/":""}${a}`;const n=function(e){return e.length>=5&&e.length<=32&&Ht.test(e)}(a);n&&$t(()=>{r({username:a})}),s&&s(!!n&&a)},[t,r,s]);return n.a.createElement(pe.a,{value:`${t?"https://t.me/":""}${l}`,onChange:b,label:m,error:h,success:u,readOnly:a})});const Vt=Object(_.g)(e=>e(),6e4,!0);var Kt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e,{progress:a,isUsernameAvailable:n}=e.profileEdit||{},c=t?Object(d.Gb)(e,t):void 0;if(!c)return{progress:a,isUsernameAvailable:n};const{firstName:r,lastName:s,username:l,fullInfo:o}=c,{bio:i}=o||{};return{currentAvatarHash:Object(m.f)(c),currentFirstName:r,currentLastName:s,currentBio:i,currentUsername:l,progress:a,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["loadCurrentUser","updateProfile","checkUsername"]))(({currentAvatarHash:e,currentFirstName:t,currentLastName:a,currentBio:c,currentUsername:l,progress:o,isUsernameAvailable:i,loadCurrentUser:d,updateProfile:m,checkUsername:u})=>{const[h,b]=Object(n.r)(!1),[g,p]=Object(n.r)(!1),[E,O]=Object(n.r)(),[f,j]=Object(n.r)(),[C,y]=Object(n.r)(t||""),[k,N]=Object(n.r)(a||""),[I,S]=Object(n.r)(c||""),[w,P]=Object(n.r)(l||""),M=Object(v.a)(e,!1,r.ApiMediaFormat.BlobUrl),A=o===s.j.InProgress,T=!1===w,R=Object(n.p)(()=>!T&&(Boolean(f)||g||!0===i),[f,g,T,i]);Object(n.n)(()=>{Vt(()=>{d()})},[d]),Object(n.n)(()=>{j(void 0)},[M]),Object(n.n)(()=>{y(t||""),N(a||""),S(c||"")},[t,a,c]),Object(n.n)(()=>{P(l||"")},[l]),Object(n.n)(()=>{o===s.j.Complete&&(p(!1),b(!1),O(void 0))},[o]);const D=Object(n.m)(e=>{j(e)},[]),x=Object(n.m)(e=>{y(e.target.value),p(!0)},[]),U=Object(n.m)(e=>{N(e.target.value),p(!0)},[]),G=Object(n.m)(e=>{S(e.target.value),p(!0)},[]),q=Object(n.m)(e=>{P(e),b(!0)},[]),z=Object(n.m)(()=>{const e=C.trim(),t=k.trim(),a=I.trim();e.length?a.length>70?O("Bio can' be longer than 70 characters"):m({photo:f,...g&&{firstName:e,lastName:t,bio:a},...h&&{username:w}}):O("Please provide your first name")},[f,C,k,I,g,w,h,m]),H=Object(F.a)();return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-edit-profile"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:M,onChange:D,title:"Edit your profile photo",disabled:A}),n.a.createElement(pe.a,{value:C,onChange:x,label:H("FirstName"),disabled:A,error:"Please provide your first name"===E?E:void 0}),n.a.createElement(pe.a,{value:k,onChange:U,label:H("LastName"),disabled:A}),n.a.createElement(pe.a,{value:I,onChange:G,label:H("UserBio"),disabled:A,error:"Bio can' be longer than 70 characters"===E?E:void 0}),n.a.createElement("p",{className:"settings-item-description",dir:H.isRtl?"rtl":void 0},Object(B.a)(H("lng_settings_about_bio"),["br","simple_markdown"]))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:H.isRtl?"rtl":void 0},H("Username")),n.a.createElement(_t,{currentUsername:w||"",isLoading:A,isUsernameAvailable:i,checkUsername:u,onChange:q}),n.a.createElement("p",{className:"settings-item-description",dir:H.isRtl?"rtl":void 0},Object(B.a)(H("UsernameHelp"),["br","simple_markdown"])),w&&n.a.createElement("p",{className:"settings-item-description",dir:H.isRtl?"rtl":void 0},H("lng_username_link"),n.a.createElement("br",null),n.a.createElement("span",{className:"username-link"},"https://t.me/",w)))),n.a.createElement(qt,{isShown:R,onClick:z,disabled:A,ariaLabel:"Save changes"},A?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),Wt=a(125),Yt=a(116);const Zt=Object(_.g)(e=>e(),6e4,!0);var Qt=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a}}=e,{orderedIds:n,byId:c,recommended:r}=e.chatFolders;return{chatsById:t,usersById:a,orderedFolderIds:n,foldersById:c,recommendedChatFolders:r,notifySettings:Object(d.eb)(e),notifyExceptions:Object(d.db)(e)}},(e,t)=>Object(u.l)(t,["loadRecommendedChatFolders","addChatFolder","showError"]))(({onCreateFolder:e,onEditFolder:t,chatsById:a,usersById:c,orderedFolderIds:r,foldersById:s,recommendedChatFolders:o,notifySettings:i,notifyExceptions:d,loadRecommendedChatFolders:u,addChatFolder:h,showError:b})=>{const[g,p]=Object(n.r)(),[v,E]=Object(n.r)(!1),O=Object(n.m)(()=>E(!0),[]);Object(n.n)(()=>{g||Object(Wt.a)("FoldersAll").then(p)},[g]),Object(n.n)(()=>{Zt(()=>{u()})},[u]);const f=Object(n.m)(()=>{Object.keys(s).length>=10?b({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):e()},[s,b,e]),j=Object(F.a)(),C=Object(n.p)(()=>{if(!r)return;const e=Object.keys(a).map(Number);return r.map(t=>{const n=s[t];return{id:n.id,title:n.title,subtitle:Object(m.o)(j,a,c,n,e,i,d)}})},[r,a,s,c,i,d,j]),y=Object(n.m)(e=>{Object.keys(s).length>=10?b({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):h({folder:e})},[s,h,b]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},g&&n.a.createElement(Yt.a,{id:"settingsFoldersMain",size:l.tb,animationData:g,play:v,noLoop:!0,onLoad:O})),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},j("CreateNewFilterInfo")),n.a.createElement(R.a,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:f,isRtl:j.isRtl},n.a.createElement("i",{className:"icon-add"}),j("CreateNewFilter"))),n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:j.isRtl?"rtl":void 0},j("Filters")),C&&C.length?C.map(e=>n.a.createElement(Ee.a,{className:"mb-2",narrow:!0,multiline:!0,onClick:()=>t(s[e.id])},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.subtitle))):C&&!C.length?n.a.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):n.a.createElement(be.a,null)),o&&!!o.length&&n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:j.isRtl?"rtl":void 0},j("FilterRecommended")),o.map(e=>n.a.createElement(Ee.a,{className:"mb-2",narrow:!0,onClick:()=>y(e)},n.a.createElement("div",{className:"settings-folders-recommended-item"},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.description)),n.a.createElement(R.a,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:j.isRtl},j("Add")))))))}));a(269);var Xt=({count:e,itemName:t,itemPluralName:a,isLoading:c,onClick:r})=>{const s=Object(F.a)();return n.a.createElement(R.a,{className:"ShowMoreButton",color:"translucent",size:"smaller",isText:!0,isLoading:c,isRtl:s.isRtl,onClick:r},n.a.createElement("i",{className:"icon-down"}),"Show ",e," more ",e>1?a||t+"s":t)};const Jt="Please provide a title for this folder.",ea="Please select at least one chat for this folder.";var ta=Object(n.h)(Object(c.h)(e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}},(e,t)=>Object(u.l)(t,["editChatFolder","addChatFolder","loadMoreChats"]))(({state:e,dispatch:t,onAddIncludedChats:a,onAddExcludedChats:c,onReset:r,loadedActiveChatIds:s,loadedArchivedChatIds:o,editChatFolder:i,addChatFolder:d,loadMoreChats:h})=>{const[b,g]=Object(n.r)(),[p,v]=Object(n.r)(!1),E=Object(n.m)(()=>v(!0),[]),[O,f]=Object(n.r)(!1),[j,C]=Object(n.r)(!1),{selectedChatIds:y,selectedChatTypes:k}=Ft(e,"included"),{selectedChatIds:N,selectedChatTypes:I}=Ft(e,"excluded");Object(n.n)(()=>{b||Object(Wt.a)("FoldersNew").then(g)},[b]),Object(n.n)(()=>{f(!1),C(!1)},[e.folderId]);const[S,w]=Object(n.p)(()=>{const e=new Set([...s||[],...o||[]]),t=Object(u.f)(y,e),a=Object(u.f)(N,e);return[O?t:t.slice(0,5-k.length),j?a:a.slice(0,5-I.length)]},[N,y,k,I,j,O,s,o]);Object(n.n)(()=>{(S.lengthf(!0):()=>C(!0);return n.a.createElement(n.a.Fragment,null,t.map(t=>function(e,t){const a="included"===t?St.find(({key:t})=>t===e):wt.find(({key:t})=>t===e);if(a)return n.a.createElement(Ee.a,{key:a.key,className:"settings-folders-list-item mb-1",icon:a.icon,narrow:!0,inactive:!0},P(a.title))}(t,e)),a.map(e=>n.a.createElement(Ee.a,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},Object(m.lb)(e)?n.a.createElement(Oe.a,{avatarSize:"small",userId:e}):n.a.createElement(fe.a,{avatarSize:"small",chatId:e}))),!c&&r>0&&n.a.createElement(Xt,{count:r,itemName:"chat",onClick:s}))}return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},b&&n.a.createElement(Yt.a,{id:"settingsFoldersEdit",size:l.tb,animationData:b,play:p&&String(e.folderId),noLoop:!0,onLoad:E})),"create"===e.mode&&n.a.createElement("p",{className:"settings-item-description mb-3",dir:P.isRtl?"rtl":void 0},P("FilterIncludeInfo")),n.a.createElement(pe.a,{className:"mb-0",label:P("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:a}=e;t({type:"setTitle",payload:a.value.trim()})},error:e.error&&e.error===Jt?Jt:void 0})),n.a.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===ea&&n.a.createElement("p",{className:"settings-item-description color-danger mb-2",dir:P.isRtl?"rtl":void 0},e.error),n.a.createElement("h4",{className:"settings-item-header mb-3",dir:P.isRtl?"rtl":void 0},P("FilterInclude")),n.a.createElement(Ee.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:a},P("FilterAddChats")),M("included")),n.a.createElement("div",{className:"settings-item no-border pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:P.isRtl?"rtl":void 0},P("FilterExclude")),n.a.createElement(Ee.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:c},P("FilterAddChats")),M("excluded"))),n.a.createElement(qt,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:a}=e.folder;a?y.length||Object.keys(k).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?i({id:e.folderId,folderUpdate:e.folder}):d({folder:e.folder}),setTimeout(()=>{r()},500)):t({type:"setError",payload:ea}):t({type:"setError",payload:Jt})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),aa=a(46);a(186),a(270);var na=Object(n.h)(({mode:e,chatIds:t,selectedIds:a,selectedChatTypes:c,filterValue:r,onSelectedIdsChange:s,onSelectedChatTypesChange:l,onFilterChange:o,onLoadMore:i})=>{const d=Object(n.q)(null),u="included"===e?St:wt,h=a.length+c.length>10,b=a.length>=100;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{d.current.focus()})},500)},[]);const g=Object(n.m)(e=>{const t=[...a];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),s(t)},[a,s]),p=Object(n.m)(e=>{const t=[...c];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),l(t)},[c,l]),v=Object(n.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]),E=Object(F.a)();const[O,f]=Object(ue.a)(i,t,Boolean(r));return n.a.createElement("div",{className:"Picker SettingsFoldersChatsPicker"},n.a.createElement("div",{className:"picker-header custom-scroll"},c.map((function(e){const t=u.find(({key:t})=>e===t);if(t)return n.a.createElement(at.a,{icon:t.icon,title:E(t.title),isMinimized:h,canClose:!0,onClick:p,clickArg:t.key})})),a.map((e,t)=>n.a.createElement(at.a,{chatOrUserId:e,isMinimized:h&&tp(e.key),ripple:!0},n.a.createElement("i",{className:"icon-"+e.icon}),n.a.createElement("h3",{className:"chat-type",dir:"auto"},E(e.title)),n.a.createElement(aa.a,{label:"",checked:c.includes(e.key),round:!0}))})),n.a.createElement("div",{key:"divider",className:"picker-list-divider"}),n.a.createElement("h4",{key:"header2",className:"settings-item-header",dir:E.isRtl?"rtl":void 0},E("FilterChats"))),O&&O.length?O.map((function(e){const t=a.includes(e);return n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>g(e),ripple:!0,disabled:!t&&b},Object(m.lb)(e)?n.a.createElement(Oe.a,{userId:e}):n.a.createElement(fe.a,{chatId:e,withChatType:!0}),n.a.createElement(aa.a,{label:"",checked:t,round:!0}))})):O&&!O.length?n.a.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):n.a.createElement(be.a,{key:"loading"})))});var ca=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a,orderedPinnedIds:n}}=e;return{chatsById:t,listIds:a.active,orderedPinnedIds:n.active,archivedPinnedIds:n.archived,archivedListIds:a.archived}},(e,t)=>Object(u.l)(t,["loadMoreChats"]))(({mode:e,state:t,dispatch:a,chatsById:c,listIds:r,orderedPinnedIds:s,archivedListIds:l,archivedPinnedIds:o,loadMoreChats:i})=>{const{chatFilter:d}=t,{selectedChatIds:u,selectedChatTypes:h}=Ft(t,e,!0),b=Object(F.a)(),g=Object(n.p)(()=>{const e=r?Object(m.Ab)(c,r,s,"all"):void 0,t=l?Object(m.Ab)(c,l,o,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[c,r,s,l,o]),p=Object(n.p)(()=>{if(g)return g.filter(e=>!d||Object(me.a)(Object(m.l)(b,e),d)||u.includes(e.id)).map(({id:e})=>e)},[g,d,b,u]),v=Object(n.m)(e=>{a({type:"setChatFilter",payload:e})},[a]),E=Object(n.m)(n=>{a("included"===e?{type:"setIncludeFilters",payload:{...t.includeFilters,includedChatIds:n}}:{type:"setExcludeFilters",payload:{...t.excludeFilters,excludedChatIds:n}})},[e,t,a]),O=Object(n.m)(t=>{const n={};t.forEach(e=>{n[e]=!0}),a("included"===e?{type:"setIncludeFilters",payload:{includedChatIds:u,...n}}:{type:"setExcludeFilters",payload:{excludedChatIds:u,...n}})},[e,u,a]);return p?n.a.createElement(na,{mode:e,chatIds:p,selectedIds:u,selectedChatTypes:h,filterValue:d,onSelectedIdsChange:E,onSelectedChatTypesChange:O,onFilterChange:v,onLoadMore:i}):n.a.createElement(be.a,null)}));a(271);var ra=Object(n.h)(({currentScreen:e,state:t,dispatch:a,onScreenSelect:c,onReset:r})=>{const l=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{a({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?r():"create"===t.mode?c(s.m.FoldersCreateFolder):c(s.m.FoldersEditFolder)},[t.mode,a,e,r,c]),o=Object(n.m)(()=>{a({type:"reset"}),c(s.m.FoldersCreateFolder)},[c,a]),i=Object(n.m)(e=>{a({type:"editFolder",payload:e}),c(s.m.FoldersEditFolder)},[a,c]),d=Object(n.m)(()=>{a({type:"editIncludeFilters"}),c(s.m.FoldersIncludedChats)},[a,c]),m=Object(n.m)(()=>{a({type:"editExcludeFilters"}),c(s.m.FoldersExcludedChats)},[a,c]);switch(e){case s.m.Folders:return n.a.createElement(Qt,{onCreateFolder:o,onEditFolder:i});case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:return n.a.createElement(ta,{state:t,dispatch:a,onAddIncludedChats:d,onAddExcludedChats:m,onReset:l});case s.m.FoldersIncludedChats:return n.a.createElement(ca,{mode:"included",state:t,dispatch:a});case s.m.FoldersExcludedChats:return n.a.createElement(ca,{mode:"excluded",state:t,dispatch:a});default:return}}),sa=a(107);a(272);var la=Object(n.h)(({options:e,range:t,label:a,value:c,disabled:r,onChange:s})=>{const l=Object(F.a)(),o=Object(n.m)(e=>{s(Number(e.currentTarget.value))},[s]),i=Object(ce.a)("RangeSlider",r&&"disabled"),d=Object(n.p)(()=>{if(e)return c/(e.length-1)*100;if(t){const e=(t.max-t.min)/(t.step||1);return(c-t.min)/e*100}return 0},[c,e,t]),[m,u,h]=Object(n.p)(()=>e?[0,e.length-1,1]:t?[t.min,t.max,t.step||1]:[0,0,0],[t,e]);return n.a.createElement("div",{className:i},a&&n.a.createElement("div",{className:"slider-top-row",dir:l.isRtl?"rtl":void 0},n.a.createElement("span",{className:"label",dir:"auto"},a),t&&n.a.createElement("span",{className:"value",dir:"auto"},c)),n.a.createElement("div",{className:"slider-main"},n.a.createElement("div",{className:"slider-fill-track",style:`width: ${d}%`}),n.a.createElement("input",{min:m,max:u,value:c,step:h,type:"range",onChange:o}),e&&n.a.createElement("div",{className:"slider-options"},e.map((e,t)=>n.a.createElement("div",{className:Object(ce.a)("slider-option no-selection",t===c&&"active"),onClick:()=>s(t)},e)))))}),oa=a(126),ia=a(114),da=a(49);var ma=Object(n.h)(({size:e=l.zb,stickerSet:t,observeIntersection:a})=>{const c=Object(n.q)(null),s=Object(sa.b)(c,a),o="stickerSet"+t.id,i=Object(v.a)(o,!s,r.ApiMediaFormat.Lottie),{shouldRenderFullMedia:d,transitionClassNames:m}=Object(ia.a)(i,"slow");return n.a.createElement("div",{ref:c,className:"sticker-set-cover"},!d&&Object(da.c)(t.title,2),d&&i&&n.a.createElement(Yt.a,{id:o,size:e,animationData:i,className:m}))});var ua=Object(n.h)(({stickerSet:e,observeIntersection:t})=>{const a=Object(n.q)(null),c=Object(sa.b)(a,t),r=Object(v.a)(e.hasThumbnail&&"stickerSet"+e.id,!c),{shouldRenderFullMedia:s,transitionClassNames:l}=Object(ia.a)(r,"slow");return n.a.createElement("div",{ref:a,className:"sticker-set-cover"},!s&&Object(da.c)(e.title,2),s&&n.a.createElement("img",{src:r,className:l,alt:""}))});a(273);var ha=Object(n.h)(({sticker:e,size:t,observeIntersection:a,noAnimate:c,title:s,className:l,onClick:o,clickArg:i,onUnfaveClick:d})=>{const m=Object(n.q)(null),u="sticker"+e.id,h="sticker-button-"+e.id,b=Object(sa.b)(m,a),g=e.thumbnail?e.thumbnail.dataUri:void 0,p=Object(v.a)(u+"?size=m",!b,r.ApiMediaFormat.BlobUrl),E=b&&!c,O=Object(v.a)(e.isAnimated&&u,!E,r.ApiMediaFormat.Lottie),[f,j,C]=Object(xe.a)(Boolean(O)),y=f&&E,{shouldRenderThumb:k,shouldRenderFullMedia:N,transitionClassNames:I}=Object(ia.a)(p||y,"slow");Object(n.n)(()=>{E||C()},[C,E]);const S=Object(ce.a)("StickerButton",e.isAnimated&&"animated",h,l),w=k&&g?`background-image: url('${g}');`:"";return n.a.createElement("div",{ref:m,className:S,title:s||e&&e.emoji,style:w,"data-sticker-id":e.id,onClick:function(){o&&o(i)}},N&&!y&&n.a.createElement("img",{src:p,className:I}),E&&O&&n.a.createElement(Yt.a,{id:u,animationData:O,play:!0,size:t,isLowPriority:!0,onLoad:j}),d&&n.a.createElement(R.a,{className:"sticker-unfave-button",color:"dark",round:!0,onClick:function(t){t.stopPropagation(),t.preventDefault(),d(e)}},n.a.createElement("i",{className:"icon-close"})))});a(274);var ba=Object(n.h)(({stickerSet:e,observeIntersection:t,onClick:a})=>{const c=Object(F.a)();if(!e||!e.stickers)return;const r=e.stickers&&e.stickers[0];return e.hasThumbnail||!r?n.a.createElement(Ee.a,{narrow:!0,className:"SettingsStickerSet",inactive:!r,onClick:()=>r&&a(r)},n.a.createElement(R.a,{ariaLabel:e.title,color:"translucent",isRtl:c.isRtl},e.isAnimated?n.a.createElement(ma,{size:l.ub,stickerSet:e,observeIntersection:t}):n.a.createElement(ua,{stickerSet:e,observeIntersection:t})),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},c("StickerPack.StickerCount",e.count,"i")))):n.a.createElement(Ee.a,{narrow:!0,className:"SettingsStickerSet",onClick:()=>a(r)},n.a.createElement(ha,{sticker:r,size:l.ub,title:e.title,observeIntersection:t}),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},c("StickerPack.StickerCount",e.count,"i"))))}),ga=a(161);const pa=["Solid and Steady","Nice and Fast","Lots of Stuff"];var va=Object(n.h)(Object(c.h)(e=>({...Object(u.l)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById}),(e,t)=>Object(u.l)(t,["setSettingOption","loadStickerSets","loadAddedStickers"]))(({onScreenSelect:e,stickerSetIds:t,stickerSetsById:a,messageTextSize:c,animationLevel:r,messageSendKeyCombo:l,shouldAutoDownloadMediaFromContacts:i,shouldAutoDownloadMediaInPrivateChats:d,shouldAutoDownloadMediaInGroups:m,shouldAutoDownloadMediaInChannels:u,shouldAutoPlayGifs:h,shouldAutoPlayVideos:b,shouldSuggestStickers:g,shouldLoopStickers:p,setSettingOption:v,loadStickerSets:E,loadAddedStickers:O})=>{const f=Object(n.q)(null),{observe:j}=Object(sa.a)({rootRef:f}),[C,y,k]=Object(xe.a)(),[N,I]=Object(n.r)(),S=Object(F.a)(),w=o.l?void 0:[{value:"enter",label:S("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:S(o.f?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}];Object(n.n)(()=>{E()},[E]),Object(n.n)(()=>{t&&t.length&&O()},[t,O]);const P=Object(n.m)(e=>{pa.forEach((t,a)=>{document.body.classList.toggle("animation-level-"+a,e===a)}),v({animationLevel:e})},[v]),M=Object(n.m)(e=>{document.documentElement.style.setProperty("--message-text-size",e+"px"),v({messageTextSize:e})},[v]),L=Object(n.m)(e=>{I(e),y()},[y]),A=t&&t.map(e=>!!(a&&a[e]&&a[e].installedDate)&&a[e]).filter(Boolean);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("SETTINGS")),n.a.createElement(la,{label:S("TextSize"),range:{min:12,max:20},value:c,onChange:M}),n.a.createElement(Ee.a,{icon:"photo",onClick:()=>e(s.m.GeneralChatBackground)},S("ChatBackground"))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},"Animation Level"),n.a.createElement("p",{className:"settings-item-description",dir:S.isRtl?"rtl":void 0},"Choose the desired animations amount."),n.a.createElement(la,{options:pa,value:r,onChange:P})),w&&n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("Keyboard")),n.a.createElement(oa.a,{name:"keyboard-send-settings",options:w,onChange:e=>v({messageSendKeyCombo:e}),selected:l})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AutoDownloadMedia")),n.a.createElement(aa.a,{label:S("Contacts"),checked:i,onCheck:e=>v({shouldAutoDownloadMediaFromContacts:e})}),n.a.createElement(aa.a,{label:S("AutodownloadPrivateChats"),checked:d,onCheck:e=>v({shouldAutoDownloadMediaInPrivateChats:e})}),n.a.createElement(aa.a,{label:S("AutodownloadGroupChats"),checked:m,onCheck:e=>v({shouldAutoDownloadMediaInGroups:e})}),n.a.createElement(aa.a,{label:S("FilterChannels"),checked:u,onCheck:e=>v({shouldAutoDownloadMediaInChannels:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AutoplayMedia")),n.a.createElement(aa.a,{label:S("GifsTab2"),checked:h,onCheck:e=>v({shouldAutoPlayGifs:e})}),n.a.createElement(aa.a,{label:S("VideosTitle"),checked:b,onCheck:e=>v({shouldAutoPlayVideos:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AccDescrStickers")),n.a.createElement(aa.a,{label:S("SuggestStickers"),checked:g,onCheck:e=>v({shouldSuggestStickers:e})}),n.a.createElement(aa.a,{label:S("LoopAnimatedStickers"),checked:p,onCheck:e=>v({shouldLoopStickers:e})}),n.a.createElement("div",{className:"mt-4",ref:f},A&&A.map(e=>n.a.createElement(ba,{key:e.id,stickerSet:e,observeIntersection:j,onClick:L}))),N&&n.a.createElement(ga.a,{isOpen:C,fromSticker:N,onClose:k})))}));let Ea;function Oa(e="*",t,a=!1){Ea||(Ea=document.createElement("input"),Ea.setAttribute("type","file")),Ea.setAttribute("accept",e),a?Ea.removeAttribute("multiple"):Ea.setAttribute("multiple","multiple"),Ea.onchange=null,Ea.value="",Ea.onchange=t,Ea.click()}var fa=a(13);function ja(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function Ca(e){const t=e[0].toString(16),a=e[1].toString(16),n=e[2].toString(16);return(1==t.length?"0"+t:t)+(1==a.length?"0"+a:a)+(1==n.length?"0"+n:n)}function ya([e,t,a]){e/=255,t/=255,a/=255;let n,c,r=Math.max(e,t,a),s=Math.min(e,t,a),l=r,o=r-s;if(c=0==r?0:o/r,r==s)n=0;else{switch(r){case e:n=(t-a)/o+(t.5?Math.max(0,.65*n):Math.max(0,Math.min(1,1-.65*n)),`hsla(${360*t}, ${100*a}%, ${100*n}%, .4)`}var Ia=a(12),Sa=a(162);a(275);var wa=Object(n.h)(({wallpaper:e,theme:t,isSelected:a,onClick:c})=>{const{slug:r,document:o}=e,i="wallpaper"+o.id,d=o.previewBlobUrl,m=Object(v.a)(i+"?size=m"),u=Object(Sa.a)(o.thumbnail&&o.thumbnail.dataUri,Boolean(m),!0),{shouldRenderThumb:h,shouldRenderFullMedia:b,transitionClassNames:g}=Object(ia.a)(m||d,"slow"),[p,O]=Object(n.r)(!1),{mediaData:j,downloadProgress:C}=Object(E.a)(i,!p),y=!1===Object(f.a)(p),{shouldRender:k,transitionClassNames:N}=Object(K.a)(p&&!j||r===s.n,void 0,y,"slow"),I=Object(n.q)();I.current=t;const S=Object(n.m)(()=>{(async()=>{const e=await Object(fa.e)(j);await Ia.d(l.m,I.current,e),c(r)})()},[j,c,r]);Object(n.n)(()=>{j&&S()},[j,S]);const w=Object(n.m)(()=>{j?S():O(e=>!e)},[j,S]),P=Object(ce.a)("WallpaperTile",a&&"selected");return n.a.createElement("div",{className:P,onClick:w},n.a.createElement("div",{className:"media-inner"},h&&n.a.createElement("canvas",{ref:u,className:"thumbnail"}),b&&n.a.createElement("img",{src:m||d,className:"full-media "+g,alt:""}),k&&n.a.createElement("div",{className:Object(ce.a)("spinner-container",N)},n.a.createElement(H.a,{progress:C,onClick:w}))))});a(276);const Pa=Object(_.g)(e=>e(),6e4,!0);var Ma=Object(n.h)(Object(c.h)(e=>{const{theme:t}=e.settings.byKey,{background:a,isBlurred:n}=e.settings.themes[t]||{},{loadedWallpapers:c}=e.settings;return{background:a,isBlurred:n,loadedWallpapers:c,theme:t}},(e,t)=>Object(u.l)(t,["loadWallpapers","uploadWallpaper","setThemeSettings"]))(({onScreenSelect:e,background:t,isBlurred:a,loadedWallpapers:c,theme:r,loadWallpapers:o,uploadWallpaper:i,setThemeSettings:d})=>{const m=Object(n.q)();m.current=r,Object(n.n)(()=>{Pa(()=>{o()})},[o]);const u=Object(n.m)(e=>{const{files:t}=e.target;t&&t.length>0&&i(t[0])},[i]),h=Object(n.m)(()=>{Oa("image/jpeg",u,!0)},[u]),b=Object(n.m)(()=>{e(s.m.GeneralChatBackgroundColor)},[e]),g=Object(n.m)(()=>{d({theme:r,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===r?l.o:l.t})},[d,r]),p=Object(n.m)(e=>{d({theme:m.current,background:e});const t=c&&c.find(t=>t.slug===e);t&&t.document.thumbnail&&async function(e){const t=[0,0,0];let a,n,c,r,s=-4,l=[0,0,0],o=0;const i=document.createElement("canvas"),d=i.getContext&&i.getContext("2d");if(!d)return t;const m=await Object(fa.g)(e);c=m.naturalHeight||m.offsetHeight||m.height,n=m.naturalWidth||m.offsetWidth||m.width,i.height=c,i.width=n,d.drawImage(m,0,0);try{a=d.getImageData(0,0,n,c)}catch(e){return t}for(r=a.data.length;(s+=20){const t=Na(e),a="#"+Ca(e);d({theme:m.current,backgroundColor:a,patternColor:t})})},[c,d]),v=Object(n.m)(e=>{d({theme:m.current,isBlurred:e.target.checked})},[d]),E=Object(F.a)(),O=c&&c[0]&&c[0].slug===s.n;return n.a.createElement("div",{className:"SettingsGeneralBackground settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Ee.a,{icon:"camera-add",className:"mb-0",disabled:O,onClick:h},E("UploadImage")),n.a.createElement(Ee.a,{icon:"colorize",className:"mb-0",onClick:b},E("SetColor")),n.a.createElement(Ee.a,{icon:"favorite",onClick:g},E("ThemeResetToDefaults")),n.a.createElement(aa.a,{label:E("BackgroundBlurred"),checked:Boolean(a),onChange:v})),c?n.a.createElement("div",{className:"settings-wallpapers"},c.map(e=>n.a.createElement(wa,{wallpaper:e,theme:r,isSelected:t===e.slug,onClick:p}))):n.a.createElement(be.a,null))}));a(277);const Fa=ya(ja("e6ebee")),La=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function Aa(e,t){return{colorPosition:[Math.round(e[1]*(t.colorRect.width-1)),Math.round((1-e[2])*(t.colorRect.height-1))],huePosition:Math.round(e[0]*(t.hueRect.width-1))}}function Ta({colorPosition:e,huePosition:t},a){return[t/(a.hueRect.width-1),e[0]/(a.colorRect.width-1),1-e[1]/(a.colorRect.height-1)]}var Ra=Object(n.h)(Object(c.h)(e=>{const{theme:t}=e.settings.byKey,{backgroundColor:a}=e.settings.themes[t]||{};return{backgroundColor:a,theme:t}},(e,t)=>Object(u.l)(t,["setThemeSettings"]))(({theme:e,backgroundColor:t,setThemeSettings:a})=>{const c=Object(n.q)();c.current=e;const r=Object(n.q)(null),s=Object(n.q)(null),l=Object(n.q)(null),o=Object(n.q)(!0),[i,d]=Object(n.r)(function(e){return e&&e.startsWith("#")?ya(ja(e.replace("#",""))):Fa}(t)),m=Object(n.q)(i);Object(n.n)(()=>{m.current=i},[i]);const[b,g,p]=Object(xe.a)(),[v,E]=Object(n.r)(""),[O,f]=Object(n.r)(""),j=Object(n.q)(),C=Object(n.q)();Object(n.n)(()=>{const e={offsetLeft:s.current.offsetLeft,...Object(u.l)(s.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:l.current.offsetLeft,...Object(u.l)(l.current.getBoundingClientRect(),["width"])};function a(t){const a=[Math.min(Math.max(0,t.pageX-e.offsetLeft),e.width-1),Math.min(Math.max(0,t.pageY-e.top+r.current.scrollTop),e.height-1)],{huePosition:n}=Aa(m.current,j.current);d(Ta({colorPosition:a,huePosition:n},j.current)),g()}function n(e){const{colorPosition:a}=Aa(m.current,j.current),n=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);d(Ta({colorPosition:a,huePosition:n},j.current)),g()}j.current={colorRect:e,hueRect:t},Object(h.b)(s.current,{onCapture:a,onDrag:a,onRelease:p,onClick:p,withCursor:!0}),Object(h.b)(l.current,{onCapture:n,onDrag:n,onRelease:p,onClick:p,withCursor:!0})},[g,p]);const{colorPosition:y=[0,0],huePosition:k=0}=j.current?Aa(i,j.current):{},N=Ca(ka(i)),I=i[0],S=Ca(ka([I,1,1]));Object(n.n)(()=>{const e=ka(i),t="#"+Ca(e);if(E(e.join(", ")),f(t),!o.current){const n=Na(e);a({theme:c.current,background:void 0,backgroundColor:t,patternColor:n})}o.current=!1},[i,a]),Object(n.n)(()=>{!function(e,t,a,n){let c,r,s;a.current&&n.current?(c=n.current.colorRect.width,r=n.current.colorRect.height,s=a.current):(c=e.offsetWidth,r=e.offsetHeight,s=e.getContext("2d"),e.width=c,e.height=r,a.current=s);const l=s.createImageData(c,r),o=l.data,i=ka([t,1,1]);let d=0;for(let e=0;e{!function(e){const t=e.offsetWidth;e.width=t,e.height=1;const a=e.getContext("2d"),n=a.createImageData(t,1),c=n.data;let r=0;for(let e=0;e{const t=e.currentTarget.value.replace(/[^\d, ]/g,"").slice(0,13);if(t.match(/^\d{1,3},\s?\d{1,3},\s?\d{1,3}$/)){const e=t.split(",").map(e=>Number(e.trim()));d(ya(e))}e.currentTarget.value=t},[]),P=Object(n.m)(e=>{const t=e.currentTarget.value.replace(/[^0-9a-fA-F]/g,"").slice(0,6);t.match(/^#?[0-9a-fA-F]{6}$/)&&d(ya(ja(t.replace("#","")))),e.currentTarget.value=t},[]),M=Object(n.m)(e=>{d(ya(ja(e.currentTarget.dataset.color.replace("#",""))))},[]),F=Object(ce.a)("SettingsGeneralBackgroundColor settings-content custom-scroll",b&&"is-dragging");return n.a.createElement("div",{ref:r,className:F},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("div",{ref:s,className:"color-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translate(${y[0]}px, ${y[1]}px); background-color: #${N};`})),n.a.createElement("div",{ref:l,className:"hue-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translateX(${k}px); background-color: #${S};`})),n.a.createElement("div",{className:"tools"},n.a.createElement(pe.a,{value:O,label:"HEX",onChange:P}),n.a.createElement(pe.a,{value:v,label:"RGB",onChange:w}))),n.a.createElement("div",{className:"predefined-colors"},La.map(e=>n.a.createElement("div",{className:e==="#"+N?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:M}))))}));var Da=Object(n.h)(Object(c.h)(e=>({hasPrivateChatsNotifications:Boolean(e.settings.byKey.hasPrivateChatsNotifications),hasPrivateChatsMessagePreview:Boolean(e.settings.byKey.hasPrivateChatsMessagePreview),hasGroupNotifications:Boolean(e.settings.byKey.hasGroupNotifications),hasGroupMessagePreview:Boolean(e.settings.byKey.hasGroupMessagePreview),hasBroadcastNotifications:Boolean(e.settings.byKey.hasBroadcastNotifications),hasBroadcastMessagePreview:Boolean(e.settings.byKey.hasBroadcastMessagePreview),hasContactJoinedNotifications:Boolean(e.settings.byKey.hasContactJoinedNotifications)}),(e,t)=>Object(u.l)(t,["loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings"]))(({hasPrivateChatsNotifications:e,hasPrivateChatsMessagePreview:t,hasGroupNotifications:a,hasGroupMessagePreview:c,hasBroadcastNotifications:r,hasBroadcastMessagePreview:s,hasContactJoinedNotifications:l,loadNotificationSettings:o,updateContactSignUpNotification:i,updateNotificationSettings:d})=>{Object(n.n)(()=>{o()},[o]);const m=Object(n.m)((n,l,o)=>{const i="contact"===l?!e:!("group"===l?a:r),m="contact"===l?t:"group"===l?c:s;d({peerType:l,..."silent"===o&&{isSilent:!n.target.checked,shouldShowPreviews:m},..."showPreviews"===o&&{shouldShowPreviews:n.target.checked,isSilent:i}})},[s,r,c,a,t,e,d]),u=Object(n.m)(e=>{i({isSilent:!e.target.checked})},[i]),h=Object(F.a)();return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("AutodownloadPrivateChats")),n.a.createElement(aa.a,{label:h("NotificationsForPrivateChats"),subLabel:h(e?"NotificationsEnabled":"NotificationsDisabled"),checked:e,onChange:e=>{m(e,"contact","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(t?"PreviewEnabled":"PreviewDisabled"),checked:t,onChange:e=>{m(e,"contact","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("FilterGroups")),n.a.createElement(aa.a,{label:h("NotificationsForGroups"),subLabel:h(a?"NotificationsEnabled":"NotificationsDisabled"),checked:a,onChange:e=>{m(e,"group","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(c?"PreviewEnabled":"PreviewDisabled"),checked:c,onChange:e=>{m(e,"group","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("FilterChannels")),n.a.createElement(aa.a,{label:h("NotificationsForChannels"),subLabel:h(r?"NotificationsEnabled":"NotificationsDisabled"),checked:r,onChange:e=>{m(e,"broadcast","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(s?"PreviewEnabled":"PreviewDisabled"),checked:s,onChange:e=>{m(e,"broadcast","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("PhoneOther")),n.a.createElement(aa.a,{label:h("ContactJoined"),checked:l,onChange:u})))}));var Ba=Object(n.h)(Object(c.h)(e=>{const{settings:{byKey:{hasPassword:t},privacy:a},blocked:n,activeSessions:c}=e;return{hasPassword:t,blockedCount:n.totalCount,sessionsCount:c.length,visibilityPrivacyPhoneNumber:a.phoneNumber&&a.phoneNumber.visibility,visibilityPrivacyLastSeen:a.lastSeen&&a.lastSeen.visibility,visibilityPrivacyProfilePhoto:a.profilePhoto&&a.profilePhoto.visibility,visibilityPrivacyForwarding:a.forwards&&a.forwards.visibility,visibilityPrivacyGroupChats:a.chatInvite&&a.chatInvite.visibility}},(e,t)=>Object(u.l)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings"]))(({onScreenSelect:e,hasPassword:t,blockedCount:a,sessionsCount:c,visibilityPrivacyPhoneNumber:r,visibilityPrivacyLastSeen:l,visibilityPrivacyProfilePhoto:o,visibilityPrivacyForwarding:i,visibilityPrivacyGroupChats:d,loadPrivacySettings:m,loadBlockedContacts:u,loadAuthorizations:h})=>{Object(n.n)(()=>{u(),h(),m()},[u,h,m]);const b=Object(F.a)();function g(e){switch(e){case"everybody":return b("P2PEverybody");case"contacts":return b("P2PContacts");case"nobody":return b("P2PNobody")}}return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Ee.a,{icon:"delete-user",narrow:!0,onClick:()=>e(s.m.PrivacyBlockedUsers)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("BlockedUsers")),a>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},b("Users",a)))),n.a.createElement(Ee.a,{icon:"lock",narrow:!0,onClick:()=>e(t?s.m.TwoFaEnabled:s.m.TwoFaDisabled)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("TwoStepVerification")),n.a.createElement("span",{className:"subtitle",dir:"auto"},b(t?"PasswordOn":"PasswordOff")))),n.a.createElement(Ee.a,{icon:"active-sessions",narrow:!0,onClick:()=>e(s.m.PrivacyActiveSessions)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("SessionsTitle")),c>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},1===c?"1 session":c+" sessions")))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:b.isRtl?"rtl":void 0},b("PrivacyTitle")),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyPhoneNumber)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyPhoneTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(r)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyLastSeen)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("LastSeenTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(l)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyProfilePhoto)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyProfilePhotoTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(o)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyForwarding)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyForwardsTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(i)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyGroupChats)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("WhoCanAddMe")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(d))))))})),xa=a(14);var Ua=Object(n.h)(Object(c.h)(e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language}),(e,t)=>Object(u.l)(t,["loadLanguages","setSettingOption"]))(({languages:e,language:t,loadLanguages:a,setSettingOption:c})=>{const[r,s]=Object(n.r)(t),[l,o,i]=Object(xe.a)();Object(n.n)(()=>{a()},[a]);const d=Object(n.m)(e=>{s(e),o(),Object(xa.c)(e,()=>{i(),c({language:e})})},[o,i,c]),m=Object(n.p)(()=>e?function(e){const t=(window.navigator.language||"en").toLowerCase(),a=t.substr(0,2);return e.map(({langCode:e,nativeName:t,name:a})=>({value:e,label:t,subLabel:a})).sort(e=>!t||e.value!==t&&e.value!==a?0:-1)}(e):void 0,[e]);return n.a.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},m?n.a.createElement(oa.a,{name:"keyboard-send-settings",options:m,selected:r,loadingOption:l?r:void 0,onChange:d}):n.a.createElement(be.a,null))}));function Ga(e){switch(e){case s.m.PrivacyPhoneNumber:case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return"phoneNumber";case s.m.PrivacyLastSeen:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return"lastSeen";case s.m.PrivacyProfilePhoto:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return"profilePhoto";case s.m.PrivacyForwarding:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return"forwards";case s.m.PrivacyGroupChats:case s.m.PrivacyGroupChatsAllowedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return"chatInvite"}}var qa=Object(n.h)(Object(c.h)((e,{screen:t})=>{let a;const{chats:{byId:n},settings:{privacy:c}}=e;switch(t){case s.m.PrivacyPhoneNumber:a=c.phoneNumber;break;case s.m.PrivacyLastSeen:a=c.lastSeen;break;case s.m.PrivacyProfilePhoto:a=c.profilePhoto;break;case s.m.PrivacyForwarding:a=c.forwards;break;case s.m.PrivacyGroupChats:a=c.chatInvite}return a?{...a,chatsById:n}:{}},(e,t)=>Object(u.l)(t,["setPrivacyVisibility"]))(({screen:e,onScreenSelect:t,visibility:a,allowUserIds:c,allowChatIds:r,blockUserIds:l,blockChatIds:o,chatsById:i,setPrivacyVisibility:d})=>{const m=Object(F.a)(),u=Object(n.p)(()=>{switch(e){case s.m.PrivacyProfilePhoto:case s.m.PrivacyGroupChats:return[{value:"everybody",label:m("P2PEverybody")},{value:"contacts",label:m("P2PContacts")}];default:return[{value:"everybody",label:m("P2PEverybody")},{value:"contacts",label:m("P2PContacts")},{value:"nobody",label:m("P2PNobody")}]}},[m,e]),h={shouldShowDenied:"nobody"!==a,shouldShowAllowed:"everybody"!==a},b=Ga(e),g=Object(n.p)(()=>{switch(e){case s.m.PrivacyPhoneNumber:return m("PrivacyPhoneTitle");case s.m.PrivacyLastSeen:return m("LastSeenTitle");case s.m.PrivacyProfilePhoto:return m("PrivacyProfilePhotoTitle");case s.m.PrivacyForwarding:return m("PrivacyForwardsTitle");case s.m.PrivacyGroupChats:return m("WhoCanAddMe");default:return}},[m,e]),p=Object(n.p)(()=>{switch(e){case s.m.PrivacyLastSeen:return m("CustomHelp");default:return}},[m,e]),v=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberAllowedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenAllowedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoAllowedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingAllowedContacts;default:return s.m.PrivacyGroupChatsAllowedContacts}})(),E=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberDeniedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenDeniedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoDeniedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingDeniedContacts;default:return s.m.PrivacyGroupChatsDeniedContacts}})(),O=Object(n.p)(()=>c&&r&&i?r.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),c.length):0,[r,c,i]),f=Object(n.p)(()=>l&&o&&i?o.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),l.length):0,[o,l,i]),j=Object(n.m)(e=>{d({privacyKey:b,visibility:e})},[b,d]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:m.isRtl?"rtl":void 0},g),n.a.createElement(oa.a,{name:"visibility-"+b,options:u,onChange:j,selected:a}),p&&n.a.createElement("p",{className:"settings-item-description-larger",dir:m.isRtl?"rtl":void 0},p)),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:m.isRtl?"rtl":void 0},m("PrivacyExceptions")),h.shouldShowAllowed&&n.a.createElement(Ee.a,{narrow:!0,icon:"add-user",onClick:()=>{t(v)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},O>0&&n.a.createElement("span",{className:"date",dir:"auto"},"+",O),n.a.createElement("span",{className:"title"},m("AlwaysShareWith")),n.a.createElement("span",{className:"subtitle"},m("EditAdminAddUsers")))),h.shouldShowDenied&&n.a.createElement(Ee.a,{narrow:!0,icon:"delete-user",onClick:()=>{t(E)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},f>0&&n.a.createElement("span",{className:"date",dir:"auto"},"−",f),n.a.createElement("span",{className:"title"},m("NeverShareWith")),n.a.createElement("span",{className:"subtitle"},m("EditAdminAddUsers"))))))}));function za(e){return[e.region,e.country].filter(Boolean).join(", ")}function Ha(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}var $a=Object(n.h)(Object(c.h)(e=>({activeSessions:e.activeSessions}),(e,t)=>Object(u.l)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"]))(({activeSessions:e,loadAuthorizations:t,terminateAuthorization:a,terminateAllAuthorizations:c})=>{const[r,s,l]=Object(xe.a)();Object(n.n)(()=>{t()},[t]);const o=Object(n.m)(e=>{a({hash:e})},[a]),i=Object(n.m)(()=>{l(),c()},[l,c]),d=Object(n.p)(()=>e.find(e=>e.isCurrent),[e]),m=Object(n.p)(()=>e.filter(e=>!e.isCurrent),[e]),u=Object(F.a)();function h(e){return n.a.createElement(Ee.a,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{o(e.hash)}}]},n.a.createElement("div",{className:"multiline-menu-item full-size",dir:"auto"},n.a.createElement("span",{className:"date"},Object(D.g)(u,1e3*e.dateActive)),n.a.createElement("span",{className:"title"},e.appName),n.a.createElement("span",{className:"subtitle black tight"},Ha(e)),n.a.createElement("span",{className:"subtitle"},e.ip," - ",za(e))))}return n.a.createElement("div",{className:"settings-content custom-scroll"},d&&(g=d,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:u.isRtl?"rtl":void 0},u("AuthSessions.CurrentSession")),n.a.createElement(Ee.a,{narrow:!0,inactive:!0},n.a.createElement("div",{className:"multiline-menu-item",dir:"auto"},n.a.createElement("span",{className:"title",dir:"auto"},g.appName),n.a.createElement("span",{className:"subtitle black tight"},Ha(g)),n.a.createElement("span",{className:"subtitle"},g.ip," - ",za(g)))),n.a.createElement(Ee.a,{className:"destructive mb-0",icon:"stop",ripple:!0,narrow:!0,onClick:s},u("TerminateAllSessions")))),m&&(b=m,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:u.isRtl?"rtl":void 0},"Other Sessions"),b.map(h))),m&&n.a.createElement(we.a,{isOpen:r,onClose:l,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:i,confirmIsDestructive:!0}),";");var b,g}));var _a=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a},blocked:{ids:n}}=e;return{chatsByIds:t,usersByIds:a,blockedIds:n}},(e,t)=>Object(u.l)(t,["unblockContact"]))(({chatsByIds:e,usersByIds:t,blockedIds:a,unblockContact:c})=>{const r=Object(n.m)(e=>{c({contactId:e})},[c]),s=Object(F.a)();return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content infinite-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("p",{className:"settings-item-description-larger mt-0 mb-2",dir:s.isRtl?"rtl":void 0},s("BlockedUsersInfo"))),n.a.createElement("div",{className:"chat-list custom-scroll"},a&&a.length?n.a.createElement("div",{className:"scroll-container"},a.map((a,c)=>function(a,c,o){const i=Object(m.lb)(a),d=i?t[a]:void 0,u=i?void 0:e[a],h=Object(ce.a)("Chat chat-item-clickable blocked-list-item",i?"private":"group");return n.a.createElement(Ee.a,{key:a,className:h,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{r(a)}}],style:`top: ${(o+c)*l.i}px;`},n.a.createElement(x.a,{size:"medium",user:d,chat:u}),n.a.createElement("div",{className:"contact-info",dir:"auto"},n.a.createElement("h3",{dir:"auto"},Object(B.a)((i?Object(m.Z)(d):Object(m.l)(s,u))||"")),d&&d.phoneNumber&&n.a.createElement("div",{className:"contact-phone",dir:"auto"},Object(xt.c)(d.phoneNumber)),d&&!d.phoneNumber&&d.username&&n.a.createElement("div",{className:"contact-username",dir:"auto"},"@",d.username)))}(a,c,0))):a&&!a.length?n.a.createElement("div",{className:"no-results",dir:"auto"},"List is empty"):n.a.createElement(be.a,{key:"loading"}))),n.a.createElement(qt,{isShown:!0,onClick:()=>{},className:"not-implemented",ariaLabel:"Add a blocked user"},n.a.createElement("i",{className:"icon-add"})))})),Va=a(128);var Ka=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🔐")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Va.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},Object(B.a)(a("EnabledPasswordText"),["br"]))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ee.a,{icon:"edit",onClick:()=>t(s.m.TwoFaChangePasswordCurrent)},a("ChangePassword")),n.a.createElement(Ee.a,{icon:"password-off",onClick:()=>t(s.m.TwoFaTurnOff)},a("TurnPasswordOff")),n.a.createElement(Ee.a,{icon:"email",onClick:()=>t(s.m.TwoFaRecoveryEmailCurrentPassword)},a("SetRecoveryEmail"))))})),Wa=a(148),Ya=a(149);var Za=Object(n.h)(({error:e,isLoading:t,expectedPassword:a,placeholder:c="Current Password",hint:r,submitLabel:s,clearError:l,onSubmit:o})=>{const[i,d]=Object(n.r)(""),[m,u]=Object(n.r)(!1),h=Object(n.m)(e=>{a&&e!==a?d("Passwords Should Be Equal"):o(e)},[o,a]),b=Object(n.m)(()=>{l&&l(),d("")},[l]),g=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Wa.a,{isBig:!0,isPasswordVisible:m})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ya.a,{error:i||e,hint:r,placeholder:c,submitLabel:s||g("Next"),clearError:b,isLoading:t,isPasswordVisible:m,onChangePasswordVisibility:u,onSubmit:h})))});var Qa=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🔐")}))(({animatedEmoji:e,onStart:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Va.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},a("SetAdditionalPasswordInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(R.a,{onClick:t},a("EditAdminTransferSetPassword"))))}));const Xa=o.g?550:400;var Ja=Object(n.h)(Object(c.h)((e,{icon:t})=>({animatedEmoji:Object(d.c)(e,"email"===t?"💌":"💡")}))(({animatedEmoji:e,type:t="text",isLoading:a,error:c,placeholder:r,shouldConfirm:s,clearError:l,onSubmit:i})=>{const d=Object(n.q)(null),[m,u]=Object(n.r)(""),[h,b,g]=Object(xe.a)(!1);Object(n.n)(()=>{o.l||setTimeout(()=>{d.current.focus()},Xa)},[]);const p=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Va.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement("form",{action:"",onSubmit:e=>{e.preventDefault(),d.current&&i(m)}},n.a.createElement(pe.a,{ref:d,value:m,inputMode:t,label:r,error:c,onChange:e=>{c&&l&&l(),u(e.target.value)}}),m?n.a.createElement(R.a,{type:"submit",isLoading:a,ripple:!0},p("Continue")):n.a.createElement(R.a,{isText:!0,isLoading:a,ripple:!0,onClick:s?b:()=>{i()}},p("YourEmailSkip"))),s&&n.a.createElement(ge.a,{className:"narrow",isOpen:h,title:p("YourEmailSkipWarning"),onClose:g},Object(B.a)(p("YourEmailSkipWarningText"),["br","simple_markdown"]),n.a.createElement("div",{className:"dialog-buttons"},n.a.createElement(R.a,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{g(),i()}},p("YourEmailSkip")),n.a.createElement(R.a,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:g},p("Cancel"))))))}));var en=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🥳")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Va.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},a("TwoStepVerificationPasswordSetInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(R.a,{onClick:()=>{t(s.m.Privacy)}},a("TwoStepVerificationPasswordReturnSettings"))))}));const tn=o.g?550:400;var an=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength}))(({animatedEmoji:e,codeLength:t,isLoading:a,error:c,clearError:r,onSubmit:s})=>{const l=Object(n.q)(null),[i,d]=Object(n.r)("");Object(n.n)(()=>{o.l||setTimeout(()=>{l.current.focus()},tn)},[]);const m=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Va.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(pe.a,{value:i,ref:l,inputMode:"decimal",label:m("YourEmailCode"),error:c,onChange:e=>{c&&r&&r();const a=e.target.value.slice(0,t);a.length===t&&s(a),d(a),e.target.value=a}}),a&&n.a.createElement(be.a,null)))}));var nn=Object(n.h)(Object(c.h)(e=>({...e.twoFaSettings}),(e,t)=>Object(u.l)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"]))(({currentScreen:e,state:t,hint:a,isLoading:c,error:r,waitingEmailCodeLength:l,dispatch:o,onScreenSelect:i,updatePassword:d,checkPassword:m,clearTwoFaError:u,updateRecoveryEmail:h,provideTwoFaEmailCode:b,clearPassword:g})=>{Object(n.n)(()=>{l&&(e===s.m.TwoFaNewPasswordEmail?i(s.m.TwoFaNewPasswordEmailCode):e===s.m.TwoFaRecoveryEmail&&i(s.m.TwoFaRecoveryEmailCode))},[e,i,l]);const p=Object(n.m)(()=>{o({type:"reset"}),i(s.m.TwoFaNewPassword)},[o,i]),v=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaNewPasswordConfirm)},[o,i]),E=Object(n.m)(()=>{i(s.m.TwoFaNewPasswordHint)},[i]),O=Object(n.m)(e=>{o({type:"setHint",payload:e}),i(s.m.TwoFaNewPasswordEmail)},[o,i]),f=Object(n.m)(e=>{o({type:"setEmail",payload:e}),d({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,d]),j=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),m({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaChangePasswordNew)}})},[m,o,i]),C=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaChangePasswordConfirm)},[o,i]),y=Object(n.m)(()=>{i(s.m.TwoFaChangePasswordHint)},[i]),k=Object(n.m)(e=>{o({type:"setHint",payload:e}),d({...t,hint:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,d]),N=Object(n.m)(e=>{g({currentPassword:e,onSuccess:()=>{i(s.m.Privacy)}})},[g,i]),I=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),m({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaRecoveryEmail)}})},[m,o,i]),S=Object(n.m)(e=>{o({type:"setEmail",payload:e}),h({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,h]),w=Object(n.m)(e=>{b({code:e})},[b]),P=Object(F.a)();switch(e){case s.m.TwoFaDisabled:return n.a.createElement(Qa,{onStart:p});case s.m.TwoFaNewPassword:return n.a.createElement(Za,{placeholder:P("EnterPassword"),submitLabel:P("Continue"),onSubmit:v});case s.m.TwoFaNewPasswordConfirm:return n.a.createElement(Za,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),submitLabel:P("Continue"),onSubmit:E});case s.m.TwoFaNewPasswordHint:return n.a.createElement(Ja,{icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:O});case s.m.TwoFaNewPasswordEmail:return n.a.createElement(Ja,{icon:"email",type:"email",isLoading:c,error:r,clearError:u,placeholder:P("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:f});case s.m.TwoFaNewPasswordEmailCode:return n.a.createElement(an,{isLoading:c,error:r,clearError:u,onSubmit:w});case s.m.TwoFaCongratulations:return n.a.createElement(en,{onScreenSelect:i});case s.m.TwoFaEnabled:return n.a.createElement(Ka,{onScreenSelect:i});case s.m.TwoFaChangePasswordCurrent:return n.a.createElement(Za,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:j});case s.m.TwoFaChangePasswordNew:return n.a.createElement(Za,{placeholder:P("PleaseEnterNewFirstPassword"),onSubmit:C});case s.m.TwoFaChangePasswordConfirm:return n.a.createElement(Za,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),onSubmit:y});case s.m.TwoFaChangePasswordHint:return n.a.createElement(Ja,{isLoading:c,error:r,clearError:u,icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:k});case s.m.TwoFaTurnOff:return n.a.createElement(Za,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:N});case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement(Za,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:I});case s.m.TwoFaRecoveryEmail:return n.a.createElement(Ja,{icon:"email",type:"email",placeholder:P("RecoveryEmailTitle"),onSubmit:S});case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(an,{isLoading:c,error:r,clearError:u,onSubmit:w});default:return}}));var cn=Object(n.h)(({itemIds:e,selectedIds:t,filterValue:a,filterPlaceholder:c,notFoundText:r,searchInputId:s,isLoading:l,onSelectedIdsChange:o,onFilterChange:i,onLoadMore:d})=>{const u=Object(n.q)(null),h=t.length>10;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{u.current.focus()})},500)},[]);const b=Object(n.m)(e=>{const a=[...t];a.includes(e)?a.splice(a.indexOf(e),1):a.push(e),o(a),i("")},[t,o,i]),g=Object(n.m)(e=>{const{value:t}=e.currentTarget;i(t)},[i]),[p,v]=Object(ue.a)(d,e,Boolean(a)),E=Object(F.a)();return n.a.createElement("div",{className:"Picker"},n.a.createElement("div",{className:"picker-header custom-scroll",dir:E.isRtl?"rtl":void 0},t.map((e,a)=>n.a.createElement(at.a,{chatOrUserId:e,isMinimized:h&&an.a.createElement(Ee.a,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>b(e),ripple:!0},n.a.createElement(aa.a,{label:"",checked:t.includes(e)}),Object(m.lb)(e)?n.a.createElement(Oe.a,{userId:e}):n.a.createElement(fe.a,{chatId:e})))):l||!p||p.length?n.a.createElement(be.a,null):n.a.createElement("p",{className:"no-results"},r||"Sorry, nothing found."))});function rn(e,t){const{privacy:a}=e.settings;switch(t){case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return a.phoneNumber;case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return a.lastSeen;case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return a.profilePhoto;case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return a.forwards;case s.m.PrivacyGroupChatsDeniedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return a.chatInvite}}var sn=Object(n.h)(Object(c.h)((e,{screen:t})=>{const{chats:{byId:a,listIds:n,orderedPinnedIds:c},currentUserId:r}=e;return{currentUserId:r,chatsById:a,listIds:n.active,orderedPinnedIds:c.active,archivedPinnedIds:c.archived,archivedListIds:n.archived,settings:rn(e,t)}},(e,t)=>Object(u.l)(t,["setPrivacySettings"]))(({currentUserId:e,isAllowList:t,screen:a,settings:c,chatsById:r,listIds:l,orderedPinnedIds:o,archivedListIds:i,archivedPinnedIds:d,setPrivacySettings:u,onScreenSelect:h})=>{const b=Object(F.a)(),g=Object(n.p)(()=>c?t?[...c.allowUserIds,...c.allowChatIds]:[...c.blockUserIds,...c.blockChatIds]:[],[t,c]),[p,v]=Object(n.r)(""),[E,O]=Object(n.r)(!1),[f,j]=Object(n.r)(g),C=Object(n.p)(()=>{const e=l?Object(m.Ab)(r,l,o,"all"):void 0,t=i?Object(m.Ab)(r,i,d,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[r,l,o,i,d]),y=Object(n.p)(()=>{if(C)return C.filter(t=>(Object(m.lb)(t.id)&&t.id!==e||Object(m.kb)(t))&&(!p||Object(me.a)(Object(m.l)(b,t),p)||g.includes(t.id))).map(({id:e})=>e)},[C,e,b,p,g]),k=Object(n.m)(e=>{j(e),O(!0)},[]),N=Object(n.m)(()=>{u({privacyKey:Ga(a),isAllowList:Boolean(t),contactsIds:f}),h(s.m.Privacy)},[t,f,h,a,u]);return n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(cn,{itemIds:y||[],selectedIds:f,filterValue:p,filterPlaceholder:b(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:k,onFilterChange:v}),n.a.createElement(qt,{isShown:E,onClick:N,ariaLabel:b(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},n.a.createElement("i",{className:"icon-arrow-right"})))}));a(278);const ln=Object.keys(s.m).length/2;var on=Object(n.h)(({currentScreen:e,onScreenSelect:t,onReset:a})=>{const[c,r]=It(Tt,At),[l,i]=It(Dt,Rt),d=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{r({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?a():"create"===c.mode?t(s.m.FoldersCreateFolder):t(s.m.FoldersEditFolder)},[c.mode,r,e,a,t]),m=Object(n.m)(()=>{r({type:"saveFilters"}),d()},[r,d]);function u(){return n.a.createElement(n.a.Fragment,null,n.a.createElement(Bt,{currentScreen:e,onReset:d,onSaveFilter:m,editedFolderId:c.folderId}),function(){switch(e){case s.m.Main:return n.a.createElement(Ut,{onScreenSelect:t});case s.m.EditProfile:return n.a.createElement(Kt,null);case s.m.General:return n.a.createElement(va,{onScreenSelect:t});case s.m.Notifications:return n.a.createElement(Da,null);case s.m.Privacy:return n.a.createElement(Ba,{onScreenSelect:t});case s.m.Language:return n.a.createElement(Ua,null);case s.m.GeneralChatBackground:return n.a.createElement(Ma,{onScreenSelect:t});case s.m.GeneralChatBackgroundColor:return n.a.createElement(Ra,{onScreenSelect:t});case s.m.PrivacyActiveSessions:return n.a.createElement($a,null);case s.m.PrivacyBlockedUsers:return n.a.createElement(_a,null);case s.m.PrivacyPhoneNumber:case s.m.PrivacyLastSeen:case s.m.PrivacyProfilePhoto:case s.m.PrivacyForwarding:case s.m.PrivacyGroupChats:return n.a.createElement(qa,{screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement(sn,{isAllowList:!0,screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement(sn,{screen:e,onScreenSelect:t});case s.m.Folders:case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement(ra,{currentScreen:e,state:c,dispatch:r,onScreenSelect:t,onReset:d});case s.m.TwoFaDisabled:case s.m.TwoFaNewPassword:case s.m.TwoFaNewPasswordConfirm:case s.m.TwoFaNewPasswordHint:case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaCongratulations:case s.m.TwoFaEnabled:case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:case s.m.TwoFaChangePasswordHint:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:case s.m.TwoFaRecoveryEmail:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(nn,{currentScreen:e,state:l,dispatch:i,onScreenSelect:t});default:return}}())}return n.a.createElement(T.a,{id:"Settings",name:o.g?"slide-layers":"push-slide",activeKey:e,renderCount:ln},u)});const dn=Object(_.g)(e=>e(),6e4,!0);var mn=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users;return{usersById:a,contactIds:t}},(e,t)=>Object(u.l)(t,["loadContactList","openChat"]))(({filter:e,usersById:t,contactIds:a,loadContactList:c,openChat:r})=>{Object(n.n)(()=>{dn(()=>{c()})});const s=Object(n.m)(e=>{r({id:e})},[r]),l=Object(n.p)(()=>{if(!a)return;const n=e?a.filter(a=>{const n=t[a];if(!n)return!1;const c=Object(m.Z)(n);return c&&Object(me.a)(c,e)}):a;return Object(m.Eb)(n,t)},[e,t,a]),[i,d]=Object(ue.a)(void 0,l,Boolean(e));return n.a.createElement(ve.a,{items:i,onLoadMore:d,className:"chat-list custom-scroll"},i&&i.length?i.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable",onClick:()=>s(e),ripple:!o.g},n.a.createElement(Oe.a,{userId:e,forceShowSelf:!0,avatarSize:"large"}))):i&&!i.length?n.a.createElement("p",{className:"no-results",key:"no-results",dir:"auto"},e.length?"No contacts matched your search.":"Contact list is empty."):n.a.createElement(be.a,{key:"loading"}))}));const un=Object(_.g)(e=>e(),6e4,!0);var hn=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users,{byId:n}=e.chats,{currentUserId:c}=e,{query:r,fetchingStatus:s,globalResults:l,localResults:o}=e.globalSearch,{userIds:i}=l||{},{userIds:d}=o||{};return{currentUserId:c,usersById:a,chatsById:n,localContactIds:t,searchQuery:r,isSearching:s&&s.chats,globalUserIds:i,localUserIds:d}},(e,t)=>Object(u.l)(t,["loadContactList","setGlobalSearchQuery"]))(({isChannel:e,selectedMemberIds:t,onSelectedMemberIdsChange:a,onNextStep:c,onReset:r,currentUserId:s,usersById:l,chatsById:o,localContactIds:i,searchQuery:d,isSearching:h,localUserIds:b,globalUserIds:g,loadContactList:p,setGlobalSearchQuery:v})=>{Object(n.n)(()=>{un(()=>{p()})});const E=Object(n.m)(e=>{v({query:e})},[v]),O=Object(n.p)(()=>{const e=i?Object(m.Db)(i.filter(e=>e!==s),o):[];if(!d)return e;const a=e.filter(e=>{const t=l[e];if(!t)return!1;const a=Object(m.Z)(t);return a&&Object(me.a)(a,d)});return Object(m.Db)(Object(u.o)([...a,...b||[],...g||[]]),o,!1,t)},[i,d,b,g,l,o,t,s]),f=Object(n.m)(()=>{(t.length||e)&&(v({query:""}),c())},[t.length,e,v,c]),j=Object(F.a)();return n.a.createElement("div",{className:"NewChat step-1"},n.a.createElement("div",{className:"left-header"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:r,ariaLabel:"Return to Chat List"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,j("GroupAddMembers"))),n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(cn,{itemIds:O,selectedIds:t,filterValue:d,filterPlaceholder:j("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:h,onSelectedIdsChange:a,onFilterChange:E}),n.a.createElement(qt,{isShown:Boolean(t.length||e),onClick:f,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},n.a.createElement("i",{className:"icon-arrow-right"}))))}));var bn=Object(n.h)(Object(c.h)(e=>{const{progress:t,error:a}=e.chatCreation||{};return{creationProgress:t,creationError:a}},(e,t)=>Object(u.l)(t,["createGroupChat","createChannel"]))(({isChannel:e,memberIds:t,onReset:a,creationProgress:c,creationError:r,createGroupChat:l,createChannel:o})=>{const i=Object(F.a)(),[d,m]=Object(n.r)(""),[u,h]=Object(n.r)(""),[b,g]=Object(n.r)(),[p,v]=Object(n.r)(),E=c===s.a.InProgress,O=Object(n.m)(e=>{const{value:t}=e.currentTarget,a=t.replace(/^\s+/,"");m(a),a!==t&&(e.currentTarget.value=a)},[]),f=Object(n.m)(e=>{h(e.currentTarget.value)},[]),j=Object(n.m)(()=>{d.length?t.length>199?v("Sorry, creating supergroups is not yet supported"):l({title:d,photo:b,memberIds:t}):v("Chat title can't be empty")},[d,t,l,b,"Chat title can't be empty","Sorry, creating supergroups is not yet supported"]),C=Object(n.m)(()=>{d.length?o({title:d,about:u,photo:b,memberIds:t}):v("Channel title can't be empty")},[d,o,u,b,t,"Channel title can't be empty"]);Object(n.n)(()=>{c===s.a.Complete&&a(!0)},[c,a]);const y=r||("Chat title can't be empty"!==p&&"Channel title can't be empty"!==p?p:void 0);return n.a.createElement("div",{className:"NewChat"},n.a.createElement("div",{className:"left-header"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>a(),ariaLabel:"Return to member selection"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,i(e?"NewChannel":"NewGroup"))),n.a.createElement("div",{className:"NewChat-inner step-2"},n.a.createElement(Gt.a,{onChange:g,title:i("AddPhoto")}),n.a.createElement(pe.a,{value:d,onChange:O,label:i(e?"EnterChannelName":"GroupName"),error:"Chat title can't be empty"===p||"Channel title can't be empty"===p?p:void 0}),e&&n.a.createElement(n.a.Fragment,null,n.a.createElement(pe.a,{value:u,onChange:f,label:i("DescriptionOptionalPlaceholder")}),n.a.createElement("p",{className:"note"},i("DescriptionInfo"))),y&&n.a.createElement("p",{className:"error"},y),t.length>0&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"chat-members-heading"},i("GroupInfo.ParticipantCount",t.length,"i")),n.a.createElement("div",{className:"chat-members-list custom-scroll"},t.map(e=>n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(Oe.a,{userId:e})))))),n.a.createElement(qt,{isShown:0!==d.length,onClick:e?C:j,disabled:E,ariaLabel:e?i("ChannelIntro.CreateChannel"):"Create Group"},E?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-arrow-right"})))}));a(279);const gn=Object.keys(s.d).length/2;var pn=Object(n.h)(({isChannel:e=!1,content:t,onContentChange:a,onReset:c})=>{const[r,l]=Object(n.r)([]),i=Object(n.m)(()=>{a(e?s.d.NewChannelStep2:s.d.NewGroupStep2)},[e,a]);return n.a.createElement(T.a,{id:"NewChat",name:o.g?"slide-layers":"push-slide",renderCount:gn,activeKey:t},()=>{switch(t){case s.d.NewChannelStep1:case s.d.NewGroupStep1:return n.a.createElement(hn,{isChannel:e,selectedMemberIds:r,onSelectedMemberIdsChange:l,onNextStep:i,onReset:c});case s.d.NewChannelStep2:case s.d.NewGroupStep2:return n.a.createElement(bn,{isChannel:e,memberIds:r,onReset:c});default:return}})}),vn=a(189);a(280);var En=Object(n.h)(({isActive:e,onReset:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"ArchivedChats"},n.a.createElement("div",{className:"left-header"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:t,ariaLabel:"Return to chat list"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,a("ArchivedChats"))),n.a.createElement(vn.a,{folderType:"archived",noChatsText:"Archive is empty.",isActive:e}))});const On={Down:!0,ArrowDown:!0,Up:!0,ArrowUp:!0,Left:!0,ArrowLeft:!0,Right:!0,ArrowRight:!0," ":!0,PageUp:!0,PageDown:!0,End:!0,Home:!0,Tab:!0},fn=e=>{e.preventDefault()};function jn(e){On[e.key]&&fn(e)}function Cn(){document.addEventListener("wheel",fn,{passive:!1}),window.ontouchmove=fn,document.onkeydown=jn}function yn(){document.removeEventListener("wheel",fn),window.ontouchmove=null,document.onkeydown=null}var kn=a(54),Nn=a(153);function In(e,t){return e?"lng_context_copy_selected":t?"lng_context_copy_text":"Copy"}var Sn=a(173),wn=a(53);a(281);var Pn=({isOpen:e,message:t,anchor:a,canSendNow:c,canReschedule:s,canReply:l,canEdit:o,canPin:i,canUnpin:d,canDelete:u,canForward:h,canFaveSticker:b,canUnfaveSticker:g,canCopy:p,canCopyLink:v,canSelect:E,onReply:O,onEdit:f,onPin:C,onUnpin:y,onForward:k,onDelete:N,onFaveSticker:I,onUnfaveSticker:S,onSelect:w,onSend:P,onReschedule:M,onClose:L,onCloseAnimationEnd:A,onCopyLink:T})=>{Object(n.n)(()=>{Object(j.b)(200)},[e]);const R=function(e,t,a){const n=[],c=Object(m.O)(e),s=Object(m.G)(e),l=Object(m.D)(e,"inline"),o=s&&l&&Nn.a,i=window.getSelection();if(o&&n.push({label:"lng_context_copy_image",handler:()=>{kn.b(l,r.ApiMediaFormat.BlobUrl).then(Nn.b),t&&t()}}),c){const e=Boolean(i&&i.anchorNode&&i.anchorNode.parentNode&&i.anchorNode.parentNode.closest(".Message .content-inner")&&""!==i.toString().replace(/(?:\r\n|\r|\n)/g,""));n.push({label:In(e,o),handler:()=>{const a=e&&i?i.toString():c;Object(Nn.c)(a),t&&t()}})}return a&&n.push({label:"lng_context_copy_message_link",handler:()=>{a(),t&&t()}}),n}(t,L,v?T:void 0),D=Object(n.m)(()=>document.querySelector(`.active > .MessageList div[data-message-id="${t.id}"]`),[t.id]),B=Object(n.m)(()=>document.querySelector(".active > .MessageList"),[]),x=Object(n.m)(()=>document.querySelector(".MessageContextMenu .bubble"),[]),{positionX:U,positionY:G,style:q}=Object(Sn.a)(a,D,B,x,10,document.querySelector(".MiddleHeader").offsetHeight),H=Object(F.a)();return n.a.createElement(wn.a,{isOpen:e,positionX:U,positionY:G,style:q,className:"MessageContextMenu fluid",onClose:L,onCloseAnimationEnd:A},c&&n.a.createElement(z.a,{icon:"send-outline",onClick:P},H("MessageScheduleSend")),s&&n.a.createElement(z.a,{icon:"schedule",onClick:M},H("MessageScheduleEditTime")),l&&n.a.createElement(z.a,{icon:"reply",onClick:O},H("Reply")),o&&n.a.createElement(z.a,{icon:"edit",onClick:f},H("Edit")),b&&n.a.createElement(z.a,{icon:"favorite",onClick:I},H("AddToFavorites")),g&&n.a.createElement(z.a,{icon:"favorite",onClick:S},H("Stickers.RemoveFromFavorites")),p&&R.map(e=>n.a.createElement(z.a,{key:e.label,icon:"copy",onClick:e.handler},H(e.label))),i&&n.a.createElement(z.a,{icon:"pin",onClick:C},H("DialogPin")),d&&n.a.createElement(z.a,{icon:"unpin",onClick:y},H("DialogUnpin")),h&&n.a.createElement(z.a,{icon:"forward",onClick:k},H("Forward")),E&&n.a.createElement(z.a,{icon:"select",onClick:w},H("Common.Select")),u&&n.a.createElement(z.a,{destructive:!0,icon:"delete",onClick:N},H("Delete")))};var Mn=Object(n.h)(Object(c.h)((e,{message:t,messageListType:a})=>{const{threadId:n}=Object(d.y)(e)||{},{noOptions:c,canReply:r,canPin:s,canUnpin:l,canDelete:o,canEdit:i,canForward:m,canFaveSticker:u,canUnfaveSticker:h,canCopy:b,canCopyLink:g,canSelect:p}=n&&Object(d.b)(e,t,n)||{},v="pinned"===a,E="scheduled"===a;return{noOptions:c,canSendNow:E,canReschedule:E,canReply:!v&&!E&&r,canPin:!E&&s,canUnpin:!E&&l,canDelete:o,canEdit:!v&&i,canForward:!E&&m,canFaveSticker:!E&&u,canUnfaveSticker:!E&&h,canCopy:b,canCopyLink:!E&&g,canSelect:p}},(e,t)=>Object(u.l)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink"]))(({isOpen:e,messageListType:t,message:a,album:c,anchor:r,onClose:s,onCloseAnimationEnd:l,noOptions:o,canSendNow:i,canReschedule:d,canReply:m,canPin:u,canUnpin:h,canDelete:b,canEdit:g,canForward:p,canFaveSticker:v,canUnfaveSticker:E,canCopy:O,canCopyLink:f,canSelect:j,setReplyingToId:C,setEditingId:y,pinMessage:k,openForwardMenu:N,faveSticker:I,unfaveSticker:S,toggleMessageSelection:w,sendScheduledMessages:P,rescheduleMessage:M,loadMessageLink:F})=>{const{transitionClassNames:L}=Object(K.a)(e,l,void 0,!1),[A,T]=Object(n.r)(!0),[R,B]=Object(n.r)(!1),[x,U]=Object(n.r)(!1),[G,q,z]=Object(xe.a)(),H=Object(n.m)(()=>{T(!1),B(!0)},[]),$=Object(n.m)(()=>{T(!1),s()},[s]),_=Object(n.m)(()=>{B(!1),s()},[s]),V=Object(n.m)(()=>{U(!1),s()},[s]),W=Object(n.m)(()=>{z(),s()},[z,s]),Y=Object(n.m)(()=>{C({messageId:a.id}),$()},[C,a.id,$]),Z=Object(n.m)(()=>{y({messageId:a.id}),$()},[y,a.id,$]),Q=Object(n.m)(()=>{T(!1),U(!0)},[]),X=Object(n.m)(()=>{k({messageId:a.id,isUnpin:!0}),$()},[k,a.id,$]),J=Object(n.m)(()=>{if($(),c&&c.messages){const e=c.messages.map(({id:e})=>e);N({fromChatId:a.chatId,messageIds:e})}else N({fromChatId:a.chatId,messageIds:[a.id]})},[N,a,$,c]),ee=Object(n.m)(()=>{$(),I({sticker:a.content.sticker})},[$,a.content.sticker,I]),te=Object(n.m)(()=>{$(),S({sticker:a.content.sticker})},[$,a.content.sticker,S]),ae=Object(n.m)(()=>{const e=c&&c.messages?{messageId:a.id,childMessageIds:c.messages.map(({id:e})=>e),withShift:!1}:{messageId:a.id,withShift:!1};w(e),$()},[$,a.id,w,c]),ne=Object(n.m)(()=>{P({chatId:a.chatId,id:a.id}),$()},[$,a.chatId,a.id,P]),ce=Object(n.m)(()=>{T(!1),q()},[q]),re=Object(n.m)(e=>{M({chatId:a.chatId,messageId:a.id,scheduledAt:Math.round(e.getTime()/1e3)})},[a.chatId,a.id,M]),se=Object(n.m)(()=>{F({messageId:a.id,chatId:a.chatId}),$()},[$,F,a.chatId,a.id]);if(Object(n.n)(()=>(Cn(),yn),[]),o)return void $();const le=new Date;return le.setFullYear(le.getFullYear()+1),n.a.createElement("div",{className:["ContextMenuContainer",L].join(" ")},n.a.createElement(Pn,{message:a,isOpen:A,anchor:r,canSendNow:i,canReschedule:d,canReply:m,canDelete:b,canPin:u,canUnpin:h,canEdit:g,canForward:p,canFaveSticker:v,canUnfaveSticker:E,canCopy:O,canCopyLink:f,canSelect:j,onReply:Y,onEdit:Z,onPin:Q,onUnpin:X,onForward:J,onDelete:H,onFaveSticker:ee,onUnfaveSticker:te,onSelect:ae,onSend:ne,onReschedule:ce,onClose:$,onCopyLink:se}),n.a.createElement(Re,{isOpen:R,isSchedule:"scheduled"===t,onClose:_,album:c,message:a}),n.a.createElement(De,{isOpen:x,messageId:a.id,chatId:a.chatId,onClose:V}),n.a.createElement(Ae,{isOpen:G,withTimePicker:!0,selectedAt:1e3*a.date,maxAt:Object(D.k)(le),isFutureMode:!0,onClose:W,onSubmit:re}))}));a(282);var Fn=Object(n.h)(Object(c.h)((e,{fromSticker:t})=>({stickerSet:Object(d.xb)(e,t.stickerSetId)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet","sendMessage"]))(({isOpen:e,fromSticker:t,stickerSet:a,onClose:c,loadStickers:r,toggleStickerSet:s,sendMessage:o})=>{const i=Object(n.q)(null),d=Object(F.a)(),{observe:m}=Object(sa.a)({rootRef:i,throttleMs:200,isDisabled:!e});Object(n.n)(()=>{if(e){const{stickerSetId:e,stickerSetAccessHash:a}=t;r({stickerSetId:e,stickerSetAccessHash:a})}},[e,t,r]);const u=Object(n.m)(e=>{e={...e,isPreloadedGlobally:!0},o({sticker:e}),c()},[c,o]),h=Object(n.m)(()=>{s({stickerSetId:t.stickerSetId}),c()},[t.stickerSetId,c,s]);return n.a.createElement(ge.a,{className:"StickerSetModal",isOpen:e,onClose:c,hasCloseButton:!0,title:a?a.title:d("AccDescrStickerSet")},a&&a.stickers?n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{ref:i,className:"stickers custom-scroll"},a.stickers.map(e=>n.a.createElement(ha,{sticker:e,size:l.xb,observeIntersection:m,onClick:u,clickArg:e}))),n.a.createElement("div",{className:"button-wrapper"},n.a.createElement(R.a,{size:"smaller",fluid:!0,color:a.installedDate?"danger":"primary",onClick:h},d(a.installedDate?"StickerPack.RemoveStickerCount":"StickerPack.AddStickerCount",a.count,"i")))):n.a.createElement(be.a,null))})),Ln=a(122);a(283);var An=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t);return!a||a.isRestricted?{}:{chat:a,isMuted:a.isMuted,isPrivate:Object(m.lb)(a.id),canDeleteChat:Object(m.d)(a)}},(e,t)=>Object(u.l)(t,["updateChatMutedState","enterMessageSelectMode"]))(({chatId:e,isOpen:t,anchor:a,isChannel:c,canSubscribe:r,canSearch:s,canMute:l,canSelect:i,canLeave:d,chat:m,isPrivate:u,isMuted:h,canDeleteChat:b,onSubscribeChannel:g,onSearchClick:p,onClose:v,onCloseAnimationEnd:E,updateChatMutedState:O,enterMessageSelectMode:f})=>{const[j,C]=Object(n.r)(!0),[y,k]=Object(n.r)(!1),{x:N,y:I}=a;Object(K.a)(t,E,void 0,!1);const S=Object(n.m)(()=>{C(!1),k(!0)},[]),w=Object(n.m)(()=>{C(!1),v()},[v]),P=Object(n.m)(()=>{k(!1),v()},[v]),M=Object(n.m)(()=>{O({chatId:e,isMuted:!h}),w()},[e,w,h,O]),L=Object(n.m)(()=>{g(),w()},[w,g]),A=Object(n.m)(()=>{p(),w()},[w,p]),T=Object(n.m)(()=>{f(),w()},[w,f]);Object(n.n)(()=>(Cn(),yn),[]);const R=Object(F.a)();return n.a.createElement(Ln.a,null,n.a.createElement("div",{className:"HeaderMenuContainer"},n.a.createElement(wn.a,{isOpen:j,positionX:"right",style:`left: ${N}px;top: ${I}px;`,onClose:w},o.g&&r&&n.a.createElement(z.a,{icon:c?"channel":"group",onClick:L},R(c?"Subscribe":"Join Group")),o.g&&s&&n.a.createElement(z.a,{icon:"search",onClick:A},R("Search")),l&&n.a.createElement(z.a,{icon:h?"unmute":"mute",onClick:M},R(h?"ChatsUnmute":"ChatsMute")),i&&n.a.createElement(z.a,{icon:"select",onClick:T},R("ReportSelectMessages")),d&&n.a.createElement(z.a,{destructive:!0,icon:"delete",onClick:S},R(u?"Delete":b?"GroupInfo.DeleteAndExit":c?"LeaveChannel":"Group.LeaveGroup"))),m&&n.a.createElement(Ve.a,{isOpen:y,onClose:P,chat:m})))})),Tn=a(154);a(284);const Rn=Object(_.a)(e=>e(),200,!1);var Dn=Object(n.h)(Object(c.h)(e=>{const t=Object(d.r)(e);if(!t)return{};const{query:a,results:n}=Object(d.A)(e)||{},{totalCount:c,foundIds:r}=n||{};return{chat:t,query:a,totalCount:c,foundIds:r,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}},(e,t)=>Object(u.l)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","openHistoryCalendar"]))(({isActive:e,chat:t,query:a,totalCount:c,foundIds:r,isHistoryCalendarOpen:s,setLocalTextSearchQuery:l,searchTextMessagesLocal:o,focusMessage:i,closeLocalTextSearch:d,openHistoryCalendar:m})=>{const u=Object(n.q)(null),[h,b]=Object(n.r)(0);Object(n.n)(()=>{const{visualViewport:e}=window;if(!e)return;const t=document.getElementById("Main"),a=()=>{const{activeElement:a}=document;if(a&&a===u.current){const{pageTop:a,height:n}=e;t.style.transform=`translateY(${a}px)`,t.style.height=n+"px",document.documentElement.scrollTop=a}else t.style.transform="",t.style.height=""};return e.addEventListener("resize",a),()=>{e.removeEventListener("resize",a)}},[]),Object(n.n)(()=>{t&&r&&r.length?(i({chatId:t.id,messageId:r[r.length-1]}),b(0)):b(-1)},[t,i,r]),Object(n.n)(()=>{Array.from(document.querySelectorAll("input")).forEach(t=>{t.disabled=Boolean(e&&t!==u.current)}),Array.from(document.querySelectorAll("div[contenteditable]")).forEach(t=>{t.contentEditable=e?"false":"true"})},[e]),Object(n.n)(()=>{e||u.current.blur()},[e]),Object(n.o)(()=>{document.querySelector("#MobileSearch input").blur()},[s]);const g=Object(n.m)(e=>{l({query:e}),e.length&&Rn(o)},[o,l]),p=Object(n.m)(()=>{if(t&&r){const e=h+1;i({chatId:t.id,messageId:r[r.length-1-e]}),b(e)}},[t,h,i,r]),v=Object(n.m)(()=>{if(t&&r){const e=h-1;i({chatId:t.id,messageId:r[r.length-1-e]}),b(e)}},[t,h,i,r]);return n.a.createElement("div",{id:"MobileSearch",className:e?"active":""},n.a.createElement("div",{className:"header"},n.a.createElement(R.a,{size:"smaller",round:!0,color:"translucent",onClick:d},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement(Tn.a,{ref:u,value:a,onChange:g})),n.a.createElement("div",{className:"footer"},n.a.createElement("div",{className:"counter"},a?r&&r.length?`${h+1} of ${c}`:r&&!r.length?"No results":"":n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>m({selectedAt:Object(D.k)(Date.now())}),ariaLabel:"Search messages by date"},n.a.createElement("i",{className:"icon-calendar"}))),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:p,disabled:!r||!r.length||h===r.length-1},n.a.createElement("i",{className:"icon-up"})),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:v,disabled:!r||!r.length||0===h},n.a.createElement("i",{className:"icon-down"}))))})),Bn=a(59),xn=a(190),Un=a(182),Gn=a(179),qn=a(184);function zn(e,t,a=0,n=!1,c=!1,r=!1){const s=e[r?"scrollLeft":"scrollTop"],l=s+e[r?"offsetWidth":"offsetHeight"],o="string"==typeof t?e.querySelectorAll(t):t,{length:i}=o,d=[];let m=!1;for(let e=0;e=s-a&&u<=l+a:i<=l+a&&u>=s-a)d.push(e),m=!0;else if(m&&!n)break}return{allElements:o,visibleIndexes:d}}var Hn=function(e,t,a=!1){const n=e[a?"scrollLeft":"scrollTop"],c=n+e[a?"offsetWidth":"offsetHeight"],r=t[a?"offsetLeft":"offsetTop"],s=r+t[a?"offsetWidth":"offsetHeight"];return r>n&&s{const l=Object(n.q)(null),{shouldRender:o,transitionClassNames:i}=Object(K.a)(e,void 0,void 0,!1),d=Object(n.m)(e=>{if(!s)return-1;const t=s.length;return Object(_n.a)(t,e)},[s]),[m,u]=Object(n.r)(-1),h=Object(n.m)((e,t)=>{t.preventDefault(),u(t=>d(t+e))},[u,d]),b=Object(n.m)((e,t=!1)=>{const a=r&&r[e];a&&c(a,t)},[r,c]),g=Object(n.m)(e=>{if(s&&s.length&&m>-1){const t=s[m];t&&(e.preventDefault(),b(t.userId,!0))}},[s,m,b]);Object(n.n)(()=>e?Object(Ue.a)({onEsc:a,onUp:e=>h(-1,e),onDown:e=>h(1,e),onEnter:g,onTab:g}):void 0,[e,a,h,g]),Object(n.n)(()=>{s&&!s.length&&a()},[s,a]),Object(n.n)(()=>{u(0)},[t]),Object(n.n)(()=>{!function(e,t){const a=t.current;if(!a||e<0)return;const{visibleIndexes:n,allElements:c}=zn(a,".chat-item-clickable",8,!0,!0);if(!c.length||!c[e])return;const r=n[0];if(!n.includes(e)||e===r&&!Hn(a,c[r])){const t=e>n[n.length-1]?"start":"end";Object($n.a)(a,c[e],t,10)}}(m,l)},[m]);const p=Object(f.a)(s&&s.length?s:void 0,o),v=s&&!s.length?p:s;if(!o||v&&!v.length)return;const E=Object(ce.a)("MentionTooltip composer-tooltip custom-scroll",i);return n.a.createElement("div",{className:E,ref:l},v&&v.map(({userId:e},t)=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>b(e),focus:m===t},n.a.createElement(Oe.a,{userId:e,avatarSize:"small",withUsername:!0}))))}),Kn=a(183);a(286);var Wn=Object(n.h)(({attachments:e,caption:t,canSuggestMembers:a,groupChatMembers:c,currentUserId:r,usersById:s,recentEmojis:o,language:i,onCaptionUpdate:d,addRecentEmoji:m,loadEmojiKeywords:u,onSend:h,onFileAppend:g,onClear:p})=>{const v=Object(n.q)(null),E=Object(f.a)(e),O=e.length?e:E,j=Boolean(e.length),[C,y,k]=Object(xe.a)(),N=O&&O.every(e=>e.quick),I=Object(F.a)(),{isMentionTooltipOpen:S,mentionFilter:w,closeMentionTooltip:P,insertMention:M,mentionFilteredMembers:L}=Object(xn.a)(a&&j,t,d,l.w,c,r,s),{isEmojiTooltipOpen:A,closeEmojiTooltip:T,filteredEmojis:D,insertEmoji:B}=Object(Un.a)(j,t,o,l.w,d);Object(n.n)(()=>j?Object(b.a)(p):void 0,[j,p]);const x=Object(n.m)(()=>{j&&h()},[j,h]),U=Object(n.m)(e=>{e.preventDefault(),k();const{dataTransfer:{files:t}}=e;if(t&&t.length){const e=N?Array.from(t).filter(e=>e.type&&l.l.includes(e.type)):Array.from(t);g(e,!1)}},[N,g,k]);if(!O)return;const G=O.every(e=>e.mimeType.startsWith("image/")),q=O.every(e=>e.mimeType.startsWith("video/"));let z="";return z=I(G?"PreviewSender.SendPhoto":q?"PreviewSender.SendVideo":"PreviewSender.SendFile",O.length,"i"),n.a.createElement(ge.a,{isOpen:j,onClose:p,header:function(){if(O)return n.a.createElement("div",{className:"modal-header-condensed",dir:I.isRtl?"rtl":void 0},n.a.createElement(R.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:p},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},z),n.a.createElement(R.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:x},I("Send")))}(),className:"AttachmentModal "+(C?"hovered":"")},n.a.createElement("div",{className:"drop-target",onDragEnter:y,onDrop:U,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),v.current&&window.clearTimeout(v.current)},onDragLeave:e=>{const{relatedTarget:t,target:a}=e;a.matches(".drop-target")&&!t&&(v.current=window.setTimeout(k,150)),a&&a.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),k())},"data-attach-description":I("Preview.Dragging.AddItems",10)},N?n.a.createElement("div",{className:"media-wrapper custom-scroll"},O.map(e=>e.mimeType.startsWith("image/")?n.a.createElement("img",{src:e.blobUrl,alt:""}):n.a.createElement("video",{src:e.blobUrl,autoPlay:!0,muted:!0,loop:!0}))):n.a.createElement("div",{className:"document-wrapper custom-scroll"},O.map(e=>n.a.createElement(Gn.a,{name:e.filename,extension:Object(Bn.d)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0}))),n.a.createElement("div",{className:"attachment-caption-wrapper"},n.a.createElement(Vn,{isOpen:S,onClose:P,filter:w,onInsertUserName:M,filteredChatMembers:L,usersById:s}),n.a.createElement(Kn.a,{isOpen:A,emojis:D,onClose:T,language:i,onEmojiSelect:B,addRecentEmoji:m,loadEmojiKeywords:u}),n.a.createElement(qn.a,{id:"caption-input-text",html:t,editableInputId:l.w,placeholder:I("Caption"),onUpdate:d,onSend:h,shouldSetFocus:j}))))}),Yn=a(138);a(287);var Zn=Object(n.h)(({isOpen:e,onSend:t,onClear:a})=>{const c=Object(n.q)(null),r=Object(n.q)(null),s=Object(n.q)(null),[l,o]=Object(n.r)(""),[i,d]=Object(n.r)([""]),[m,u]=Object(n.r)(!0),[h,g]=Object(n.r)(!1),[p,v]=Object(n.r)(!1),[E,O]=Object(n.r)(),[f,j]=Object(n.r)(),[C,y]=Object(n.r)(!1),k=Object(F.a)(),N=Object(n.m)(t=>{e&&t.current&&t.current.focus()},[e]);Object(n.n)(()=>e?Object(b.a)(a):void 0,[e,a]),Object(n.n)(()=>{e||(o(""),d([""]),u(!0),g(!1),v(!1),O(""),j(""),y(!1))},[e]),Object(n.n)(()=>N(c),[N,e]),Object(n.o)(()=>{const e=s.current;e&&E!==e.innerHTML&&(e.innerHTML=E)},[E]);const I=Object(n.m)((e=[])=>{d([...e,""]),requestAnimationFrame(()=>{const e=r.current;e&&(e.classList.toggle("overflown",e.scrollHeight>320),e.scrollTo({top:e.scrollHeight,behavior:"smooth"}))})},[]),S=Object(n.m)(()=>{if(y(!1),!e)return;const a=l.trim().substring(0,255),n=i.map(e=>e.trim().substring(0,100)).filter(e=>e.length);if(!a||n.length<2)return o(a),n.length?n.length<2?I(n):d(n):I(),void y(!0);if(p&&(!f||!n[Number(f)]))return void y(!0);const c={summary:{question:a,answers:n.map((e,t)=>({text:e.trim(),option:String(t),...String(t)===f&&{correct:!0}})),...!m&&{isPublic:!0},...h&&{multipleChoice:!0},...p&&{quiz:!0}}};if(p){const{text:e,entities:t}=E&&Object(Yn.a)(E.substring(0,200))||{};c.quiz={correctAnswers:[f],...e&&{solution:e},...t&&{solutionEntities:t}}}t(c)},[e,l,i,p,f,m,h,t,I,E]),w=Object(n.m)((e,t)=>{const a=[...i];a[e]=t,a[a.length-1].trim().length&&a.length<10?I(a):d(a)},[i,I]),P=Object(n.m)(e=>{const t=[...i];t.splice(e,1),d(t),requestAnimationFrame(()=>{r.current&&r.current.classList.toggle("overflown",r.current.scrollHeight>320)})},[i]),M=Object(n.m)(e=>{j(e)},[j]),L=Object(n.m)(e=>{u(e.target.checked)},[]),A=Object(n.m)(e=>{g(e.target.checked)},[]),T=Object(n.m)(e=>{v(e.target.checked)},[]),D=Object(n.m)(e=>{13===e.keyCode&&S()},[S]),B=Object(n.m)(()=>{if(C&&!l.trim().length)return k("lng_polls_choose_question")},[C,k,l]),x=Object(n.m)(e=>{const t=i.map(e=>e.trim()).filter(e=>e.length);if(C&&t.length<2&&!i[e].trim().length)return k("lng_polls_choose_answers")},[C,k,i]);function U(){return i.map((e,t)=>n.a.createElement("div",{className:"option-wrapper"},n.a.createElement(pe.a,{label:t!==i.length-1||10===i.length?k("OptionHint"):k("CreatePoll.AddOption"),error:x(t),value:e,onChange:e=>w(t,e.currentTarget.value),onKeyPress:D}),t!==i.length-1&&n.a.createElement(R.a,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:k("Delete"),onClick:()=>P(t)},n.a.createElement("i",{className:"icon-close"}))))}return n.a.createElement(ge.a,{isOpen:e,onClose:a,header:n.a.createElement("div",{className:"modal-header-condensed"},n.a.createElement(R.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel poll creation",onClick:a},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},k("NewPoll")),n.a.createElement(R.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:S},k("Create"))),className:"PollModal"},n.a.createElement(pe.a,{ref:c,label:k("AskAQuestion"),value:l,error:B(),onChange:e=>o(e.currentTarget.value),onKeyPress:D}),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"options-list custom-scroll",ref:r},n.a.createElement("h3",{className:"options-header"},"Options"),C&&function(){const e=i.map(e=>e.trim()).filter(e=>e.length);return p&&(!f||!e[Number(f)])&&n.a.createElement("p",{className:"error"},k("lng_polls_choose_correct"))}(),p?n.a.createElement(oa.a,{name:"correctOption",options:U().map((e,t)=>({value:String(t),label:e,hidden:t===i.length-1})),onChange:M}):U()),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"quiz-mode"},n.a.createElement(aa.a,{label:k("PollAnonymous"),checked:m,onChange:L}),n.a.createElement(aa.a,{label:k("PollMultiple"),checked:h,disabled:p,onChange:A}),n.a.createElement(aa.a,{label:k("PollQuiz"),checked:p,disabled:h,onChange:T}),p&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"options-header"},"Solution"),n.a.createElement("div",{ref:s,className:"form-control",contentEditable:!0,dir:"auto",onChange:e=>O(e.currentTarget.innerHTML)}),n.a.createElement("div",{className:"note"},k("CreatePoll.ExplanationInfo")))))});let Qn;function Xn(e,t,a=250){const c=Object(n.q)(!1);Object(n.n)(()=>{Qn&&(clearTimeout(Qn),Qn=void 0),e&&!o.l&&(Qn=window.setTimeout(()=>{c.current||t()},2*a))},[e,a,t]);return[Object(n.m)(()=>{c.current=!0},[]),Object(n.m)(()=>{c.current=!1,Qn&&(clearTimeout(Qn),Qn=void 0),Qn=window.setTimeout(()=>{c.current||t()},a)},[a,t])]}var Jn=a(65),ec=a(142);a(288);var tc=Object(n.h)(({emoji:e,focus:t,onClick:a})=>{const c=Object(n.m)(t=>{t.preventDefault(),a(e.native,e.id)},[e,a]);return n.a.createElement("div",{className:"EmojiButton "+(t?"focus":""),onMouseDown:c,title:`:${e.names[0]}:`},o.d?n.a.createElement("span",{className:"font-emoji"},e.native):n.a.createElement("img",{src:`./img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))});var ac=Object(n.h)(({category:e,index:t,allEmojis:a,observeIntersection:c,shouldRender:r,onEmojiSelect:s})=>{const l=Object(n.q)(null);Object(sa.c)(l,c);const{transitionClassNames:i}=Object(K.a)(r,void 0,void 0,"slow"),d=Object(F.a)(),m=o.g?Math.floor((y.a.get().width-8)/44):9,u=44*Math.ceil(e.emojis.length/m);return n.a.createElement("div",{ref:l,key:e.id,id:"emoji-category-"+t,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name",dir:"auto"},d("recent"===e.id?"RecentStickers":"Emoji"+t)),n.a.createElement("div",{className:Object(ce.a)("symbol-set-container",i),style:`height: ${u}px;`,dir:d.isRtl?"rtl":void 0},r&&e.emojis.map(e=>{const t=a[e],c="id"in t?t:t[1];return n.a.createElement(tc,{key:c.id,emoji:c,onClick:s})})))});a(289);const nc={recent:"icon-recent",people:"icon-smile",nature:"icon-animals",foods:"icon-eats",activity:"icon-sport",places:"icon-car",objects:"icon-lamp",symbols:"icon-language",flags:"icon-flag"},cc=[];let rc,sc,lc;var oc=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["recentEmojis"]))(({className:e,onEmojiSelect:t,recentEmojis:c})=>{const r=Object(n.q)(null),s=Object(n.q)(null),[i,d]=Object(n.r)(),[m,u]=Object(n.r)(),[h,b]=Object(n.r)(0),{observe:g}=Object(sa.a)({rootRef:r,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("emoji-category-"))return;const a=Number(t.replace("emoji-category-",""));cc[a]=e.isIntersecting});const t=cc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&b(t[Math.floor(t.length/2)].index)});Object(We.a)(s.current,!o.g),Object(n.n)(()=>{if(!i)return;const e=s.current;if(!e)return;const t=42*h-e.offsetWidth/2+21;Object(ec.a)(e,t)},[i,h]);const p=Object(F.a)(),v=Object(n.p)(()=>{if(!i)return He.a;const e=[...i];return c&&c.length&&e.unshift({id:"recent",name:p("RecentStickers"),emojis:c}),e},[i,p,c]);Object(n.n)(()=>{setTimeout(()=>{const e=()=>{d(lc.categories),u(lc.emojis)};lc?e():async function(){rc||(rc=a.e(1).then(a.t.bind(null,314,3)),sc=(await rc).default,lc=Object(Jn.b)(sc));return rc}().then(e)},200)},[]);const E=Object(n.m)(e=>{b(e);const t=document.getElementById("emoji-category-"+e);Object($n.a)(r.current,t,"start",50,800)},[]),O=Object(n.m)((e,a)=>{t(e,a)},[t]),f=Object(ot.a)([],l.T);const j=Object(ce.a)("EmojiPicker",e);return m&&f?n.a.createElement("div",{className:j},n.a.createElement("div",{ref:s,className:"EmojiPicker-header",dir:p.isRtl?"rtl":""},v.map((function(e,t){const a=nc[e.id];return a&&n.a.createElement(R.a,{className:"symbol-set-button "+(t===h?"activated":""),round:!0,faded:!0,color:"translucent",onClick:()=>E(t),ariaLabel:e.name},n.a.createElement("i",{className:a}))}))),n.a.createElement("div",{ref:r,className:"EmojiPicker-main no-selection no-scrollbar"},v.map((e,t)=>n.a.createElement(ac,{category:e,index:t,allEmojis:m,observeIntersection:g,shouldRender:h>=t-1&&h<=t+1,onEmojiSelect:O})))):n.a.createElement("div",{className:j},n.a.createElement(be.a,null))}));const ic=o.g?8:16;var dc=Object(n.h)(({stickerSet:e,loadAndPlay:t,index:a,observeIntersection:c,shouldRender:r,onStickerSelect:s,onStickerUnfave:i})=>{const d=Object(n.q)(null);Object(sa.c)(d,c);const{transitionClassNames:m}=Object(K.a)(r,void 0,void 0,"slow"),u=o.g?Math.floor((y.a.get().width-8)/(l.yb+ic)):5,h=Math.ceil(e.count/u)*(l.yb+ic);return n.a.createElement("div",{ref:d,key:e.id,id:"sticker-set-"+a,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name"},e.title),n.a.createElement("div",{className:Object(ce.a)("symbol-set-container",m),style:`height: ${h}px;`},r&&e.stickers&&e.stickers.map(a=>n.a.createElement(ha,{key:a.id,sticker:a,size:l.yb,observeIntersection:c,noAnimate:!t,onClick:s,clickArg:a,onUnfaveClick:"favorite"===e.id?i:void 0}))))});a(290);const mc=[];var uc=Object(n.h)(Object(c.h)(e=>{const{setsById:t,added:a,recent:n,favorite:c}=e.stickers;return{recentStickers:n.stickers,favoriteStickers:c.stickers,stickerSetsById:t,addedSetIds:a.setIds,shouldPlay:e.settings.byKey.shouldLoopStickers}},(e,t)=>Object(u.l)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"]))(({className:e,loadAndPlay:t,canSendStickers:a,recentStickers:c,favoriteStickers:r,addedSetIds:s,stickerSetsById:o,shouldPlay:i,onStickerSelect:d,loadStickerSets:m,loadRecentStickers:u,loadFavoriteStickers:h,loadAddedStickers:b,addRecentSticker:g,unfaveSticker:p})=>{const v=Object(n.q)(null),E=Object(n.q)(null),[O,f]=Object(n.r)(0),{observe:j}=Object(sa.a)({rootRef:v,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("sticker-set-"))return;const a=Number(t.replace("sticker-set-",""));mc[a]=e.isIntersecting});const t=mc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&f(t[Math.floor(t.length/2)].index)}),{observe:C}=Object(sa.a)({rootRef:E}),y=Object(F.a)(),k=Boolean(s),N=Object(n.p)(()=>s?[{id:"recent",title:y("RecentStickers"),stickers:c,count:c.length},{id:"favorite",title:y("FavoriteStickers"),stickers:r,count:r.length},...s.map(e=>o[e]).filter(Boolean)]:He.a,[s,y,c,r,o]),I=Object(n.p)(()=>k&&0===N.filter(e=>e.stickers&&e.stickers.length).length,[N,k]);Object(n.n)(()=>{t&&(m(),u(),h())},[t,h,u,m]),Object(n.n)(()=>{s&&s.length&&b()},[s,b]),Object(We.a)(E.current),Object(n.n)(()=>{if(!k)return;const e=E.current;if(!e)return;const t=52*O-(e.offsetWidth/2-26);Object(ec.a)(e,t)},[k,O]);const S=Object(n.m)(e=>{f(e);const t=document.getElementById("sticker-set-"+e);Object($n.a)(v.current,t,"start",void 0,500)},[]),w=Object(n.m)(e=>{d(e),g({sticker:e})},[g,d]),P=Object(n.m)(e=>{p({sticker:e})},[p]),M=Object(ot.a)([],l.pb);const L=Object(ce.a)("StickerPicker",e);return k&&M&&!I&&a?n.a.createElement("div",{className:L},n.a.createElement("div",{ref:E,className:"StickerPicker-header no-selection no-scrollbar"},N.map((function(e,t){const a=e.stickers&&e.stickers[0],c=Object(ce.a)("symbol-set-button sticker-set-button",t===O&&"activated");return"recent"===e.id||"favorite"===e.id||e.hasThumbnail||!a?n.a.createElement(R.a,{key:e.id,className:c,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>S(t)},"recent"===e.id?n.a.createElement("i",{className:"icon-recent"}):"favorite"===e.id?n.a.createElement("i",{className:"icon-favorite"}):e.isAnimated?n.a.createElement(ma,{stickerSet:e,observeIntersection:C}):n.a.createElement(ua,{stickerSet:e,observeIntersection:C})):n.a.createElement(ha,{key:e.id,sticker:a,size:l.zb,title:e.title,className:c,observeIntersection:C,onClick:S,clickArg:t})}))),n.a.createElement("div",{ref:v,className:"StickerPicker-main no-scrollbar"},N.map((e,a)=>n.a.createElement(dc,{key:e.id,stickerSet:e,loadAndPlay:Boolean(i&&t),index:a,observeIntersection:j,shouldRender:O>=a-1&&O<=a+1,onStickerSelect:w,onStickerUnfave:P})))):n.a.createElement("div",{className:L},a?I?n.a.createElement("div",{className:"picker-disabled"},"You have no saved Stickers."):n.a.createElement(be.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending stickers is not allowed in this chat."))}));a(291);function hc(){return(hc=Object.assign||function(e){for(var t=1;t{const s=Object(n.q)(null),l=Object(n.q)(null),o=e.thumbnail&&!!e.thumbnail.dataUri,i="gif"+e.id,d=Object(sa.b)(s,t)&&!a,m=Object(v.a)(i+"?size=m",!d,r.ApiMediaFormat.BlobUrl),u=Object(Sa.a)(e.thumbnail&&e.thumbnail.dataUri,Boolean(m)),h=Object(v.a)(i,!d,r.ApiMediaFormat.BlobUrl),b=Boolean(d&&h),{transitionClassNames:g}=Object(ia.a)(o||m||h,"slow"),{isBuffered:p,bufferingHandlers:E}=Object(W.a)(!0),O=d&&!p;Object(Z.a)(l,[b]);const f=Object(n.m)(()=>c({...e,blobUrl:h}),[c,e,h]),j=Object(ce.a)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs}),(e,t)=>Object(u.l)(t,["loadSavedGifs"]))(({className:e,loadAndPlay:t,canSendGifs:a,savedGifs:c,onGifSelect:r,loadSavedGifs:s})=>{const o=Object(n.q)(null),{observe:i}=Object(sa.a)({rootRef:o,debounceMs:300});Object(n.n)(()=>{t&&s()},[t,s]);const d=Object(ot.a)([],l.pb);return n.a.createElement("div",{ref:o,className:Object(ce.a)("GifPicker no-scrollbar",e)},a?d&&c&&c.length?c.map(e=>n.a.createElement(bc,{key:e.id,gif:e,observeIntersection:i,isDisabled:!t,onClick:r})):d&&c?n.a.createElement("div",{className:"picker-disabled"},"No saved GIFs."):n.a.createElement(be.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))}));let pc;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(pc||(pc={}));const vc=Object.values(pc).filter(e=>"string"==typeof e),Ec={[pc.Emoji]:"icon-smile",[pc.Stickers]:"icon-stickers",[pc.GIFs]:"icon-gifs"};var Oc=Object(n.h)(({activeTab:e,onSwitchTab:t,onRemoveSymbol:a,onSearchOpen:c})=>{const r=Object(F.a)();function s(a){return n.a.createElement(R.a,{className:"symbol-tab-button "+(e===a?"activated":""),onClick:()=>t(a),ariaLabel:vc[a],round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:Ec[a]}))}const l=Object(n.m)(()=>{c(e===pc.Stickers?"stickers":"gifs")},[e,c]);return n.a.createElement("div",{className:"SymbolMenu-footer",onClick:function(e){e.stopPropagation()},dir:r.isRtl?"rtl":void 0},e!==pc.Emoji&&n.a.createElement(R.a,{className:"symbol-search-button",ariaLabel:e===pc.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:l},n.a.createElement("i",{className:"icon-search"})),s(pc.Emoji),s(pc.Stickers),s(pc.GIFs),e===pc.Emoji&&n.a.createElement(R.a,{className:"symbol-delete-button",onClick:a,ariaLabel:"Remove Symbol",round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:"icon-delete-left"})))});a(293);let fc=!1;var jc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onLoad:a,onClose:c,onEmojiSelect:r,onStickerSelect:s,onGifSelect:l,onRemoveSymbol:i,onSearchOpen:d,addRecentEmoji:m})=>{const[u,h]=Object(n.r)(0),[b,g]=Object(n.r)([]),[p,v]=Xn(e,c),{shouldRender:E,transitionClassNames:O}=Object(K.a)(e,c,!1,!1);!fc&&e&&(fc=!0),Object(n.n)(()=>{a()},[a]),Object(n.o)(()=>{if(o.g)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&Object(_.b)(()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout(()=>{document.body.classList.remove("enable-symbol-menu-transforms")},350)})}},[e]);const f=Object(n.q)(b);f.current=b,Object(n.n)(()=>{f.current.length&&(f.current.forEach(e=>{m({emoji:e})}),g([]))},[e,u,m]);const j=Object(n.m)((e,t)=>{g(e=>[...e,t]),r(e)},[r]),C=Object(n.m)(e=>{c(),d(e)},[c,d]),y=Object(F.a)(),{canSendStickers:k,canSendGifs:N}=t;function I(t,a){switch(u){case pc.Emoji:return n.a.createElement(oc,{className:"picker-tab",onEmojiSelect:j});case pc.Stickers:return n.a.createElement(uc,{className:"picker-tab",loadAndPlay:!!k&&(e&&(t||a)),canSendStickers:k,onStickerSelect:s});case pc.GIFs:return n.a.createElement(gc,{className:"picker-tab",loadAndPlay:!!N&&(e&&(t||a)),canSendGifs:N,onGifSelect:l})}}const S=n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},fc&&n.a.createElement(T.a,{name:"slide",activeKey:u,renderCount:vc.length},I)),o.g&&n.a.createElement(R.a,{round:!0,faded:!0,color:"translucent",ariaLabel:y("Close"),className:"symbol-close-button",size:"tiny",onClick:c},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(Oc,{activeTab:u,onSwitchTab:h,onRemoveSymbol:i,onSearchOpen:C}));if(o.g){if(!E)return;const e=Object(ce.a)("SymbolMenu mobile-menu",O);return n.a.createElement(Ln.a,null,n.a.createElement("div",{className:e},S))}return n.a.createElement(wn.a,{isOpen:e,positionX:"left",positionY:"bottom",onClose:c,className:"SymbolMenu",onCloseAnimationEnd:c,onMouseEnter:o.l?void 0:p,onMouseLeave:o.l?void 0:v,noCloseOnBackdrop:!o.l},S)});a(294);var Cc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onFileSelect:a,onPollCreate:c,onClose:r})=>{const[s,i]=Xn(e,r),d=Object(n.m)((e,t)=>{const{files:n}=e.target;n&&n.length>0&&a(Array.from(n),t)},[a]),m=Object(n.m)(()=>{Oa(l.l,e=>d(e,!0))},[d]),u=Object(n.m)(()=>{Oa("*",e=>d(e,!1))},[d]),h=Object(F.a)(),{canAttachMedia:b,canAttachPolls:g}=t;return n.a.createElement(wn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:r,className:"AttachMenu fluid",onCloseAnimationEnd:r,onMouseEnter:o.l?void 0:s,onMouseLeave:o.l?void 0:i,noCloseOnBackdrop:!o.l},!b&&n.a.createElement(z.a,{className:"media-disabled",disabled:!0},"Posting media content is not allowed in this group."),b&&n.a.createElement(n.a.Fragment,null,n.a.createElement(z.a,{icon:"photo",onClick:m},h("AttachmentMenu.PhotoOrVideo")),n.a.createElement(z.a,{icon:"document",onClick:u},h("AttachDocument"))),g&&n.a.createElement(z.a,{icon:"poll",onClick:c},h("Poll")))});a(295);var yc=Object(n.h)(Object(c.h)(e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}},(e,t)=>Object(u.l)(t,["clearStickersForEmoji"]))(({isOpen:e,onStickerSelect:t,stickers:a,clearStickersForEmoji:c})=>{const r=Object(n.q)(null),{shouldRender:s,transitionClassNames:i}=Object(K.a)(e,void 0,void 0,!1),d=Object(f.a)(a,!0),m=a||d,{observe:u}=Object(sa.a)({rootRef:r,throttleMs:200});Object(n.n)(()=>e?Object(b.a)(c):void 0,[e,c]);const h=Object(ce.a)("StickerTooltip composer-tooltip custom-scroll",i,!(m&&m.length)&&"hidden");return n.a.createElement("div",{ref:r,className:h,onMouseEnter:o.l?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:o.l?void 0:()=>{document.body.classList.remove("no-select")}},s&&m?m.map(e=>n.a.createElement(ha,{key:e.id,sticker:e,size:l.yb,observeIntersection:u,onClick:t,clickArg:e})):s?n.a.createElement(be.a,null):void 0)}));a(296);var kc=Object(n.h)(Object(c.h)((e,{messageId:t})=>{const{chatId:a}=Object(d.y)(e)||{};return a?{message:Object(d.k)(e,a,t)}:{}},(e,t)=>Object(u.l)(t,["clickInlineButton"]))(({isOpen:e,message:t,onClose:a,clickInlineButton:c})=>{const[r,s]=Xn(e,a);if(t&&t.keyboardButtons)return n.a.createElement(wn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:a,className:"KeyboardMenu",onCloseAnimationEnd:a,onMouseEnter:o.l?void 0:r,onMouseLeave:o.l?void 0:s,noCloseOnBackdrop:!o.l},n.a.createElement("div",{className:"content"},t.keyboardButtons.map(e=>n.a.createElement("div",{className:"row"},e.map(e=>n.a.createElement(R.a,{ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>c({button:e})},e.text))))))}));a(297);var Nc=Object(n.h)(({isOpen:e,onSilentSend:t,onScheduleSend:a,onClose:c,onCloseAnimationEnd:r})=>{const[s,l]=Xn(e,c),i=Object(F.a)();return n.a.createElement(wn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:c,onCloseAnimationEnd:r,onMouseEnter:o.l?void 0:s,onMouseLeave:o.l?void 0:l,noCloseOnBackdrop:!o.l},t&&n.a.createElement(z.a,{icon:"mute",onClick:t},i("SendWithoutSound")),a&&n.a.createElement(z.a,{icon:"schedule",onClick:a},i("ScheduleMessage")))}),Ic=a(139),Sc=a(164),wc=a(175);a(298);var Pc=Object(n.h)(({isOpen:e,language:t,emojis:a,onClose:c,onEmojiSelect:r,addRecentEmoji:s,loadEmojiKeywords:l})=>{const i=Object(n.q)(null),{shouldRender:d,transitionClassNames:m}=Object(K.a)(e,void 0,void 0,!1),u=Object(wc.a)(a.length?a:void 0,350)||[],[h,b]=Object(n.r)(-1);Object(n.n)(()=>{l({language:t})},[l,t]),Object(n.n)(()=>{b(0)},[a]),Object(n.n)(()=>{!function(e,t){const a=t.current;if(!a)return;const{visibleIndexes:n,allElements:c}=zn(a,".EmojiButton",8,!0,!0,!0);if(!c.length||!c[e])return;const r=n[0];if(!n.includes(e)||e===r&&!Hn(a,c[r],!0)){const t="start"===(e>n[n.length-1]?"start":"end")?44*e:0;Object(ec.a)(a,t)}}(h,i)},[h]);const g=Object(n.m)(e=>{if(!a.length)return-1;const t=a.length;return Object(_n.a)(t,e)},[a]),p=Object(n.m)((e,t)=>{t.preventDefault(),b(t=>g(t+e))},[b,g]),v=Object(n.m)(e=>{if(a.length&&h>-1){const t=a[h];t&&(e.preventDefault(),r(t.native),s({emoji:t.id}))}},[s,a,r,h]);Object(n.n)(()=>e?Object(Ue.a)({onEsc:c,onLeft:e=>p(-1,e),onRight:e=>p(1,e),onEnter:v}):void 0,[p,v,e,c]);const E=Object(ce.a)("EmojiTooltip composer-tooltip custom-scroll-x",m);return n.a.createElement("div",{ref:i,className:E,onMouseEnter:o.l?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:o.l?void 0:()=>{document.body.classList.remove("no-select")}},d&&u?u.map((e,t)=>n.a.createElement(tc,{key:e.id,emoji:e,focus:h===t,onClick:r})):d?n.a.createElement(be.a,null):void 0)}),Mc=a(171);a(299);var Fc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),n=a&&Object(d.m)(e,a.id);if(!a||!n)return{};const{query:c,results:r}=Object(d.A)(e)||{},{totalCount:s,foundIds:l}=r||{};return{chat:a,messagesById:n,query:c,totalCount:s,foundIds:l}},(e,t)=>Object(u.l)(t,["searchTextMessagesLocal","focusMessage"]))(({chatId:e,threadId:t,chat:a,messagesById:r,query:s,totalCount:l,foundIds:o,searchTextMessagesLocal:i,focusMessage:h})=>{const b=Object(F.a)(),g=Object(n.p)(()=>{if(!(s&&o&&o.length&&r))return He.a;const n=o.map(n=>{const s=r[n];if(!s)return;const l=s.senderId?Object(d.Gb)(Object(c.e)(),s.senderId):void 0;let o;if(a&&Object(m.jb)(a))o=a;else if(s.forwardInfo){const{isChannelPost:e,fromChatId:t}=s.forwardInfo;o=e&&t?Object(d.f)(Object(c.e)(),t):void 0}else o=s.senderId?Object(d.f)(Object(c.e)(),s.senderId):void 0;return{message:s,senderUser:l,senderChat:o,onClick:()=>h({chatId:e,threadId:t,messageId:n})}}).filter(Boolean);return Object(u.k)(n,({message:e})=>e.date,"desc")},[e,t,h,o,a,r,s]),p=Object(n.q)(null),v=Object(he.a)(p,!0,e=>{g&&g[e]&&g[e].onClick()},".ListItem-button",!0);return n.a.createElement(ve.a,{className:"RightSearch custom-scroll",items:g,preloadBackwards:0,onLoadMore:i,noFastList:!0,onKeyDown:v,ref:p},n.a.createElement("p",{className:"helper-text",dir:"auto"},s?0!==l&&g.length?1===l?"1 message found":(g.length&&(l||g.length))+" messages found":b("lng_search_no_results"):b("lng_dlg_search_for_messages")),g.map(({message:e,senderUser:t,senderChat:a,onClick:c})=>{const r=a?Object(m.l)(b,a):Object(m.Z)(t),l=Object(m.N)(b,e);return n.a.createElement(Ee.a,{className:"chat-item-clickable search-result-message m-0",onClick:c},n.a.createElement(x.a,{chat:a,user:t}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",{dir:"auto"},r&&Object(B.a)(r)),n.a.createElement(Mc.a,{message:e})),n.a.createElement("div",{className:"subtitle",dir:"auto"},Object(B.a)(l,["emoji","highlight"],{highlight:s}))))}))})),Lc=a(51);var Ac=Object(n.h)(Object(c.h)((e,{stickerSetId:t})=>({set:Object(d.xb)(e,t),shouldPlay:Object(d.wb)(e)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet"]))(({stickerSetId:e,observeIntersection:t,set:a,shouldPlay:c,loadStickers:r,toggleStickerSet:s,isSomeModalOpen:o,onModalToggle:i})=>{const d=Object(F.a)(),m=a&&Boolean(a.installedDate),u=Boolean(a&&a.stickers),[h,b,g]=Object(xe.a)();Object(Lc.a)(()=>{i(h)},[h,i]);const p=Object(n.p)(()=>{if(!a)return[];const e=(a.covers||[]).map(({id:e})=>e),t=a.stickers?a.stickers.filter(({id:t})=>!e.includes(t)):[];return[...a.covers||[],...t].slice(0,5)},[a]);Object(n.n)(()=>{!u&&p.length<5&&r({stickerSetId:e})},[u,p.length,r,e]);const v=Object(n.m)(()=>{s({stickerSetId:e})},[s,e]);if(!a)return;const E=p.length>0;return n.a.createElement("div",{key:a.id,className:"sticker-set",dir:d.isRtl?"rtl":void 0},n.a.createElement("div",{className:"sticker-set-header"},n.a.createElement("div",{className:"title-wrapper"},n.a.createElement("h3",{className:"title",dir:"auto"},a.title),n.a.createElement("p",{className:"count",dir:"auto"},d("Stickers",a.count,"i"))),n.a.createElement(R.a,{className:m?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:v},d(m?"Stickers.Installed":"Stickers.Install"))),n.a.createElement("div",{className:"sticker-set-main"},!E&&n.a.createElement(L.a,null),E&&p.map(e=>n.a.createElement(ha,{sticker:e,size:l.Ab,observeIntersection:t,noAnimate:!c||h||o,onClick:b}))),E&&n.a.createElement(ga.a,{isOpen:h,fromSticker:p[0],onClose:g}))}));a(300);const Tc=Object(_.g)(e=>e(),6e4,!0);var Rc=Object(n.h)(Object(c.h)(e=>{const t=Object(d.z)(e),{query:a,resultIds:n}=t||{},{featured:c}=e.stickers;return{query:a,featuredIds:c.setIds,resultIds:n}},(e,t)=>Object(u.l)(t,["loadFeaturedStickers"]))(({query:e,featuredIds:t,resultIds:a,loadFeaturedStickers:c})=>{const r=Object(n.q)(null),s=Object(F.a)(),[l,o]=Object(n.r)(!1),{observe:i}=Object(sa.a)({rootRef:r,throttleMs:200});return Object(n.n)(()=>{Tc(()=>{c()})}),n.a.createElement("div",{ref:r,className:"StickerSearch custom-scroll",dir:s.isRtl?"rtl":void 0},function(){if(void 0!==e)return!e&&t?t.map(e=>n.a.createElement(Ac,{key:e,stickerSetId:e,observeIntersection:i,isSomeModalOpen:l,onModalToggle:o})):a?a.length?a.map(e=>n.a.createElement(Ac,{key:e,stickerSetId:e,observeIntersection:i,isSomeModalOpen:l,onModalToggle:o})):n.a.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):n.a.createElement(be.a,null)}())}));a(301);var Dc=Object(n.h)(Object(c.h)(e=>{const t=Object(d.s)(e),{query:a,results:n}=t||{},{chatId:c}=Object(d.y)(e)||{},r=c?Object(d.f)(e,c):void 0;return{query:a,results:n,chat:r,isChatWithBot:r?Object(d.O)(e,r):void 0}},(e,t)=>Object(u.l)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"]))(({query:e,results:t,chat:a,isChatWithBot:c,searchMoreGifs:r,sendMessage:s,setGifSearchQuery:l})=>{const i=Object(n.q)(null),{observe:d}=Object(sa.a)({rootRef:i,debounceMs:300}),{canSendGifs:u}=Object(m.c)(a,c),h=Object(n.m)(e=>{u&&s({gif:e}),o.l&&l({query:void 0})},[u,s,l]),b=Object(F.a)();const g=Boolean(void 0!==e&&t&&t.length);return n.a.createElement("div",{className:"GifSearch",dir:b.isRtl?"rtl":void 0},n.a.createElement(ve.a,{ref:i,className:Object(ce.a)("gif-container custom-scroll",g&&"grid"),items:t,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:r},function(){if(void 0!==e)return t?t.length?t.map(e=>n.a.createElement(bc,{key:e.id,gif:e,observeIntersection:d,onClick:h})):n.a.createElement("p",{className:"helper-text",dir:"auto"},b("NoGIFsFound")):n.a.createElement(be.a,null)}()))}));a(302);var Bc=Object(n.h)(Object(c.h)((e,{answer:t})=>{const{voters:a,offsets:n}=e.pollResults;return{voters:a&&a[t.option],offset:n&&n[t.option]||""}},(e,t)=>Object(u.l)(t,["loadPollOptionResults","openChat","closePollResults"]))(({chat:e,message:t,answer:a,answerVote:c,totalVoters:r,voters:s,offset:l,loadPollOptionResults:o,openChat:i,closePollResults:d})=>{const m=Object(f.a)(c.votersCount),[u,h]=Object(n.r)(!0),b=Boolean(s),{option:g,text:p}=a,v=Object(F.a)();Object(n.n)(()=>{b&&m===c.votersCount||o({chat:e,messageId:t.id,option:g,offset:l,limit:4,shouldResetVoters:!0})},[c.votersCount,b]);const E=Object(n.m)(()=>{h(!0),o({chat:e,messageId:t.id,option:g,offset:l,limit:50})},[e,o,t.id,l,g]);Object(n.n)(()=>{h(!1)},[s]);const O=Object(n.m)(e=>{i({id:e}),d()},[d,i]);return n.a.createElement("div",{className:"PollAnswerResults"},n.a.createElement("div",{className:"poll-voters"},s?s.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable",onClick:()=>O(e)},n.a.createElement(Oe.a,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0}))):n.a.createElement(be.a,null),s&&function(){const e=c.votersCount-s.length;return c.votersCount>4&&e>0&&n.a.createElement(Xt,{count:e,itemName:"voter",isLoading:u,onClick:E})}()),n.a.createElement("div",{className:"answer-head",dir:v.isRtl?"rtl":void 0},n.a.createElement("span",{className:"answer-title",dir:"auto"},p),n.a.createElement("span",{className:"answer-percent",dir:v.isRtl?"auto":void 0},(j=c.votersCount,(C=r)>0?(j/C*100).toFixed():0),"%")));var j,C}));a(303);var xc=Object(n.h)(Object(c.h)(e=>{const{pollResults:{chatId:t,messageId:a},lastSyncTime:n}=e;if(!t||!a)return{};return{chat:Object(d.f)(e,t),message:Object(d.k)(e,t,a),lastSyncTime:n}})(({chat:e,message:t,lastSyncTime:a})=>{const c=Object(F.a)();if(!t||!e)return n.a.createElement(be.a,null);const{summary:r,results:s}=Object(m.H)(t);if(!s.results)return;const l=Object(u.c)(s.results,"option");return n.a.createElement("div",{className:"PollResults",dir:c.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"poll-question",dir:"auto"},r.question),n.a.createElement("div",{className:"poll-results-list custom-scroll"},a&&r.answers.map(a=>n.a.createElement(Bc,{key:`${t.id}-${a.option}`,chat:e,message:t,answer:a,answerVote:l[a.option],totalVoters:s.totalVoters})),!a&&n.a.createElement(be.a,null)))}));a(166);var Uc=Object(n.h)(Object(c.h)((e,{userId:t})=>{const a=Object(d.Gb)(e,t),n=Object(d.f)(e,t),{progress:c}=e.management;return{user:a,chat:n,progress:c}},(e,t)=>Object(u.l)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"]))(({userId:e,user:t,chat:a,progress:c,updateContact:r,deleteUser:l,deleteHistory:o,closeManagement:i,openChat:d})=>{const[m,u,h]=Object(xe.a)(),[b,g]=Object(n.r)(!1),[p,v]=Object(n.r)(),E=Object(F.a)(),O=t&&t.firstName||"",f=t&&t.lastName||"",j=a?a.isMuted:void 0,[C,y]=Object(n.r)(O),[k,N]=Object(n.r)(f),[I,S]=Object(n.r)(!j);Object(n.n)(()=>{S(!j)},[j]),Object(n.n)(()=>{g(!1),h()},[h,e]),Object(n.n)(()=>{y(O),N(f)},[O,f,t]),Object(n.n)(()=>{c===s.f.Complete&&(g(!1),v(void 0),h())},[h,c]);const w=Object(n.m)(e=>{y(e.target.value),g(!0)},[]),P=Object(n.m)(e=>{N(e.target.value),g(!0)},[]),M=Object(n.m)(e=>{S(e.target.checked),g(!0)},[]),A=Object(n.m)(()=>{const t=C.trim(),a=k.trim();t.length||v("Please provide first name"),r({userId:e,isMuted:!I,firstName:t,lastName:a})},[C,k,r,e,I]),T=Object(n.m)(()=>{o({chatId:a.id,shouldDeleteForAll:!1}),l({userId:e}),h(),i(),d({id:void 0})},[a.id,h,i,o,l,d,e]);if(!t)return;const R=c===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),n.a.createElement(pe.a,{id:"user-first-name",label:E("UserInfo.FirstNamePlaceholder"),onChange:w,value:C,error:"Please provide first name"===p?p:void 0}),n.a.createElement(pe.a,{id:"user-last-name",label:E("UserInfo.LastNamePlaceholder"),onChange:P,value:k}),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(aa.a,{checked:I,label:E("Notifications"),subLabel:E(I?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:M}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:u},E("DeleteContact")))),n.a.createElement(qt,{isShown:b,onClick:A,disabled:R,ariaLabel:E("Save")},R?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:m,onClose:h,text:E("AreYouSureDeleteContact"),confirmLabel:E("DeleteContact"),confirmHandler:T,confirmIsDestructive:!0}))}));var Gc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{progress:n}=e.management,c=Boolean(a.fullInfo&&a.fullInfo.linkedChatId);return{chat:a,progress:n,isBasicGroup:Object(m.ib)(a),hasLinkedChannel:c,canChangeInfo:Object(m.q)(a,"changeInfo"),canBanUsers:Object(m.q)(a,"banUsers")}},(e,t)=>Object(u.l)(t,["togglePreHistoryHidden","updateChat","closeManagement","deleteHistory","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isBasicGroup:c,hasLinkedChannel:l,canChangeInfo:o,canBanUsers:i,onScreenSelect:d,togglePreHistoryHidden:u,updateChat:h,deleteHistory:b,leaveChannel:g,deleteChannel:p,closeManagement:E,openChat:O})=>{const[f,j,C]=Object(xe.a)(),y=t.title,k=t.fullInfo&&t.fullInfo.about||"",[N,I]=Object(n.r)(!1),[S,w]=Object(n.r)(y),[P,M]=Object(n.r)(k),[A,T]=Object(n.r)(),[R,D]=Object(n.r)(),x=Object(m.f)(t),U=Object(v.a)(x,!1,r.ApiMediaFormat.BlobUrl),G=Object(F.a)();Object(n.n)(()=>{a===s.f.Complete&&(I(!1),D(void 0))},[a]);const q=Object(n.m)(()=>{d(s.g.ChatPrivacyType)},[d]),z=Object(n.m)(()=>{d(s.g.Discussion)},[d]),H=Object(n.m)(()=>{d(s.g.GroupPermissions)},[d]),$=Object(n.m)(()=>{d(s.g.ChatAdministrators)},[d]),_=Object(n.m)(e=>{T(e),I(!0)},[]),V=Object(n.m)(e=>{w(e.target.value),I(!0)},[]),K=Object(n.m)(e=>{M(e.target.value),I(!0)},[]),W=Object(n.m)(()=>{const t=S.trim(),a=P.trim();t.length?h({chatId:e,title:t,about:a,photo:A}):D("Group title can't be empty")},[P,e,A,S,h]),Y=Object(n.m)(()=>{d(s.g.GroupMembers)},[d]),Z=Object(n.m)(()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;u({chatId:t.id,isEnabled:!e})},[t,u]),Q=Object(n.p)(()=>{if(!t.defaultBannedRights)return 0;let e=["sendMessages","sendMedia","embedLinks","sendPolls","changeInfo","inviteUsers","pinMessages"].filter(e=>!t.defaultBannedRights[e]).length;const{sendStickers:a,sendGifs:n}=t.defaultBannedRights;return a||n||(e+=1),e},[t]),X=t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,J=Object(n.m)(()=>{c?b({chatId:t.id,shouldDeleteForAll:!1}):t.isCreator?p({chatId:t.id}):g({chatId:t.id}),C(),E(),O({id:void 0})},[c,t.isCreator,t.id,C,E,b,g,p,O]);if(t.isRestricted)return;const ee=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:U,onChange:_,disabled:!o}),n.a.createElement(pe.a,{id:"group-title",label:G("GroupName"),onChange:V,value:S,error:"Group title can't be empty"===R?R:void 0,disabled:!o}),n.a.createElement(pe.a,{id:"group-about",className:"mb-2",label:G("DescriptionPlaceholder"),onChange:K,value:P,disabled:!o}),t.isCreator&&n.a.createElement(Ee.a,{icon:"lock",multiline:!0,ripple:!0,onClick:q},n.a.createElement("span",{className:"title"},G("GroupType")),n.a.createElement("span",{className:"subtitle"},t.username?G("TypePublic"):G("TypePrivate"))),l&&n.a.createElement(Ee.a,{icon:"message",multiline:!0,ripple:!0,onClick:z},n.a.createElement("span",{className:"title"},G("LinkedChannel")),n.a.createElement("span",{className:"subtitle"},G("DiscussionUnlink"))),n.a.createElement(Ee.a,{icon:"permissions",multiline:!0,ripple:!0,onClick:H,disabled:!i},n.a.createElement("span",{className:"title"},G("ChannelPermissions")),n.a.createElement("span",{className:"subtitle",dir:"auto"},Q,"/",8)),n.a.createElement(Ee.a,{icon:"admin",multiline:!0,ripple:!0,onClick:$},n.a.createElement("span",{className:"title"},G("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},Object(da.a)(X)))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"group",multiline:!0,ripple:!0,onClick:Y},n.a.createElement("span",{className:"title"},G("GroupMembers")),n.a.createElement("span",{className:"subtitle"},Object(da.a)(t.membersCount))),t.fullInfo&&n.a.createElement("div",{className:"ListItem narrow no-selection"},n.a.createElement(aa.a,{checked:!t.fullInfo.isPreHistoryHidden,label:G("ChatHistory"),onChange:Z,disabled:!i}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},G("DeleteMega")))),n.a.createElement(qt,{isShown:N,onClick:W,disabled:ee,ariaLabel:G("Save")},ee?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:f,onClose:C,textParts:Object(B.a)(c||!t.isCreator?G("AreYouSureDeleteAndExit"):G("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:c||!t.isCreator?G("DeleteMega"):G("DeleteGroupForAll"),confirmHandler:J,confirmIsDestructive:!0}))}));var qc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(d.f)(e,t),currentUserId:e.currentUserId}),(e,t)=>Object(u.l)(t,["updateChatDefaultBannedRights"]))(({onScreenSelect:e,onChatMemberSelect:t,chat:a,currentUserId:c,updateChatDefaultBannedRights:r})=>{const[l,o]=Object(n.r)({}),[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),h=Object(F.a)(),b=Object(n.m)(()=>{e(s.g.GroupRemovedUsers)},[e]),g=Object(n.m)(()=>{e(s.g.GroupUserPermissionsCreate)},[e]),p=Object(n.m)(a=>{t(a.userId,a.promotedByUserId===c),e(s.g.GroupUserPermissions)},[c,t,e]);Object(n.n)(()=>{o(a&&a.defaultBannedRights||{}),d(!1),setTimeout(()=>{u(!1)},250)},[a]);const v=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),d(!0)},[]),E=Object(n.m)(()=>{a&&(u(!0),r({chatId:a.id,bannedRights:l}))},[a,l,r]),O=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.kickedMembers?a.fullInfo.kickedMembers.length:0,[a]),f=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.members?a.fullInfo.members.filter(({bannedRights:e})=>!!e):[],[a]),j=Object(n.m)(e=>{const{bannedRights:t}=e;if(!t||!a)return;const{defaultBannedRights:n}=a;return Object.keys(t).reduce((e,a)=>{if(!t[a]||n&&n[a]||"sendInline"===a||"viewMessages"===a||"sendGames"===a)return e;const c=function(e){switch(e){case"sendMessages":return"UserRestrictionsNoSend";case"sendMedia":return"UserRestrictionsNoSendMedia";case"sendStickers":return"UserRestrictionsNoSendStickers";case"embedLinks":return"UserRestrictionsNoEmbedLinks";case"sendPolls":return"UserRestrictionsNoSendPolls";case"changeInfo":return"UserRestrictionsNoChangeInfo";case"inviteUsers":return"UserRestrictionsInviteUsers";case"pinMessages":return"UserRestrictionsPinMessages";default:return}}(a);if(!c)return e;const r=h(c);return`${e}${e.length?", "+r:r}`},"")},[a,h]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading",dir:"auto"},h("ChannelPermissionsHeader")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMessages",checked:!l.sendMessages,label:h("UserRestrictionsSend"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMedia",checked:!l.sendMedia,label:h("UserRestrictionsSendMedia"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:h("UserRestrictionsSendStickers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendPolls",checked:!l.sendPolls,label:h("UserRestrictionsSendPolls"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"embedLinks",checked:!l.embedLinks,label:h("UserRestrictionsEmbedLinks"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!l.inviteUsers,label:h("UserRestrictionsInviteUsers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!l.pinMessages,label:h("UserRestrictionsPinMessages"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!l.changeInfo,label:h("UserRestrictionsChangeInfo"),blocking:!0,onChange:v}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete-user",multiline:!0,ripple:!0,narrow:!0,onClick:b},n.a.createElement("span",{className:"title"},h("ChannelBlockedUsers")),n.a.createElement("span",{className:"subtitle"},O))),n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading",dir:"auto"},h("PrivacyExceptions")),n.a.createElement(Ee.a,{icon:"add-user",ripple:!0,onClick:g},h("ChannelAddException")),f.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable exceptions-member",ripple:!0,onClick:()=>p(e)},n.a.createElement(Oe.a,{userId:e.userId,status:j(e)}))))),n.a.createElement(qt,{isShown:i,onClick:E,ariaLabel:h("Save"),disabled:m},m?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var zc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{chat:a,usersById:n}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,usersById:t,updateChatMemberBannedRights:a})=>{const c=Object(F.a)(),r=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[],[e]),s=Object(n.m)(e=>{if(!e.kickedByUserId)return;const a=t[e.kickedByUserId];return a?c("UserRemovedBy",Object(m.Z)(a)):void 0},[c,t]),l=Object(n.m)(t=>{if(e)return[{title:c("Unblock"),icon:"delete",destructive:!0,handler:()=>a({chatId:e.id,userId:t.userId,bannedRights:{}})}]},[c,e,a]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",dir:c.isRtl?"rtl":void 0},n.a.createElement("p",{className:"text-muted"},c("NoBlockedGroup2")),r.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:l(e)},n.a.createElement(Oe.a,{userId:e.userId,status:s(e)}))))))}));var Hc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{progress:n}=e.management;return{chat:a,progress:n,isSignaturesShown:Boolean(a&&a.isSignaturesShown),canChangeInfo:Object(m.q)(a,"changeInfo")}},(e,t)=>Object(u.l)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isSignaturesShown:c,canChangeInfo:l,onScreenSelect:o,updateChat:i,toggleSignatures:d,closeManagement:u,leaveChannel:h,deleteChannel:b,openChat:g})=>{const p=t&&t.title||"",E=t&&t.fullInfo&&t.fullInfo.about||"",O=t&&t.fullInfo&&t.fullInfo.linkedChatId,[f,j,C]=Object(xe.a)(),[y,k]=Object(n.r)(!1),[N,I]=Object(n.r)(p),[S,w]=Object(n.r)(E),[P,M]=Object(n.r)(),[A,T]=Object(n.r)(),R=t&&Object(m.f)(t),D=Object(v.a)(R,!1,r.ApiMediaFormat.BlobUrl),B=Object(F.a)();Object(n.n)(()=>{a===s.f.Complete&&(k(!1),T(void 0))},[a]);const x=t&&t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,U=Object(n.m)(()=>{o(s.g.ChatPrivacyType)},[o]),G=Object(n.m)(()=>{o(s.g.Discussion)},[o]),q=Object(n.m)(()=>{o(s.g.ChatAdministrators)},[o]),z=Object(n.m)(e=>{M(e),k(!0)},[]),H=Object(n.m)(e=>{I(e.target.value),k(!0)},[]),$=Object(n.m)(e=>{w(e.target.value),k(!0)},[]),_=Object(n.m)(()=>{const t=N.trim(),a=S.trim();t.length?i({chatId:e,title:t,about:a,photo:P}):T("Channel title can't be empty")},[S,e,P,N,i]),V=Object(n.m)(()=>{d({chatId:e,isEnabled:!c})},[e,c,d]),K=Object(n.m)(()=>{o(s.g.ChannelSubscribers)},[o]),W=Object(n.m)(()=>{t.isCreator?b({chatId:t.id}):h({chatId:t.id}),C(),u(),g({id:void 0})},[t.isCreator,t.id,C,u,h,b,g]);if(t.isRestricted)return;const Y=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:D,onChange:z,disabled:!l}),n.a.createElement(pe.a,{id:"channel-title",label:B("EnterChannelName"),onChange:H,value:N,error:"Channel title can't be empty"===A?A:void 0,disabled:!l}),n.a.createElement(pe.a,{id:"channel-about",className:"mb-2",label:B("DescriptionPlaceholder"),onChange:$,value:S,disabled:!l}),t.isCreator&&n.a.createElement(Ee.a,{icon:"lock",ripple:!0,multiline:!0,onClick:U},n.a.createElement("span",{className:"title"},B("ChannelType")),n.a.createElement("span",{className:"subtitle"},t.username?B("TypePublic"):B("TypePrivate"))),n.a.createElement(Ee.a,{icon:"message",multiline:!0,ripple:!0,onClick:G,disabled:!l},n.a.createElement("span",{className:"title"},B("Discussion")),n.a.createElement("span",{className:"subtitle"},B(O?"DiscussionUnlink":"Add"))),n.a.createElement(Ee.a,{icon:"admin",multiline:!0,ripple:!0,onClick:q},n.a.createElement("span",{className:"title"},B("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},x)),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(aa.a,{checked:c,label:B("ChannelSignMessages"),onChange:V}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"group",multiline:!0,ripple:!0,onClick:K},n.a.createElement("span",{className:"title",dir:"auto"},B("ChannelSubscribers")),n.a.createElement("span",{className:"subtitle",dir:"auto"},B("Subscribers",t.membersCount,"i")))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},t.isCreator?B("ChannelDelete"):B("LeaveChannel")))),n.a.createElement(qt,{isShown:y,onClick:_,disabled:Y,ariaLabel:B("Save")},Y?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:f,onClose:C,text:t.isCreator?B("ChannelDeleteAlert"):B("ChannelLeaveAlert"),confirmLabel:t.isCreator?B("ChannelDelete"):B("LeaveChannel"),confirmHandler:W,confirmIsDestructive:!0}))})),$c=a(57);var _c=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{isUsernameAvailable:n}=Object(d.Z)(e,t);return{chat:a,isChannel:Object(m.jb)(a),progress:e.management.progress,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"]))(({chat:e,isChannel:t,progress:a,isUsernameAvailable:c,checkPublicLink:r,updatePublicLink:l,updatePrivateLink:o})=>{const i=Boolean(e.username),d=e.fullInfo&&e.fullInfo.inviteLink,[m,u]=Object(n.r)(i?"public":"private"),[h,b]=Object(n.r)(),[g,p,v]=Object(xe.a)(),E="public"===m&&h&&c||"private"===m&&i;Object(n.n)(()=>{m&&!d&&o()},[m,d,o]);const O=Object(n.m)(e=>{u(e)},[]),f=Object(n.m)(()=>{l({username:"public"===m?h:""})},[m,l,h]),j=Object(n.m)(()=>{v(),o()},[v,o]),C=Object(F.a)(),y=t?"Channel":"Mega",k=t?"Channel":"Group",N=[{value:"private",label:C(y+"Private"),subLabel:C(y+"PrivateInfo")},{value:"public",label:C(y+"Public"),subLabel:C(y+"PublicInfo")}],I=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",dir:C.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading"},C(k+"Type")),n.a.createElement(oa.a,{selected:m,name:"channel-type",options:N,onChange:O})),"private"===m?n.a.createElement("div",{className:"section",dir:C.isRtl?"rtl":void 0},d?n.a.createElement(n.a.Fragment,null,n.a.createElement($c.a,{url:d,className:"group-link",text:d}),n.a.createElement("p",{className:"section-info",dir:C.isRtl?"rtl":void 0},C(y+"PrivateLinkHelp")),n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:p},C("RevokeLink")),n.a.createElement(we.a,{isOpen:g,onClose:v,text:C("RevokeAlert"),confirmLabel:C("RevokeButton"),confirmHandler:j,confirmIsDestructive:!0})):n.a.createElement(be.a,null)):n.a.createElement("div",{className:"section no-border"},n.a.createElement(_t,{asLink:!0,currentUsername:e.username,isLoading:I,isUsernameAvailable:c,checkUsername:r,onChange:b}),n.a.createElement("p",{className:"section-info",dir:"auto"},C(k+".Username.CreatePublicLinkHelp")))),n.a.createElement(qt,{isShown:E,disabled:I,ariaLabel:C("Save"),onClick:f},I?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var Vc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{forDiscussionIds:n,byId:c}=e.chats;return{chat:a,chatsByIds:c,forDiscussionIds:n,linkedChat:a&&a.fullInfo&&a.fullInfo.linkedChatId?Object(d.f)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&Object(m.jb)(a)}},(e,t)=>Object(u.l)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"]))(({chat:e,chatId:t,chatsByIds:a,linkedChat:c,forDiscussionIds:r,isChannel:o,onScreenSelect:i,loadGroupsForDiscussion:d,linkDiscussionGroup:m,unlinkDiscussionGroup:u})=>{const[h,b]=Object(n.r)(),[g,p]=Object(n.r)(),[v,E]=Object(n.r)(!1),O=Object(n.m)(()=>E(!0),[]),[f,j,C]=Object(xe.a)(),[y,k,N]=Object(xe.a)(),I=Object(F.a)(),S=c&&c.id;Object(n.n)(()=>{d()},[d]),Object(n.n)(()=>{g||Object(Wt.a)("DiscussionGroups").then(p)},[g]);const w=Object(n.m)(()=>{C(),u({channelId:o?t:S}),o||i(s.g.Initial)},[C,u,o,t,S,i]),P=Object(n.m)(()=>{N(),m({channelId:t,chatId:h})},[N,m,t,h]);function M(){const e=a[h];if(e)return n.a.createElement("div",{className:"modal-header"},n.a.createElement(x.a,{size:"tiny",chat:e}),n.a.createElement("div",{className:"modal-title"},I("Channel.DiscussionGroup.LinkGroup")))}function L(){const t=a[h];if(t)return t.hasPrivateLink?Object(B.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):Object(B.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?\n\nAnyone from the channel will be able to see messages in this group.`,["br","simple_markdown"])}return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("div",{className:"section-icon"},g&&n.a.createElement(Yt.a,{id:"discussionGroupsDucks",size:l.sb,animationData:g,play:v,noLoop:!0,onLoad:O})),c&&n.a.createElement("div",null,n.a.createElement(Ee.a,{className:"chat-item-clickable",inactive:!0},n.a.createElement(fe.a,{chatId:c.id})),n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),n.a.createElement(we.a,{isOpen:f,onClose:C,header:n.a.createElement("div",{className:"modal-header"},n.a.createElement(x.a,{size:"tiny",chat:c}),n.a.createElement("div",{className:"modal-title"},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:Object(B.a)(I(o?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",c.title),["br","simple_markdown"]),confirmLabel:I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:w,confirmIsDestructive:!0})),!c&&n.a.createElement("div",null,n.a.createElement("p",{className:"section-help",dir:"auto"},I("DiscussionChannelHelp")),n.a.createElement("div",{teactFastList:!0},n.a.createElement(Ee.a,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},I("DiscussionCreateGroup")),r?r.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{b(e),k()}},n.a.createElement(fe.a,{chatId:e}))):n.a.createElement(tt.a,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),n.a.createElement("p",{className:"mt-4 mb-0 section-help",dir:"auto"},I("DiscussionChannelHelp2")),n.a.createElement(we.a,{isOpen:y,onClose:N,header:M(),textParts:L(),confirmLabel:I("DiscussionLinkGroup"),confirmHandler:P,isButtonsInOneRow:!0})))))}));var Kc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(d.f)(e,t);return{chat:n,isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,selectedChatMemberId:t,onScreenSelect:a,updateChatMemberBannedRights:c,isFormFullyDisabled:r})=>{const[l,o]=Object(n.r)({}),[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),[h,b,g]=Object(xe.a)(),p=Object(F.a)(),v=Object(n.p)(()=>{if(e&&e.fullInfo&&e.fullInfo.members)return e.fullInfo.members.find(({userId:e})=>e===t)},[e,t]);Object(n.n)(()=>{e&&e.fullInfo&&t&&!v&&a(s.g.GroupPermissions)},[e,a,v,t]),Object(n.n)(()=>{o(v&&v.bannedRights||e&&e.defaultBannedRights||{}),d(!1),u(!1)},[e,v]);const E=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),d(!0)},[]),O=Object(n.m)(()=>{e&&t&&(u(!0),c({chatId:e.id,userId:t,bannedRights:l}))},[e,t,l,c]),f=Object(n.m)(()=>{e&&t&&c({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})},[e,t,c]),j=Object(n.m)(t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t],[e,r]);if(v)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(Oe.a,{userId:v.userId})),n.a.createElement("h3",{className:"section-heading mt-4",dir:"auto"},p("UserRestrictionsCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMessages",checked:!l.sendMessages,label:p("UserRestrictionsSend"),blocking:!0,disabled:j("sendMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMedia",checked:!l.sendMedia,label:p("UserRestrictionsSendMedia"),blocking:!0,disabled:j("sendMedia"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:p("UserRestrictionsSendStickers"),blocking:!0,disabled:j("sendStickers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendPolls",checked:!l.sendPolls,label:p("UserRestrictionsSendPolls"),blocking:!0,disabled:j("sendPolls"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"embedLinks",checked:!l.embedLinks,label:p("UserRestrictionsEmbedLinks"),blocking:!0,disabled:j("embedLinks"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!l.inviteUsers,label:p("UserRestrictionsInviteUsers"),blocking:!0,disabled:j("inviteUsers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!l.pinMessages,label:p("UserRestrictionsPinMessages"),blocking:!0,disabled:j("pinMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!l.changeInfo,label:p("UserRestrictionsChangeInfo"),blocking:!0,disabled:j("changeInfo"),onChange:E}))),!r&&n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete-user",ripple:!0,destructive:!0,onClick:b},p("UserRestrictionsBlock")))),n.a.createElement(qt,{isShown:i,onClick:O,ariaLabel:p("Save"),disabled:m},m?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:h,onClose:g,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:f,confirmIsDestructive:!0}))}));var Wc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{chat:a,currentUserId:e.currentUserId,isChannel:Object(m.jb)(a),usersById:n}})(({chat:e,isChannel:t,currentUserId:a,usersById:c,onScreenSelect:r,onChatMemberSelect:l})=>{const o=Object(F.a)();const i=Object(n.p)(()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),d=Object(n.m)(e=>{l(e.userId,e.promotedByUserId===a),r(s.g.ChatAdminRights)},[a,l,r]),u=Object(n.m)(e=>{if(e.isOwner)return o("ChannelCreator");const t=e.promotedByUserId?c[e.promotedByUserId]:void 0;return t?o("EditAdminPromotedBy",Object(m.Z)(t)):o("ChannelAdmin")},[o,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"recent",multiline:!0,ripple:!0,onClick:function(){r(s.g.GroupRecentActions)}},n.a.createElement("span",{className:"title"},o("EventLog")),n.a.createElement("span",{className:"subtitle"},o(t?"EventLogInfoDetailChannel":"EventLogInfoDetail")))),n.a.createElement("div",{className:"section",dir:o.isRtl?"rtl":void 0},n.a.createElement("p",{className:"text-muted",dir:"auto"},t?"You can add administrators to help you manage your channel.":"You can add administrators to help you manage your group."),i.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,onClick:()=>d(e)},n.a.createElement(Oe.a,{userId:e.userId,status:u(e),forceShowSelf:!0}))))))}));var Yc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(d.f)(e,t)}))(({chat:e})=>{const t=Object(F.a)(),a=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),c=Object(n.m)(e=>e.isOwner?t("ChannelCreator"):t("ChannelAdmin"),[t]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section not-implemented",dir:t.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading",dir:"auto"},"Actions"),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogAllEvents"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewAdmins"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewMembers"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterChannelInfo"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterDeletedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterEditedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterLeavingMembers"),onChange:void 0}))),n.a.createElement("div",{className:"section not-implemented",dir:t.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading",dir:"auto"},t("Channel.Management.Title")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogAllAdmins"),onChange:void 0})),a.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},n.a.createElement(aa.a,{label:"",checked:!0}),n.a.createElement(Oe.a,{userId:e.userId,status:c(e),forceShowSelf:!0}))))))}));var Zc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(d.f)(e,t),{byId:c}=e.users,{currentUserId:r}=e;return{chat:n,usersById:c,currentUserId:r,isChannel:Object(m.jb)(n),isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatAdmin"]))(({selectedChatMemberId:e,onScreenSelect:t,chat:a,usersById:c,currentUserId:r,isChannel:l,isFormFullyDisabled:o,updateChatAdmin:i})=>{const[d,u]=Object(n.r)({}),[h,b]=Object(n.r)(!1),[g,p]=Object(n.r)(!1),[v,E,O]=Object(xe.a)(),[f,j]=Object(n.r)(""),C=Object(F.a)(),y=Object(n.p)(()=>{if(a.fullInfo&&a.fullInfo.adminMembers)return a.fullInfo.adminMembers.find(({userId:t})=>t===e)},[a,e]);Object(n.n)(()=>{a&&a.fullInfo&&e&&!y&&t(s.g.ChatAdministrators)},[a,t,y,e]),Object(n.n)(()=>{u(y&&y.adminRights||{}),j((y&&y.customTitle||"").substr(0,16)),b(!1),p(!1)},[y]);const k=Object(n.m)(e=>{const{name:t}=e.target;u(e=>{return{...e,[t]:(a=e[t],!a||void 0)};var a}),b(!0)},[]),N=Object(n.m)(()=>{e&&(p(!0),i({chatId:a.id,userId:e,adminRights:d,customTitle:f}))},[a,e,d,f,i]),I=Object(n.m)(()=>{e&&(i({chatId:a.id,userId:e,adminRights:{}}),O())},[a.id,O,e,i]),S=Object(n.m)(e=>!Object(m.ib)(a)&&(!(!o&&a.adminRights)||!a.adminRights[e]),[a,o]),w=Object(n.p)(()=>{if(!y)return;if(y.isOwner)return C("ChannelCreator");const e=y.promotedByUserId?c[y.promotedByUserId]:void 0;return e?C("EditAdminPromotedBy",Object(m.Z)(e)):C("ChannelAdmin")},[y,c,C]),P=Object(n.m)(e=>{const{value:t}=e.target;j(t),b(!0)},[]);if(y)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(Oe.a,{userId:y.userId,status:w,forceShowSelf:!0})),n.a.createElement("h3",{className:"section-heading mt-4",dir:"auto"},C("EditAdminWhatCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!!d.changeInfo,label:C(l?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:S("changeInfo"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"postMessages",checked:!!d.postMessages,label:C("EditAdminPostMessages"),blocking:!0,disabled:S("postMessages"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"editMessages",checked:!!d.editMessages,label:C("EditAdminEditMessages"),blocking:!0,disabled:S("editMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"deleteMessages",checked:!!d.deleteMessages,label:C(l?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:S("deleteMessages"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"banUsers",checked:!!d.banUsers,label:C("EditAdminBanUsers"),blocking:!0,disabled:S("banUsers"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!!d.inviteUsers,label:C("EditAdminAddUsers"),blocking:!0,disabled:S("inviteUsers"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!!d.pinMessages,label:C("EditAdminPinMessages"),blocking:!0,disabled:S("pinMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"addAdmins",checked:!!d.addAdmins,label:C("EditAdminAddAdmins"),blocking:!0,disabled:S("addAdmins"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"anonymous",checked:!!d.anonymous,label:C("EditAdminSendAnonymously"),blocking:!0,disabled:S("anonymous"),onChange:k})),o&&n.a.createElement("p",{className:"section-info mb-4",dir:"auto"},C("Channel.EditAdmin.CannotEdit")),!l&&n.a.createElement(pe.a,{id:"admin-title",label:C("EditAdminRank"),onChange:P,value:f,disabled:o,maxLength:16}),r!==e&&!o&&n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:E},C("EditAdminRemoveAdmin")))),n.a.createElement(qt,{isShown:h,onClick:N,ariaLabel:C("Save"),disabled:g},g?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:v,onClose:O,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:I,confirmIsDestructive:!0}))}));var Qc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(m.jb)(a)}},(e,t)=>Object(u.l)(t,["openUserInfo"]))(({members:e,usersById:t,isChannel:a,openUserInfo:c})=>{const r=Object(n.p)(()=>{if(e&&t)return Object(m.Eb)(e.map(({userId:e})=>e),t)},[e,t]),s=Object(n.m)(e=>{c({id:e})},[c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},r?r.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>s(e)},n.a.createElement(Oe.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(tt.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Xc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(m.jb)(a)}})(({usersById:e,members:t,isChannel:a,onScreenSelect:c,onChatMemberSelect:r})=>{const l=Object(n.p)(()=>{if(t&&e)return Object(m.Eb)(t.filter(e=>!e.isOwner).map(({userId:e})=>e),e)},[t,e]),o=Object(n.m)(e=>{r(e),c(s.g.GroupUserPermissions)},[r,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},l?l.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>o(e)},n.a.createElement(Oe.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(tt.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Jc=Object(n.h)(Object(c.h)(e=>({managementType:Object(d.u)(e)}))(({chatId:e,currentScreen:t,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r,onChatMemberSelect:l,managementType:o})=>{switch(t){case s.g.Initial:switch(o){case"user":return n.a.createElement(Uc,{key:e,userId:e});case"group":return n.a.createElement(Gc,{key:e,chatId:e,onScreenSelect:r});case"channel":return n.a.createElement(Hc,{key:e,chatId:e,onScreenSelect:r})}break;case s.g.ChatPrivacyType:return n.a.createElement(_c,{chatId:e});case s.g.Discussion:return n.a.createElement(Vc,{chatId:e,onScreenSelect:r});case s.g.GroupPermissions:return n.a.createElement(qc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRemovedUsers:return n.a.createElement(zc,{chatId:e});case s.g.GroupUserPermissionsCreate:return n.a.createElement(Xc,{chatId:e,onChatMemberSelect:l,onScreenSelect:r});case s.g.GroupUserPermissions:return n.a.createElement(Kc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChatAdministrators:return n.a.createElement(Wc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRecentActions:return n.a.createElement(Yc,{chatId:e});case s.g.ChatAdminRights:return n.a.createElement(Zc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChannelSubscribers:case s.g.GroupMembers:return n.a.createElement(Qc,{chatId:e})}}));const er={USD:"$",EUR:"€",GBP:"£",JPY:"¥",RUB:"₽",UAH:"₴",INR:"₹",AED:"د.إ"};function tr(e){return e&&er[e]||""}const ar=/^4[0-9]{12}(?:[0-9]{1,3})?$/,nr=/^5[1-5][0-9]{11,14}$/,cr=/^2[2-7][0-9]{11,14}$/;let rr;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(rr||(rr={}));const sr={[rr.Default]:"",[rr.Visa]:"visa",[rr.Mastercard]:"mastercard"};function lr(e){return e=e.replace(/\s/g,""),ar.test(e)?rr.Visa:nr.test(e)||cr.test(e)?rr.Mastercard:rr.Default}var or=a(60);const ir={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},dr=(e,t)=>{switch(t.type){case"changeAddress1":return{...e,streetLine1:t.payload,formErrors:{...e.formErrors,streetLine1:void 0}};case"changeAddress2":return{...e,streetLine2:t.payload,formErrors:{...e.formErrors,streetLine2:void 0}};case"changeCity":return{...e,city:t.payload,formErrors:{...e.formErrors,city:void 0}};case"changeState":return{...e,state:t.payload,formErrors:{...e.formErrors,state:void 0}};case"changeCountry":return{...e,countryIso2:t.payload,billingCountry:mr(t.payload),formErrors:{...e.formErrors,countryIso2:void 0}};case"changePostCode":return{...e,postCode:t.payload,formErrors:{...e.formErrors,postCode:void 0}};case"changeFullName":return{...e,fullName:t.payload,formErrors:{...e.formErrors,fullName:void 0}};case"changeEmail":return{...e,email:t.payload,formErrors:{...e.formErrors,email:void 0}};case"changePhone":return{...e,phone:t.payload,formErrors:{...e.formErrors,phone:void 0}};case"changeShipping":return{...e,shipping:t.payload};case"changeCardNumber":return{...e,cardNumber:t.payload,formErrors:{...e.formErrors,cardNumber:void 0}};case"changeCardholder":return{...e,cardholder:t.payload,formErrors:{...e.formErrors,cardholder:void 0}};case"changeExpiryDate":return{...e,expiry:t.payload,formErrors:{...e.formErrors,expiry:void 0}};case"changeCvvCode":return{...e,cvv:t.payload,formErrors:{...e.formErrors,cvv:void 0}};case"changeBillingCountry":return{...e,billingCountry:t.payload,formErrors:{...e.formErrors,billingCountry:void 0}};case"changeBillingZip":return{...e,billingZip:t.payload,formErrors:{...e.formErrors,billingZip:void 0}};case"changeSaveInfo":return{...e,saveInfo:t.payload};case"changeSaveCredentials":return{...e,saveCredentials:t.payload};case"updateUserInfo":return t.payload.countryIso2?{...e,...t.payload,billingCountry:mr(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function mr(e){const t=xt.a.find(({id:t})=>t===e);return t?t.name:""}function ur(e,t=400){Object(n.n)(()=>{o.l||setTimeout(()=>{Object(_.b)(()=>{e.current&&e.current.focus()})},t)},[e,t])}var hr=Object(n.h)(e=>{const{id:t,value:a,label:c,hasArrow:r,error:s,ref:l,placeholder:o,onChange:i,children:d}=e,m=s||c,u=Object(ce.a)("input-group",a&&"touched",s&&"error",m&&"with-label",r&&"with-arrow","input-group");return n.a.createElement("div",{className:u},n.a.createElement("select",{className:"form-control",id:t,value:a||"",onChange:i,placeholder:o||c,ref:l},d),m&&t&&n.a.createElement("label",{htmlFor:t},m))});a(304);var br=Object(n.h)(({state:e,needEmail:t,needPhone:a,needName:c,needAddress:r,dispatch:s})=>{const l=Object(n.q)(null),o=Object(n.q)(null),i=Object(n.q)(null);Object(n.n)(()=>{i.current&&i.current.value!==e.countryIso2&&(i.current.value=e.countryIso2)},[e.countryIso2]);const d=Object(F.a)();ur(l);const m=Object(n.m)(e=>{s({type:"changeAddress1",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeAddress2",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeCity",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeState",payload:e.target.value})},[s]),g=Object(n.m)(e=>{s({type:"changeCountry",payload:e.target.value})},[s]),p=Object(n.m)(e=>{s({type:"changePostCode",payload:e.target.value})},[s]),v=Object(n.m)(e=>{s({type:"changeFullName",payload:e.target.value})},[s]),E=Object(n.m)(e=>{s({type:"changeEmail",payload:e.target.value})},[s]),O=Object(n.m)(e=>{let{value:t}=e.target;t="+"+t.replace(/\D/g,""),o.current&&(o.current.value=t),s({type:"changePhone",payload:t})},[s]),f=Object(n.m)(e=>{s({type:"changeSaveInfo",payload:e.target.value})},[s]),{formErrors:j}=e;return n.a.createElement("div",{className:"ShippingInfo"},n.a.createElement("form",null,r?n.a.createElement("div",null,n.a.createElement("h5",null,d("PaymentShippingAddress")),n.a.createElement(pe.a,{ref:l,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:j.streetLine1}),n.a.createElement(pe.a,{label:"Address2 (Street)",onChange:u,value:e.streetLine2,inputMode:"text",error:j.streetLine2}),n.a.createElement(pe.a,{label:"City",onChange:h,value:e.city,inputMode:"text",error:j.city}),n.a.createElement(pe.a,{label:"State",onChange:b,value:e.state,inputMode:"text",error:j.state}),n.a.createElement(hr,{label:"Country",placeholder:"Country",onChange:g,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:j.countryIso2,ref:i},xt.a.map(({name:e,id:t})=>n.a.createElement("option",{value:t,className:"county-item"},e))),n.a.createElement(pe.a,{label:"Post Code",onChange:p,value:e.postCode,inputMode:"text",error:j.postCode})):void 0,c||t||a?n.a.createElement("h5",null,d("PaymentShippingReceiver")):void 0,c&&n.a.createElement(pe.a,{label:"Full name",onChange:v,value:e.fullName,inputMode:"text",error:j.fullName}),t&&n.a.createElement(pe.a,{label:"Email",onChange:E,value:e.email,inputMode:"email",error:j.email}),a&&n.a.createElement(pe.a,{label:"Phone number",onChange:O,value:e.phone,inputMode:"tel",error:j.phone,ref:o}),n.a.createElement(aa.a,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:f})))});a(305);var gr=Object(n.h)(({state:e,shippingOptions:t,currency:a,dispatch:c})=>{Object(n.n)(()=>{t&&!e.shipping&&c({type:"changeShipping",payload:t[0].id})},[t,e.shipping,c]);const r=Object(n.m)(e=>{c({type:"changeShipping",payload:e})},[c]),s=Object(n.p)(()=>t.map(({id:e,title:t,amount:n})=>({label:t,subLabel:`${a} ${String(n/100)}`,value:e})),[t,a]);return n.a.createElement("div",{className:"Shipping"},n.a.createElement("form",null,n.a.createElement("p",null,"Select shipping method"),n.a.createElement(oa.a,{name:"shipping-options",options:s,onChange:r,selected:e.shipping})))});a(306);function pr(e,t,a,c=!1){return n.a.createElement("div",{className:"price-info-item "+(c?"price-info-item-main":"")},n.a.createElement("div",{className:"title"},e),n.a.createElement("div",{className:"value"},`${a||""} ${(t/100).toFixed(2)}`))}function vr(e,t,a){return n.a.createElement("div",{className:"checkout-info-item"},n.a.createElement("i",{className:e}," "),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},t),n.a.createElement("p",{className:"data"},a)))}var Er=Object(n.h)(({invoiceContent:e,prices:t,shippingPrices:a,checkoutInfo:c,currency:r,totalPrice:s})=>{const{photoUrl:l,title:o,text:i}=e||{},{paymentMethod:d,paymentProvider:m,shippingAddress:u,name:h,phone:b,shippingMethod:g}=c||{};return n.a.createElement("div",{className:"Checkout"},n.a.createElement("div",{className:"description has-image"},l&&n.a.createElement("img",{src:l,alt:""}),n.a.createElement("div",{className:"text"},n.a.createElement("h5",null,o),n.a.createElement("p",null,i))),n.a.createElement("div",{className:"price-info"},t&&t.map(e=>pr(e.label,e.amount,r,!1)),a&&a.map(e=>pr(e.label,e.amount,r,!1)),void 0!==s&&pr("Total",s,r,!0)),n.a.createElement("div",{className:"invoice-info"},d&&vr("icon-card",d,"Payment method"),m&&vr("stripe-provider",m,"Payment provider"),u&&vr("icon-location",u,"Shipping address"),h&&vr("icon-user",h,"Name"),b&&vr("icon-phone",b,"Phone number"),g&&vr("icon-truck",g,"Shipping method")))});var Or=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null),r=Object(n.m)(t=>{if("Backspace"===t.key&&"/"===e.charAt(e.length-1)){const t=e.slice(0,e.length-1);c.current&&(c.current.value=t)}},[e]),s=Object(n.m)(e=>{a(function(e){const t=(e=e.replace(/[^\d]/g,"").slice(0,4)).match(/.{1,2}/g);return t&&t[0]&&Number(t[0])>12&&(t[0]="12"),t&&t[0]&&2===t[0].length&&!t[1]&&(t[1]=""),t?t.join("/"):""}(e.target.value))},[a]);return n.a.createElement(pe.a,{label:"Expiry date",ref:c,onChange:s,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}),fr=(a(307),a.p+"mastercard.4216118edafe23cc2dec7b8807ba4622.svg"),jr=a.p+"visa.e5a7c336e1deb4b92a636e2e053878c4.svg";var Cr=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null);ur(c);const[r,s]=Object(n.r)(rr.Default);Object(n.n)(()=>{const t=lr(e);s(t)},[]);const l=Object(n.m)(e=>{const t=function(e){const t=(e=e.replace(/[^\d]/g,"")).match(/.{1,4}/g);return t?t.join(" "):""}(e.target.value),n=lr(e.target.value);s(n),a(t),c.current&&(c.current.value=t)},[a,c]),o=function(e){switch(e){case rr.Mastercard:return n.a.createElement("img",{src:fr,alt:""});case rr.Visa:return n.a.createElement("img",{src:jr,alt:""});default:return}}(r);return n.a.createElement("div",{className:"CardInput"},n.a.createElement("span",{className:"left-addon"},o),n.a.createElement(pe.a,{ref:c,label:"Card number",onChange:l,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))});a(308);var yr=Object(n.h)(({state:e,canSaveCredentials:t,needCardholderName:a,needCountry:c,needZip:r,dispatch:s})=>{const l=Object(n.q)(null);Object(n.n)(()=>{l.current&&l.current.value!==e.billingCountry&&(l.current.value=e.billingCountry)},[e.billingCountry]);const o=Object(n.m)(e=>{s({type:"changeCardNumber",payload:e})},[s]),i=Object(n.m)(e=>{s({type:"changeCardholder",payload:e.target.value.toUpperCase()})},[s]),d=Object(n.m)(e=>{s({type:"changeExpiryDate",payload:e})},[s]),m=Object(n.m)(e=>{s({type:"changeCvvCode",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeBillingCountry",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeBillingZip",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeSaveCredentials",payload:e.target.value})},[s]),g=Object(F.a)(),{formErrors:p={}}=e;return n.a.createElement("div",{className:"PaymentInfo"},n.a.createElement("form",null,n.a.createElement("h5",null,g("PaymentCardTitle")),n.a.createElement(Cr,{onChange:o,value:e.cardNumber,error:p.cardNumber}),a&&n.a.createElement(pe.a,{label:"Name on card",onChange:i,value:e.cardholder,inputMode:"text",error:p.cardholder}),n.a.createElement("section",{className:"inline-inputs"},n.a.createElement(Or,{value:e.expiry,onChange:d,error:p.expiry}),n.a.createElement(pe.a,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:p.cvv})),c||r?n.a.createElement("h5",null,g("PaymentBillingAddress")):void 0,c&&n.a.createElement(hr,{label:"Country",placeholder:"Country",onChange:u,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:p.billingCountry,ref:l},xt.a.map(({name:e})=>n.a.createElement("option",{value:e,className:"county-item"},e))),r&&n.a.createElement(pe.a,{label:"Post Code",onChange:h,value:e.billingZip,inputMode:"text",error:p.billingZip}),t&&n.a.createElement(aa.a,{label:g("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:b})))});a(187);var kr=Object(n.h)(Object(c.h)(e=>{const{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,invoice:r,invoiceContent:s,nativeProvider:l,nativeParams:o,passwordMissing:i,error:d}=e.payment,m=Boolean(r&&(!l||"stripe"!==l)),{needCardholderName:u,needCountry:h,needZip:b}=o||{},{nameRequested:g,phoneRequested:p,emailRequested:v,shippingAddressRequested:E,flexible:O,phoneToProvider:f,emailToProvider:j,currency:C,prices:y}=r||{};return{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,nativeProvider:l,passwordMissing:i,nameRequested:g,shippingAddressRequested:E,phoneRequested:p,emailRequested:v,flexible:O,phoneToProvider:f,emailToProvider:j,currency:C,prices:y,isProviderError:m,invoiceContent:s,needCardholderName:u,needCountry:h,needZip:b,error:d,globalErrors:e.errors}},(e,t)=>Object(u.l)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"]))(({isOpen:e,onClose:t,step:a,shippingOptions:c,savedInfo:r,canSaveCredentials:l,nameRequested:o,shippingAddressRequested:i,phoneRequested:d,emailRequested:m,phoneToProvider:u,emailToProvider:h,currency:b,passwordMissing:g,isProviderError:p,invoiceContent:v,nativeProvider:E,prices:O,needCardholderName:f,needCountry:j,needZip:C,error:y,globalErrors:k,validateRequestedInfo:N,sendPaymentForm:I,setPaymentStep:S,sendCredentialsInfo:w,clearPaymentError:P})=>{const[M,A]=It(dr,ir),D=tr(b),[B,x]=Object(n.r)(!1),U=Object(F.a)();Object(n.n)(()=>{(a||y||k)&&x(!1)},[a,y,k]),Object(n.n)(()=>{if(y&&y.field)A({type:"setFormErrors",payload:{[y.field]:y.fieldError}});else if(k&&k.length){const e=Object(or.a)(k);A({type:"setFormErrors",payload:{...e}})}},[y,k,A]),Object(n.n)(()=>{if(r){const{name:e,phone:t,email:a,shippingAddress:n}=r;A({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?"+"+t:t,email:a,...n||{}}})}},[r,A]);const G=Object(n.m)(()=>{P()},[P]),q=Object(n.p)(()=>a!==s.i.Checkout?0:function(e=[],t,a){const n=t?Ir(t,a):[];let c=0;const r=e.concat(n||[]);return c=r.reduce((e,t)=>e+t.amount,c),c}(O,c,M.shipping),[a,M.shipping,O,c]),z=Object(n.p)(()=>{if(a===s.i.Checkout)return function(e,t,a){const n=`${function(e){const t=lr(e);return sr[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,c=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:r,fullName:s}=e,l=t?Nr(t,e.shipping):void 0,o=l?l.title:void 0;return{paymentMethod:n,paymentProvider:a,shippingAddress:c,name:s,phone:r,shippingMethod:o}}(M,c,E||"")},[a,M,c,E]);const H=Object(n.m)(()=>{const{saveInfo:e}=M,t=function(e){const{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s,fullName:l,phone:o,email:i}=e;return{name:l,phone:o,email:i,shippingAddress:{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s}}}(M);N({requestInfo:t,saveInfo:e})},[N,M]),$=Object(n.m)(()=>{const e=function(e){const{cardNumber:t,cardholder:a,expiry:n,cvv:c,billingCountry:r,billingZip:s}=e,[l,o]=n.split("/");return{data:{cardNumber:t,cardholder:a,expiryMonth:l,expiryYear:o,cvv:c,country:r,zip:s}}}(M);w({credentials:e})},[w,M]),_=Object(n.m)(()=>{I({shippingOptionId:M.shipping,saveCredentials:M.saveCredentials})},[I,M]),V=Object(n.m)(e=>{S({step:e})},[S]),K=Object(n.m)(()=>{switch(x(!0),a){case s.i.ShippingInfo:return H();case s.i.Shipping:return V(s.i.PaymentInfo);case s.i.PaymentInfo:return $();case s.i.Checkout:return _();default:return()=>{}}},[a,H,V,$,_]),W=Object(n.p)(()=>{switch(a){case s.i.ShippingInfo:return U("PaymentShippingInfo");case s.i.Shipping:return U("PaymentShippingMethod");case s.i.PaymentInfo:return U("PaymentCardInfo");case s.i.Checkout:return U("PaymentCheckout");default:return""}},[a,U]),Y=Object(n.p)(()=>{switch(a){case s.i.Checkout:return U("Checkout.PayPrice",`${D}${(q/100).toFixed(2)}`);default:return U("Next")}},[a,U,D,q]);return p?n.a.createElement(ge.a,{className:"error",isOpen:e,onClose:t},n.a.createElement("p",null,"Sorry, Telegram T doesn't support payments with this provider yet. ",n.a.createElement("br",null),"Please use one of our mobile apps to do this."),n.a.createElement(R.a,{isText:!0,onClick:t},U("OK"))):n.a.createElement(ge.a,{className:"PaymentModal",isOpen:e,onClose:t},n.a.createElement("div",{className:"header",dir:U.isRtl?"rtl":void 0},n.a.createElement(R.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null,W)),void 0!==a?n.a.createElement(T.a,{name:"slide",activeKey:a},()=>n.a.createElement("div",{className:"content custom-scroll"},function(e){switch(e){case s.i.ShippingInfo:return n.a.createElement(br,{state:M,dispatch:A,needAddress:Boolean(i),needEmail:Boolean(m||h),needPhone:Boolean(d||u),needName:Boolean(o)});case s.i.Shipping:return n.a.createElement(gr,{state:M,dispatch:A,shippingOptions:c||[],currency:D});case s.i.PaymentInfo:return n.a.createElement(yr,{state:M,dispatch:A,canSaveCredentials:Boolean(!g&&l),needCardholderName:f,needCountry:j,needZip:C});case s.i.Checkout:return n.a.createElement(Er,{prices:O,shippingPrices:M.shipping&&c?Ir(c,M.shipping):void 0,totalPrice:q,invoiceContent:v,checkoutInfo:z,currency:D});default:return}}(a))):n.a.createElement("div",{className:"empty-content"},n.a.createElement(L.a,{color:"gray"})),n.a.createElement("div",{className:"footer"},n.a.createElement(R.a,{type:"submit",onClick:K,disabled:B,isLoading:B},Y)),y&&!y.field&&function(){if(y)return n.a.createElement(ge.a,{className:"error",isOpen:Boolean(y),onClose:G},n.a.createElement("h4",null,y.description||"Error"),n.a.createElement("p",null,y.description||"Error"),n.a.createElement(R.a,{isText:!0,onClick:P},U("OK")))}())}));function Nr(e,t){return e.find(({id:e})=>e===t)}function Ir(e,t){const a=Nr(e,t);return a?a.prices:void 0}var Sr=Object(n.h)(Object(c.h)(e=>{const{receipt:t}=e.payment,{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:d,title:m}=t||{};return{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:d,title:m}})(({isOpen:e,onClose:t,prices:a,shippingPrices:c,totalAmount:r,currency:s,info:l,photoUrl:o,text:i,title:d,credentialsTitle:m,shippingMethod:u})=>{const h=Object(F.a)(),b=tr(s),g=Object(n.p)(()=>function(e,t,a){if(!t)return{paymentMethod:e};const{shippingAddress:n}=t,c=n&&n.streetLine1?`${n.streetLine1}, ${n.city}, ${n.countryIso2}`:void 0,{phone:r,name:s}=t;return{paymentMethod:e,paymentProvider:"Stripe",shippingAddress:c,name:s,phone:r,shippingMethod:a}}(m,l,u),[l,u,m]);return n.a.createElement(ge.a,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},n.a.createElement("div",null,n.a.createElement("div",{className:"header",dir:h.isRtl?"rtl":void 0},n.a.createElement(R.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null," ",h("PaymentReceipt")," ")),n.a.createElement("div",{className:"receipt-content custom-scroll"},n.a.createElement(Er,{prices:a,shippingPrices:c,totalPrice:r,invoiceContent:{photoUrl:o,text:i,title:d},checkoutInfo:g,currency:b}))))}))},,,,,,,,,,,,,,,,,,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return s}));var n=a(5),c=a(54);const r={MonkeyIdle:a.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:a.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:a.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:a.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:a.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:a.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:a.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function s(e){const t=r[e].replace(window.location.origin,"");return c.b("file"+t,n.ApiMediaFormat.Lottie)}},,,,,function(e,t,a){"use strict";var n=a(0),c=a(8),r=a(1),s=a(13),l=a(25),o=a(32),i=a(110),d=a(16);a(151);const m={type:"blob",quality:.8,format:"jpeg",circle:!1};let u,h,b;var g=Object(n.h)(({file:e,onChange:t,onClose:c})=>{const[g,p]=Object(n.r)(!1);Object(n.n)(()=>{e&&(g?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:a,offsetHeight:n}=t;b=new u(t,{enableZoom:!0,boundary:{width:a,height:n},viewport:{width:a-16,height:n-16,type:"circle"}});const c=await Object(s.a)(e);await b.bind({url:c})}catch(e){r.p&&console.error(e)}}(e):async function(){return h||(h=Promise.all([a.e(6),a.e(8)]).then(a.bind(null,315)),u=(await h).default),h}().then(()=>p(!0)))},[e,g]);const v=Object(l.a)();return n.a.createElement(i.a,{isOpen:Boolean(e),onClose:c,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},g?n.a.createElement("div",{id:"avatar-crop"}):n.a.createElement(d.a,null),n.a.createElement(o.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!b)return;const e=await b.result(m),a="string"==typeof e?e:Object(s.b)(e,"avatar.jpg");t(a)},ariaLabel:v("CropImage")},n.a.createElement("i",{className:"icon-check"})))});a(152);t.a=Object(n.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:a,onChange:r})=>{const[s,l]=Object(n.r)(),[o,i]=Object(n.r)(a);Object(n.n)(()=>{i(a)},[a]);const d=Object(c.a)(o&&"filled",t&&"disabled");return n.a.createElement("div",{className:"AvatarEditable"},n.a.createElement("label",{className:d,role:"button",tabIndex:0,title:e},n.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(l(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),n.a.createElement("i",{className:"icon-camera-add"}),o&&n.a.createElement("img",{src:o,alt:"Avatar"})),n.a.createElement(g,{file:s,onClose:function(){l(void 0)},onChange:function(e){l(void 0),r(e),o&&URL.revokeObjectURL(o),i(URL.createObjectURL(e))}}))})},,,,,,,,,,function(e,t,a){},,,,,,,,function(e,t,a){"use strict";var n=a(0),c=a(1),r=a(7),s=a(125),l=a(116);a(140);const o=[0,50],i=[0,20],d=[20,0],m=r.g?c.rb:c.qb;t.a=Object(n.h)(({isPasswordVisible:e,isBig:t})=>{const[a,r]=Object(n.r)(),[u,h]=Object(n.r)(),[b,g]=Object(n.r)(!1),[p,v]=Object(n.r)(!1);Object(n.n)(()=>{a?setTimeout(()=>v(!0),2e3):Object(s.a)("MonkeyClose").then(r)},[a]),Object(n.n)(()=>{u||Object(s.a)("MonkeyPeek").then(h)},[u]);const E=Object(n.m)(()=>g(!0),[]);return n.a.createElement("div",{id:"monkey",className:t?"big":""},!b&&n.a.createElement("div",{className:"monkey-preview"}),a&&n.a.createElement(l.a,{id:"closeMonkey",size:t?c.Bb:m,className:p?"hidden":"shown",animationData:a,playSegment:o,noLoop:!0,onLoad:E}),u&&n.a.createElement(l.a,{id:"peekMonkey",size:t?c.Bb:m,className:p?"shown":"hidden",animationData:u,playSegment:e?i:d,noLoop:!0}))})},function(e,t,a){"use strict";var n=a(0),c=a(1),r=a(7),s=a(8),l=a(25),o=a(32);const i=r.g?550:400;t.a=Object(n.h)(({isLoading:e=!1,isPasswordVisible:t,error:a,hint:d,placeholder:m="Password",submitLabel:u="Next",clearError:h,onChangePasswordVisibility:b,onInputChange:g,onSubmit:p})=>{const v=Object(n.q)(null),E=Object(l.a)(),[O,f]=Object(n.r)(""),[j,C]=Object(n.r)(!1);return Object(n.n)(()=>{r.l||setTimeout(()=>{v.current.focus()},i)},[]),Object(n.n)(()=>{a&&requestAnimationFrame(()=>{v.current.focus(),v.current.select()})},[a]),n.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||j&&p(O)},autoComplete:"off"},n.a.createElement("div",{className:Object(s.a)("input-group password-input",O&&"touched",a&&"error"),dir:E.isRtl?"rtl":void 0},n.a.createElement("input",{ref:v,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:O||"",autoComplete:"current-password",onChange:function(e){a&&h();const{target:t}=e;f(t.value),C(t.value.length>=c.Y),g&&g(t.value)},dir:"auto"}),n.a.createElement("label",null,a||d||m),n.a.createElement("div",{className:"toggle-password",onClick:function(){b(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},n.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),j&&n.a.createElement(o.a,{type:"submit",ripple:!0,isLoading:e},u))})},,function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,,function(e,t,a){},,,,,,,,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){}])]); -//# sourceMappingURL=3.ac6afd4be1c32f54938b.js.map \ No newline at end of file diff --git a/dist/3.ac6afd4be1c32f54938b.js.map b/dist/3.ac6afd4be1c32f54938b.js.map deleted file mode 100644 index d8fadf4c6..000000000 --- a/dist/3.ac6afd4be1c32f54938b.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack:///./src/components/mediaViewer/SenderInfo.tsx","webpack:///./src/components/mediaViewer/MediaViewerActions.tsx","webpack:///./src/components/mediaViewer/MediaViewerFooter.tsx","webpack:///./src/hooks/useFullscreen.ts","webpack:///./src/components/mediaViewer/helpers/formatFileSize.ts","webpack:///./src/components/mediaViewer/VideoPlayerControls.tsx","webpack:///./src/components/mediaViewer/VideoPlayer.tsx","webpack:///./src/components/mediaViewer/ZoomControls.tsx","webpack:///./src/components/mediaViewer/PanZoom.tsx","webpack:///./src/components/mediaViewer/MediaViewer.tsx","webpack:///./src/components/main/ForwardPicker.tsx","webpack:///./src/components/main/Errors.tsx","webpack:///./src/components/main/Notifications.tsx","webpack:///./src/components/main/SafeLinkModal.tsx","webpack:///./src/components/common/CalendarModal.tsx","webpack:///./src/components/main/HistoryCalendar.tsx","webpack:///./src/components/common/DeleteMessageModal.tsx","webpack:///./src/components/common/PinMessageModal.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.tsx","webpack:///./src/components/middle/DeleteSelectedMessagesModal.tsx","webpack:///./src/components/middle/MessageSelectToolbar.tsx","webpack:///./src/hooks/useSelectWithEnter.ts","webpack:///./src/components/left/search/LeftSearchResultChat.tsx","webpack:///./src/components/left/search/RecentContacts.tsx","webpack:///./src/components/left/search/ChatMessage.tsx","webpack:///./src/components/left/search/DateSuggest.tsx","webpack:///./src/components/left/search/ChatResults.tsx","webpack:///./src/components/left/search/ChatMessageResults.tsx","webpack:///./src/components/left/search/helpers/createMapStateToProps.ts","webpack:///./src/components/left/search/MediaResults.tsx","webpack:///./src/components/left/search/helpers/getSenderName.ts","webpack:///./src/components/left/search/LinkResults.tsx","webpack:///./src/components/left/search/FileResults.tsx","webpack:///./src/components/left/search/AudioResults.tsx","webpack:///./src/components/left/search/LeftSearch.tsx","webpack:///./src/hooks/useReducer.ts","webpack:///./src/hooks/reducers/useFoldersReducer.ts","webpack:///./src/hooks/reducers/useTwoFaReducer.ts","webpack:///./src/components/left/settings/SettingsHeader.tsx","webpack:///./src/components/left/settings/SettingsMain.tsx","webpack:///./src/components/ui/FloatingActionButton.tsx","webpack:///./src/components/common/UsernameInput.tsx","webpack:///./src/components/left/settings/SettingsEditProfile.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack:///./src/components/ui/ShowMoreButton.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack:///./src/components/left/settings/folders/SettingsFolders.tsx","webpack:///./src/components/ui/RangeSlider.tsx","webpack:///./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack:///./src/components/middle/composer/StickerSetCover.tsx","webpack:///./src/components/common/StickerButton.tsx","webpack:///./src/components/left/settings/SettingsStickerSet.tsx","webpack:///./src/components/left/settings/SettingsGeneral.tsx","webpack:///./src/util/systemFilesDialog.ts","webpack:///./src/util/colors.ts","webpack:///./src/components/left/settings/WallpaperTile.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackground.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack:///./src/components/left/settings/SettingsNotifications.tsx","webpack:///./src/components/left/settings/SettingsPrivacy.tsx","webpack:///./src/components/left/settings/SettingsLanguage.tsx","webpack:///./src/components/left/settings/helper/privacy.ts","webpack:///./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack:///./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack:///./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack:///./src/components/common/Picker.tsx","webpack:///./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack:///./src/components/left/settings/Settings.tsx","webpack:///./src/components/left/main/ContactList.tsx","webpack:///./src/components/left/newChat/NewChatStep1.tsx","webpack:///./src/components/left/newChat/NewChatStep2.tsx","webpack:///./src/components/left/newChat/NewChat.tsx","webpack:///./src/components/left/ArchivedChats.tsx","webpack:///./src/util/scrollLock.ts","webpack:///./src/components/middle/message/helpers/copyOptions.ts","webpack:///./src/components/middle/message/MessageContextMenu.tsx","webpack:///./src/components/middle/message/ContextMenuContainer.tsx","webpack:///./src/components/common/StickerSetModal.tsx","webpack:///./src/components/middle/HeaderMenuContainer.tsx","webpack:///./src/components/middle/MobileSearch.tsx","webpack:///./src/util/findInViewport.ts","webpack:///./src/util/isFullyVisible.ts","webpack:///./src/components/middle/composer/MentionTooltip.tsx","webpack:///./src/components/middle/composer/AttachmentModal.tsx","webpack:///./src/components/middle/composer/PollModal.tsx","webpack:///./src/hooks/useMouseInside.ts","webpack:///./src/components/middle/composer/EmojiButton.tsx","webpack:///./src/components/middle/composer/EmojiCategory.tsx","webpack:///./src/components/middle/composer/EmojiPicker.tsx","webpack:///./src/components/middle/composer/StickerSet.tsx","webpack:///./src/components/middle/composer/StickerPicker.tsx","webpack:///./src/components/common/GifButton.tsx","webpack:///./src/components/middle/composer/GifPicker.tsx","webpack:///./src/components/middle/composer/SymbolMenuFooter.tsx","webpack:///./src/components/middle/composer/SymbolMenu.tsx","webpack:///./src/components/middle/composer/AttachMenu.tsx","webpack:///./src/components/middle/composer/StickerTooltip.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.tsx","webpack:///./src/components/middle/composer/EmojiTooltip.tsx","webpack:///./src/components/right/RightSearch.tsx","webpack:///./src/components/right/StickerSetResult.tsx","webpack:///./src/components/right/StickerSearch.tsx","webpack:///./src/components/right/GifSearch.tsx","webpack:///./src/components/right/PollAnswerResults.tsx","webpack:///./src/components/right/PollResults.tsx","webpack:///./src/components/right/management/ManageUser.tsx","webpack:///./src/components/right/management/ManageGroup.tsx","webpack:///./src/components/right/management/ManageGroupPermissions.tsx","webpack:///./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack:///./src/components/right/management/ManageChannel.tsx","webpack:///./src/components/right/management/ManageChatPrivacyType.tsx","webpack:///./src/components/right/management/ManageDiscussion.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissions.tsx","webpack:///./src/components/right/management/ManageChatAdministrators.tsx","webpack:///./src/components/right/management/ManageGroupRecentActions.tsx","webpack:///./src/components/right/management/ManageGroupAdminRights.tsx","webpack:///./src/components/right/management/ManageGroupMembers.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack:///./src/components/right/management/Management.tsx","webpack:///./src/components/middle/helpers/getCurrencySign.ts","webpack:///./src/components/common/helpers/detectCardType.ts","webpack:///./src/hooks/reducers/usePaymentReducer.ts","webpack:///./src/hooks/useFocusAfterAnimation.tsx","webpack:///./src/components/ui/Select.tsx","webpack:///./src/components/payment/ShippingInfo.tsx","webpack:///./src/components/payment/Shipping.tsx","webpack:///./src/components/payment/Checkout.tsx","webpack:///./src/components/payment/ExpiryInput.tsx","webpack:///./src/components/middle/helpers/inputFormatters.ts","webpack:///./src/assets/mastercard.svg","webpack:///./src/assets/visa.svg","webpack:///./src/components/payment/CardInput.tsx","webpack:///./src/components/payment/PaymentInfo.tsx","webpack:///./src/components/payment/PaymentModal.tsx","webpack:///./src/components/payment/ReceiptModal.tsx","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["animateOpening","hasFooter","origin","bestImageData","message","mediaEl","fromImage","getNodes","width","windowWidth","windowSize","get","mediaSize","isVideo","photo","video","webPage","getMessageContent","Boolean","getVideoDimensions","getPhotoFullDimensions","AVATAR_FULL_DIMENSIONS","availableWidth","height","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","mql","window","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","topOffsetRem","matches","REM","getTopOffset","top","fromTop","left","fromLeft","fromWidth","fromHeight","getBoundingClientRect","MediaViewerOrigin","SharedMedia","Album","ScheduledAlbum","SearchResult","includes","uncovered","realWidth","realHeight","size","Math","max","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","ghost","createGhost","applyStyles","transform","applyShape","document","body","classList","add","requestAnimationFrame","appendChild","style","firstChild","objectFit","remove","clearShape","setTimeout","contains","removeChild","ANIMATION_END_DELAY","animateClosing","container","toImage","getElementById","querySelector","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","Inline","ScheduledInline","isMessageImageFullyVisible","existingGhost","getElementsByClassName","ProfileAvatar","transition","transformOrigin","opacity","source","shouldAppendProfileInfo","createElement","img","Image","src","HTMLVideoElement","poster","profileInfo","cloneNode","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","parentElement","scrollTop","offsetHeight","element","styles","Object","assign","containerSelector","mediaSelector","MiddleHeaderAvatar","mediaEls","querySelectorAll","length","withGlobal","global","chatId","messageId","isAvatar","sender","isChatPrivate","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","lang","useLang","isFromChat","senderTitle","getSenderTitle","className","onClick","Avatar","key","chat","user","dir","renderText","formatMediaDateTime","date","MediaViewerActions","mediaData","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","isVideoDownloadAllowed","setIsVideoDownloadAllowed","useState","videoMediaHash","getMessageMediaHash","undefined","videoBlobUrl","downloadProgress","useMediaWithDownloadProgress","useEffect","download","handleVideoDownloadClick","e","stopPropagation","isAllowed","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_MOBILE_SCREEN","DropdownMenu","trigger","positionX","MenuItem","icon","href","ProgressSpinner","progress","noCross","MediaViewerFooter","text","isHideable","isMultiline","setIsMultiline","footerContent","checkIsMultiline","clientHeight","handleResize","throttle","addEventListener","removeEventListener","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","getBrowserFullscreenElementProp","units","bytes","number","floor","log","toFixed","stopEvent","VideoPlayerControls","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","timeout","clearTimeout","downloadedPercent","totalSize","percentagePlayed","percentageBuffered","min","step","type","onInput","value","renderSeekLine","ripple","formatMediaDuration","renderTime","formatFileSize","memo","url","isGif","posterData","posterSize","isMediaViewerOpen","noPlay","onClose","videoRef","useRef","setIsPlayed","IS_TOUCH_ENV","IS_IOS","setCurrentTime","isControlsVisible","setIsControlsVisible","setFullscreen","exitFullscreen","elRef","setIsFullscreen","useLayoutEffect","listener","listenerEnter","listenerExit","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","wrapperStyle","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","buildClassName","disabled","onChange","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","1","1.5","2","2.5","3","children","noWrap","canPan","panDeltaX","panDeltaY","onPan","tunedZoomLevel","isDragging","setIsDragging","dragData","setDragData","dx","dy","x","y","matrixData","setMatrixData","panWrapperRef","panContainerRef","newZoomLevel","newPandx","newPandy","newMatrixData","areSortedArraysEqual","oldScale","wrapper","image","wrapperRect","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","toString","preventDefault","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","renderPhoto","blobUrl","imageSize","canDrag","alt","draggable","Spinner","threadId","avatarOwnerId","profilePhotoIndex","mediaViewer","animationLevel","settings","byKey","senderId","avatarOwner","chatMessages","collectionIds","selectScheduledMessage","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","animationKey","webPagePhoto","getMessageWebPagePhoto","getMessagePhoto","getMessageVideo","isWebPagePhoto","isPhoto","isFromSharedMedia","isFromSearch","slideAnimation","headerAnimation","isGhostAnimation","getMessageMediaFilename","prevSenderId","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","getMediaHash","full","photos","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","BlobUrl","previewMediaHash","blobUrlPreview","startsWith","DataUri","fullMediaData","getMessageMediaFormat","localBlobUrl","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","photoDimensions","videoDimensions","toggle","forceUpdate","useForceUpdate","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","textParts","renderMessageText","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","Right","Left","handlePan","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","ShowTransition","isRtl","Transition","activeKey","name","aria-label","chats","byId","chatsById","listIds","currentUserId","activeListIds","active","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatIds","sortChatIds","getCanPostInChat","MAIN_THREAD_ID","searchWords","getChatTitle","viewportIds","getMore","useInfiniteScroll","handleFilterChange","containerRef","useKeyboardListNavigation","modalHeader","InputText","onKeyDown","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","getErrorHeader","error","isSlowMode","errors","dismissError","title","getReadableErrorText","isText","notifications","dismissNotification","Notification","onDismiss","toggleSafeLinkModal","handleOpen","open","handleDismiss","renderingUrl","useCurrentOrPrev","ConfirmDialog","confirmLabel","confirmHandler","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","Date","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","now","defaultSelectedDate","selectedDate","setSelectedDate","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","currentDate","shouldDisableNextMonth","shouldDisablePrevMonth","calendarGrid","grid","setFullYear","setMonth","setDate","monthStartDay","getDay","i","push","gridDate","buildCalendarGrid","handleChangeHours","replace","hours","getTime","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","formatMonthAndYear","d","dateCopy","letter","role","tabIndex","handleDateSelect","inputMode","formatHumanDate","formatTime","formatSubmitLabel","historyCalendarSelectedAt","searchMessagesByDate","closeHistoryCalendar","handleJumpToDate","timestamp","valueOf","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChannel","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","messageListType","canDelete","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","useFlag","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","onSelect","buttonRef","activeElement","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","withUsername","contextActions","useChatContextActions","handleDelete","handleClick","useSelectWithEnter","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","formatDateToString","suggestion","latestYear","getSuggestionsFromDate","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChatIds","globalUserIds","localChatIds","localUserIds","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","Backwards","query","handleChatClick","handlePickerItemClick","MEMO_EMPTY_ARRAY","foundContactIds","fullName","getUserFullName","username","unique","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","description","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","isLoading","searchChatId","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","classNames","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","WebLink","onMessageClick","getMessageDocument","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","renderingFor","onPlay","TABS","GlobalSearchContent","ChatList","Links","Files","Music","Voice","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","useReducer","reducer","initialState","reducerRef","state","setState","action","currentState","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","folder","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","values","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","payload","isTouched","omit","folderId","currentPassword","password","hint","email","twoFaReducer","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","EditProfile","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyPhoneNumberAllowedContacts","PrivacyLastSeenAllowedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyForwardingAllowedContacts","PrivacyGroupChatsAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsDeniedContacts","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaNewPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaChangePasswordHint","TwoFaNewPasswordEmail","TwoFaRecoveryEmail","TwoFaNewPasswordEmailCode","TwoFaRecoveryEmailCode","TwoFaCongratulations","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","Folders","FoldersCreateFolder","FoldersEditFolder","FoldersIncludedChats","FoldersExcludedChats","renderHeaderContent","confirmIsDestructive","currentUser","onScreenSelect","formatPhoneNumberWithCode","phoneNumber","FloatingActionButton","buttonClassName","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","label","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","InProgress","isUsernameError","isSaveButtonShown","Complete","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showError","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","userFolders","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","noLoop","onLoad","pill","fluid","narrow","multiline","ShowMoreButton","count","itemName","itemPluralName","ERROR_NO_TITLE","ERROR_NO_CHATS","loadedActiveChatIds","loadedArchivedChatIds","dispatch","onAddIncludedChats","onAddExcludedChats","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","includedChatTypes","excludedChatTypes","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","find","typeKey","inactive","renderChatType","event","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","onFilterChange","chatTypes","shouldMinimize","hasMaxChats","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","isMinimized","canClose","Checkbox","checked","isSelected","withChatType","orderedPinnedIds","archivedPinnedIds","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","handleSelectedChatTypesChange","newFilters","forEach","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","options","range","handleChange","trackWidth","possibleValuesLength","option","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","Lottie","shouldRenderFullMedia","useTransitionForMedia","getFirstLetters","hasThumbnail","sticker","noAnimate","onUnfaveClick","localMediaHash","stickerSelector","thumbnail","dataUri","previewBlobUrl","shouldPlay","isAnimated","markLoaded","unmarkLoaded","canAnimatedPlay","shouldRenderThumb","shouldRenderPreview","previewTransitionClassNames","fullClassName","emoji","data-sticker-id","isLowPriority","stickers","firstSticker","STICKER_SIZE_GENERAL_SETTINGS","ANIMATION_LEVEL_OPTIONS","stickerSetIds","added","setIds","stickerSetsById","setsById","messageTextSize","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers","setSettingOption","loadStickerSets","loadAddedStickers","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","isModalOpen","openModal","closeModal","setSticker","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","handleStickerSetClick","stickerSets","installedDate","RadioGroup","selected","onCheck","isChecked","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","setAttribute","removeAttribute","onchange","click","hex2rgb","param","parseInt","substring","rgb2hex","p0","p1","p2","rgb2hsb","r","g","h","s","v","hsb2rgb","f","p","q","t","getPatternColor","rgbColor","hue","saturation","wallpaper","theme","slug","thumbRef","useCanvasBlur","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","cacheKeyRef","handleSelect","blob","fetchBlob","cacheApi","CUSTOM_BG_CACHE_NAME","background","isBlurred","themes","loadedWallpapers","loadWallpapers","uploadWallpaper","setThemeSettings","themeRef","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","backgroundColor","patternColor","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","data","rgb","canvas","context","getContext","preloadImage","naturalHeight","naturalWidth","offsetWidth","drawImage","getImageData","blockSize","getAverageColor","handleWallPaperBlurChange","isUploading","DEFAULT_HSB","PREDEFINED_COLORS","hsb2positions","hsb","rects","colorPosition","colorRect","huePosition","hueRect","positions2hsb","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","onCapture","onDrag","onRelease","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","data-color","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","handleSettingsChange","peerType","setting","currentIsSilent","currentShouldShowPreviews","shouldShowPreviews","handleContactNotificationChange","hasPassword","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","langCode","setLanguage","currentLangCode","navigator","toLowerCase","shortLangCode","substr","nativeName","buildOptions","loadingOption","getPrivacyKey","screen","privacySettings","allowUserIds","allowChatIds","blockUserIds","blockChatIds","setPrivacyVisibility","visibilityOptions","exceptionLists","shouldShowDenied","shouldShowAllowed","privacyKey","headerText","descriptionText","allowedContactsScreen","deniedContactsScreen","allowedCount","reduce","result","membersCount","blockCount","handleVisibilityChange","getLocation","session","region","country","getDeviceEnvironment","deviceModel","platform","systemVersion","terminateAuthorization","terminateAllAuthorizations","isConfirmTerminateAllDialogOpen","openConfirmTerminateAllDialog","closeConfirmTerminateAllDialog","handleTerminateSessionClick","hash","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","renderSession","handler","dateActive","appName","ip","sessions","chatsByIds","usersByIds","blockedIds","unblockContact","handleUnblockClick","contactId","viewportOffset","isPrivate","CHAT_HEIGHT_PX","renderContact","animatedEmoji","selectAnimatedEmoji","AnimatedEmoji","expectedPassword","submitLabel","clearError","validationError","setValidationError","shouldShowPassword","setShouldShowPassword","handleSubmit","newPassword","handleClearError","PasswordMonkey","isBig","isPasswordVisible","PasswordForm","onChangePasswordVisibility","onStart","FOCUS_DELAY_TIMEOUT_MS","shouldConfirm","setValue","isConfirmShown","markIsConfirmShown","unmarkIsConfirmShown","codeLength","twoFaSettings","waitingEmailCodeLength","newValue","updatePassword","checkPassword","clearTwoFaError","updateRecoveryEmail","provideTwoFaEmailCode","clearPassword","handleStartWizard","handleNewPassword","handleNewPasswordConfirm","handleNewPasswordHint","handleNewPasswordEmail","onSuccess","handleChangePasswordCurrent","handleChangePasswordNew","handleChangePasswordConfirm","handleChangePasswordHint","handleTurnOff","handleRecoveryEmailCurrentPassword","handleRecoveryEmail","handleEmailCode","code","itemIds","filterPlaceholder","notFoundText","searchInputId","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","foldersState","foldersDispatch","twoFaState","twoFaDispatch","handleSaveFilter","renderCurrentSection","Main","renderCurrentSectionContent","contactIds","resultIds","sortUserIds","forceShowSelf","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","ChatCreationProgress","handleTitleChange","handleDescriptionChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","NewChannelStep2","NewGroupStep2","NewChannelStep1","NewGroupStep1","folderType","noChatsText","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","ArrowLeft","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","canImageBeCopied","MessageContextMenu","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","scheduledMaxDate","getDayStartAt","selectStickerSet","stickerSetId","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","isMuted","canDeleteChat","getCanDeleteChat","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","isHistoryCalendarOpen","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","openHistoryCalendar","focusedIndex","setFocusedIndex","visualViewport","mainEl","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","y1","y2","isFullyVisible","onInsertUserName","filteredChatMembers","getSelectedIndex","newIndex","cycleRestrict","selectedMentionIndex","setSelectedMentionIndex","handleArrowKey","handleUserSelect","forceFocus","handleSelectMention","member","onUp","onDown","onTab","first","position","fastSmoothScroll","setItemVisible","prevChatMembers","renderedChatMembers","attachments","caption","canSuggestMembers","groupChatMembers","recentEmojis","onCaptionUpdate","addRecentEmoji","loadEmojiKeywords","onFileAppend","onClear","hideTimeoutRef","prevAttachments","renderingAttachments","isHovered","markHovered","unmarkHovered","isQuick","every","quick","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredMembers","useMentionTooltip","EDITABLE_INPUT_MODAL_ID","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","sendAttachments","handleFilesDrop","dataTransfer","newFiles","file","CONTENT_TYPES_FOR_QUICK_UPLOAD","areAllPhotos","mimeType","areAllVideos","renderHeader","onDragEnter","onDrop","onDragOver","onDragLeave","relatedTarget","toTarget","fromTarget","data-attach-description","attachment","File","filename","extension","getFileExtension","previewData","emojis","onEmojiSelect","MessageInput","html","editableInputId","onUpdate","shouldSetFocus","questionInputRef","optionsListRef","solutionRef","question","setQuestion","setOptions","isAnonymous","setIsAnonymous","isMultipleAnswers","setIsMultipleAnswers","isQuizMode","setIsQuizMode","solution","setSolution","correctOption","setCorrectOption","hasErrors","setHasErrors","focusInput","solutionEl","innerHTML","addNewOption","newOptions","list","scrollHeight","scrollTo","behavior","handleCreate","questionTrimmed","optionsTrimmed","o","summary","answers","correct","isPublic","multipleChoice","quiz","entities","parseMessageInput","correctAnswers","solutionEntities","updateOption","removeOption","handleCorrectOptionChange","handleIsAnonymousChange","handleMultipleAnswersChange","handleQuizModeChange","handleKeyPress","keyCode","getQuestionError","getOptionsError","renderOptions","onKeyPress","renderQuizNoOptionError","hidden","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","native","names","IS_EMOJI_SUPPORTED","loading","category","allEmojis","useOnIntersect","emojisPerRow","ceil","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","headerRef","categories","setCategories","setEmojis","activeCategoryIndex","setActiveCategoryIndex","entries","entry","intersectingWithIndexes","newLeft","HEADER_BUTTON_WIDTH","fastSmoothScrollHorizontal","allCategories","themeCategories","unshift","exec","default","uncompressEmoji","ensureEmojiData","selectCategory","categoryEl","handleEmojiSelect","MENU_TRANSITION_DURATION","containerClassName","faded","STICKER_MARGIN","loadAndPlay","onStickerSelect","onStickerUnfave","stickersPerRow","STICKER_SIZE_PICKER","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","canSendStickers","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","gif","videoData","shouldRenderVideo","preload","savedGifs","gifs","saved","canSendGifs","onGifSelect","loadSavedGifs","debounceMs","SymbolMenuTabs","SYMBOL_MENU_TAB_TITLES","SYMBOL_MENU_TAB_ICONS","Emoji","Stickers","GIFs","onRemoveSymbol","onSearchOpen","renderTabButton","handleSearchOpen","isActivated","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","fastRaf","recentEmojisRef","renderContent","isFrom","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","clickInlineButton","keyboardButtons","row","button","onSilentSend","onScheduleSend","listEmojis","usePrevDuringAnimation","selectedIndex","setSelectedIndex","emojisCount","handleSelectEmoji","onLeft","onRight","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","useOnChange","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","getAllowedAttachmentOptions","handleGifClick","hasResults","answer","voters","offsets","pollResults","offset","answerVote","totalVoters","loadPollOptionResults","closePollResults","prevVotersCount","votersCount","setIsLoading","areVotersLoaded","limit","shouldResetVoters","handleViewMoreClick","handleMemberClick","noStatusOrTyping","leftVotersCount","renderViewMoreButton","total","getMessagePoll","resultsByOption","buildCollectionByKey","management","updateContact","deleteUser","deleteHistory","closeManagement","isDeleteDialogOpen","openDeleteDialog","closeDeleteDialog","currentIsMuted","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","withFullInfo","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","ChatPrivacyType","handleClickDiscussion","Discussion","handleClickPermissions","GroupPermissions","handleClickAdministrators","ChatAdministrators","handleSetPhoto","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","GroupMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","isCreator","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","GroupRemovedUsers","handleAddExceptionClick","GroupUserPermissionsCreate","handleExceptionMemberClick","promotedByUserId","GroupUserPermissions","handlePermissionChange","getUpdatedPermissionValue","handleSavePermissions","bannedRights","removedUsersCount","kickedMembers","exceptionMembers","members","getMemberExceptions","langKey","getLangKeyForBannedRightKey","translatedString","sendMessages","blocking","sendMedia","sendPolls","embedLinks","inviteUsers","pinMessages","changeInfo","updateChatMemberBannedRights","removedMembers","getRemovedBy","kickedByUserId","kickedByUser","getContextActions","isSignaturesShown","toggleSignatures","hasLinkedChat","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","ChannelSubscribers","handleDeleteChannel","selectManagement","checkPublicLink","updatePublicLink","updatePrivateLink","privateLink","inviteLink","privacyType","setPrivacyType","isRevokeConfirmDialogOpen","openRevokeConfirmDialog","closeRevokeConfirmDialog","canUpdate","handleOptionChange","handleSave","handleRevokePrivateLink","langPrefix1","langPrefix2","SafeLink","forDiscussionIds","linkedChat","loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup","linkedGroupId","setLinkedGroupId","isConfirmUnlinkGroupDialogOpen","openConfirmUnlinkGroupDialog","closeConfirmUnlinkGroupDialog","isConfirmLinkGroupDialogOpen","openConfirmLinkGroupDialog","closeConfirmLinkGroupDialog","handleUnlinkGroupSessions","channelId","Initial","handleLinkGroupSessions","renderLinkGroupHeader","linkedGroup","renderLinkGroupConfirmText","hasPrivateLink","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","isOwner","handleAdminMemberClick","ChatAdminRights","getMemberStatus","promotedByUser","GroupRecentActions","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","CURRENCIES","USD","EUR","GBP","JPY","RUB","UAH","INR","AED","getCurrencySign","currency","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","getBillingCountry","countryCode","countryList","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","handleShippingSelect","amount","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","item","expiryInputRef","charAt","parts","formatCardExpiry","cardNumberRef","cardType","setCardType","newCardType","formatCardNumber","cardIcon","mastercardIconPath","visaIconPath","getCardIcon","canSaveCredentials","needCardholderName","needCountry","needZip","handleCardNumberChange","handleCardholderChange","toUpperCase","handleExpiryChange","handleCvvChange","handleBillingPostCodeChange","handleChangeSaveCredentials","savedInfo","invoice","nativeProvider","nativeParams","passwordMissing","payment","isProviderError","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","globalErrors","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","currencySign","field","fieldError","getShippingError","handleErrorModalClose","PaymentStep","Checkout","shippingOption","getShippingPrices","totalPrices","concat","acc","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","ShippingInfo","Shipping","PaymentInfo","buttonText","cuurentStep","renderModalContent","renderError","optionId","receipt","mapedPrices","info","totalAmount","credentialsTitle","fullAddress","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","path","location","cropperResultOptions","quality","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","enableZoom","boundary","viewport","blobToDataUri","bind","err","DEBUG","console","initCropper","ensureCroppie","croppedImg","blobToFile","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","URL","revokeObjectURL","createObjectURL","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","playSegment","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH"],"mappings":"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","file":"3.ac6afd4be1c32f54938b.js","sourcesContent":["import { ApiMessage } from '../../../api/types';\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { getMessageContent, getPhotoFullDimensions, getVideoDimensions } from '../../../modules/helpers';\nimport {\n AVATAR_FULL_DIMENSIONS,\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\n\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean, origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n let isVideo = false;\n let mediaSize;\n if (message) {\n const { photo, video, webPage } = getMessageContent(message);\n isVideo = Boolean(video);\n mediaSize = video ? getVideoDimensions(video)! : getPhotoFullDimensions((photo || webPage!.photo)!)!;\n } else {\n mediaSize = AVATAR_FULL_DIMENSIONS;\n }\n\n // eslint-disable-next-line max-len\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, mediaSize.width, mediaSize.height,\n );\n const toLeft = (windowWidth - toWidth) / 2;\n const toTop = getTopOffset(hasFooter) + (availableHeight - toHeight) / 2;\n\n let {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n const uncovered = uncover(toWidth, toHeight, fromTop, fromLeft, fromWidth, fromHeight);\n fromTop = uncovered.top;\n fromLeft = uncovered.left;\n fromWidth = uncovered.width;\n fromHeight = uncovered.height;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n const fromScaleX = fromWidth / toWidth;\n const fromScaleY = fromHeight / toHeight;\n\n const ghost = createGhost(bestImageData || fromImage);\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n applyShape(ghost, origin);\n\n document.body.classList.add('ghost-animating');\n\n requestAnimationFrame(() => {\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n clearShape(ghost);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nexport function animateClosing(origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage) {\n const { container, mediaEl: toImage } = getNodes(origin, message);\n if (!toImage) {\n return;\n }\n\n const fromImage = document.getElementById('MediaViewer')!.querySelector(\n '.active .media-viewer-content img, .active .media-viewer-content video',\n );\n if (!fromImage || !toImage) {\n return;\n }\n\n const {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n const {\n top: targetTop, left: toLeft, width: toWidth, height: toHeight,\n } = toImage.getBoundingClientRect();\n\n let toTop = targetTop;\n if (!isElementInViewport(container)) {\n const { height: windowHeight } = windowSize.get();\n toTop = targetTop < fromTop ? -toHeight : windowHeight;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n let fromScaleX = fromWidth / toWidth;\n let fromScaleY = fromHeight / toHeight;\n\n const shouldFadeOut = (\n [MediaViewerOrigin.Inline, MediaViewerOrigin.ScheduledInline].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n ) || (\n [MediaViewerOrigin.Album, MediaViewerOrigin.ScheduledAlbum].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n );\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n if (fromScaleX > fromScaleY) {\n fromScaleX = fromScaleY;\n } else if (fromScaleY > fromScaleX) {\n fromScaleY = fromScaleX;\n }\n }\n\n const existingGhost = document.getElementsByClassName('ghost')[0] as HTMLDivElement;\n\n const ghost = existingGhost || createGhost(bestImageData || toImage, origin === MediaViewerOrigin.ProfileAvatar);\n if (!existingGhost) {\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n }\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n const {\n top,\n left,\n width,\n height,\n } = existingGhost.getBoundingClientRect();\n const scaleX = width / toWidth;\n const scaleY = height / toHeight;\n\n applyStyles(ghost, {\n transition: 'none',\n top: `${toTop}px`,\n left: `${toLeft}px`,\n transformOrigin: 'top left',\n transform: `translate3d(${left - toLeft}px, ${top - toTop}px, 0) scale(${scaleX}, ${scaleY})`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n });\n }\n document.body.classList.add('ghost-animating');\n if (!existingGhost) document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n existingGhost.style.transition = '';\n }\n\n ghost.style.transform = '';\n\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement, shouldAppendProfileInfo = false) {\n const ghost = document.createElement('div');\n ghost.classList.add('ghost');\n\n const img = new Image();\n\n if (typeof source === 'string') {\n img.src = source;\n } else if (source instanceof HTMLVideoElement) {\n img.src = source.poster;\n } else {\n img.src = source.src;\n }\n\n ghost.appendChild(img);\n\n if (shouldAppendProfileInfo) {\n ghost.classList.add('ProfileInfo');\n const profileInfo = document.querySelector('#RightColumn .ProfileInfo .info');\n if (profileInfo) {\n ghost.appendChild(profileInfo.cloneNode(true));\n }\n }\n\n return ghost;\n}\n\nfunction uncover(realWidth: number, realHeight: number, top: number, left: number, width: number, height: number) {\n if (realWidth === realHeight) {\n const size = Math.max(width, height) * (realWidth / realHeight);\n left -= (size - width) / 2;\n top -= (size - height) / 2;\n width = size;\n height = size;\n } else if (realWidth > realHeight) {\n const srcWidth = width;\n width = height * (realWidth / realHeight);\n left -= (width - srcWidth) / 2;\n } else if (realHeight > realWidth) {\n const srcHeight = height;\n height = width * (realHeight / realWidth);\n top -= (height - srcHeight) / 2;\n }\n\n return {\n top, left, width, height,\n };\n}\n\nfunction isElementInViewport(el: HTMLElement) {\n if (el.style.display === 'none') {\n return false;\n }\n\n const rect = el.getBoundingClientRect();\n const { height: windowHeight } = windowSize.get();\n\n return (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n}\n\nfunction isMessageImageFullyVisible(container: HTMLElement, imageEl: HTMLElement) {\n const messageListElement = document.querySelector('.active > .MessageList')!;\n let imgOffsetTop = container.offsetTop + imageEl.closest('.content-inner, .WebPage')!.offsetTop;\n if (container.id.includes('album-media-')) {\n imgOffsetTop += container.parentElement!.offsetTop + container.closest('.Message')!.offsetTop;\n }\n\n return imgOffsetTop > messageListElement.scrollTop\n && imgOffsetTop + imageEl.offsetHeight < messageListElement.scrollTop + messageListElement.offsetHeight;\n}\n\nfunction getTopOffset(hasFooter: boolean) {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n let topOffsetRem = 4.125;\n if (hasFooter) {\n topOffsetRem += mql.matches ? 0.875 : 3.375;\n }\n\n return topOffsetRem * REM;\n}\n\nfunction applyStyles(element: HTMLElement, styles: Record) {\n Object.assign(element.style, styles);\n}\n\nfunction getNodes(origin: MediaViewerOrigin, message?: ApiMessage) {\n let containerSelector;\n let mediaSelector;\n\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n containerSelector = `.active > .MessageList #album-media-${message!.id}`;\n mediaSelector = '.full-media';\n break;\n\n case MediaViewerOrigin.SharedMedia:\n containerSelector = `#shared-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.SearchResult:\n containerSelector = `#search-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n containerSelector = '.MiddleHeader .ChatInfo .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .ProfileInfo .active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ScheduledInline:\n case MediaViewerOrigin.Inline:\n default:\n containerSelector = `.active > .MessageList #message${message!.id}`;\n mediaSelector = '.message-content .full-media, .message-content .thumbnail';\n }\n\n const container = document.querySelector(containerSelector)!;\n const mediaEls = container && container.querySelectorAll(mediaSelector);\n\n return {\n container,\n mediaEl: mediaEls && mediaEls[mediaEls.length - 1],\n };\n}\n\nfunction applyShape(ghost: HTMLDivElement, origin: MediaViewerOrigin) {\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n case MediaViewerOrigin.Inline:\n case MediaViewerOrigin.ScheduledInline:\n ghost.classList.add('rounded-corners');\n break;\n\n case MediaViewerOrigin.SharedMedia:\n case MediaViewerOrigin.ProfileAvatar:\n case MediaViewerOrigin.SearchResult:\n (ghost.firstChild as HTMLElement).style.objectFit = 'cover';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n ghost.classList.add('circle');\n break;\n }\n}\n\nfunction clearShape(ghost: HTMLDivElement) {\n (ghost.firstChild as HTMLElement).style.objectFit = 'default';\n ghost.classList.remove('rounded-corners', 'circle');\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../api/types';\n\nimport { getSenderTitle, isChatPrivate } from '../../modules/helpers';\nimport { formatMediaDateTime } from '../../util/dateFormat';\nimport renderText from '../common/helpers/renderText';\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from '../common/Avatar';\n\nimport './SenderInfo.scss';\n\ntype OwnProps = {\n chatId?: number;\n messageId?: number;\n isAvatar?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst SenderInfo: FC = ({\n chatId, messageId, sender, isAvatar, message, closeMediaViewer, focusMessage,\n}) => {\n const handleFocusMessage = useCallback(() => {\n closeMediaViewer();\n focusMessage({ chatId, messageId });\n }, [chatId, focusMessage, messageId, closeMediaViewer]);\n\n const lang = useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const isFromChat = sender.id < 0;\n const senderTitle = getSenderTitle(lang, sender);\n\n return (\n
\n {isFromChat ? (\n \n ) : (\n \n )}\n
\n
\n {senderTitle && renderText(senderTitle)}\n
\n
\n {isAvatar ? lang('lng_mediaview_profile_photo') : formatMediaDateTime(lang, message!.date * 1000)}\n
\n
\n
\n );\n};\n\nexport default withGlobal(\n (global, { chatId, messageId, isAvatar }): StateProps => {\n if (isAvatar && chatId) {\n return {\n sender: isChatPrivate(chatId) ? selectUser(global, chatId) : selectChat(global, chatId),\n };\n }\n\n if (!messageId || !chatId) {\n return {};\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n message,\n sender: message && selectSender(global, message),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['closeMediaViewer', 'focusMessage']),\n)(SenderInfo);\n","import React, {\n FC, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport download from '../../util/download';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './MediaViewerActions.scss';\n\ntype OwnProps = {\n mediaData?: string;\n isVideo: boolean;\n isZoomed: boolean;\n message?: ApiMessage;\n fileName?: string;\n isAvatar?: boolean;\n onCloseMediaViewer: NoneToVoidFunction;\n onForward: NoneToVoidFunction;\n onZoomToggle: NoneToVoidFunction;\n};\n\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const [isVideoDownloadAllowed, setIsVideoDownloadAllowed] = useState(false);\n const videoMediaHash = isVideo && message ? getMessageMediaHash(message, 'download') : undefined;\n const {\n mediaData: videoBlobUrl, downloadProgress,\n } = useMediaWithDownloadProgress(videoMediaHash, !isVideoDownloadAllowed);\n\n // Download with browser when fully loaded\n useEffect(() => {\n if (isVideoDownloadAllowed && videoBlobUrl) {\n download(videoBlobUrl, fileName!);\n setIsVideoDownloadAllowed(false);\n }\n }, [fileName, videoBlobUrl, isVideoDownloadAllowed]);\n\n // Cancel download on slide change\n useEffect(() => {\n setIsVideoDownloadAllowed(false);\n }, [videoMediaHash]);\n\n const handleVideoDownloadClick = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n setIsVideoDownloadAllowed((isAllowed) => !isAllowed);\n }, []);\n\n const lang = useLang();\n\n const MenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n if (IS_MOBILE_SCREEN) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isVideoDownloadAllowed && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isVideoDownloadAllowed ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n )}\n \n \n \n \n \n \n
\n );\n};\n\nexport default MediaViewerActions;\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport { REM } from '../common/helpers/mediaDimensions';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHideable: boolean;\n};\n\nconst MediaViewerFooter: FC = ({ text = '', isHideable, onClick }) => {\n const [isMultiline, setIsMultiline] = useState(false);\n useEffect(() => {\n const footerContent = document.querySelector('.MediaViewerFooter .media-text') as HTMLDivElement | null;\n\n const checkIsMultiline = () => {\n const height = footerContent ? footerContent.clientHeight : 0;\n\n setIsMultiline(height > REM * 2);\n };\n\n // First run for initial detection of multiline footer text\n checkIsMultiline();\n\n const handleResize = throttle(checkIsMultiline, RESIZE_THROTTLE_MS, true);\n\n window.addEventListener('resize', handleResize, false);\n\n return () => {\n window.removeEventListener('resize', handleResize, false);\n };\n }, []);\n\n function stopEvent(e: React.MouseEvent) {\n if (text) {\n e.stopPropagation();\n }\n }\n\n return (\n
\n {text && (\n
\n

{text}

\n
\n )}\n
\n );\n};\n\nexport default MediaViewerFooter;\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\nimport { PLATFORM_ENV } from '../util/environment';\n\ntype RefType = {\n current: HTMLElement | null;\n};\n\ntype ReturnType = [boolean, () => void, () => void] | [false];\ntype CallbackType = (isPlayed: boolean) => void;\n\nconst prop = getBrowserFullscreenElementProp();\n\nexport default function useFullscreenStatus(elRef: RefType, setIsPlayed: CallbackType): ReturnType {\n const [isFullscreen, setIsFullscreen] = useState(Boolean(prop && document[prop]));\n\n const setFullscreen = () => {\n if (!elRef.current || !(prop || PLATFORM_ENV === 'iOS')) {\n return;\n }\n\n if (elRef.current.requestFullscreen) {\n elRef.current.requestFullscreen();\n } else if (elRef.current.webkitRequestFullscreen) {\n elRef.current.webkitRequestFullscreen();\n } else if (elRef.current.webkitEnterFullscreen) {\n elRef.current.webkitEnterFullscreen();\n } else if (elRef.current.mozRequestFullScreen) {\n elRef.current.mozRequestFullScreen();\n }\n\n setIsFullscreen(true);\n };\n\n const exitFullscreen = () => {\n if (!elRef.current) {\n return;\n }\n\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n\n setIsFullscreen(false);\n };\n\n useLayoutEffect(() => {\n const listener = () => { setIsFullscreen(Boolean(prop && document[prop])); };\n const listenerEnter = () => { setIsFullscreen(true); };\n const listenerExit = () => {\n setIsFullscreen(false);\n setIsPlayed(false);\n };\n const video = elRef.current;\n\n document.addEventListener('fullscreenchange', listener, false);\n document.addEventListener('webkitfullscreenchange', listener, false);\n document.addEventListener('mozfullscreenchange', listener, false);\n\n if (video) {\n video.addEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.addEventListener('webkitendfullscreen', listenerExit, false);\n }\n\n return () => {\n document.removeEventListener('fullscreenchange', listener, false);\n document.removeEventListener('webkitfullscreenchange', listener, false);\n document.removeEventListener('mozfullscreenchange', listener, false);\n if (video) {\n video.removeEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.removeEventListener('webkitendfullscreen', listenerExit, false);\n }\n };\n // eslint-disable-next-line\n }, []);\n\n if (!prop && PLATFORM_ENV !== 'iOS') {\n return [false];\n }\n\n return [isFullscreen, setFullscreen, exitFullscreen];\n}\n\nfunction getBrowserFullscreenElementProp() {\n if (typeof document.fullscreenElement !== 'undefined') {\n return 'fullscreenElement';\n } else if (typeof document.mozFullScreenElement !== 'undefined') {\n return 'mozFullScreenElement';\n } else if (typeof document.webkitFullscreenElement !== 'undefined') {\n return 'webkitFullscreenElement';\n }\n\n return '';\n}\n","const units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];\n\nexport default (bytes: number) => {\n const number = bytes === 0 ? 0 : Math.floor(Math.log(bytes) / Math.log(1024));\n\n return `${(bytes / 1024 ** Math.floor(number)).toFixed(1)} ${units[number]}`;\n};\n","import React, { FC, useState, useEffect } from '../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport formatFileSize from './helpers/formatFileSize';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './VideoPlayerControls.scss';\n\ntype IProps = {\n bufferedProgress: number;\n currentTime: number;\n duration: number;\n fileSize: number;\n isForceVisible: boolean;\n isForceMobileVersion?: boolean;\n isPlayed: boolean;\n isFullscreenSupported: boolean;\n isFullscreen: boolean;\n onChangeFullscreen: (e: React.MouseEvent) => void;\n onPlayPause: (e: React.MouseEvent) => void;\n onSeek: OnChangeHandler;\n};\n\ntype OnChangeHandler = (e: React.ChangeEvent) => void;\n\nconst stopEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n};\n\nconst HIDE_CONTROLS_TIMEOUT_MS = 800;\n\nconst VideoPlayerControls: FC = ({\n bufferedProgress,\n currentTime,\n duration,\n fileSize,\n isForceVisible,\n isForceMobileVersion,\n isPlayed,\n isFullscreenSupported,\n isFullscreen,\n onChangeFullscreen,\n onPlayPause,\n onSeek,\n}) => {\n const [isVisible, setVisibility] = useState(true);\n\n useEffect(() => {\n if (isForceVisible) {\n setVisibility(isForceVisible);\n }\n }, [isForceVisible]);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n if (!isForceVisible) {\n if (IS_MOBILE_SCREEN) {\n setVisibility(false);\n } else {\n timeout = window.setTimeout(() => {\n setVisibility(false);\n }, HIDE_CONTROLS_TIMEOUT_MS);\n }\n }\n\n return () => {\n if (timeout) {\n window.clearTimeout(timeout);\n }\n };\n }, [isForceVisible]);\n\n useEffect(() => {\n if (isVisible || isForceVisible) {\n document.body.classList.add('video-controls-visible');\n }\n\n return () => {\n document.body.classList.remove('video-controls-visible');\n };\n }, [isForceVisible, isVisible]);\n\n const lang = useLang();\n\n if (!isVisible && !isForceVisible) {\n return undefined;\n }\n\n return (\n
\n {renderSeekLine(currentTime, duration, bufferedProgress, onSeek)}\n \n \n \n {renderTime(currentTime, duration)}\n {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)}\n {isFullscreenSupported && (\n \n \n \n )}\n
\n );\n};\n\nfunction renderTime(currentTime: number, duration: number) {\n return (\n
\n {`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`}\n
\n );\n}\n\nfunction renderFileSize(downloadedPercent: number, totalSize: number) {\n return (\n
\n {`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`}\n
\n );\n}\n\nfunction renderSeekLine(currentTime: number, duration: number, bufferedProgress: number, onSeek: OnChangeHandler) {\n const percentagePlayed = (currentTime / duration) * 100;\n const percentageBuffered = bufferedProgress * 100;\n\n return (\n
\n
\n \n \n \n
\n
\n );\n}\n\nexport default VideoPlayerControls;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IDimensions } from '../../modules/helpers';\n\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useFullscreenStatus from '../../hooks/useFullscreen';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport safePlay from '../../util/safePlay';\n\nimport VideoPlayerControls from './VideoPlayerControls';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: IDimensions;\n downloadProgress?: number;\n fileSize: number;\n isMediaViewerOpen?: boolean;\n noPlay?: boolean;\n onClose: (e: React.MouseEvent) => void;\n};\n\nconst MOBILE_VERSION_CONTROL_WIDTH = 400;\n\nconst VideoPlayer: FC = ({\n url,\n isGif,\n posterData,\n posterSize,\n downloadProgress,\n fileSize,\n isMediaViewerOpen,\n noPlay,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n const [isPlayed, setIsPlayed] = useState(!IS_TOUCH_ENV || !IS_IOS);\n const [currentTime, setCurrentTime] = useState(0);\n const [isControlsVisible, setIsControlsVisible] = useState(true);\n\n const [isFullscreen, setFullscreen, exitFullscreen] = useFullscreenStatus(videoRef, setIsPlayed);\n\n const { isBuffered, bufferedProgress, bufferingHandlers } = useBuffering();\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(!isBuffered, undefined, undefined, 'slow');\n\n useEffect(() => {\n if (noPlay || !isMediaViewerOpen) {\n videoRef.current!.pause();\n } else if (url && !IS_TOUCH_ENV) {\n // Chrome does not automatically start playing when `url` becomes available (even with `autoPlay`),\n // so we force it here. Contrary, iOS does not allow to call `play` without mouse event,\n // so we need to use `autoPlay` instead to allow pre-buffering.\n safePlay(videoRef.current!);\n }\n }, [noPlay, isMediaViewerOpen, url]);\n\n useEffect(() => {\n if (videoRef.current!.currentTime === videoRef.current!.duration) {\n setCurrentTime(0);\n setIsPlayed(false);\n } else {\n setCurrentTime(videoRef.current!.currentTime);\n }\n }, [currentTime]);\n\n const togglePlayState = useCallback((e: React.MouseEvent | KeyboardEvent) => {\n e.stopPropagation();\n if (isPlayed) {\n videoRef.current!.pause();\n setIsPlayed(false);\n } else {\n videoRef.current!.play();\n setIsPlayed(true);\n }\n }, [isPlayed]);\n\n useVideoCleanup(videoRef, []);\n\n const handleMouseOver = useCallback(() => {\n setIsControlsVisible(true);\n }, []);\n\n const handleMouseOut = useCallback(() => {\n setIsControlsVisible(false);\n }, []);\n\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setCurrentTime(e.currentTarget.currentTime);\n }, []);\n\n const handleEnded = useCallback(() => {\n setCurrentTime(0);\n setIsPlayed(false);\n }, []);\n\n const handleFullscreenChange = useCallback(() => {\n if (isFullscreen && exitFullscreen) {\n exitFullscreen();\n } else if (!isFullscreen && setFullscreen) {\n setFullscreen();\n }\n }, [exitFullscreen, isFullscreen, setFullscreen]);\n\n const handleSeek = useCallback((e: React.ChangeEvent) => {\n e.stopPropagation();\n\n videoRef.current!.currentTime = (Number(e.target.value) * videoRef.current!.duration) / 100;\n }, []);\n\n const toggleControls = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n togglePlayState(e);\n }\n };\n\n document.addEventListener('keydown', togglePayingStateBySpace, false);\n\n return () => {\n document.removeEventListener('keydown', togglePayingStateBySpace, false);\n };\n }, [togglePlayState]);\n\n const wrapperStyle = posterSize && `width: ${posterSize.width}px; height: ${posterSize.height}px`;\n const videoStyle = `background-image: url(${posterData})`;\n\n return (\n \n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n {url && }\n \n \n {shouldRenderSpinner && (\n
\n {!isBuffered &&
Buffering...
}\n \n
\n )}\n {!isGif && !shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(VideoPlayer);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ZoomControls.scss';\n\ntype OwnProps = {\n isShown: boolean;\n onChangeZoom: (level: number, canCloseZoom?: boolean) => void;\n};\n\nexport const MAX_ZOOM_LEVEL = 3;\nexport const MIN_ZOOM_LEVEL = 1;\nconst ONE_STEP_PERCENT = 100 / (MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL);\nconst RESET_ZOOM_LEVEL = 1.5;\n\nconst ZoomControls: FC = ({ isShown, onChangeZoom }) => {\n const { transitionClassNames } = useShowTransition(isShown);\n const prevIsShown = usePrevious(isShown);\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [zoomLevel, setZoomLevel] = useState(1);\n const isSeeking = useRef(false);\n\n useEffect(() => {\n if (isShown && !prevIsShown) {\n setZoomLevel(RESET_ZOOM_LEVEL);\n }\n }, [isShown, prevIsShown]);\n\n const handleZoomOut = () => {\n if (inputRef.current) {\n setZoomLevel(Math.max(MIN_ZOOM_LEVEL, zoomLevel - 0.5));\n }\n };\n\n const handleZoomIn = () => {\n if (inputRef.current) {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, zoomLevel + 0.5));\n }\n };\n\n const handleStartSeek = useCallback(() => {\n isSeeking.current = true;\n }, []);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (zoomLevel === 1) {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }\n }, [onChangeZoom, zoomLevel]);\n\n const handleSeeklineChange = (e:React.ChangeEvent) => {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, Math.max(Number(e.target.value), MIN_ZOOM_LEVEL)));\n };\n\n useEffect(() => {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }, [zoomLevel, onChangeZoom]);\n\n const lang = useLang();\n\n const className = buildClassName(\n 'ZoomControls',\n transitionClassNames,\n );\n\n return (\n
\n \n \n \n \n \n \n
\n
\n \n \n
\n
\n
\n );\n};\n\nexport default memo(ZoomControls);\n","/*\n @source https://github.com/ajainarayanan/react-pan-zoom\n\n Heavily inspired/lifted from this idea: https://stackoverflow.com/a/39311435/661768\n without jqueryUI or jquery dependency.\n*/\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nimport './PanZoom.scss';\n\nexport interface IDragData {\n x: number;\n y: number;\n dx: number;\n dy: number;\n}\n\nexport interface OwnProps {\n children: any;\n className?: string;\n noWrap: boolean;\n canPan: boolean;\n zoomLevel: number;\n panDeltaX: number;\n panDeltaY: number;\n onPan?: (x: number, y: number) => void;\n}\n\nconst INITIAL_MATRIX = [\n 1, 0, 0, 1, 0, 0,\n];\n\nconst SCALE_VALUES = {\n 1: 1,\n 1.5: 1.5,\n 2: 2.2,\n 2.5: 3.3,\n 3: 5.5,\n};\n\nconst ZOOM_SAFE_AREA = 150;\n\nfunction calculateSafeZoneOnZoom(oldScale: number, matrixData: number[], wrapper: HTMLDivElement | null) {\n const image = wrapper && wrapper.querySelector('.active img');\n if (!wrapper || !image) {\n return matrixData;\n }\n const wrapperRect = wrapper.getBoundingClientRect();\n const imageRect = image.getBoundingClientRect();\n\n const newImgWidth = (imageRect.width / oldScale) * matrixData[0];\n const newImgHeight = (imageRect.height / oldScale) * matrixData[3];\n const newImgX = (wrapperRect.width - newImgWidth) / 2 + matrixData[4];\n const newImgY = (wrapperRect.height - newImgHeight) / 2 + matrixData[5];\n if (wrapperRect.width && wrapperRect.width - ZOOM_SAFE_AREA < newImgX) {\n matrixData[4] -= newImgX + wrapperRect.width - ZOOM_SAFE_AREA;\n } else if (newImgWidth && newImgWidth + newImgX < ZOOM_SAFE_AREA) {\n matrixData[4] -= newImgWidth + newImgX - ZOOM_SAFE_AREA;\n }\n if (wrapperRect.height && wrapperRect.height - ZOOM_SAFE_AREA < newImgY) {\n matrixData[5] -= newImgY + wrapperRect.height - ZOOM_SAFE_AREA;\n } else if (newImgHeight && newImgHeight + newImgY < ZOOM_SAFE_AREA) {\n matrixData[5] -= newImgHeight + newImgY - ZOOM_SAFE_AREA;\n }\n\n return matrixData;\n}\n\nconst PanZoom: FC = ({\n children,\n className,\n noWrap,\n canPan,\n zoomLevel,\n panDeltaX,\n panDeltaY,\n onPan,\n}) => {\n const tunedZoomLevel = SCALE_VALUES[zoomLevel as keyof typeof SCALE_VALUES] || zoomLevel;\n const [isDragging, setIsDragging] = useState(false);\n const [dragData, setDragData] = useState({\n dx: panDeltaX, dy: panDeltaY, x: 0, y: 0,\n });\n // [zoom, skew, skew, zoom, dx, dy] - see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix()\n const [matrixData, setMatrixData] = useState(INITIAL_MATRIX);\n // Used to set cursor while moving.\n // eslint-disable-next-line no-null/no-null\n const panWrapperRef = useRef(null);\n // Used to set transform for pan.\n // eslint-disable-next-line no-null/no-null\n const panContainerRef = useRef(null);\n\n useEffect(() => {\n const newZoomLevel = tunedZoomLevel || matrixData[0];\n const newPandx = panDeltaX || matrixData[4];\n const newPandy = panDeltaY || matrixData[5];\n\n const newMatrixData = [...matrixData];\n if (matrixData[0] !== newZoomLevel) {\n newMatrixData[0] = newZoomLevel || newMatrixData[0];\n newMatrixData[3] = newZoomLevel || newMatrixData[3];\n }\n if (matrixData[4] !== newPandx) {\n newMatrixData[4] = newPandx;\n }\n if (matrixData[5] !== newPandy) {\n newMatrixData[5] = newPandy;\n }\n\n if (!areSortedArraysEqual(matrixData, newMatrixData)) {\n setMatrixData(calculateSafeZoneOnZoom(matrixData[0], newMatrixData, panWrapperRef.current));\n }\n // eslint-disable-next-line\n }, [panDeltaX, panDeltaY, tunedZoomLevel]);\n\n useEffect(() => {\n if (!canPan) {\n setMatrixData(INITIAL_MATRIX);\n }\n }, [canPan]);\n\n useEffect(() => {\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }, [noWrap, matrixData]);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!canPan) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n const offsetX = matrixData[4];\n const offsetY = matrixData[5];\n const newDragData: IDragData = {\n dx: offsetX,\n dy: offsetY,\n x: e.pageX,\n y: e.pageY,\n };\n setDragData(newDragData);\n setIsDragging(true);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.add('move');\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.remove('move');\n }\n\n if (onPan) {\n onPan(matrixData[4], matrixData[5]);\n }\n };\n\n function getNewMatrixData(x: number, y: number): number[] {\n const newMatrixData = [...matrixData];\n const deltaX = dragData.x - x;\n const deltaY = dragData.y - y;\n newMatrixData[4] = dragData.dx - deltaX;\n newMatrixData[5] = dragData.dy - deltaY;\n\n return newMatrixData;\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (isDragging) {\n const newMatrixData = getNewMatrixData(e.pageX, e.pageY);\n setMatrixData(newMatrixData);\n\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }\n };\n\n if (noWrap) {\n return children;\n }\n\n return (\n \n \n {children}\n \n \n );\n};\n\nexport default memo(PanZoom);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\nimport {\n AVATAR_FULL_DIMENSIONS,\n MEDIA_VIEWER_MEDIA_QUERY,\n calculateMediaViewerDimensions,\n} from '../common/helpers/mediaDimensions';\nimport {\n selectChat,\n selectChatMessage,\n selectChatMessages,\n selectCurrentMediaSearch,\n selectListedIds,\n selectOutlyingIds,\n selectScheduledMessage,\n selectScheduledMessages,\n selectUser,\n} from '../../modules/selectors';\nimport {\n getChatAvatarHash,\n getChatMediaMessageIds,\n getMessageMediaFilename,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getPhotoFullDimensions,\n getVideoDimensions,\n IDimensions,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { stopCurrentAudio } from '../../util/audioPlayer';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport { animateClosing, animateOpening } from './helpers/ghostAnimation';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\nimport ShowTransition from '../ui/ShowTransition';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport SenderInfo from './SenderInfo';\nimport MediaViewerActions from './MediaViewerActions';\nimport MediaViewerFooter from './MediaViewerFooter';\nimport VideoPlayer from './VideoPlayer';\nimport ZoomControls from './ZoomControls';\nimport PanZoom from './PanZoom';\n\nimport './MediaViewer.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageId?: number;\n senderId?: number;\n origin?: MediaViewerOrigin;\n avatarOwner?: ApiChat | ApiUser;\n profilePhotoIndex?: number;\n message?: ApiMessage;\n chatMessages?: Record;\n collectionIds?: number[];\n animationLevel: 0 | 1 | 2;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewer: FC = ({\n chatId,\n threadId,\n messageId,\n senderId,\n origin,\n avatarOwner,\n profilePhotoIndex,\n message,\n chatMessages,\n collectionIds,\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n animationLevel,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const animationKey = useRef(null);\n const isOpen = Boolean(avatarOwner || messageId);\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const isWebPagePhoto = Boolean(webPagePhoto);\n const isPhoto = Boolean(photo || webPagePhoto);\n const isVideo = Boolean(video);\n const isGif = video ? video.isGif : undefined;\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n const fileName = avatarOwner\n ? `avatar${avatarOwner.id}-${profilePhotoIndex}.jpg`\n : message && getMessageMediaFilename(message);\n const prevSenderId = usePrevious(senderId);\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panDelta, setPanDelta] = useState({ x: 0, y: 0 });\n\n const messageIds = useMemo(() => {\n return isWebPagePhoto && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isWebPagePhoto, messageId, chatMessages, collectionIds, isFromSharedMedia]);\n\n const selectedMediaMessageIndex = messageId ? messageIds.indexOf(messageId) : -1;\n const isFirst = selectedMediaMessageIndex === 0 || selectedMediaMessageIndex === -1;\n const isLast = selectedMediaMessageIndex === messageIds.length - 1 || selectedMediaMessageIndex === -1;\n if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n\n function getMediaHash(full?: boolean) {\n if (avatarOwner && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner, full ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, full ? 'viewerFull' : 'viewerPreview');\n }\n\n const blobUrlPictogram = useMedia(\n message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'),\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const previewMediaHash = getMediaHash();\n const blobUrlPreview = useMedia(\n previewMediaHash,\n undefined,\n avatarOwner && previewMediaHash && previewMediaHash.startsWith('profilePhoto')\n ? ApiMediaFormat.DataUri\n : ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const { mediaData: fullMediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMediaHash(true),\n undefined,\n message && getMessageMediaFormat(message, 'viewerFull'),\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n\n const localBlobUrl = (photo || video) ? (photo || video)!.blobUrl : undefined;\n let bestImageData = (!isVideo && (localBlobUrl || fullMediaData)) || blobUrlPreview || blobUrlPictogram;\n const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message));\n if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) {\n bestImageData = thumbDataUri;\n }\n\n const photoDimensions = isPhoto ? getPhotoFullDimensions((\n isWebPagePhoto ? getMessageWebPagePhoto(message!) : getMessagePhoto(message!)\n )!) : undefined;\n const videoDimensions = isVideo ? getVideoDimensions(getMessageVideo(message!)!) : undefined;\n\n useEffect(() => {\n if (!IS_MOBILE_SCREEN) {\n return;\n }\n\n document.body.classList.toggle('is-media-viewer-open', isOpen);\n }, [isOpen]);\n\n const forceUpdate = useForceUpdate();\n useEffect(() => {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', forceUpdate);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(forceUpdate);\n }\n\n return () => {\n if (typeof mql.removeEventListener === 'function') {\n mql.removeEventListener('change', forceUpdate);\n } else if (typeof mql.removeListener === 'function') {\n mql.removeListener(forceUpdate);\n }\n };\n }, [forceUpdate]);\n\n const prevMessage = usePrevious(message);\n const prevOrigin = usePrevious(origin);\n const prevAvatarOwner = usePrevious(avatarOwner);\n const prevBestImageData = usePrevious(bestImageData);\n useEffect(() => {\n if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n const textParts = message ? renderMessageText(message) : undefined;\n const hasFooter = Boolean(textParts);\n animateOpening(hasFooter, origin!, bestImageData!, message);\n }\n\n if (isGhostAnimation && !isOpen && (prevMessage || prevAvatarOwner)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n animateClosing(prevOrigin!, prevBestImageData!, prevMessage || undefined);\n }\n }, [\n isGhostAnimation, isOpen, origin, prevOrigin,\n message, prevMessage, prevAvatarOwner, bestImageData, prevBestImageData,\n ]);\n\n useEffect(() => {\n let timer: number | undefined;\n\n if (isZoomed) {\n setCanPanZoomWrap(true);\n } else {\n timer = window.setTimeout(() => {\n setCanPanZoomWrap(false);\n }, ANIMATION_DURATION);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [isZoomed]);\n\n const closeZoom = () => {\n setIsZoomed(false);\n setZoomLevel(1);\n setPanDelta({ x: 0, y: 0 });\n };\n\n const handleZoomToggle = useCallback(() => {\n setIsZoomed(!isZoomed);\n setZoomLevel(!isZoomed ? 1.5 : 1);\n if (isZoomed) {\n setPanDelta({ x: 0, y: 0 });\n }\n }, [isZoomed]);\n\n const handleZoomValue = useCallback((level: number, canCloseZoom = false) => {\n setZoomLevel(level);\n if (level === 1 && canCloseZoom) {\n closeZoom();\n }\n }, []);\n\n const close = useCallback(() => {\n closeMediaViewer();\n closeZoom();\n }, [closeMediaViewer]);\n\n const handleFooterClick = useCallback(() => {\n close();\n focusMessage({ chatId, threadId, messageId });\n }, [close, chatId, threadId, focusMessage, messageId]);\n\n const handleForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n closeZoom();\n }, [openForwardMenu, chatId, messageId]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(() => {\n if (isZoomed) {\n closeZoom();\n } else {\n close();\n }\n }) : undefined), [close, isOpen, isZoomed]);\n\n useEffect(() => {\n if (isVideo && !isGif) {\n stopCurrentAudio();\n }\n }, [isGif, isVideo]);\n\n const getMessageId = useCallback((fromId: number, direction: number): number => {\n let index = messageIds.indexOf(fromId);\n if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) {\n index += direction;\n }\n\n return messageIds[index];\n }, [messageIds]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, -1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isFirst, messageId, openMediaViewer, origin]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, 1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isLast, messageId, openMediaViewer, origin]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Left': // IE/Edge specific value\n case 'ArrowLeft':\n selectPreviousMedia();\n break;\n\n case 'Right': // IE/Edge specific value\n case 'ArrowRight':\n selectNextMedia();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector('.slide-container > .active, .slide-container > .to');\n if (!element) {\n return undefined;\n }\n\n const shouldCloseOnVideo = isGif && !IS_IOS;\n\n return captureEvents(element, {\n // eslint-disable-next-line max-len\n excludedClosestSelector: `.backdrop, .navigation, .media-viewer-head, .media-viewer-footer${!shouldCloseOnVideo ? ', .VideoPlayer' : ''}`,\n onClick: () => {\n if (!isZoomed) {\n close();\n }\n },\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n } else {\n close();\n }\n } : undefined,\n });\n }, [close, isGif, isZoomed, selectNextMedia, selectPreviousMedia, canPanZoomWrap]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const lang = useLang();\n\n function renderSlide(isActive: boolean) {\n if (avatarOwner) {\n return (\n
\n {renderPhoto(\n fullMediaData || blobUrlPreview,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n !IS_MOBILE_SCREEN && !isZoomed,\n )}\n
\n );\n } else if (message) {\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n\n return (\n
\n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaData || blobUrlPreview || blobUrlPictogram,\n message && calculateMediaViewerDimensions(photoDimensions!, hasFooter),\n !IS_MOBILE_SCREEN && !isZoomed,\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n
\n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_MOBILE_SCREEN && (\n \n \n \n )}\n \n {renderSenderInfo}\n \n \n
\n \n \n {renderSlide}\n \n \n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n \n \n )}\n \n );\n};\n\nfunction renderPhoto(blobUrl?: string, imageSize?: IDimensions, canDrag?: boolean) {\n return blobUrl\n ? (\n \n )\n : (\n \n \n \n );\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = global.mediaViewer;\n const {\n animationLevel,\n } = global.settings.byKey;\n\n if (origin === MediaViewerOrigin.SearchResult) {\n if (!(chatId && messageId)) {\n return { animationLevel };\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n if (!message) {\n return { animationLevel };\n }\n\n return {\n chatId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n animationLevel,\n };\n }\n\n if (avatarOwnerId) {\n const sender = selectUser(global, avatarOwnerId) || selectChat(global, avatarOwnerId);\n\n return {\n messageId: -1,\n senderId: avatarOwnerId,\n avatarOwner: sender,\n profilePhotoIndex: profilePhotoIndex || 0,\n animationLevel,\n origin,\n };\n }\n\n if (!(chatId && threadId && messageId)) {\n return { animationLevel };\n }\n\n let message: ApiMessage | undefined;\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n message = selectScheduledMessage(global, chatId, messageId);\n } else {\n message = selectChatMessage(global, chatId, messageId);\n }\n\n if (!message) {\n return { animationLevel };\n }\n\n let chatMessages: Record | undefined;\n\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n chatMessages = selectScheduledMessages(global, chatId);\n } else {\n chatMessages = selectChatMessages(global, chatId);\n }\n let collectionIds: number[] | undefined;\n\n if (origin === MediaViewerOrigin.Inline || origin === MediaViewerOrigin.Album) {\n collectionIds = selectOutlyingIds(global, chatId, threadId) || selectListedIds(global, chatId, threadId);\n } else if (origin === MediaViewerOrigin.SharedMedia) {\n const currentSearch = selectCurrentMediaSearch(global);\n const { foundIds } = (currentSearch && currentSearch.resultsByType && currentSearch.resultsByType.media) || {};\n collectionIds = foundIds;\n }\n\n return {\n chatId,\n threadId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n chatMessages,\n collectionIds,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openMediaViewer', 'closeMediaViewer', 'openForwardMenu', 'focusMessage',\n ]),\n)(MediaViewer));\n","import React, {\n FC, useMemo, useState, memo, useRef, useEffect, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport {\n getCanPostInChat, getChatTitle, isChatPrivate, sortChatIds,\n} from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick } from '../../util/iteratees';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\n\nimport Loading from '../ui/Loading';\nimport Modal from '../ui/Modal';\nimport InputText from '../ui/InputText';\nimport Button from '../ui/Button';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\n\nimport './ForwardPicker.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n activeListIds?: number[];\n archivedListIds?: number[];\n orderedPinnedIds?: number[];\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\nconst MODAL_HIDE_DELAY_MS = 300;\n\nconst ForwardPicker: FC = ({\n chatsById,\n activeListIds,\n archivedListIds,\n currentUserId,\n isOpen,\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n}) => {\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (isOpen) {\n if (!IS_MOBILE_SCREEN) {\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n });\n }, FOCUS_DELAY_MS);\n }\n } else {\n if (inputRef.current) {\n inputRef.current.blur();\n }\n\n setTimeout(() => {\n setFilter('');\n }, MODAL_HIDE_DELAY_MS);\n }\n }, [isOpen]);\n\n const chatIds = useMemo(() => {\n const listIds = [\n ...activeListIds || [],\n ...archivedListIds || [],\n ];\n\n return sortChatIds([\n ...listIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return true;\n }\n\n if (!getCanPostInChat(chat, MAIN_THREAD_ID)) {\n return false;\n }\n\n if (!filter) {\n return true;\n }\n\n return searchWords(getChatTitle(lang, chatsById[id], undefined, id === currentUserId), filter);\n }),\n ], chatsById, undefined, currentUserId ? [currentUserId] : undefined);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter, lang]);\n\n const [viewportIds, getMore] = useInfiniteScroll(loadMoreChats, chatIds, Boolean(filter));\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n setFilter(e.currentTarget.value);\n }, []);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isOpen, (index) => {\n if (viewportIds) {\n setForwardChatId({ id: viewportIds[index] });\n }\n }, '.ListItem-button', true);\n\n const modalHeader = (\n
\n \n \n \n \n
\n );\n\n return (\n \n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n setForwardChatId({ id })}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n },\n currentUserId,\n } = global;\n\n return {\n chatsById,\n activeListIds: listIds.active,\n archivedListIds: listIds.archived,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setForwardChatId', 'exitForwardMode', 'loadMoreChats']),\n)(ForwardPicker));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiError } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Errors.scss';\n\ntype StateProps = {\n errors: ApiError[];\n};\n\ntype DispatchProps = Pick;\n\nconst Errors: FC = ({ errors, dismissError }) => {\n const lang = useLang();\n\n if (!errors.length) {\n return undefined;\n }\n\n return (\n
\n {errors.map((error) => (\n \n

{getReadableErrorText(error)}

\n \n \n ))}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['errors']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissError']),\n)(Errors));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiNotification } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Notification from '../ui/Notification';\nimport renderText from '../common/helpers/renderText';\n\ntype StateProps = {\n notifications: ApiNotification[];\n};\n\ntype DispatchProps = Pick;\n\nconst Notifications: FC = ({ notifications, dismissNotification }) => {\n if (!notifications.length) {\n return undefined;\n }\n\n return (\n
\n {notifications.map(({ message }) => (\n \n ))}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['notifications']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissNotification']),\n)(Notifications));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\n\nexport type OwnProps = {\n url?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLinkModal: FC = ({ url, toggleSafeLinkModal }) => {\n const lang = useLang();\n\n const handleOpen = useCallback(() => {\n window.open(url);\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal, url]);\n\n const handleDismiss = useCallback(() => {\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal]);\n\n const renderingUrl = useCurrentOrPrev(url);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['toggleSafeLinkModal']),\n)(SafeLinkModal));\n","import React, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport {\n formatMonthAndYear, formatHumanDate, formatTime,\n} from '../../util/dateFormat';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './CalendarModal.scss';\n\nexport type OwnProps = {\n selectedAt?: number;\n maxAt?: number;\n isFutureMode?: boolean;\n isPastMode?: boolean;\n isOpen: boolean;\n withTimePicker?: boolean;\n submitButtonLabel?: string;\n secondButtonLabel?: string;\n onClose: () => void;\n onSubmit: (date: Date) => void;\n onSecondButtonClick?: NoneToVoidFunction;\n};\n\nconst WEEKDAY_LETTERS = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];\n\nconst CalendarModal: FC = ({\n selectedAt,\n maxAt,\n isFutureMode,\n isPastMode,\n isOpen,\n withTimePicker,\n submitButtonLabel,\n secondButtonLabel,\n onClose,\n onSubmit,\n onSecondButtonClick,\n}) => {\n const lang = useLang();\n const now = new Date();\n const defaultSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const maxDate = maxAt ? new Date(maxAt) : undefined;\n\n const [selectedDate, setSelectedDate] = useState(defaultSelectedDate);\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(defaultSelectedDate.getMinutes()),\n );\n\n const currentYear = selectedDate.getFullYear();\n const currentMonth = selectedDate.getMonth();\n const currentDate = selectedDate.getDate();\n\n useEffect(() => {\n if (isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate]);\n\n const shouldDisableNextMonth = (isPastMode && currentYear >= now.getFullYear() && currentMonth >= now.getMonth())\n || (maxDate && currentYear >= maxDate.getFullYear() && currentMonth >= maxDate.getMonth());\n const shouldDisablePrevMonth = isFutureMode && currentYear <= now.getFullYear() && currentMonth <= now.getMonth();\n\n const calendarGrid = useMemo(() => (\n buildCalendarGrid(currentYear, currentMonth)\n ), [currentMonth, currentYear]);\n\n function handlePrevMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() - 1);\n\n return dateCopy;\n });\n }\n\n function handleNextMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() + 1);\n\n return dateCopy;\n });\n }\n\n function handleDateSelect(date: number) {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setDate(date);\n\n return dateCopy;\n });\n }\n\n function handleSubmit() {\n onSubmit(selectedDate);\n }\n\n const handleChangeHours = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedHours('');\n e.target.value = '';\n return;\n }\n\n const hours = Math.max(0, Math.min(Number(value), 23));\n\n const date = new Date(selectedDate.getTime());\n date.setHours(hours);\n setSelectedDate(date);\n\n const hoursStr = formatInputTime(hours);\n setSelectedHours(hoursStr);\n e.target.value = hoursStr;\n }, [selectedDate]);\n\n const handleChangeMinutes = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedMinutes('');\n e.target.value = '';\n return;\n }\n\n const minutes = Math.max(0, Math.min(Number(value), 59));\n\n const date = new Date(selectedDate.getTime());\n date.setMinutes(minutes);\n setSelectedDate(date);\n\n const minutesStr = formatInputTime(minutes);\n setSelectedMinutes(minutesStr);\n e.target.value = minutesStr;\n }, [selectedDate]);\n\n function renderTimePicker() {\n return (\n
\n \n :\n \n
\n );\n }\n\n return (\n \n
\n
\n \n \n \n\n

\n {formatMonthAndYear(lang, selectedDate, IS_MOBILE_SCREEN)}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((letter) => (\n
\n {letter}\n
\n ))}\n {calendarGrid.map((gridDate) => (\n handleDateSelect(gridDate)}\n className={buildClassName(\n 'day-button',\n isDisabledDay(\n currentYear, currentMonth, gridDate, isFutureMode ? now : undefined, isPastMode ? now : maxDate,\n )\n ? 'disabled'\n : `${gridDate ? 'clickable' : ''}`,\n gridDate === currentDate && 'selected',\n )}\n >\n {!!gridDate && (\n {gridDate}\n )}\n
\n ))}\n
\n \n\n {withTimePicker && renderTimePicker()}\n\n
\n \n {secondButtonLabel && (\n \n )}\n
\n \n );\n};\n\nfunction buildCalendarGrid(year: number, month: number) {\n const grid: number[] = [];\n\n const date = new Date();\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(1);\n\n const monthStartDay = date.getDay();\n // Fill empty cells\n for (let i = 1; i < monthStartDay; i++) {\n grid.push(0);\n }\n\n while (date.getMonth() === month) {\n const gridDate = date.getDate();\n grid.push(gridDate);\n date.setDate(gridDate + 1);\n }\n\n return grid;\n}\n\nfunction isDisabledDay(year: number, month: number, day: number, minDate?: Date, maxDate?: Date) {\n const selectedDay = new Date(year, month, day, 0, 0, 0, 0);\n const fixedMinDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0, 0, 0);\n const fixedMaxDate = maxDate && new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 0, 0, 0, 0);\n\n if (fixedMaxDate && selectedDay > fixedMaxDate) {\n return true;\n } else if (fixedMinDate && selectedDay < fixedMinDate) {\n return true;\n }\n\n return false;\n}\n\nfunction formatInputTime(value: string | number) {\n return String(value).padStart(2, '0');\n}\n\nfunction formatSubmitLabel(lang: LangFn, date: Date) {\n const day = formatHumanDate(lang, date, true);\n\n if (day === 'Today') {\n return lang('Conversation.ScheduleMessage.SendToday', formatTime(date));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', day).replace('%@', formatTime(date));\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport CalendarModal from '../common/CalendarModal';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n selectedAt?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst HistoryCalendar: FC = ({\n isOpen, selectedAt, searchMessagesByDate, closeHistoryCalendar,\n}) => {\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeHistoryCalendar();\n }, [closeHistoryCalendar, searchMessagesByDate]);\n\n const lang = useLang();\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n selectedAt: global.historyCalendarSelectedAt,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesByDate', 'closeHistoryCalendar',\n ]),\n)(HistoryCalendar));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { IAlbum } from '../../types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectAllowedMessageActions,\n selectChat,\n selectCurrentMessageList,\n selectUser,\n} from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n message: ApiMessage;\n album?: IAlbum;\n onClose: () => void;\n};\n\ntype StateProps = {\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteMessageModal: FC = ({\n isOpen,\n isSchedule,\n message,\n album,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n deleteMessages({ messageIds, shouldDeleteForAll: true });\n onClose();\n }, [deleteMessages, message.id, onClose, album]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n if (isSchedule) {\n deleteScheduledMessages({ messageIds });\n } else {\n deleteMessages({\n messageIds,\n shouldDeleteForAll: false,\n });\n }\n onClose();\n }, [album, message.id, isSchedule, onClose, deleteScheduledMessages, deleteMessages]);\n\n const lang = useLang();\n\n return (\n \n

{lang('AreYouSureDeleteSingleMessage')}

\n {willDeleteForCurrentUserOnly && (\n

{lang('lng_delete_for_me_chat_hint')}

\n )}\n {willDeleteForAll && (\n

{lang('lng_delete_for_everyone_hint', 1, 'i')}

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message, isSchedule }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const { canDeleteForAll } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const chat = selectChat(global, message.chatId);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages', 'deleteScheduledMessages',\n ]),\n)(DeleteMessageModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectChat, selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: number;\n messageId: number;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isPrivateChat: boolean;\n isChatWithSelf: boolean;\n isGroup: boolean;\n isSuperGroup: boolean;\n canPinForAll: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst PinMessageModal: FC = ({\n isOpen,\n messageId,\n chatId,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n onClose,\n pinMessage,\n}) => {\n const handlePinMessageForAll = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false,\n });\n onClose();\n }, [pinMessage, chatId, messageId, onClose]);\n\n const handlePinMessage = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false, isOneSide: true, isSilent: true,\n });\n onClose();\n }, [chatId, messageId, onClose, pinMessage]);\n\n const lang = useLang();\n\n function renderMessage() {\n if (isChannel) {\n return lang('PinMessageAlertChannel');\n }\n\n if (isGroup || isSuperGroup) {\n return lang('PinMessageAlert');\n }\n\n return lang('PinMessageAlertChat');\n }\n\n return (\n \n

{renderMessage()}

\n \n {canPinForAll && (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const isPrivateChat = isChatPrivate(chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const chat = selectChat(global, chatId);\n const isChannel = !!chat && isChatChannel(chat);\n const isGroup = !!chat && isChatBasicGroup(chat);\n const isSuperGroup = !!chat && isChatSuperGroup(chat);\n const canPinForAll = (isPrivateChat && !isChatWithSelf) || isSuperGroup || isGroup;\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['pinMessage']),\n)(PinMessageModal));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId?: number;\n pinnedMessagesCount?: number;\n onClose: () => void;\n onUnpin: () => void;\n};\n\nconst UnpinAllMessagesModal: FC = ({\n isOpen,\n pinnedMessagesCount = 0,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n return (\n \n

{lang('Chat.UnpinAllMessagesConfirmation', pinnedMessagesCount, 'i')}

\n \n \n \n );\n};\n\nexport default memo(UnpinAllMessagesModal);\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectCanDeleteSelectedMessages, selectCurrentChat, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n selectedMessageIds?: number[];\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteSelectedMessagesModal: FC = ({\n isOpen,\n isSchedule,\n selectedMessageIds,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n exitMessageSelectMode,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n exitMessageSelectMode();\n onClose();\n }, [deleteMessages, exitMessageSelectMode, selectedMessageIds, onClose]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n if (isSchedule) {\n deleteScheduledMessages({ messageIds: selectedMessageIds });\n } else {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: false });\n }\n\n exitMessageSelectMode();\n onClose();\n }, [\n isSchedule, exitMessageSelectMode, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages,\n ]);\n\n const lang = useLang();\n\n if (!selectedMessageIds) {\n return undefined;\n }\n\n return (\n \n

{lang('AreYouSureDeleteFewMessages')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete them just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete them for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { isSchedule }): StateProps => {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { canDeleteForAll } = selectCanDeleteSelectedMessages(global);\n const chat = selectCurrentChat(global);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n selectedMessageIds,\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages',\n 'deleteScheduledMessages',\n 'exitMessageSelectMode',\n ]),\n)(DeleteSelectedMessagesModal));\n","import React, { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCurrentMessageList,\n selectSelectedMessagesCount,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useFlag from '../../hooks/useFlag';\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport MenuItem from '../ui/MenuItem';\n\nimport DeleteSelectedMessagesModal from './DeleteSelectedMessagesModal';\n\nimport './MessageSelectToolbar.scss';\n\nexport type OwnProps = {\n isActive?: boolean;\n canPost?: boolean;\n messageListType?: MessageListType;\n};\n\ntype StateProps = {\n isSchedule: boolean;\n selectedMessagesCount?: number;\n canDeleteMessages?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, openDeleteModal, exitMessageSelectMode]);\n\n const prevSelectedMessagesCount = usePrevious(selectedMessagesCount || undefined, true);\n const renderingSelectedMessagesCount = isActive ? selectedMessagesCount : prevSelectedMessagesCount;\n\n const lang = useLang();\n\n const formattedMessagesCount = lang('VoiceOver.Chat.MessagesSelected', renderingSelectedMessagesCount);\n\n const className = buildClassName(\n 'MessageSelectToolbar',\n canPost && 'with-composer',\n isActive && 'shown',\n );\n\n return (\n
\n
\n \n \n \n \n {formattedMessagesCount}\n \n\n {!!selectedMessagesCount && (\n
\n {messageListType !== 'scheduled' && (\n \n \n {lang('Forward')}\n \n \n )}\n \n \n {lang('Delete')}\n \n \n
\n )}\n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']),\n)(MessageSelectToolbar));\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nexport default (\n onSelect: NoneToVoidFunction,\n) => {\n // eslint-disable-next-line no-null/no-null\n const buttonRef = useRef(null);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n const isFocused = buttonRef.current === document.activeElement;\n\n if (isFocused) {\n onSelect();\n }\n }, [onSelect]);\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown, false);\n\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n return buttonRef;\n};\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport { isChatPrivate, getPrivateChatUserId } from '../../../modules/helpers';\nimport { selectChat, selectUser, selectIsChatPinned } from '../../../modules/selectors';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n withUsername?: boolean;\n onClick: (id: number) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n isPinned?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n handleDelete: openDeleteModal,\n });\n\n const handleClick = () => {\n onClick(chatId);\n };\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const privateChatUserId = chat && getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n const isPinned = selectIsChatPinned(global, chatId);\n\n return {\n chat,\n privateChatUser,\n isPinned,\n };\n },\n)(LeftSearchResultChat));\n","import React, {\n FC, useEffect, useCallback, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFirstOrLastName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport LeftSearchResultChat from './LeftSearchResultChat';\n\nimport './RecentContacts.scss';\n\ntype OwnProps = {\n onReset: () => void;\n};\n\ntype StateProps = {\n topUserIds?: number[];\n usersById: Record;\n recentlyFoundChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SEARCH_CLOSE_TIMEOUT_MS = 250;\nconst NBSP = '\\u00A0';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst RecentContacts: FC = ({\n topUserIds, usersById, recentlyFoundChatIds,\n onReset, loadTopUsers, loadContactList, openChat,\n addRecentlyFoundChatId, clearRecentlyFoundChats,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const topUsersRef = useRef(null);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadTopUsers();\n // Loading full contact list for quick local search before user enters the query\n loadContactList();\n });\n }, [loadTopUsers, loadContactList]);\n\n useHorizontalScroll(topUsersRef.current, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\n onReset();\n setTimeout(() => {\n addRecentlyFoundChatId({ id });\n }, SEARCH_CLOSE_TIMEOUT_MS);\n },\n [openChat, addRecentlyFoundChatId, onReset],\n );\n\n const lang = useLang();\n\n return (\n
\n {topUserIds && (\n
\n
\n {topUserIds.map((userId) => (\n
handleClick(userId)} dir={lang.isRtl ? 'rtl' : undefined}>\n \n
{renderText(getUserFirstOrLastName(usersById[userId]) || NBSP)}
\n
\n ))}\n
\n
\n )}\n {recentlyFoundChatIds && (\n
\n

\n {lang('Recent')}\n\n \n \n \n

\n {recentlyFoundChatIds.map((id) => (\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: topUserIds } = global.topPeers;\n const usersById = global.users.byId;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n return {\n topUserIds,\n usersById,\n recentlyFoundChatIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadTopUsers',\n 'loadContactList',\n 'openChat',\n 'addRecentlyFoundChatId',\n 'clearRecentlyFoundChats',\n ]),\n)(RecentContacts));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus,\n} from '../../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport renderText from '../../common/helpers/renderText';\nimport { pick } from '../../../util/iteratees';\nimport useMedia from '../../../hooks/useMedia';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useLang, { LangFn } from '../../../hooks/useLang';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport ListItem from '../../ui/ListItem';\nimport Link from '../../ui/Link';\n\nimport './ChatMessage.scss';\n\ntype OwnProps = {\n searchQuery?: string;\n message: ApiMessage;\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatMessage: FC = ({\n message,\n searchQuery,\n chatId,\n chat,\n privateChatUser,\n focusMessage,\n lastSyncTime,\n}) => {\n const mediaThumbnail = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro'));\n const isRoundVideo = Boolean(getMessageRoundVideo(message));\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n const lang = useLang();\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n \n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n
\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n\n
\n
\n
\n {renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}\n
\n
\n
\n \n );\n};\n\nfunction renderMessageSummary(\n lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean,\n) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, message, true), ['emoji', 'highlight'], { highlight: searchQuery })}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const privateChatUserId = getPrivateChatUserId(chat);\n\n return {\n chat,\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n ]),\n)(ChatMessage));\n","import React, { FC, memo, useMemo } from '../../../lib/teact/teact';\nimport { formatDateToString } from '../../../util/dateFormat';\n\nimport './DateSuggest.scss';\n\nconst SUGGESTION_COUNT = 8;\n\nexport type OwnProps = {\n searchDate: string;\n onSelect: (value: Date) => void;\n};\n\nconst DateSuggest: FC = ({\n searchDate, onSelect,\n}) => {\n const suggestions = useMemo(() => getSuggestionsFromDate(searchDate), [searchDate]);\n return (\n
\n {suggestions.map(({ date, text }) => {\n return (\n onSelect(date)}\n className=\"date-item\"\n key={text}\n >\n \n {text}\n \n );\n })}\n
\n );\n};\n\nfunction getSuggestionsFromDate(searchDate: string) {\n const hasYear = searchDate.match(/^\\d{2,4}-\\d{2}-\\d{2}$/g);\n if (hasYear) {\n const date = new Date(searchDate);\n return [{ date, text: formatDateToString(date) }];\n }\n\n const suggestion = [];\n const currentDate = new Date();\n const currentYear = currentDate.getFullYear();\n const latestYear = currentDate.getTime() > (new Date(`${currentYear}-${searchDate}`)).getTime()\n ? currentYear\n : currentYear - 1;\n\n for (let i = 0; i < SUGGESTION_COUNT; i++) {\n const date = new Date(`${latestYear - i}-${searchDate}`);\n suggestion.push({ date, text: formatDateToString(date) });\n }\n\n return suggestion;\n}\n\nexport default memo(DateSuggest);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport searchWords from '../../../util/searchWords';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getUserFullName, getMessageSummaryText, sortChatIds } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport LeftSearchResultChat from './LeftSearchResultChat';\nimport RecentContacts from './RecentContacts';\nimport ChatMessage from './ChatMessage';\nimport DateSuggest from './DateSuggest';\nimport Link from '../../ui/Link';\nimport NothingFound from '../../common/NothingFound';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n searchDate?: number;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n localContactIds?: number[];\n localChatIds?: number[];\n localUserIds?: number[];\n globalChatIds?: number[];\n globalUserIds?: number[];\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n usersById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH = 4;\nconst LESS_LIST_ITEMS_AMOUNT = 3;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatResults: FC = ({\n searchQuery, searchDate, dateSearchQuery, currentUserId,\n localContactIds, localChatIds, localUserIds, globalChatIds, globalUserIds,\n foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime,\n onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n}) => {\n const lang = useLang();\n\n const [shouldShowMoreLocal, setShouldShowMoreLocal] = useState(false);\n const [shouldShowMoreGlobal, setShouldShowMoreGlobal] = useState(false);\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const handleChatClick = useCallback(\n (id: number) => {\n openChat({ id });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_MOBILE_SCREEN) {\n onReset();\n }\n },\n [currentUserId, openChat, addRecentlyFoundChatId, onReset],\n );\n\n const handlePickerItemClick = useCallback((id: number) => {\n setGlobalSearchChatId({ id });\n }, [setGlobalSearchChatId]);\n\n const localResults = useMemo(() => {\n if (!searchQuery || (searchQuery.startsWith('@') && searchQuery.length < 2)) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const foundContactIds = localContactIds\n ? localContactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const fullName = getUserFullName(user);\n return (fullName && searchWords(fullName, searchQuery)) || searchWords(user.username, searchQuery);\n })\n : [];\n\n return [\n ...(currentUserId && searchWords(lang('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...sortChatIds(unique([\n ...foundContactIds,\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById),\n ];\n }, [searchQuery, localContactIds, currentUserId, lang, localChatIds, localUserIds, chatsById, usersById]);\n\n const globalResults = useMemo(() => {\n if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChatIds || !globalUserIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return sortChatIds(unique([...globalChatIds, ...globalUserIds]), chatsById, true);\n }, [chatsById, globalChatIds, globalUserIds, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if ((!searchQuery && !searchDate) || !foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId, searchQuery, searchDate]);\n\n const handleClickShowMoreLocal = useCallback(() => {\n setShouldShowMoreLocal(!shouldShowMoreLocal);\n }, [shouldShowMoreLocal]);\n\n const handleClickShowMoreGlobal = useCallback(() => {\n setShouldShowMoreGlobal(!shouldShowMoreGlobal);\n }, [shouldShowMoreGlobal]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages\n && !localResults.length && !globalResults.length && !foundMessages.length;\n\n if (!searchQuery && !searchDate) {\n return ;\n }\n\n return (\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && (\n \n )}\n {!!localResults.length && (\n
\n {localResults.map((id) => (\n \n ))}\n
\n )}\n {!!localResults.length && (\n
\n

\n {localResults.length > LESS_LIST_ITEMS_AMOUNT && (\n \n {lang(shouldShowMoreLocal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionDialogs')}\n

\n {localResults.map((id, index) => {\n if (!shouldShowMoreLocal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!globalResults.length && (\n
\n

\n {globalResults.length > LESS_LIST_ITEMS_AMOUNT && (\n \n {lang(shouldShowMoreGlobal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionGlobal')}\n

\n {globalResults.map((id, index) => {\n if (!shouldShowMoreGlobal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!foundMessages.length && (\n
\n

{lang('SearchMessages')}

\n {foundMessages.map(renderFoundMessage)}\n
\n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n\n const { userIds: localContactIds } = global.contactList || {};\n\n if (!localContactIds) {\n return {\n chatsById,\n usersById,\n };\n }\n\n const { currentUserId, messages, lastSyncTime } = global;\n const {\n fetchingStatus, globalResults, localResults, resultsByType,\n } = global.globalSearch;\n const { chatIds: globalChatIds, userIds: globalUserIds } = globalResults || {};\n const { chatIds: localChatIds, userIds: localUserIds } = localResults || {};\n const { byChatId: globalMessagesByChatId } = messages;\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n localContactIds,\n localChatIds,\n localUserIds,\n globalChatIds,\n globalUserIds,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n usersById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'addRecentlyFoundChatId',\n 'searchMessagesGlobal',\n 'setGlobalSearchChatId',\n ]),\n)(ChatResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getMessageSummaryText } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport DateSuggest from './DateSuggest';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatMessageResults: FC = ({\n searchQuery,\n currentUserId,\n dateSearchQuery,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n searchMessagesGlobal,\n onSearchDateSelect,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n chatId: currentUserId,\n });\n });\n }\n }, [currentUserId, lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages && !foundMessages.length;\n\n return (\n
\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && (\n \n )}\n {!!foundMessages.length && foundMessages.map(renderFoundMessage)}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { currentUserId, messages: { byChatId: globalMessagesByChatId }, lastSyncTime } = global;\n const { fetchingStatus, resultsByType } = global.globalSearch;\n\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMessagesGlobal']),\n)(ChatMessageResults));\n","import { GlobalState } from '../../../../global/types';\nimport {\n ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser,\n} from '../../../../api/types';\n\nexport type StateProps = {\n isLoading?: boolean;\n chatsById: Record;\n usersById: Record;\n globalMessagesByChatId?: Record }>;\n foundIds?: string[];\n lastSyncTime?: number;\n searchChatId?: number;\n};\n\nexport function createMapStateToProps(type: ApiGlobalMessageSearchType) {\n return (global: GlobalState, props: any) => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n const {\n fetchingStatus, resultsByType, chatId,\n } = global.globalSearch;\n\n // One component is used for two different types of results.\n // The differences between them are only in the isVoice property.\n // The rest of the search results use their own personal components.\n const currentType = type !== 'audio' ? type : (props && props.isVoice ? 'voice' : 'audio');\n\n const { byChatId: globalMessagesByChatId } = global.messages;\n const { foundIds } = (resultsByType && resultsByType[currentType]) || {};\n\n return {\n isLoading: foundIds === undefined\n || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false),\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n searchChatId: chatId,\n lastSyncTime: global.lastSyncTime,\n };\n };\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection, MediaViewerOrigin } from '../../../types';\n\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'media';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst MediaResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n openMediaViewer,\n}) => {\n const lang = useLang();\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleSelectMedia = useCallback((messageId: number, chatId: number) => {\n openMediaViewer({\n chatId,\n messageId,\n origin: MediaViewerOrigin.SearchResult,\n });\n }, [openMediaViewer]);\n\n function renderGallery() {\n return (\n
\n {foundMessages.map((message) => (\n \n ))}\n
\n );\n }\n\n function renderSearchResult() {\n return foundMessages.map((message) => (\n \n ));\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n const isMediaGrid = canRenderContents && foundIds && foundIds.length > 0 && !searchQuery;\n const isMessageList = canRenderContents && foundIds && foundIds.length > 0 && searchQuery;\n\n const classNames = buildClassName(\n 'search-content custom-scroll',\n isMessageList && 'chat-list',\n );\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {isMediaGrid && renderGallery()}\n {isMessageList && renderSearchResult()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'openMediaViewer',\n ]),\n)(MediaResults));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isChatPrivate,\n isChatGroup,\n} from '../../../../modules/helpers';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport function getSenderName(\n lang: LangFn, message: ApiMessage, chatsById: Record, usersById: Record,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isChatPrivate(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(lang, sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isChatPrivate(senderId) && (sender as ApiUser).isSelf) {\n senderName = `${lang('FromYou')} → ${getChatTitle(lang, chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(lang, chat)}`;\n }\n }\n\n return senderName;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport WebLink from '../../common/WebLink';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'links';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst LinkResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(LinkResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport { getMessageDocument } from '../../../modules/helpers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport Document from '../../common/Document';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'documents';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst FileResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n const message = globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n\n return message && getMessageDocument(message) ? message : undefined;\n }).filter(Boolean) as ApiMessage[];\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(lang, new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(FileResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Audio from '../../common/Audio';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n isVoice?: boolean;\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst AudioResults: FC = ({\n isVoice,\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n}) => {\n const lang = useLang();\n const currentType = isVoice ? 'voice' : 'audio';\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: currentType,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [currentType, lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n const handlePlayAudio = useCallback((messageId: number, chatId: number) => {\n openAudioPlayer({ chatId, messageId });\n }, [openAudioPlayer]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps('audio'),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n 'openAudioPlayer',\n ]),\n)(AudioResults));\n","import React, {\n FC, memo, useCallback, useState, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { GlobalSearchContent } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { parseDateString } from '../../../util/dateFormat';\nimport useKeyboardListNavigation from '../../../hooks/useKeyboardListNavigation';\nimport useLang from '../../../hooks/useLang';\n\nimport TabList from '../../ui/TabList';\nimport Transition from '../../ui/Transition';\nimport ChatResults from './ChatResults';\nimport UserChatResults from './ChatMessageResults';\nimport MediaResults from './MediaResults';\nimport LinkResults from './LinkResults';\nimport FileResults from './FileResults';\nimport AudioResults from './AudioResults';\n\nimport './LeftSearch.scss';\n\nexport type OwnProps = {\n searchQuery?: string;\n searchDate?: number;\n isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: GlobalSearchContent.ChatList, title: 'SearchAllChatsShort' },\n { type: GlobalSearchContent.Media, title: 'SharedMediaTab2' },\n { type: GlobalSearchContent.Links, title: 'SharedLinksTab2' },\n { type: GlobalSearchContent.Files, title: 'SharedFilesTab2' },\n { type: GlobalSearchContent.Music, title: 'SharedMusicTab2' },\n { type: GlobalSearchContent.Voice, title: 'SharedVoiceTab2' },\n];\n\nconst CHAT_TABS = [\n { type: GlobalSearchContent.ChatList, title: 'All Messages' },\n ...TABS.slice(1),\n];\n\nconst TRANSITION_RENDER_COUNT = Object.keys(GlobalSearchContent).length / 2;\n\nconst LeftSearch: FC = ({\n searchQuery,\n searchDate,\n isActive,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(0);\n const dateSearchQuery = useMemo(() => parseDateString(searchQuery), [searchQuery]);\n\n const handleSwitchTab = useCallback((index: number) => {\n const tab = TABS[index];\n setGlobalSearchContent({ content: tab.type });\n setActiveTab(index);\n }, [setGlobalSearchContent]);\n\n const handleSearchDateSelect = useCallback((value: Date) => {\n setGlobalSearchDate({ date: value.getTime() / 1000 });\n }, [setGlobalSearchDate]);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isActive, undefined, '.ListItem-button', true);\n\n return (\n
\n \n \n {() => {\n switch (currentContent) {\n case GlobalSearchContent.ChatList:\n if (chatId) {\n return (\n \n );\n }\n return (\n \n );\n case GlobalSearchContent.Media:\n return ;\n case GlobalSearchContent.Links:\n return ;\n case GlobalSearchContent.Files:\n return ;\n case GlobalSearchContent.Music:\n return (\n \n );\n case GlobalSearchContent.Voice:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentContent, chatId } = global.globalSearch;\n\n return { currentContent, chatId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setGlobalSearchContent', 'setGlobalSearchDate']),\n)(LeftSearch));\n","import { useState, useCallback, useRef } from '../lib/teact/teact';\n\nexport type ReducerAction = { type: Actions; payload?: any };\nexport type StateReducer = (state: State, action: ReducerAction) => State;\nexport type Dispatch = (action: ReducerAction) => void;\n\nexport default function useReducer(\n reducer: StateReducer,\n initialState: State,\n) {\n const reducerRef = useRef(reducer);\n const [state, setState] = useState(initialState);\n\n const dispatch = useCallback((action: ReducerAction) => {\n setState((currentState) => reducerRef.current(currentState, action));\n }, []);\n\n return [\n state,\n dispatch,\n ] as [State, Dispatch];\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { ApiChatFolder } from '../../api/types';\nimport { pick, omit } from '../../util/iteratees';\n\nexport type FolderChatType = {\n icon: string;\n title: string;\n key: keyof Pick;\n};\n\nexport const INCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'user', title: 'FilterContacts', key: 'contacts' },\n { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' },\n { icon: 'group', title: 'FilterGroups', key: 'groups' },\n { icon: 'channel', title: 'FilterChannels', key: 'channels' },\n { icon: 'bots', title: 'FilterBots', key: 'bots' },\n];\n\nexport const EXCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' },\n { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' },\n { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' },\n];\n\nconst INCLUDE_FILTER_FIELDS: Array = [\n 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts',\n];\nconst EXCLUDE_FILTER_FIELDS: Array = [\n 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead',\n];\n\nexport function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) {\n let selectedChatIds: number[] = [];\n let selectedChatTypes: FolderChatType['key'][] = [];\n\n if (mode === 'included') {\n const {\n includedChatIds,\n ...includeFilters\n } = selectTemp\n ? state.includeFilters || {}\n : pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = includedChatIds || [];\n selectedChatTypes = (Object.keys(includeFilters) as Array)\n .filter((key) => Boolean(includeFilters[key]));\n } else {\n const {\n excludedChatIds,\n ...excludeFilters\n } = selectTemp\n ? state.excludeFilters || {}\n : pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = excludedChatIds || [];\n selectedChatTypes = (Object.keys(excludeFilters) as Array)\n .filter((key) => Boolean(excludeFilters[key]));\n }\n\n return {\n selectedChatIds,\n selectedChatTypes,\n };\n}\n\nfunction getSuggestedFolderName(includeFilters?: FolderIncludeFilters) {\n if (includeFilters) {\n const {\n includedChatIds,\n ...filters\n } = includeFilters;\n\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (includedChatIds && includedChatIds.length)\n ) {\n return '';\n }\n\n if (filters.bots) {\n return 'Bots';\n } else if (filters.groups) {\n return 'Groups';\n } else if (filters.channels) {\n return 'Channels';\n } else if (filters.contacts) {\n return 'Contacts';\n } else if (filters.nonContacts) {\n return 'Non-Contacts';\n }\n }\n\n return '';\n}\n\ntype FolderIncludeFilters = Pick;\ntype FolderExcludeFilters = Pick;\n\nexport type FoldersState = {\n mode: 'create' | 'edit';\n isLoading?: boolean;\n isTouched?: boolean;\n error?: string;\n folderId?: number;\n chatFilter: string;\n folder: Omit;\n includeFilters?: FolderIncludeFilters;\n excludeFilters?: FolderExcludeFilters;\n};\nexport type FoldersActions = (\n 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' |\n 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters'\n);\nexport type FolderEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FoldersState = {\n mode: 'create',\n chatFilter: '',\n folder: {\n title: '',\n includedChatIds: [],\n excludedChatIds: [],\n },\n};\n\nconst foldersReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setTitle':\n return {\n ...state,\n folder: {\n ...state.folder,\n title: action.payload,\n },\n isTouched: true,\n };\n case 'editIncludeFilters':\n return {\n ...state,\n includeFilters: pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n ),\n };\n case 'editExcludeFilters':\n return {\n ...state,\n excludeFilters: pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n ),\n };\n case 'setIncludeFilters':\n return {\n ...state,\n includeFilters: action.payload,\n chatFilter: '',\n };\n case 'setExcludeFilters':\n return {\n ...state,\n excludeFilters: action.payload,\n chatFilter: '',\n };\n case 'saveFilters':\n if (state.includeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, INCLUDE_FILTER_FIELDS),\n title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters),\n ...state.includeFilters,\n },\n includeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else if (state.excludeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, EXCLUDE_FILTER_FIELDS),\n ...state.excludeFilters,\n },\n excludeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else {\n return state;\n }\n case 'editFolder': {\n const { id: folderId, description, ...folder } = action.payload;\n\n return {\n mode: 'edit',\n folderId,\n folder,\n chatFilter: '',\n };\n }\n case 'setChatFilter': {\n return {\n ...state,\n chatFilter: action.payload,\n };\n }\n case 'setIsLoading': {\n return {\n ...state,\n isLoading: action.payload,\n };\n }\n case 'setError': {\n return {\n ...state,\n error: action.payload,\n };\n }\n case 'reset':\n return INITIAL_STATE;\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(foldersReducer, INITIAL_STATE);\n};\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\n\nexport type TwoFaActions = (\n 'setCurrentPassword' | 'setPassword' | 'setHint' | 'setEmail' | 'reset'\n);\nexport type TwoFaDispatch = Dispatch;\n\nexport type TwoFaState = {\n currentPassword: string;\n password: string;\n hint: string;\n email: string;\n};\n\nconst INITIAL_STATE: TwoFaState = {\n currentPassword: '',\n password: '',\n hint: '',\n email: '',\n};\n\nconst twoFaReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setCurrentPassword':\n return {\n ...state,\n currentPassword: action.payload,\n };\n\n case 'setPassword':\n return {\n ...state,\n password: action.payload,\n };\n\n case 'setHint':\n return {\n ...state,\n hint: action.payload,\n };\n\n case 'setEmail':\n return {\n ...state,\n email: action.payload,\n };\n\n case 'reset':\n return INITIAL_STATE;\n\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(twoFaReducer, INITIAL_STATE);\n};\n","import React, {\n FC, useCallback, useMemo, memo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n currentScreen: SettingsScreens;\n editedFolderId?: number;\n onReset: () => void;\n onSaveFilter: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\n}) => {\n const [isSignOutDialogOpen, setIsSignOutDialogOpen] = useState(false);\n const [isDeleteFolderDialogOpen, setIsDeleteFolderDialogOpen] = useState(false);\n\n const openSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(true);\n }, []);\n\n const closeSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(false);\n }, []);\n\n const openDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(true);\n }, []);\n\n const closeDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(false);\n }, []);\n\n const handleSignOutMessage = useCallback(() => {\n closeSignOutConfirmation();\n signOut();\n }, [closeSignOutConfirmation, signOut]);\n\n const handleDeleteFolderMessage = useCallback(() => {\n closeDeleteFolderConfirmation();\n deleteChatFolder({ id: editedFolderId });\n onReset();\n }, [editedFolderId, closeDeleteFolderConfirmation, deleteChatFolder, onReset]);\n\n const SettingsMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n const lang = useLang();\n\n function renderHeaderContent() {\n switch (currentScreen) {\n case SettingsScreens.EditProfile:\n return

{lang('lng_settings_information')}

;\n case SettingsScreens.General:\n return

{lang('General')}

;\n case SettingsScreens.Notifications:\n return

{lang('Notifications')}

;\n case SettingsScreens.Privacy:\n return

{lang('PrivacySettings')}

;\n case SettingsScreens.Language:\n return

{lang('Language')}

;\n\n case SettingsScreens.GeneralChatBackground:\n return

{lang('ChatBackground')}

;\n case SettingsScreens.GeneralChatBackgroundColor:\n return

{lang('SetColor')}

;\n\n case SettingsScreens.PrivacyPhoneNumber:\n return

{lang('PrivacyPhone')}

;\n case SettingsScreens.PrivacyLastSeen:\n return

{lang('PrivacyLastSeen')}

;\n case SettingsScreens.PrivacyProfilePhoto:\n return

{lang('Privacy.ProfilePhoto')}

;\n case SettingsScreens.PrivacyForwarding:\n return

{lang('PrivacyForwards')}

;\n case SettingsScreens.PrivacyGroupChats:\n return

{lang('AutodownloadGroupChats')}

;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return

{lang('AlwaysShareWith')}

;\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return

{lang('NeverShareWith')}

;\n\n case SettingsScreens.PrivacyActiveSessions:\n return

{lang('SessionsTitle')}

;\n case SettingsScreens.PrivacyBlockedUsers:\n return

{lang('BlockedUsers')}

;\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n return

{lang('TwoStepVerification')}

;\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return

{lang('EnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return

{lang('PleaseReEnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaChangePasswordHint:\n return

{lang('PasswordHint')}

;\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaRecoveryEmail:\n return

{lang('RecoveryEmailTitle')}

;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return

Recovery Email Code

;\n case SettingsScreens.TwoFaCongratulations:\n return

{lang('TwoStepVerificationPasswordSet')}

;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return

{lang('PleaseEnterCurrentPassword')}

;\n\n case SettingsScreens.Folders:\n return

{lang('Filters')}

;\n case SettingsScreens.FoldersCreateFolder:\n return

{lang('FilterNew')}

;\n case SettingsScreens.FoldersEditFolder:\n return (\n
\n

{lang('FilterEdit')}

\n\n {editedFolderId && (\n \n \n Delete Folder\n \n \n )}\n
\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n
\n {currentScreen === SettingsScreens.FoldersIncludedChats ? (\n

{lang('FilterInclude')}

\n ) : (\n

{lang('FilterExclude')}

\n )}\n\n \n \n \n
\n );\n\n default:\n return (\n
\n

{lang('SETTINGS')}

\n\n \n {lang('LogOutTitle')}\n \n
\n );\n }\n }\n\n return (\n
\n \n \n \n {renderHeaderContent()}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['signOut', 'deleteChatFolder']),\n)(SettingsHeader));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n};\n\nconst SettingsMain: FC = ({\n onScreenSelect,\n currentUser,\n}) => {\n const lang = useLang();\n\n return (\n
\n
\n {currentUser && (\n
\n \n

{getUserFullName(currentUser)}

\n

{formatPhoneNumberWithCode(currentUser.phoneNumber)}

\n
\n )}\n onScreenSelect(SettingsScreens.EditProfile)}\n >\n {lang('lng_settings_information')}\n \n onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\n \n onScreenSelect(SettingsScreens.General)}\n >\n {lang('Telegram.GeneralSettingsViewController')}\n \n onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n \n onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n \n onScreenSelect(SettingsScreens.Language)}\n >\n {lang('Language')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n };\n },\n)(SettingsMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\nimport './FloatingActionButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n className?: string;\n color?: ButtonProps['color'];\n ariaLabel?: ButtonProps['ariaLabel'];\n disabled?: boolean;\n onClick: () => void;\n children: any;\n};\n\nconst FloatingActionButton: FC = ({\n isShown,\n className,\n color = 'primary',\n ariaLabel,\n disabled,\n onClick,\n children,\n}) => {\n const buttonClassName = buildClassName(\n 'FloatingActionButton',\n isShown && 'revealed',\n className,\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default FloatingActionButton;\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\n\ntype OwnProps = {\n currentUsername?: string;\n asLink?: boolean;\n isLoading?: boolean;\n isUsernameAvailable?: boolean;\n checkUsername: AnyToVoidFunction;\n onChange: (value: string | false) => void;\n};\n\nconst MIN_USERNAME_LENGTH = 5;\nconst MAX_USERNAME_LENGTH = 32;\nconst LINK_PREFIX = 'https://t.me/';\nconst LINK_PREFIX_REGEX = /https:\\/\\/t\\.me\\/?/i;\nconst USERNAME_REGEX = /^([a-zA-Z0-9_]+)$/;\n\nconst runDebouncedForCheckUsername = debounce((cb) => cb(), 250, false);\n\nfunction isUsernameValid(username: string) {\n return username.length >= MIN_USERNAME_LENGTH\n && username.length <= MAX_USERNAME_LENGTH\n && USERNAME_REGEX.test(username);\n}\n\nconst SettingsEditProfile: FC = ({\n currentUsername,\n asLink,\n isLoading,\n isUsernameAvailable,\n checkUsername,\n onChange,\n}) => {\n const [username, setUsername] = useState(currentUsername || '');\n\n const lang = useLang();\n const langPrefix = asLink ? 'SetUrl' : 'Username';\n const label = asLink ? lang('SetUrlPlaceholder') : lang('Username');\n\n const [usernameSuccess, usernameError] = useMemo(() => {\n if (!username.length) {\n return [];\n }\n\n if (username.length < MIN_USERNAME_LENGTH) {\n return [undefined, `${label} is too short`];\n }\n if (username.length > MAX_USERNAME_LENGTH) {\n return [undefined, `${label} is too long`];\n }\n if (!USERNAME_REGEX.test(username)) {\n return [undefined, `${label} contains invalid characters`];\n }\n\n if (isUsernameAvailable === undefined) {\n return [];\n }\n\n // Variable `isUsernameAvailable` is initialized with `undefined`, so a strict false check is required\n return [\n isUsernameAvailable ? lang(`${langPrefix}Available`, 'Username') : undefined,\n isUsernameAvailable === false ? lang(`${langPrefix}InUse`) : undefined,\n ];\n }, [username, isUsernameAvailable, lang, langPrefix, label]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [asLink, currentUsername]);\n\n const handleUsernameChange = useCallback((e: ChangeEvent) => {\n const newUsername = e.target.value.trim().replace(LINK_PREFIX_REGEX, '');\n setUsername(newUsername);\n e.target.value = `${asLink ? LINK_PREFIX : ''}${newUsername}`;\n\n const isValid = isUsernameValid(newUsername);\n\n if (isValid) {\n runDebouncedForCheckUsername(() => {\n checkUsername({ username: newUsername });\n });\n }\n\n if (onChange) {\n onChange(isValid ? newUsername : false);\n }\n }, [asLink, checkUsername, onChange]);\n\n return (\n \n );\n};\n\nexport default memo(SettingsEditProfile);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { ProfileEditProgress } from '../../../types';\n\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\nimport { getChatAvatarHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport InputText from '../../ui/InputText';\nimport renderText from '../../common/helpers/renderText';\nimport UsernameInput from '../../common/UsernameInput';\n\ntype StateProps = {\n currentAvatarHash?: string;\n currentFirstName?: string;\n currentLastName?: string;\n currentBio?: string;\n currentUsername?: string;\n progress?: ProfileEditProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst MAX_BIO_LENGTH = 70;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide your first name';\nconst ERROR_BIO_TOO_LONG = 'Bio can\\' be longer than 70 characters';\n\nconst SettingsEditProfile: FC = ({\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const [isUsernameTouched, setIsUsernameTouched] = useState(false);\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n\n const [photo, setPhoto] = useState();\n const [firstName, setFirstName] = useState(currentFirstName || '');\n const [lastName, setLastName] = useState(currentLastName || '');\n const [bio, setBio] = useState(currentBio || '');\n const [username, setUsername] = useState(currentUsername || '');\n\n const currentAvatarBlobUrl = useMedia(currentAvatarHash, false, ApiMediaFormat.BlobUrl);\n\n const isLoading = progress === ProfileEditProgress.InProgress;\n const isUsernameError = username === false;\n\n const isSaveButtonShown = useMemo(() => {\n if (isUsernameError) {\n return false;\n }\n\n return Boolean(photo) || isProfileFieldsTouched || isUsernameAvailable === true;\n }, [photo, isProfileFieldsTouched, isUsernameError, isUsernameAvailable]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadCurrentUser();\n });\n }, [loadCurrentUser]);\n\n useEffect(() => {\n setPhoto(undefined);\n }, [currentAvatarBlobUrl]);\n\n useEffect(() => {\n setFirstName(currentFirstName || '');\n setLastName(currentLastName || '');\n setBio(currentBio || '');\n }, [currentFirstName, currentLastName, currentBio]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [currentUsername]);\n\n useEffect(() => {\n if (progress === ProfileEditProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setIsUsernameTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handlePhotoChange = useCallback((newPhoto: File) => {\n setPhoto(newPhoto);\n }, []);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleBioChange = useCallback((e: ChangeEvent) => {\n setBio(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUsernameChange = useCallback((value: string | false) => {\n setUsername(value);\n setIsUsernameTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n const trimmedBio = bio.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n return;\n }\n\n if (trimmedBio.length > MAX_BIO_LENGTH) {\n setError(ERROR_BIO_TOO_LONG);\n return;\n }\n\n updateProfile({\n photo,\n ...(isProfileFieldsTouched && {\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n bio: trimmedBio,\n }),\n ...(isUsernameTouched && {\n username,\n }),\n });\n }, [\n photo,\n firstName, lastName, bio, isProfileFieldsTouched,\n username, isUsernameTouched,\n updateProfile,\n ]);\n\n const lang = useLang();\n\n return (\n
\n
\n
\n \n \n \n \n\n

\n {renderText(lang('lng_settings_about_bio'), ['br', 'simple_markdown'])}\n

\n
\n\n
\n

{lang('Username')}

\n\n \n\n

\n {renderText(lang('UsernameHelp'), ['br', 'simple_markdown'])}\n

\n {username && (\n

\n {lang('lng_username_link')}
\n https://t.me/{username}\n

\n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n const { progress, isUsernameAvailable } = global.profileEdit || {};\n const currentUser = currentUserId ? selectUser(global, currentUserId) : undefined;\n\n if (!currentUser) {\n return {\n progress,\n isUsernameAvailable,\n };\n }\n\n const {\n firstName: currentFirstName,\n lastName: currentLastName,\n username: currentUsername,\n fullInfo,\n } = currentUser;\n const { bio: currentBio } = fullInfo || {};\n const currentAvatarHash = getChatAvatarHash(currentUser);\n\n return {\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadCurrentUser',\n 'updateProfile',\n 'checkUsername',\n ]),\n)(SettingsEditProfile));\n","import React, {\n FC, memo, useMemo, useCallback, useState, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChatFolder, ApiChat, ApiUser } from '../../../../api/types';\nimport { NotifyException, NotifySettings } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../../modules/selectors';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport Button from '../../../ui/Button';\nimport Loading from '../../../ui/Loading';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\n\ntype OwnProps = {\n onCreateFolder: () => void;\n onEditFolder: (folder: ApiChatFolder) => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n orderedFolderIds?: number[];\n foldersById: Record;\n recommendedChatFolders?: ApiChatFolder[];\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true);\n\nconst MAX_ALLOWED_FOLDERS = 10;\n\nconst SettingsFoldersMain: FC = ({\n onCreateFolder,\n onEditFolder,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n loadRecommendedChatFolders,\n addChatFolder,\n showError,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersAll').then(setAnimationData);\n }\n }, [animationData]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottledForLoadRecommended(() => {\n loadRecommendedChatFolders();\n });\n }, [loadRecommendedChatFolders]);\n\n const handleCreateFolder = useCallback(() => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showError, onCreateFolder]);\n\n const lang = useLang();\n\n const userFolders = useMemo(() => {\n if (!orderedFolderIds) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n\n return orderedFolderIds.map((id) => {\n const folder = foldersById[id];\n\n return {\n id: folder.id,\n title: folder.title,\n subtitle: getFolderDescriptionText(\n lang, chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions,\n ),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, notifySettings, notifyExceptions, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showError]);\n\n return (\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n

\n {lang('CreateNewFilterInfo')}\n

\n\n \n \n {lang('CreateNewFilter')}\n \n
\n\n
\n

{lang('Filters')}

\n\n {userFolders && userFolders.length ? userFolders.map((folder) => (\n onEditFolder(foldersById[folder.id])}\n >\n {folder.title}\n {folder.subtitle}\n \n )) : userFolders && !userFolders.length ? (\n

\n You have no folders yet.\n

\n ) : }\n
\n\n {(recommendedChatFolders && !!recommendedChatFolders.length) && (\n
\n

\n {lang('FilterRecommended')}\n

\n\n {recommendedChatFolders.map((folder) => (\n handleCreateFolderFromRecommended(folder)}\n >\n
\n
\n {folder.title}\n {folder.description}\n
\n\n \n {lang('Add')}\n \n
\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n } = global;\n\n const {\n orderedIds: orderedFolderIds,\n byId: foldersById,\n recommended: recommendedChatFolders,\n } = global.chatFolders;\n\n return {\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showError']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\n\nimport './ShowMoreButton.scss';\n\ntype OwnProps = {\n count: number;\n itemName: string;\n itemPluralName?: string;\n isLoading?: boolean;\n onClick: () => void;\n};\n\nconst ShowMoreButton: FC = ({\n count,\n itemName,\n itemPluralName,\n isLoading,\n onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n \n Show {count} more {count > 1 ? itemPluralName || `${itemName}s` : itemName}\n \n );\n};\n\nexport default ShowMoreButton;\n","import React, {\n FC, memo, useCallback, useState, useEffect, useMemo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick, findIntersectionWithSet } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n FoldersState,\n FolderEditDispatch,\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\nimport InputText from '../../../ui/InputText';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport FloatingActionButton from '../../../ui/FloatingActionButton';\nimport Spinner from '../../../ui/Spinner';\nimport ShowMoreButton from '../../../ui/ShowMoreButton';\n\ntype OwnProps = {\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onAddIncludedChats: () => void;\n onAddExcludedChats: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: number[];\n loadedArchivedChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SUBMIT_TIMEOUT = 500;\n\nconst INITIAL_CHATS_LIMIT = 5;\n\nconst ERROR_NO_TITLE = 'Please provide a title for this folder.';\nconst ERROR_NO_CHATS = 'Please select at least one chat for this folder.';\n\nconst SettingsFoldersEdit: FC = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n onReset,\n loadedActiveChatIds,\n loadedArchivedChatIds,\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n const [isIncludedChatsListExpanded, setIsIncludedChatsListExpanded] = useState(false);\n const [isExcludedChatsListExpanded, setIsExcludedChatsListExpanded] = useState(false);\n\n const {\n selectedChatIds: includedChatIds,\n selectedChatTypes: includedChatTypes,\n } = selectChatFilters(state, 'included');\n const {\n selectedChatIds: excludedChatIds,\n selectedChatTypes: excludedChatTypes,\n } = selectChatFilters(state, 'excluded');\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersNew').then(setAnimationData);\n }\n }, [animationData]);\n\n useEffect(() => {\n setIsIncludedChatsListExpanded(false);\n setIsExcludedChatsListExpanded(false);\n }, [state.folderId]);\n\n const [visibleIncludedChatIds, visibleExcludedChatIds] = useMemo(() => {\n const allLoadedChatsSet = new Set([\n ...loadedActiveChatIds || [],\n ...loadedArchivedChatIds || [],\n ]);\n\n const loadedIncludedChatIds = findIntersectionWithSet(includedChatIds, allLoadedChatsSet);\n const loadedExcludedChatIds = findIntersectionWithSet(excludedChatIds, allLoadedChatsSet);\n\n return [\n isIncludedChatsListExpanded\n ? loadedIncludedChatIds\n : loadedIncludedChatIds.slice(0, INITIAL_CHATS_LIMIT - includedChatTypes.length),\n isExcludedChatsListExpanded\n ? loadedExcludedChatIds\n : loadedExcludedChatIds.slice(0, INITIAL_CHATS_LIMIT - excludedChatTypes.length),\n ];\n }, [\n excludedChatIds, includedChatIds, includedChatTypes, excludedChatTypes,\n isExcludedChatsListExpanded, isIncludedChatsListExpanded,\n loadedActiveChatIds, loadedArchivedChatIds,\n ]);\n\n useEffect(() => {\n if (\n visibleIncludedChatIds.length < includedChatIds.length\n || visibleExcludedChatIds.length < excludedChatIds.length\n ) {\n loadMoreChats({ listType: 'active' });\n }\n }, [\n loadMoreChats,\n excludedChatIds.length,\n includedChatIds.length,\n visibleExcludedChatIds.length,\n visibleIncludedChatIds.length,\n ]);\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n dispatch({ type: 'setTitle', payload: currentTarget.value.trim() });\n }\n\n function handleSubmit() {\n const { title } = state.folder;\n\n if (!title) {\n dispatch({ type: 'setError', payload: ERROR_NO_TITLE });\n return;\n }\n\n if (!includedChatIds.length && !Object.keys(includedChatTypes).length) {\n dispatch({ type: 'setError', payload: ERROR_NO_CHATS });\n return;\n }\n\n dispatch({ type: 'setIsLoading', payload: true });\n if (state.mode === 'edit') {\n editChatFolder({ id: state.folderId, folderUpdate: state.folder });\n } else {\n addChatFolder({ folder: state.folder });\n }\n\n setTimeout(() => {\n onReset();\n }, SUBMIT_TIMEOUT);\n }\n\n function renderChatType(key: string, mode: 'included' | 'excluded') {\n const chatType = mode === 'included'\n ? INCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key)\n : EXCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key);\n\n if (!chatType) {\n return undefined;\n }\n\n return (\n \n {lang(chatType.title)}\n \n );\n }\n\n function renderChats(mode: 'included' | 'excluded') {\n const selectedChatTypes = mode === 'included' ? includedChatTypes : excludedChatTypes;\n const visibleChatIds = mode === 'included' ? visibleIncludedChatIds : visibleExcludedChatIds;\n\n const isExpanded = mode === 'included' ? isIncludedChatsListExpanded : isExcludedChatsListExpanded;\n const allChatIds = mode === 'included' ? includedChatIds : excludedChatIds;\n const leftChatsCount = allChatIds.length - selectedChatTypes.length - visibleChatIds.length;\n const clickHandler = mode === 'included'\n ? () => setIsIncludedChatsListExpanded(true)\n : () => setIsExcludedChatsListExpanded(true);\n\n return (\n <>\n {selectedChatTypes.map((key) => renderChatType(key, mode))}\n {visibleChatIds.map((id) => (\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n {(!isExpanded && leftChatsCount > 0) && (\n \n )}\n \n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n {state.mode === 'create' && (\n

\n {lang('FilterIncludeInfo')}\n

\n )}\n\n \n
\n\n
\n {state.error && state.error === ERROR_NO_CHATS && (\n

\n {state.error}\n

\n )}\n\n

{lang('FilterInclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('included')}\n
\n\n
\n

{lang('FilterExclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('excluded')}\n
\n
\n\n \n {state.isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { listIds } = global.chats;\n\n return {\n loadedActiveChatIds: listIds.active,\n loadedArchivedChatIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolder', 'addChatFolder', 'loadMoreChats']),\n)(SettingsFoldersEdit));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport {\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n FolderChatType,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useInfiniteScroll from '../../../../hooks/useInfiniteScroll';\nimport useLang from '../../../../hooks/useLang';\n\nimport Checkbox from '../../../ui/Checkbox';\nimport InputText from '../../../ui/InputText';\nimport ListItem from '../../../ui/ListItem';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport PickerSelectedItem from '../../../common/PickerSelectedItem';\nimport InfiniteScroll from '../../../ui/InfiniteScroll';\nimport Loading from '../../../ui/Loading';\n\nimport '../../../common/Picker.scss';\nimport './SettingsFoldersChatsPicker.scss';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n chatIds: number[];\n selectedIds: number[];\n selectedChatTypes: string[];\n filterValue?: string;\n onSelectedIdsChange: (ids: number[]) => void;\n onSelectedChatTypesChange: (types: string[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_CHATS = 100;\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst SettingsFoldersChatsPicker: FC = ({\n mode,\n chatIds,\n selectedIds,\n selectedChatTypes,\n filterValue,\n onSelectedIdsChange,\n onSelectedChatTypesChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const chatTypes = mode === 'included' ? INCLUDED_CHAT_TYPES : EXCLUDED_CHAT_TYPES;\n const shouldMinimize = selectedIds.length + selectedChatTypes.length > MAX_FULL_ITEMS;\n const hasMaxChats = selectedIds.length >= MAX_CHATS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n }, [selectedIds, onSelectedIdsChange]);\n\n const handleChatTypeClick = useCallback((key: FolderChatType['key']) => {\n const newSelectedChatTypes = [...selectedChatTypes];\n if (newSelectedChatTypes.includes(key)) {\n newSelectedChatTypes.splice(newSelectedChatTypes.indexOf(key), 1);\n } else {\n newSelectedChatTypes.push(key);\n }\n onSelectedChatTypesChange(newSelectedChatTypes);\n }, [selectedChatTypes, onSelectedChatTypesChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const lang = useLang();\n\n function renderSelectedChatType(key: string) {\n const selectedType = chatTypes.find(({ key: typeKey }) => key === typeKey);\n if (!selectedType) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n function renderChatType(type: FolderChatType) {\n return (\n handleChatTypeClick(type.key)}\n ripple\n >\n \n

{lang(type.title)}

\n \n \n );\n }\n\n function renderItem(id: number) {\n const isSelected = selectedIds.includes(id);\n\n return (\n handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n \n );\n }\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, chatIds, Boolean(filterValue));\n\n return (\n
\n
\n {selectedChatTypes.map(renderSelectedChatType)}\n {selectedIds.map((id, i) => (\n \n ))}\n {!hasMaxChats ? (\n \n ) : (\n

\n {`Sorry, you can't add more than ${MAX_CHATS} chats.`}\n

\n )}\n
\n \n {(!viewportIds || !viewportIds.length || viewportIds.includes(chatIds[0])) && (\n <>\n

\n {lang('FilterChatTypes')}\n

\n {chatTypes.map(renderChatType)}\n
\n

\n {lang('FilterChats')}\n

\n \n )}\n\n {viewportIds && viewportIds.length ? (\n viewportIds.map(renderItem)\n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(SettingsFoldersChatsPicker);\n","import React, {\n FC, memo, useMemo, useCallback,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChat } from '../../../../api/types';\n\nimport useLang from '../../../../hooks/useLang';\nimport { pick } from '../../../../util/iteratees';\nimport searchWords from '../../../../util/searchWords';\nimport { prepareChatList, getChatTitle } from '../../../../modules/helpers';\nimport {\n FoldersState,\n FolderEditDispatch,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersChatsPicker from './SettingsFoldersChatsPicker';\n\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n state: FoldersState;\n dispatch: FolderEditDispatch;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsFoldersChatFilters: FC = ({\n mode,\n state,\n dispatch,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n loadMoreChats,\n}) => {\n const { chatFilter } = state;\n const { selectedChatIds, selectedChatTypes } = selectChatFilters(state, mode, true);\n\n const lang = useLang();\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [...activeChatArrays.pinnedChats, ...activeChatArrays.otherChats]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n !chatFilter\n || searchWords(getChatTitle(lang, chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, lang, selectedChatIds]);\n\n const handleFilterChange = useCallback((newFilter: string) => {\n dispatch({\n type: 'setChatFilter',\n payload: newFilter,\n });\n }, [dispatch]);\n\n const handleSelectedIdsChange = useCallback((ids: number[]) => {\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: { ...state.includeFilters, includedChatIds: ids },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: { ...state.excludeFilters, excludedChatIds: ids },\n });\n }\n }, [mode, state, dispatch]);\n\n const handleSelectedChatTypesChange = useCallback((keys: string[]) => {\n const newFilters: Record = {};\n keys.forEach((key) => {\n newFilters[key] = true;\n });\n\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: {\n includedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: {\n excludedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n }\n }, [mode, selectedChatIds, dispatch]);\n\n if (!displayedIds) {\n return ;\n }\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n } = global;\n\n return {\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats']),\n)(SettingsFoldersChatFilters));\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiChatFolder } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { FoldersState, FolderEditDispatch } from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersMain from './SettingsFoldersMain';\nimport SettingsFoldersEdit from './SettingsFoldersEdit';\nimport SettingsFoldersChatFilters from './SettingsFoldersChatFilters';\n\nimport './SettingsFolders.scss';\n\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n state,\n dispatch,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n dispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (state.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n state.mode, dispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleCreateFolder = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n }, [onScreenSelect, dispatch]);\n\n const handleEditFolder = useCallback((folder: ApiChatFolder) => {\n dispatch({ type: 'editFolder', payload: folder });\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }, [dispatch, onScreenSelect]);\n\n const handleAddIncludedChats = useCallback(() => {\n dispatch({ type: 'editIncludeFilters' });\n onScreenSelect(SettingsScreens.FoldersIncludedChats);\n }, [dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(SettingsScreens.FoldersExcludedChats);\n }, [dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n \n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n return (\n \n );\n case SettingsScreens.FoldersIncludedChats:\n return (\n \n );\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(SettingsFolders);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n range?: { min: number; max: number; step?: number };\n label?: string;\n value: number;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC = ({\n options,\n range,\n label,\n value,\n disabled,\n onChange,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent) => {\n onChange(Number(event.currentTarget.value));\n }, [onChange]);\n\n const className = buildClassName(\n 'RangeSlider',\n disabled && 'disabled',\n );\n\n const trackWidth = useMemo(() => {\n if (options) {\n return (value / (options.length - 1)) * 100;\n } else if (range) {\n const possibleValuesLength = (range.max - range.min) / (range.step || 1);\n return ((value - range.min) / possibleValuesLength) * 100;\n }\n return 0;\n }, [value, options, range]);\n\n const [min, max, step] = useMemo(() => {\n if (options) {\n return [0, options.length - 1, 1];\n } else if (range) {\n return [range.min, range.max, range.step || 1];\n }\n\n return [0, 0, 0];\n }, [range, options]);\n\n return (\n
\n {label && (\n
\n {label}\n {range && (\n {value}\n )}\n
\n )}\n
\n \n \n {options && (\n
\n {options.map((option, index) => (\n onChange(index)}\n >\n {option}\n
\n ))}\n
\n )}\n
\n
\n );\n};\n\nexport default memo(RangeSlider);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\ntype OwnProps = {\n size?: number;\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCoverAnimated: FC = ({\n size = STICKER_SIZE_PICKER_HEADER,\n stickerSet,\n observeIntersection,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaHash = `stickerSet${stickerSet.id}`;\n const lottieData = useMedia(mediaHash, !isIntersecting, ApiMediaFormat.Lottie);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(lottieData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && lottieData && (\n \n )}\n
\n );\n};\n\nexport default memo(StickerSetCoverAnimated);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiStickerSet } from '../../../api/types';\n\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\ntype OwnProps = {\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCover: FC = ({ stickerSet, observeIntersection }) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaData = useMedia(stickerSet.hasThumbnail && `stickerSet${stickerSet.id}`, !isIntersecting);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && (\n \"\"\n )}\n
\n );\n};\n\nexport default memo(StickerSetCover);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\n\nimport AnimatedSticker from './AnimatedSticker';\nimport Button from '../ui/Button';\n\nimport './StickerButton.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n size: number;\n observeIntersection: ObserveFn;\n noAnimate?: boolean;\n title?: string;\n className?: string;\n onClick?: (arg: any) => void;\n clickArg?: any;\n onUnfaveClick?: (sticker: ApiSticker) => void;\n};\n\nconst StickerButton: FC = ({\n sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const localMediaHash = `sticker${sticker.id}`;\n const stickerSelector = `sticker-button-${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl);\n\n const shouldPlay = isIntersecting && !noAnimate;\n const lottieData = useMedia(sticker.isAnimated && localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const {\n shouldRenderThumb,\n shouldRenderFullMedia: shouldRenderPreview,\n transitionClassNames: previewTransitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || canAnimatedPlay, 'slow');\n\n // To avoid flickering\n useEffect(() => {\n if (!shouldPlay) {\n unmarkLoaded();\n }\n }, [unmarkLoaded, shouldPlay]);\n\n function handleClick() {\n if (onClick) {\n onClick(clickArg);\n }\n }\n\n function handleUnfaveClick(e: ReactMouseEvent) {\n e.stopPropagation();\n e.preventDefault();\n\n onUnfaveClick!(sticker);\n }\n\n const fullClassName = buildClassName(\n 'StickerButton',\n sticker.isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = shouldRenderThumb && thumbDataUri ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {shouldRenderPreview && !canAnimatedPlay && (\n // eslint-disable-next-line jsx-a11y/alt-text\n \n )}\n {shouldPlay && lottieData && (\n \n )}\n {onUnfaveClick && (\n \n \n \n )}\n \n );\n};\n\nexport default memo(StickerButton);\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_GENERAL_SETTINGS } from '../../../config';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Button from '../../ui/Button';\nimport StickerSetCoverAnimated from '../../middle/composer/StickerSetCoverAnimated';\nimport StickerSetCover from '../../middle/composer/StickerSetCover';\nimport StickerButton from '../../common/StickerButton';\n\nimport './SettingsStickerSet.scss';\n\ntype OwnProps = {\n stickerSet?: ApiStickerSet;\n observeIntersection: ObserveFn;\n onClick: (value: ApiSticker) => void;\n};\n\nconst SettingsStickerSet: FC = ({\n stickerSet,\n observeIntersection,\n onClick,\n}) => {\n const lang = useLang();\n\n if (!stickerSet || !stickerSet.stickers) {\n return undefined;\n }\n\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n\n if (stickerSet.hasThumbnail || !firstSticker) {\n return (\n firstSticker && onClick(firstSticker)}\n >\n \n {stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n } else {\n return (\n onClick(firstSticker)}\n >\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n }\n};\n\nexport default memo(SettingsStickerSet);\n","import React, {\n FC, useCallback, memo, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ISettings } from '../../../types';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\n\nimport ListItem from '../../ui/ListItem';\nimport RangeSlider from '../../ui/RangeSlider';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\nimport SettingsStickerSet from './SettingsStickerSet';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = ISettings['byKey'] & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst SettingsGeneral: FC = ({\n onScreenSelect,\n stickerSetIds,\n stickerSetsById,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayGifs,\n shouldAutoPlayVideos,\n shouldSuggestStickers,\n shouldLoopStickers,\n setSettingOption,\n loadStickerSets,\n loadAddedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const stickerSettingsRef = useRef(null);\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: stickerSettingsRef });\n const [isModalOpen, openModal, closeModal] = useFlag();\n const [sticker, setSticker] = useState();\n\n const lang = useLang();\n\n const KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: lang('lng_settings_send_enter'), subLabel: 'New line by Shift + Enter' },\n {\n value: 'ctrl-enter',\n label: lang(IS_MAC_OS ? 'lng_settings_send_cmdenter' : 'lng_settings_send_ctrlenter'),\n subLabel: 'New line by Enter',\n },\n ] : undefined;\n\n useEffect(() => {\n loadStickerSets();\n }, [loadStickerSets]);\n\n useEffect(() => {\n if (stickerSetIds && stickerSetIds.length) {\n loadAddedStickers();\n }\n }, [stickerSetIds, loadAddedStickers]);\n\n const handleAnimationLevelChange = useCallback((newLevel: number) => {\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [setSettingOption]);\n\n const handleMessageTextSizeChange = useCallback((newSize: number) => {\n document.documentElement.style.setProperty('--message-text-size', `${newSize}px`);\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById && stickerSetsById[id] && stickerSetsById[id].installedDate ? stickerSetsById[id] : false;\n }).filter(Boolean);\n\n return (\n
\n
\n

{lang('SETTINGS')}

\n\n \n\n onScreenSelect(SettingsScreens.GeneralChatBackground)}\n >\n {lang('ChatBackground')}\n \n
\n\n
\n

\n Animation Level\n

\n

\n Choose the desired animations amount.\n

\n\n \n
\n\n {KEYBOARD_SEND_OPTIONS && (\n
\n

{lang('Keyboard')}

\n\n setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\n
\n )}\n\n
\n

{lang('AutoDownloadMedia')}

\n\n setSettingOption({ shouldAutoDownloadMediaFromContacts: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInPrivateChats: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInGroups: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInChannels: isChecked })}\n />\n
\n\n
\n

{lang('AutoplayMedia')}

\n\n setSettingOption({ shouldAutoPlayGifs: isChecked })}\n />\n setSettingOption({ shouldAutoPlayVideos: isChecked })}\n />\n
\n\n
\n

{lang('AccDescrStickers')}

\n\n setSettingOption({ shouldSuggestStickers: isChecked })}\n />\n setSettingOption({ shouldLoopStickers: isChecked })}\n />\n\n
\n {stickerSets && stickerSets.map((stickerSet: ApiStickerSet) => (\n \n ))}\n
\n {sticker && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n ...pick(global.settings.byKey,\n [\n 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldAutoDownloadMediaFromContacts',\n 'shouldAutoDownloadMediaInPrivateChats',\n 'shouldAutoDownloadMediaInGroups',\n 'shouldAutoDownloadMediaInChannels',\n 'shouldAutoPlayGifs',\n 'shouldAutoPlayVideos',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\n ]),\n stickerSetIds: global.stickers.added.setIds,\n stickerSetsById: global.stickers.setsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadStickerSets', 'loadAddedStickers',\n ]),\n)(SettingsGeneral));\n","let fileSelector: HTMLInputElement;\n\nexport function openSystemFilesDialog(accept = '*', callback: (e: Event) => void, noMultiple = false) {\n if (!fileSelector) {\n fileSelector = document.createElement('input');\n fileSelector.setAttribute('type', 'file');\n }\n\n fileSelector.setAttribute('accept', accept);\n\n if (noMultiple) {\n fileSelector.removeAttribute('multiple');\n } else {\n fileSelector.setAttribute('multiple', 'multiple');\n }\n\n // eslint-disable-next-line no-null/no-null\n fileSelector.onchange = null;\n fileSelector.value = '';\n fileSelector.onchange = callback;\n\n fileSelector.click();\n}\n","/* eslint-disable eqeqeq */\n/* eslint-disable prefer-template */\n/* eslint-disable prefer-const */\n/* eslint-disable prefer-destructuring */\n/* eslint-disable one-var */\n/* eslint-disable one-var-declaration-per-line */\n\nimport { preloadImage } from './files';\n\n/**\n * HEX > RGB\n * input: 'xxxxxx' (ex. 'ed15fa') case-insensitive\n * output: [r, g, b] ([0-255, 0-255, 0-255])\n */\nexport function hex2rgb(param: string): [number, number, number] {\n return [\n parseInt(param.substring(0, 2), 16),\n parseInt(param.substring(2, 4), 16),\n parseInt(param.substring(4, 6), 16),\n ];\n}\n\n/**\n * RGB > HEX\n * input: [r, g, b] ([0-255, 0-255, 0-255])\n * output: 'xxxxxx' (ex. 'ff0000')\n */\nexport function rgb2hex(param: [number, number, number]) {\n const p0 = param[0].toString(16);\n const p1 = param[1].toString(16);\n const p2 = param[2].toString(16);\n return (p0.length == 1 ? '0' + p0 : p0) + (p1.length == 1 ? '0' + p1 : p1) + (p2.length == 1 ? '0' + p2 : p2);\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\nexport function rgb2hsb([r, g, b]: [number, number, number]): [number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n let max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h!: number, s: number, v: number = max;\n\n let d = max - min;\n s = max == 0 ? 0 : d / max;\n\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return [h, s, v];\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsb2rgb([h, s, v]: [number, number, number]): [number, number, number] {\n let r!: number, g!: number, b!: number;\n\n let i = Math.floor(h * 6);\n let f = h * 6 - i;\n let p = v * (1 - s);\n let q = v * (1 - f * s);\n let t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n ];\n}\n\nexport async function getAverageColor(url: string): Promise<[number, number, number]> {\n // Only visit every 5 pixels\n const blockSize = 5;\n const defaultRGB: [number, number, number] = [0, 0, 0];\n let data;\n let width;\n let height;\n let i = -4;\n let length;\n let rgb: [number, number, number] = [0, 0, 0];\n let count = 0;\n\n const canvas = document.createElement('canvas');\n const context = canvas.getContext && canvas.getContext('2d');\n if (!context) {\n return defaultRGB;\n }\n\n const image = await preloadImage(url);\n height = image.naturalHeight || image.offsetHeight || image.height;\n width = image.naturalWidth || image.offsetWidth || image.width;\n canvas.height = height;\n canvas.width = width;\n\n context.drawImage(image, 0, 0);\n\n try {\n data = context.getImageData(0, 0, width, height);\n } catch (e) {\n return defaultRGB;\n }\n\n length = data.data.length;\n\n // eslint-disable-next-line no-cond-assign\n while ((i += blockSize * 4) < length) {\n ++count;\n rgb[0] += data.data[i];\n rgb[1] += data.data[i + 1];\n rgb[2] += data.data[i + 2];\n }\n\n rgb[0] = Math.floor(rgb[0] / count);\n rgb[1] = Math.floor(rgb[1] / count);\n rgb[2] = Math.floor(rgb[2] / count);\n\n return rgb;\n}\n\n// eslint-disable-next-line max-len\n// Function was adapted from https://github.com/telegramdesktop/tdesktop/blob/35ff621b5b52f7e3553fb0f990ea13ade7101b8e/Telegram/SourceFiles/data/data_wall_paper.cpp#L518\nexport function getPatternColor(rgbColor: [number, number, number]) {\n let [hue, saturation, value] = rgb2hsb(rgbColor);\n\n saturation = Math.min(1, saturation + 0.05 + 0.1 * (1 - saturation));\n value = value > 0.5\n ? Math.max(0, value * 0.65)\n : Math.max(0, Math.min(1, 1 - value * 0.65));\n\n return `hsla(${hue * 360}, ${saturation * 100}%, ${value * 100}%, .4)`;\n}\n","import React, {\n FC, memo, useCallback, useEffect, useState, useRef,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../../../config';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { fetchBlob } from '../../../util/files';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useCanvasBlur from '../../../hooks/useCanvasBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n theme: ThemeKey;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst WallpaperTile: FC = ({\n wallpaper,\n theme,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbRef = useCanvasBlur(\n document.thumbnail && document.thumbnail.dataUri,\n Boolean(previewBlobUrl),\n true,\n );\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || localBlobUrl, 'slow');\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData: fullMedia, downloadProgress,\n } = useMediaWithDownloadProgress(localMediaHash, !isDownloadAllowed);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition(\n (isDownloadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG,\n undefined,\n wasDownloadDisabled,\n 'slow',\n );\n // To prevent triggering of the effect for useCallback\n const cacheKeyRef = useRef();\n cacheKeyRef.current = theme;\n\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, cacheKeyRef.current!, blob);\n onClick(slug);\n })();\n }, [fullMedia, onClick, slug]);\n\n useEffect(() => {\n if (fullMedia) {\n handleSelect();\n }\n }, [fullMedia, handleSelect]);\n\n const handleClick = useCallback(() => {\n if (fullMedia) {\n handleSelect();\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [fullMedia, handleSelect]);\n\n const className = buildClassName(\n 'WallpaperTile',\n isSelected && 'selected',\n );\n\n return (\n
\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n
\n
\n );\n};\n\nexport default memo(WallpaperTile);\n","import React, {\n FC, memo, useEffect, useCallback, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DARK_THEME_PATTERN_COLOR, DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor, rgb2hex } from '../../../util/colors';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Loading from '../../ui/Loading';\nimport WallpaperTile from './WallpaperTile';\n\nimport './SettingsGeneralBackground.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n background?: string;\n isBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC = ({\n onScreenSelect,\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n loadWallpapers,\n uploadWallpaper,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadWallpapers();\n });\n }, [loadWallpapers]);\n\n const handleFileSelect = useCallback((e: Event) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n uploadWallpaper(files[0]);\n }\n }, [uploadWallpaper]);\n\n const handleUploadWallpaper = useCallback(() => {\n openSystemFilesDialog(SUPPORTED_TYPES, handleFileSelect, true);\n }, [handleFileSelect]);\n\n const handleSetColor = useCallback(() => {\n onScreenSelect(SettingsScreens.GeneralChatBackgroundColor);\n }, [onScreenSelect]);\n\n const handleResetToDefault = useCallback(() => {\n setThemeSettings({\n theme,\n background: undefined,\n backgroundColor: undefined,\n isBlurred: true,\n patternColor: theme === 'dark' ? DARK_THEME_PATTERN_COLOR : DEFAULT_PATTERN_COLOR,\n });\n }, [setThemeSettings, theme]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setThemeSettings({ theme: themeRef.current, background: slug });\n const currentWallpaper = loadedWallpapers && loadedWallpapers.find((wallpaper) => wallpaper.slug === slug);\n if (currentWallpaper && currentWallpaper.document.thumbnail) {\n getAverageColor(currentWallpaper.document.thumbnail.dataUri)\n .then((color) => {\n const patternColor = getPatternColor(color);\n const rgbColor = `#${rgb2hex(color)}`;\n setThemeSettings({ theme: themeRef.current, backgroundColor: rgbColor, patternColor });\n });\n }\n }, [loadedWallpapers, setThemeSettings]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => {\n setThemeSettings({ theme: themeRef.current, isBlurred: e.target.checked });\n }, [setThemeSettings]);\n\n const lang = useLang();\n\n const isUploading = loadedWallpapers && loadedWallpapers[0] && loadedWallpapers[0].slug === UPLOADING_WALLPAPER_SLUG;\n\n return (\n
\n
\n \n {lang('UploadImage')}\n \n\n \n {lang('SetColor')}\n \n\n \n {lang('ThemeResetToDefaults')}\n \n\n \n
\n\n {loadedWallpapers ? (\n
\n {loadedWallpapers.map((wallpaper) => (\n \n ))}\n
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { theme } = global.settings.byKey;\n const { background, isBlurred } = global.settings.themes[theme] || {};\n const { loadedWallpapers } = global.settings;\n\n return {\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWallpapers', 'uploadWallpaper', 'setThemeSettings',\n ]),\n)(SettingsGeneralBackground));\n","import { ChangeEvent, MutableRefObject, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n getPatternColor, hex2rgb, hsb2rgb, rgb2hex, rgb2hsb,\n} from '../../../util/colors';\nimport { captureEvents, RealTouchEvent } from '../../../util/captureEvents';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n backgroundColor?: string;\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\ninterface CanvasRects {\n colorRect: {\n offsetLeft: number;\n top: number;\n width: number;\n height: number;\n };\n hueRect: {\n offsetLeft: number;\n width: number;\n };\n}\n\nconst DEFAULT_HSB = rgb2hsb(hex2rgb('e6ebee'));\nconst PREDEFINED_COLORS = [\n '#e6ebee', '#b2cee1', '#008dd0', '#c6e7cb', '#c4e1a6', '#60b16e',\n '#ccd0af', '#a6a997', '#7a7072', '#fdd7af', '#fdb76e', '#dd8851',\n];\n\nconst SettingsGeneralBackground: FC = ({\n theme,\n backgroundColor,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const colorPickerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const huePickerRef = useRef(null);\n const isFirstRunRef = useRef(true);\n\n const [hsb, setHsb] = useState(getInitialHsb(backgroundColor));\n // Cache for drag handlers\n const hsbRef = useRef(hsb);\n useEffect(() => {\n hsbRef.current = hsb;\n }, [hsb]);\n\n const [isDragging, markIsDragging, unmarkIsDragging] = useFlag();\n const [rgbInput, setRgbInput] = useState('');\n const [hexInput, setHexInput] = useState('');\n\n const rectsRef = useRef();\n const colorCtxRef = useRef();\n\n // Setup: cache rects, subscribe for drag events\n useEffect(() => {\n // We use `offsetLeft` instead of `left` to support screen transition\n const colorRect = {\n offsetLeft: colorPickerRef.current!.offsetLeft,\n ...pick(colorPickerRef.current!.getBoundingClientRect(), ['top', 'width', 'height']),\n };\n const hueRect = {\n offsetLeft: huePickerRef.current!.offsetLeft,\n ...pick(huePickerRef.current!.getBoundingClientRect(), ['width']),\n };\n\n rectsRef.current = { colorRect, hueRect };\n\n function handleColorDrag(e: MouseEvent | RealTouchEvent) {\n const colorPosition = [\n Math.min(Math.max(0, e.pageX! - colorRect.offsetLeft), colorRect.width - 1),\n Math.min(Math.max(0, e.pageY! - colorRect.top + containerRef.current!.scrollTop), colorRect.height - 1),\n ];\n\n const { huePosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(colorPickerRef.current!, {\n onCapture: handleColorDrag,\n onDrag: handleColorDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n\n function handleHueDrag(e: MouseEvent | RealTouchEvent) {\n const { colorPosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n const huePosition = Math.min(Math.max(0, e.pageX! - hueRect.offsetLeft), hueRect.width - 1);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(huePickerRef.current!, {\n onCapture: handleHueDrag,\n onDrag: handleHueDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n }, [markIsDragging, unmarkIsDragging]);\n\n const { colorPosition = [0, 0], huePosition = 0 } = rectsRef.current ? hsb2positions(hsb, rectsRef.current) : {};\n const hex = rgb2hex(hsb2rgb(hsb));\n const hue = hsb[0];\n const hueHex = rgb2hex(hsb2rgb([hue, 1, 1]));\n\n // Save value and update inputs when HSL changes\n useEffect(() => {\n const rgb = hsb2rgb(hsb);\n const color = `#${rgb2hex(rgb)}`;\n\n setRgbInput(rgb.join(', '));\n setHexInput(color);\n\n if (!isFirstRunRef.current) {\n const patternColor = getPatternColor(rgb);\n setThemeSettings({\n theme: themeRef.current,\n background: undefined,\n backgroundColor: color,\n patternColor,\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setThemeSettings]);\n\n // Redraw color picker when hue changes\n useEffect(() => {\n drawColor(colorPickerRef.current!.firstChild as HTMLCanvasElement, hue, colorCtxRef, rectsRef);\n }, [hue]);\n\n // Initially draw hue picker\n useEffect(() => {\n drawHue(huePickerRef.current!.firstChild as HTMLCanvasElement);\n }, []);\n\n const handleRgbChange = useCallback((e: ChangeEvent) => {\n const rgbValue = e.currentTarget.value.replace(/[^\\d, ]/g, '').slice(0, 13);\n\n if (rgbValue.match(/^\\d{1,3},\\s?\\d{1,3},\\s?\\d{1,3}$/)) {\n const rgb = rgbValue.split(',').map((channel) => Number(channel.trim())) as [number, number, number];\n setHsb(rgb2hsb(rgb));\n }\n\n e.currentTarget.value = rgbValue;\n }, []);\n\n const handleHexChange = useCallback((e: ChangeEvent) => {\n const hexValue = e.currentTarget.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6);\n\n if (hexValue.match(/^#?[0-9a-fA-F]{6}$/)) {\n setHsb(rgb2hsb(hex2rgb(hexValue.replace('#', ''))));\n }\n\n e.currentTarget.value = hexValue;\n }, []);\n\n const handlePredefinedColorClick = useCallback((e: React.MouseEvent) => {\n setHsb(rgb2hsb(hex2rgb(e.currentTarget.dataset.color!.replace('#', ''))));\n }, []);\n\n const className = buildClassName(\n 'SettingsGeneralBackgroundColor settings-content custom-scroll',\n isDragging && 'is-dragging',\n );\n\n return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n {PREDEFINED_COLORS.map((color) => (\n \n ))}\n
\n
\n );\n};\n\nfunction getInitialHsb(backgroundColor?: string) {\n return backgroundColor && backgroundColor.startsWith('#')\n ? rgb2hsb(hex2rgb(backgroundColor.replace('#', '')))\n : DEFAULT_HSB;\n}\n\nfunction hsb2positions(hsb: [number, number, number], rects: CanvasRects) {\n return {\n colorPosition: [\n Math.round((hsb[1]) * (rects.colorRect.width - 1)),\n Math.round((1 - hsb[2]) * (rects.colorRect.height - 1)),\n ],\n huePosition: Math.round(hsb[0] * (rects.hueRect.width - 1)),\n };\n}\n\nfunction positions2hsb(\n { colorPosition, huePosition }: { colorPosition: number[]; huePosition: number },\n rects: CanvasRects,\n): [number, number, number] {\n return [\n huePosition / (rects.hueRect.width - 1),\n colorPosition[0] / (rects.colorRect.width - 1),\n 1 - colorPosition[1] / (rects.colorRect.height - 1),\n ];\n}\n\nfunction drawColor(\n canvas: HTMLCanvasElement,\n hue: number,\n colorCtxRef: MutableRefObject,\n rectsRef: RefObject,\n) {\n let w: number;\n let h: number;\n let ctx: CanvasRenderingContext2D;\n\n if (!colorCtxRef.current || !rectsRef.current) {\n // First run\n w = canvas.offsetWidth;\n h = canvas.offsetHeight;\n ctx = canvas.getContext('2d')!;\n\n canvas.width = w;\n canvas.height = h;\n\n colorCtxRef.current = ctx;\n } else {\n w = rectsRef.current.colorRect.width;\n h = rectsRef.current.colorRect.height;\n ctx = colorCtxRef.current;\n }\n\n const imgData = ctx!.createImageData(w, h);\n const pixels = imgData.data;\n const col = hsb2rgb([hue, 1, 1]);\n\n let index = 0;\n\n for (let y = 0; y < h; y++) {\n const perY = 1 - y / (h - 1);\n const st = [255 * perY, 255 * perY, 255 * perY];\n const ed = [col[0] * perY, col[1] * perY, col[2] * perY];\n for (let x = 0; x < w; x++) {\n const perX = x / (w - 1);\n pixels[index++] = st[0] + (ed[0] - st[0]) * perX;\n pixels[index++] = st[1] + (ed[1] - st[1]) * perX;\n pixels[index++] = st[2] + (ed[2] - st[2]) * perX;\n pixels[index++] = 255;\n }\n }\n\n ctx!.putImageData(imgData, 0, 0);\n}\n\nfunction drawHue(canvas: HTMLCanvasElement) {\n const w = canvas.offsetWidth;\n const h = 1;\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d')!;\n\n const imgData = ctx.createImageData(w, h);\n const pixels = imgData.data;\n\n let index = 0;\n\n for (let x = 0; x < w; x++) {\n const hue = x / (w - 1);\n const rgb = hsb2rgb([hue, 1, 1]);\n /* eslint-disable prefer-destructuring */\n pixels[index++] = rgb[0];\n pixels[index++] = rgb[1];\n pixels[index++] = rgb[2];\n /* eslint-enable prefer-destructuring */\n pixels[index++] = 255;\n }\n\n ctx.putImageData(imgData, 0, 0);\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { theme } = global.settings.byKey;\n const { backgroundColor } = global.settings.themes[theme] || {};\n return {\n backgroundColor,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setThemeSettings']),\n)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport Checkbox from '../../ui/Checkbox';\n\ntype StateProps = {\n hasPrivateChatsNotifications: boolean;\n hasPrivateChatsMessagePreview: boolean;\n hasGroupNotifications: boolean;\n hasGroupMessagePreview: boolean;\n hasBroadcastNotifications: boolean;\n hasBroadcastMessagePreview: boolean;\n hasContactJoinedNotifications: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsNotifications: FC = ({\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n loadNotificationSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationSettings();\n }, [loadNotificationSettings]);\n\n const handleSettingsChange = useCallback((\n e: ChangeEvent,\n peerType: 'contact' | 'group' | 'broadcast',\n setting: 'silent' | 'showPreviews',\n ) => {\n const currentIsSilent = peerType === 'contact'\n ? !hasPrivateChatsNotifications\n : !(peerType === 'group' ? hasGroupNotifications : hasBroadcastNotifications);\n const currentShouldShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, shouldShowPreviews: currentShouldShowPreviews }),\n ...(setting === 'showPreviews' && { shouldShowPreviews: e.target.checked, isSilent: currentIsSilent }),\n });\n }, [\n hasBroadcastMessagePreview, hasBroadcastNotifications,\n hasGroupMessagePreview, hasGroupNotifications,\n hasPrivateChatsMessagePreview, hasPrivateChatsNotifications,\n updateNotificationSettings,\n ]);\n\n const handleContactNotificationChange = useCallback((e: ChangeEvent) => {\n updateContactSignUpNotification({\n isSilent: !e.target.checked,\n });\n }, [updateContactSignUpNotification]);\n\n const lang = useLang();\n\n return (\n
\n
\n

\n {lang('AutodownloadPrivateChats')}\n

\n\n { handleSettingsChange(e, 'contact', 'silent'); }}\n />\n { handleSettingsChange(e, 'contact', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterGroups')}

\n\n { handleSettingsChange(e, 'group', 'silent'); }}\n />\n { handleSettingsChange(e, 'group', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterChannels')}

\n\n { handleSettingsChange(e, 'broadcast', 'silent'); }}\n />\n { handleSettingsChange(e, 'broadcast', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('PhoneOther')}

\n\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global): StateProps => {\n return {\n hasPrivateChatsNotifications: Boolean(global.settings.byKey.hasPrivateChatsNotifications),\n hasPrivateChatsMessagePreview: Boolean(global.settings.byKey.hasPrivateChatsMessagePreview),\n hasGroupNotifications: Boolean(global.settings.byKey.hasGroupNotifications),\n hasGroupMessagePreview: Boolean(global.settings.byKey.hasGroupMessagePreview),\n hasBroadcastNotifications: Boolean(global.settings.byKey.hasBroadcastNotifications),\n hasBroadcastMessagePreview: Boolean(global.settings.byKey.hasBroadcastMessagePreview),\n hasContactJoinedNotifications: Boolean(global.settings.byKey.hasContactJoinedNotifications),\n };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\n]))(SettingsNotifications));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { PrivacyVisibility, SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n visibilityPrivacyPhoneNumber?: PrivacyVisibility;\n visibilityPrivacyLastSeen?: PrivacyVisibility;\n visibilityPrivacyProfilePhoto?: PrivacyVisibility;\n visibilityPrivacyForwarding?: PrivacyVisibility;\n visibilityPrivacyGroupChats?: PrivacyVisibility;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacy: FC = ({\n onScreenSelect,\n hasPassword,\n blockedCount,\n sessionsCount,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings]);\n\n const lang = useLang();\n\n function getVisibilityValue(visibility?: PrivacyVisibility) {\n switch (visibility) {\n case 'everybody':\n return lang('P2PEverybody');\n\n case 'contacts':\n return lang('P2PContacts');\n\n case 'nobody':\n return lang('P2PNobody');\n }\n\n return undefined;\n }\n\n return (\n
\n
\n onScreenSelect(SettingsScreens.PrivacyBlockedUsers)}\n >\n
\n {lang('BlockedUsers')}\n {blockedCount > 0 && (\n \n {lang('Users', blockedCount)}\n \n )}\n
\n \n onScreenSelect(\n hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled,\n )}\n >\n
\n {lang('TwoStepVerification')}\n \n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyActiveSessions)}\n >\n
\n {lang('SessionsTitle')}\n {sessionsCount > 0 && (\n \n {sessionsCount === 1 ? '1 session' : `${sessionsCount} sessions`}\n \n )}\n
\n \n
\n\n
\n

{lang('PrivacyTitle')}

\n\n onScreenSelect(SettingsScreens.PrivacyPhoneNumber)}\n >\n
\n {lang('PrivacyPhoneTitle')}\n \n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n
\n {lang('LastSeenTitle')}\n \n {getVisibilityValue(visibilityPrivacyLastSeen)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n
\n {lang('PrivacyProfilePhotoTitle')}\n \n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n
\n {lang('PrivacyForwardsTitle')}\n \n {getVisibilityValue(visibilityPrivacyForwarding)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n
\n {lang('WhoCanAddMe')}\n \n {getVisibilityValue(visibilityPrivacyGroupChats)}\n \n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\n visibilityPrivacyPhoneNumber: privacy.phoneNumber && privacy.phoneNumber.visibility,\n visibilityPrivacyLastSeen: privacy.lastSeen && privacy.lastSeen.visibility,\n visibilityPrivacyProfilePhoto: privacy.profilePhoto && privacy.profilePhoto.visibility,\n visibilityPrivacyForwarding: privacy.forwards && privacy.forwards.visibility,\n visibilityPrivacyGroupChats: privacy.chatInvite && privacy.chatInvite.visibility,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings',\n ]),\n)(SettingsPrivacy));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ISettings } from '../../../types';\nimport { ApiLanguage } from '../../../api/types';\n\nimport { setLanguage } from '../../../util/langProvider';\nimport { pick } from '../../../util/iteratees';\n\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport useFlag from '../../../hooks/useFlag';\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\n languages,\n language,\n loadLanguages,\n setSettingOption,\n}) => {\n const [selectedLanguage, setSelectedLanguage] = useState(language);\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n // TODO Throttle\n useEffect(() => {\n loadLanguages();\n }, [loadLanguages]);\n\n const handleChange = useCallback((langCode: string) => {\n setSelectedLanguage(langCode);\n markIsLoading();\n\n setLanguage(langCode, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n return (\n
\n {options ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n const currentLangCode = (window.navigator.language || 'en').toLowerCase();\n const shortLangCode = currentLangCode.substr(0, 2);\n\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n })).sort((a) => {\n return currentLangCode && (a.value === currentLangCode || a.value === shortLangCode) ? -1 : 0;\n });\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n languages: global.settings.byKey.languages,\n language: global.settings.byKey.language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadLanguages', 'setSettingOption',\n ]),\n)(SettingsLanguage));\n","import { ApiPrivacyKey, SettingsScreens } from '../../../../types';\n\nexport function getPrivacyKey(screen: SettingsScreens): ApiPrivacyKey | undefined {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return 'phoneNumber';\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return 'lastSeen';\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return 'profilePhoto';\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return 'forwards';\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return 'chatInvite';\n }\n\n return undefined;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n onScreenSelect,\n visibility,\n allowUserIds,\n allowChatIds,\n blockUserIds,\n blockChatIds,\n chatsById,\n setPrivacyVisibility,\n}) => {\n const lang = useLang();\n\n const visibilityOptions = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyGroupChats:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n ];\n\n default:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n { value: 'nobody', label: lang('P2PNobody') },\n ];\n }\n }, [lang, screen]);\n\n const exceptionLists = {\n shouldShowDenied: visibility !== 'nobody',\n shouldShowAllowed: visibility !== 'everybody',\n };\n\n const privacyKey = getPrivacyKey(screen);\n\n const headerText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return lang('PrivacyPhoneTitle');\n case SettingsScreens.PrivacyLastSeen:\n return lang('LastSeenTitle');\n case SettingsScreens.PrivacyProfilePhoto:\n return lang('PrivacyProfilePhotoTitle');\n case SettingsScreens.PrivacyForwarding:\n return lang('PrivacyForwardsTitle');\n case SettingsScreens.PrivacyGroupChats:\n return lang('WhoCanAddMe');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const descriptionText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyLastSeen:\n return lang('CustomHelp');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const allowedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberAllowedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenAllowedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoAllowedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingAllowedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsAllowedContacts;\n }\n })();\n\n const deniedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberDeniedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenDeniedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoDeniedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingDeniedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsDeniedContacts;\n }\n })();\n\n const allowedCount = useMemo(() => {\n if (!allowUserIds || !allowChatIds || !chatsById) {\n return 0;\n }\n\n return allowChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, allowUserIds.length);\n }, [allowChatIds, allowUserIds, chatsById]);\n\n const blockCount = useMemo(() => {\n if (!blockUserIds || !blockChatIds || !chatsById) {\n return 0;\n }\n\n return blockChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, blockUserIds.length);\n }, [blockChatIds, blockUserIds, chatsById]);\n\n const handleVisibilityChange = useCallback((value) => {\n setPrivacyVisibility({\n privacyKey,\n visibility: value,\n });\n }, [privacyKey, setPrivacyVisibility]);\n\n return (\n
\n
\n

{headerText}

\n\n \n\n {descriptionText && (\n

{descriptionText}

\n )}\n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n {exceptionLists.shouldShowAllowed && (\n { onScreenSelect(allowedContactsScreen); }}\n >\n
\n {allowedCount > 0 && +{allowedCount}}\n {lang('AlwaysShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n {exceptionLists.shouldShowDenied && (\n { onScreenSelect(deniedContactsScreen); }}\n >\n
\n {blockCount > 0 && −{blockCount}}\n {lang('NeverShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n let privacySettings: ApiPrivacySettings | undefined;\n\n const {\n chats: { byId: chatsById },\n settings: { privacy },\n } = global;\n\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n privacySettings = privacy.phoneNumber;\n break;\n\n case SettingsScreens.PrivacyLastSeen:\n privacySettings = privacy.lastSeen;\n break;\n\n case SettingsScreens.PrivacyProfilePhoto:\n privacySettings = privacy.profilePhoto;\n break;\n\n case SettingsScreens.PrivacyForwarding:\n privacySettings = privacy.forwards;\n break;\n\n case SettingsScreens.PrivacyGroupChats:\n privacySettings = privacy.chatInvite;\n break;\n }\n\n if (!privacySettings) {\n return {};\n }\n\n return {\n ...privacySettings,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacyVisibility']),\n)(SettingsPrivacyVisibility));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiSession } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\n activeSessions,\n loadAuthorizations,\n terminateAuthorization,\n terminateAllAuthorizations,\n}) => {\n const [isConfirmTerminateAllDialogOpen, openConfirmTerminateAllDialog, closeConfirmTerminateAllDialog] = useFlag();\n useEffect(() => {\n loadAuthorizations();\n }, [loadAuthorizations]);\n\n const handleTerminateSessionClick = useCallback((hash: string) => {\n terminateAuthorization({ hash });\n }, [terminateAuthorization]);\n\n const handleTerminateAllSessions = useCallback(() => {\n closeConfirmTerminateAllDialog();\n terminateAllAuthorizations();\n }, [closeConfirmTerminateAllDialog, terminateAllAuthorizations]);\n\n const currentSession = useMemo(() => {\n return activeSessions.find((session) => session.isCurrent);\n }, [activeSessions]);\n\n const otherSessions = useMemo(() => {\n return activeSessions.filter((session) => !session.isCurrent);\n }, [activeSessions]);\n\n const lang = useLang();\n\n function renderCurrentSession(session: ApiSession) {\n return (\n
\n

\n {lang('AuthSessions.CurrentSession')}\n

\n\n \n
\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n
\n\n \n {lang('TerminateAllSessions')}\n \n
\n );\n }\n\n function renderOtherSessions(sessions: ApiSession[]) {\n return (\n
\n

Other Sessions

\n\n {sessions.map(renderSession)}\n
\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n >\n
\n {formatPastTimeShort(lang, session.dateActive * 1000)}\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n \n );\n }\n\n return (\n
\n {currentSession && renderCurrentSession(currentSession)}\n\n {otherSessions && renderOtherSessions(otherSessions)}\n\n {otherSessions && (\n \n )};\n
\n );\n};\n\nfunction getLocation(session: ApiSession) {\n return [session.region, session.country].filter(Boolean).join(', ');\n}\n\nfunction getDeviceEnvironment(session: ApiSession) {\n return `${session.deviceModel}${session.deviceModel ? ', ' : ''} ${session.platform} ${session.systemVersion}`;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n activeSessions: global.activeSessions,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations',\n ]),\n)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport { pick } from '../../../util/iteratees';\nimport {\n getChatTitle, getUserFullName, isChatPrivate,\n} from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\n chatsByIds,\n usersByIds,\n blockedIds,\n unblockContact,\n}) => {\n const handleUnblockClick = useCallback((contactId: number) => {\n unblockContact({ contactId });\n }, [unblockContact]);\n\n const lang = useLang();\n\n function renderContact(contactId: number, i: number, viewportOffset: number) {\n const isPrivate = isChatPrivate(contactId);\n const user = isPrivate ? usersByIds[contactId] : undefined;\n const chat = !isPrivate ? chatsByIds[contactId] : undefined;\n\n const className = buildClassName(\n 'Chat chat-item-clickable blocked-list-item',\n isPrivate ? 'private' : 'group',\n );\n\n return (\n {\n handleUnblockClick(contactId);\n },\n }]}\n style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`}\n >\n \n
\n

{renderText((isPrivate ? getUserFullName(user) : getChatTitle(lang, chat!)) || '')}

\n {user && user.phoneNumber && (\n
{formatPhoneNumberWithCode(user.phoneNumber)}
\n )}\n {user && !user.phoneNumber && user.username && (\n
@{user.username}
\n )}\n
\n \n );\n }\n\n return (\n
\n
\n
\n

\n {lang('BlockedUsersInfo')}\n

\n
\n\n
\n {blockedIds && blockedIds.length ? (\n
\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n
\n ) : blockedIds && !blockedIds.length ? (\n
\n List is empty\n
\n ) : (\n \n )}\n
\n
\n\n {\n }}\n className=\"not-implemented\"\n ariaLabel=\"Add a blocked user\"\n >\n \n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsByIds,\n },\n users: {\n byId: usersByIds,\n },\n blocked: {\n ids,\n },\n } = global;\n\n return {\n chatsByIds,\n usersByIds,\n blockedIds: ids,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['unblockContact']),\n)(SettingsPrivacyBlockedUsers));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({ animatedEmoji, onScreenSelect }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n\n

\n {renderText(lang('EnabledPasswordText'), ['br'])}\n

\n
\n\n
\n onScreenSelect(SettingsScreens.TwoFaChangePasswordCurrent)}\n >\n {lang('ChangePassword')}\n \n onScreenSelect(SettingsScreens.TwoFaTurnOff)}\n >\n {lang('TurnPasswordOff')}\n \n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCurrentPassword)}\n >\n {lang('SetRecoveryEmail')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaEnabled));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../../lib/teact/teact';\n\nimport useLang from '../../../../hooks/useLang';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\n error?: string;\n isLoading?: boolean;\n expectedPassword?: string;\n placeholder?: string;\n hint?: string;\n submitLabel?: string;\n clearError?: NoneToVoidFunction;\n onSubmit: (password: string) => void;\n};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\n error,\n isLoading,\n expectedPassword,\n placeholder = 'Current Password',\n hint,\n submitLabel,\n clearError,\n onSubmit,\n}) => {\n const [validationError, setValidationError] = useState('');\n const [shouldShowPassword, setShouldShowPassword] = useState(false);\n\n const handleSubmit = useCallback((newPassword) => {\n if (expectedPassword && newPassword !== expectedPassword) {\n setValidationError(EQUAL_PASSWORD_ERROR);\n } else {\n onSubmit(newPassword);\n }\n }, [onSubmit, expectedPassword]);\n\n const handleClearError = useCallback(() => {\n if (clearError) {\n clearError();\n }\n setValidationError('');\n }, [clearError]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(SettingsTwoFaPassword);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({ animatedEmoji, onStart }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n\n

\n {lang('SetAdditionalPasswordInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaStart));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport Modal from '../../../ui/Modal';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n icon: 'hint' | 'email';\n type?: 'text' | 'email';\n isLoading?: boolean;\n error?: string;\n placeholder: string;\n shouldConfirm?: boolean;\n clearError?: NoneToVoidFunction;\n onSubmit: (value?: string) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n const [isConfirmShown, markIsConfirmShown, unmarkIsConfirmShown] = useFlag(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n setValue(e.target.value);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!inputRef.current) {\n return;\n }\n\n onSubmit(value);\n };\n\n const handleSkip = () => {\n onSubmit();\n };\n\n const handleSkipConfirm = () => {\n unmarkIsConfirmShown();\n onSubmit();\n };\n\n const lang = useLang();\n\n return (\n
\n
\n \n
\n\n
\n
\n \n\n {value ? (\n \n ) : (\n \n {lang('YourEmailSkip')}\n \n )}\n \n {shouldConfirm && (\n \n {renderText(lang('YourEmailSkipWarningText'), ['br', 'simple_markdown'])}\n
\n \n {lang('YourEmailSkip')}\n \n \n {lang('Cancel')}\n \n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal((global, { icon }) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, icon === 'email' ? '💌' : '💡'),\n };\n})(SettingsTwoFaSkippableForm));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({ animatedEmoji, onScreenSelect }) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n return (\n
\n
\n \n\n

\n {lang('TwoStepVerificationPasswordSetInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🥳'),\n };\n})(SettingsTwoFaCongratulations));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n isLoading?: boolean;\n error?: string;\n clearError: NoneToVoidFunction;\n onSubmit: (hint: string) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const lang = useLang();\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n const newValue = e.target.value.slice(0, codeLength);\n\n if (newValue.length === codeLength) {\n onSubmit(newValue);\n }\n\n setValue(newValue);\n e.target.value = newValue;\n };\n\n return (\n
\n
\n \n
\n\n
\n \n {isLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '💌'),\n codeLength: global.twoFaSettings.waitingEmailCodeLength,\n };\n})(SettingsTwoFaEmailCode));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { pick } from '../../../../util/iteratees';\nimport { TwoFaDispatch, TwoFaState } from '../../../../hooks/reducers/useTwoFaReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport SettingsTwoFaEnabled from './SettingsTwoFaEnabled';\nimport SettingsTwoFaPassword from './SettingsTwoFaPassword';\nimport SettingsTwoFaStart from './SettingsTwoFaStart';\nimport SettingsTwoFaSkippableForm from './SettingsTwoFaSkippableForm';\nimport SettingsTwoFaCongratulations from './SettingsTwoFaCongratulations';\nimport SettingsTwoFaEmailCode from './SettingsTwoFaEmailCode';\n\nexport type OwnProps = {\n state: TwoFaState;\n currentScreen: SettingsScreens;\n dispatch: TwoFaDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n onScreenSelect,\n updatePassword,\n checkPassword,\n clearTwoFaError,\n updateRecoveryEmail,\n provideTwoFaEmailCode,\n clearPassword,\n}) => {\n useEffect(() => {\n if (waitingEmailCodeLength) {\n if (currentScreen === SettingsScreens.TwoFaNewPasswordEmail) {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmailCode);\n } else if (currentScreen === SettingsScreens.TwoFaRecoveryEmail) {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCode);\n }\n }\n }, [currentScreen, onScreenSelect, waitingEmailCodeLength]);\n\n const handleStartWizard = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.TwoFaNewPassword);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPassword = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordHint);\n }, [onScreenSelect]);\n\n const handleNewPasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmail);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updatePassword({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleChangePasswordCurrent = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordNew);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleChangePasswordNew = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaChangePasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleChangePasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordHint);\n }, [onScreenSelect]);\n\n const handleChangePasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n updatePassword({\n ...state,\n hint: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleTurnOff = useCallback((value: string) => {\n clearPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.Privacy);\n },\n });\n }, [clearPassword, onScreenSelect]);\n\n const handleRecoveryEmailCurrentPassword = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmail);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleRecoveryEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updateRecoveryEmail({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updateRecoveryEmail]);\n\n const handleEmailCode = useCallback((code: string) => {\n provideTwoFaEmailCode({ code });\n }, [provideTwoFaEmailCode]);\n\n const lang = useLang();\n\n switch (currentScreen) {\n case SettingsScreens.TwoFaDisabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n return (\n \n );\n\n case SettingsScreens.TwoFaCongratulations:\n return (\n \n );\n\n case SettingsScreens.TwoFaEnabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordCurrent:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordNew:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaTurnOff:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => ({ ...global.twoFaSettings }),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updatePassword', 'updateRecoveryEmail', 'clearPassword', 'provideTwoFaEmailCode',\n 'checkPassword', 'clearTwoFaError',\n ]),\n)(SettingsTwoFa));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../modules/helpers';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport GroupChatInfo from './GroupChatInfo';\nimport PickerSelectedItem from './PickerSelectedItem';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\n\nimport './Picker.scss';\n\ntype OwnProps = {\n itemIds: number[];\n selectedIds: number[];\n filterValue?: string;\n filterPlaceholder?: string;\n notFoundText?: string;\n searchInputId?: string;\n isLoading?: boolean;\n onSelectedIdsChange: (ids: number[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore?: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst Picker: FC = ({\n itemIds,\n selectedIds,\n filterValue,\n filterPlaceholder,\n notFoundText,\n searchInputId,\n isLoading,\n onSelectedIdsChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const shouldMinimize = selectedIds.length > MAX_FULL_ITEMS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n onFilterChange('');\n }, [selectedIds, onSelectedIdsChange, onFilterChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, itemIds, Boolean(filterValue));\n\n const lang = useLang();\n\n return (\n
\n
\n {selectedIds.map((id, i) => (\n \n ))}\n \n
\n\n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n handleItemClick(id)}\n ripple\n >\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : !isLoading && viewportIds && !viewportIds.length ? (\n

{notFoundText || 'Sorry, nothing found.'}

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(Picker);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport searchWords from '../../../util/searchWords';\nimport { getPrivacyKey } from './helper/privacy';\nimport {\n getChatTitle, isChatGroup, isChatPrivate, prepareChatList,\n} from '../../../modules/helpers';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n settings?: ApiPrivacySettings;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibilityExceptionList: FC = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n setPrivacySettings,\n onScreenSelect,\n}) => {\n const lang = useLang();\n\n const selectedContactIds = useMemo(() => {\n if (!settings) {\n return [];\n }\n\n if (isAllowList) {\n return [...settings.allowUserIds, ...settings.allowChatIds];\n } else {\n return [...settings.blockUserIds, ...settings.blockChatIds];\n }\n }, [isAllowList, settings]);\n const [searchQuery, setSearchQuery] = useState('');\n const [isSubmitShown, setIsSubmitShown] = useState(false);\n const [newSelectedContactIds, setNewSelectedContactIds] = useState(selectedContactIds);\n\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [\n ...activeChatArrays.pinnedChats,\n ...activeChatArrays.otherChats,\n ]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n ((isChatPrivate(chat.id) && chat.id !== currentUserId) || isChatGroup(chat))\n && (\n !searchQuery\n || searchWords(getChatTitle(lang, chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, lang, searchQuery, selectedContactIds]);\n\n const handleSelectedContactIdsChange = useCallback((value: number[]) => {\n setNewSelectedContactIds(value);\n setIsSubmitShown(true);\n }, []);\n\n const handleSubmit = useCallback(() => {\n setPrivacySettings({\n privacyKey: getPrivacyKey(screen),\n isAllowList: Boolean(isAllowList),\n contactsIds: newSelectedContactIds,\n });\n\n onScreenSelect(SettingsScreens.Privacy);\n }, [isAllowList, newSelectedContactIds, onScreenSelect, screen, setPrivacySettings]);\n\n return (\n
\n \n\n \n \n \n
\n );\n};\n\nfunction getCurrentPrivacySettings(global: GlobalState, screen: SettingsScreens) {\n const { privacy } = global.settings;\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return privacy.phoneNumber;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return privacy.lastSeen;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return privacy.profilePhoto;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return privacy.forwards;\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return privacy.chatInvite;\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n currentUserId,\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n settings: getCurrentPrivacySettings(global, screen),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacySettings']),\n)(SettingsPrivacyVisibilityExceptionList));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport useFoldersReducer from '../../../hooks/reducers/useFoldersReducer';\nimport useTwoFaReducer from '../../../hooks/reducers/useTwoFaReducer';\n\nimport Transition from '../../ui/Transition';\nimport SettingsHeader from './SettingsHeader';\nimport SettingsMain from './SettingsMain';\nimport SettingsEditProfile from './SettingsEditProfile';\nimport SettingsFolders from './folders/SettingsFolders';\nimport SettingsGeneral from './SettingsGeneral';\nimport SettingsGeneralBackground from './SettingsGeneralBackground';\nimport SettingsGeneralBackgroundColor from './SettingsGeneralBackgroundColor';\nimport SettingsNotifications from './SettingsNotifications';\nimport SettingsPrivacy from './SettingsPrivacy';\nimport SettingsLanguage from './SettingsLanguage';\nimport SettingsPrivacyVisibility from './SettingsPrivacyVisibility';\nimport SettingsPrivacyActiveSessions from './SettingsPrivacyActiveSessions';\nimport SettingsPrivacyBlockedUsers from './SettingsPrivacyBlockedUsers';\nimport SettingsTwoFa from './twoFa/SettingsTwoFa';\nimport SettingsPrivacyVisibilityExceptionList from './SettingsPrivacyVisibilityExceptionList';\n\nimport './Settings.scss';\n\nconst TRANSITION_RENDER_COUNT = Object.keys(SettingsScreens).length / 2;\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n currentScreen,\n onScreenSelect,\n onReset,\n}) => {\n const [foldersState, foldersDispatch] = useFoldersReducer();\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n foldersDispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (foldersState.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n foldersState.mode, foldersDispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleSaveFilter = useCallback(() => {\n foldersDispatch({ type: 'saveFilters' });\n handleReset();\n }, [foldersDispatch, handleReset]);\n\n function renderCurrentSectionContent() {\n switch (currentScreen) {\n case SettingsScreens.Main:\n return (\n \n );\n case SettingsScreens.EditProfile:\n return (\n \n );\n case SettingsScreens.General:\n return (\n \n );\n case SettingsScreens.Notifications:\n return (\n \n );\n case SettingsScreens.Privacy:\n return (\n \n );\n case SettingsScreens.Language:\n return (\n \n );\n case SettingsScreens.GeneralChatBackground:\n return (\n \n );\n case SettingsScreens.GeneralChatBackgroundColor:\n return (\n \n );\n case SettingsScreens.PrivacyActiveSessions:\n return (\n \n );\n case SettingsScreens.PrivacyBlockedUsers:\n return (\n \n );\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return (\n \n );\n\n case SettingsScreens.Folders:\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaNewPasswordConfirm:\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaCongratulations:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n case SettingsScreens.TwoFaChangePasswordHint:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n case SettingsScreens.TwoFaRecoveryEmail:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n }\n\n function renderCurrentSection() {\n return (\n <>\n \n {renderCurrentSectionContent()}\n \n );\n }\n\n return (\n \n {renderCurrentSection}\n \n );\n};\n\nexport default memo(Settings);\n","import React, {\n FC, useEffect, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport { getUserFullName, sortUserIds } from '../../../modules/helpers';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ListItem from '../../ui/ListItem';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n filter: string;\n};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n filter, usersById, contactIds, loadContactList, openChat,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\n },\n [openChat],\n );\n\n const listIds = useMemo(() => {\n if (!contactIds) {\n return undefined;\n }\n\n const resultIds = filter ? contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, filter);\n }) : contactIds;\n\n return sortUserIds(resultIds, usersById);\n }, [filter, usersById, contactIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n \n {viewportIds && viewportIds.length ? (\n viewportIds.map((id) => (\n handleClick(id)}\n ripple={!IS_MOBILE_SCREEN}\n >\n \n \n ))\n ) : viewportIds && !viewportIds.length ? (\n

\n {filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'}\n

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: contactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n\n return {\n usersById,\n contactIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'openChat']),\n)(ContactList));\n","import React, {\n FC, useCallback, useEffect, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { getUserFullName, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: boolean;\n selectedMemberIds: number[];\n onSelectedMemberIdsChange: (ids: number[]) => void;\n onNextStep: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n usersById: Record;\n chatsById: Record;\n localContactIds?: number[];\n searchQuery?: string;\n isSearching?: boolean;\n localUserIds?: number[];\n globalUserIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC = ({\n isChannel,\n selectedMemberIds,\n onSelectedMemberIdsChange,\n onNextStep,\n onReset,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\n loadContactList,\n setGlobalSearchQuery,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const handleFilterChange = useCallback((query: string) => {\n setGlobalSearchQuery({ query });\n }, [setGlobalSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds;\n }\n\n const foundContactIds = contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, searchQuery);\n });\n\n return sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, searchQuery, localUserIds, globalUserIds, usersById, chatsById, selectedMemberIds, currentUserId,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length || isChannel) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds.length, isChannel, setGlobalSearchQuery, onNextStep]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n

{lang('GroupAddMembers')}

\n
\n
\n \n\n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n const { currentUserId } = global;\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalResults,\n localResults,\n } = global.globalSearch;\n const { userIds: globalUserIds } = globalResults || {};\n const { userIds: localUserIds } = localResults || {};\n\n return {\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus && fetchingStatus.chats,\n globalUserIds,\n localUserIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setGlobalSearchQuery']),\n)(NewChatStep1));\n","import React, {\n FC, useState, useCallback, useEffect, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ChatCreationProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport InputText from '../../ui/InputText';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport Button from '../../ui/Button';\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nexport type OwnProps = {\n isChannel?: boolean;\n memberIds: number[];\n onReset: (forceReturnToChatList?: boolean) => void;\n};\n\ntype StateProps = {\n creationProgress?: ChatCreationProgress;\n creationError?: string;\n};\n\ntype DispatchProps = Pick;\n\n// TODO @implement\nconst MAX_USERS_FOR_LEGACY_CHAT = 199; // Accounting for current user\n\nconst NewChatStep2: FC = ({\n isChannel,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n const [title, setTitle] = useState('');\n const [about, setAbout] = useState('');\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n\n const chatTitleEmptyError = 'Chat title can\\'t be empty';\n const channelTitleEmptyError = 'Channel title can\\'t be empty';\n const chatTooManyUsersError = 'Sorry, creating supergroups is not yet supported';\n\n const isLoading = creationProgress === ChatCreationProgress.InProgress;\n\n const handleTitleChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n const newValue = value.replace(/^\\s+/, '');\n\n setTitle(newValue);\n\n if (newValue !== value) {\n e.currentTarget.value = newValue;\n }\n }, []);\n\n const handleDescriptionChange = useCallback((e: React.ChangeEvent) => {\n setAbout(e.currentTarget.value);\n }, []);\n\n const handleCreateGroup = useCallback(() => {\n if (!title.length) {\n setError(chatTitleEmptyError);\n return;\n }\n\n if (memberIds.length > MAX_USERS_FOR_LEGACY_CHAT) {\n setError(chatTooManyUsersError);\n return;\n }\n\n createGroupChat({\n title,\n photo,\n memberIds,\n });\n }, [title, memberIds, createGroupChat, photo, chatTitleEmptyError, chatTooManyUsersError]);\n\n const handleCreateChannel = useCallback(() => {\n if (!title.length) {\n setError(channelTitleEmptyError);\n return;\n }\n\n createChannel({\n title,\n about,\n photo,\n memberIds,\n });\n }, [title, createChannel, about, photo, memberIds, channelTitleEmptyError]);\n\n useEffect(() => {\n if (creationProgress === ChatCreationProgress.Complete) {\n onReset(true);\n }\n }, [creationProgress, onReset]);\n\n const renderedError = creationError || (\n error !== chatTitleEmptyError && error !== channelTitleEmptyError\n ? error\n : undefined\n );\n\n return (\n
\n
\n onReset()}\n ariaLabel=\"Return to member selection\"\n >\n \n \n

{lang(isChannel ? 'NewChannel' : 'NewGroup')}

\n
\n
\n \n \n {isChannel && (\n <>\n \n

{lang('DescriptionInfo')}

\n \n )}\n\n {renderedError && (\n

{renderedError}

\n )}\n\n {memberIds.length > 0 && (\n <>\n

{lang('GroupInfo.ParticipantCount', memberIds.length, 'i')}

\n\n
\n {memberIds.map((id) => (\n \n \n \n ))}\n
\n \n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n progress: creationProgress,\n error: creationError,\n } = global.chatCreation || {};\n\n return {\n creationProgress,\n creationError,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'createGroupChat', 'createChannel',\n ]),\n)(NewChatStep2));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport NewChatStep1 from './NewChatStep1';\nimport NewChatStep2 from './NewChatStep2';\n\nimport './NewChat.scss';\n\nexport type OwnProps = {\n isChannel?: boolean;\n content: LeftColumnContent;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\nconst RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\n\nconst NewChat: FC = ({\n isChannel = false,\n content,\n onContentChange,\n onReset,\n}) => {\n const [newChatMemberIds, setNewChatMemberIds] = useState([]);\n\n const handleNextStep = useCallback(() => {\n onContentChange(isChannel ? LeftColumnContent.NewChannelStep2 : LeftColumnContent.NewGroupStep2);\n }, [isChannel, onContentChange]);\n\n return (\n \n {() => {\n switch (content) {\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewGroupStep1:\n return (\n \n );\n case LeftColumnContent.NewChannelStep2:\n case LeftColumnContent.NewGroupStep2:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n );\n};\n\nexport default memo(NewChat);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n onReset: () => void;\n};\n\nconst ArchivedChats: FC = ({ isActive, onReset }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n

{lang('ArchivedChats')}

\n
\n \n
\n );\n};\n\nexport default memo(ArchivedChats);\n","const IGNORED_KEYS: Record = {\n Down: true,\n ArrowDown: true,\n Up: true,\n ArrowUp: true,\n Left: true,\n ArrowLeft: true,\n Right: true,\n ArrowRight: true,\n ' ': true,\n PageUp: true,\n PageDown: true,\n End: true,\n Home: true,\n Tab: true,\n};\n\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key]) {\n preventDefault(e);\n }\n}\n\nexport function disableScrolling() {\n // Disable scrolling in Chrome\n document.addEventListener('wheel', preventDefault, { passive: false });\n window.ontouchmove = preventDefault; // mobile\n document.onkeydown = preventDefaultForScrollKeys;\n}\n\nexport function enableScrolling() {\n document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome\n // eslint-disable-next-line no-null/no-null\n window.ontouchmove = null;\n // eslint-disable-next-line no-null/no-null\n document.onkeydown = null;\n}\n","import { ApiMediaFormat, ApiMessage } from '../../../../api/types';\n\nimport * as mediaLoader from '../../../../util/mediaLoader';\nimport { getMessageMediaHash, getMessagePhoto, getMessageText } from '../../../../modules/helpers';\nimport { CLIPBOARD_ITEM_SUPPORTED, copyImageToClipboard, copyTextToClipboard } from '../../../../util/clipboard';\n\ntype ICopyOptions = {\n label: string;\n handler: () => void;\n}[];\n\nexport function getMessageCopyOptions(\n message: ApiMessage, afterEffect?: () => void, onCopyLink?: () => void,\n): ICopyOptions {\n const options: ICopyOptions = [];\n const text = getMessageText(message);\n const photo = getMessagePhoto(message);\n const mediaHash = getMessageMediaHash(message, 'inline')!;\n const canImageBeCopied = photo && mediaHash && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'lng_context_copy_image',\n handler: () => {\n mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl).then(copyImageToClipboard);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (text) {\n // Detect if the user has selection in the current message\n const hasSelection = Boolean((\n selection\n && selection.anchorNode\n && selection.anchorNode.parentNode\n && (selection.anchorNode.parentNode as HTMLElement).closest('.Message .content-inner')\n && selection.toString().replace(/(?:\\r\\n|\\r|\\n)/g, '') !== ''\n ));\n\n options.push({\n label: getCopyLabel(hasSelection, canImageBeCopied),\n handler: () => {\n const clipboardText = hasSelection && selection ? selection.toString() : text;\n copyTextToClipboard(clipboardText);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (onCopyLink) {\n options.push({\n label: 'lng_context_copy_message_link',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean, canImageBeCopied: boolean): string {\n if (hasSelection) {\n return 'lng_context_copy_selected';\n }\n\n if (canImageBeCopied) {\n return 'lng_context_copy_text';\n }\n\n return 'Copy';\n}\n","import React, { FC, useCallback, useEffect } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport { getMessageCopyOptions } from './helpers/copyOptions';\nimport useContextMenuPosition from '../../../hooks/useContextMenuPosition';\nimport { dispatchHeavyAnimationEvent } from '../../../hooks/useHeavyAnimationCheck';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './MessageContextMenu.scss';\n\ntype OwnProps = {\n isOpen: boolean;\n anchor: IAnchorPosition;\n message: ApiMessage;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n onReply: () => void;\n onEdit: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onForward: () => void;\n onDelete: () => void;\n onFaveSticker: () => void;\n onUnfaveSticker: () => void;\n onSelect: () => void;\n onSend: () => void;\n onReschedule: () => void;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onCopyLink?: () => void;\n};\n\nconst ANIMATION_DURATION = 200;\nconst SCROLLBAR_WIDTH = 10;\n\nconst MessageContextMenu: FC = ({\n isOpen,\n message,\n anchor,\n canSendNow,\n canReschedule,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n useEffect(() => {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }, [isOpen]);\n\n const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined);\n\n const getTriggerElement = useCallback(() => {\n return document.querySelector(`.active > .MessageList div[data-message-id=\"${message.id}\"]`);\n }, [message.id]);\n\n const getRootElement = useCallback(\n () => document.querySelector('.active > .MessageList'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => document.querySelector('.MessageContextMenu .bubble'),\n [],\n );\n\n const { positionX, positionY, style } = useContextMenuPosition(\n anchor,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n SCROLLBAR_WIDTH,\n (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight,\n );\n\n const lang = useLang();\n\n return (\n \n {canSendNow && {lang('MessageScheduleSend')}}\n {canReschedule && (\n {lang('MessageScheduleEditTime')}\n )}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && (\n {lang('AddToFavorites')}\n )}\n {canUnfaveSticker && (\n {lang('Stickers.RemoveFromFavorites')}\n )}\n {canCopy && copyOptions.map((options) => (\n {lang(options.label)}\n ))}\n {canPin && {lang('DialogPin')}}\n {canUnpin && {lang('DialogUnpin')}}\n {canForward && {lang('Forward')}}\n {canSelect && {lang('Common.Select')}}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum, IAnchorPosition } from '../../../types';\nimport { selectAllowedMessageActions, selectCurrentMessageList } from '../../../modules/selectors';\nimport { disableScrolling, enableScrolling } from '../../../util/scrollLock';\nimport { pick } from '../../../util/iteratees';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal';\nimport PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\n\nexport type OwnProps = {\n isOpen: boolean;\n message: ApiMessage;\n album?: IAlbum;\n anchor: IAnchorPosition;\n messageListType: MessageListType;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n noOptions?: boolean;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ContextMenuContainer: FC = ({\n isOpen,\n messageListType,\n message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n loadMessageLink,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isPinModalOpen, setIsPinModalOpen] = useState(false);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closePinModal = useCallback(() => {\n setIsPinModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n onClose();\n }, [closeCalendar, onClose]);\n\n const handleReply = useCallback(() => {\n setReplyingToId({ messageId: message.id });\n closeMenu();\n }, [setReplyingToId, message.id, closeMenu]);\n\n const handleEdit = useCallback(() => {\n setEditingId({ messageId: message.id });\n closeMenu();\n }, [setEditingId, message.id, closeMenu]);\n\n const handlePin = useCallback(() => {\n setIsMenuOpen(false);\n setIsPinModalOpen(true);\n }, []);\n\n const handleUnpin = useCallback(() => {\n pinMessage({ messageId: message.id, isUnpin: true });\n closeMenu();\n }, [pinMessage, message.id, closeMenu]);\n\n const handleForward = useCallback(() => {\n closeMenu();\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: message.chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: message.chatId, messageIds: [message.id] });\n }\n }, [openForwardMenu, message, closeMenu, album]);\n\n const handleFaveSticker = useCallback(() => {\n closeMenu();\n faveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, faveSticker]);\n\n const handleUnfaveSticker = useCallback(() => {\n closeMenu();\n unfaveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, unfaveSticker]);\n\n const handleSelectMessage = useCallback(() => {\n const params = album && album.messages\n ? {\n messageId: message.id,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: false,\n }\n : { messageId: message.id, withShift: false };\n\n toggleMessageSelection(params);\n closeMenu();\n }, [closeMenu, message.id, toggleMessageSelection, album]);\n\n const handleScheduledMessageSend = useCallback(() => {\n sendScheduledMessages({ chatId: message.chatId, id: message.id });\n closeMenu();\n }, [closeMenu, message.chatId, message.id, sendScheduledMessages]);\n\n const handleOpenCalendar = useCallback(() => {\n setIsMenuOpen(false);\n openCalendar();\n }, [openCalendar]);\n\n const handleRescheduleMessage = useCallback((date: Date) => {\n rescheduleMessage({\n chatId: message.chatId,\n messageId: message.id,\n scheduledAt: Math.round(date.getTime() / 1000),\n });\n }, [message.chatId, message.id, rescheduleMessage]);\n\n const handleCopyLink = useCallback(() => {\n loadMessageLink({\n messageId: message.id,\n chatId: message.chatId,\n });\n closeMenu();\n }, [closeMenu, loadMessageLink, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n if (noOptions) {\n closeMenu();\n\n return undefined;\n }\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n return (\n
\n \n \n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const isPinned = messageListType === 'pinned';\n const isScheduled = messageListType === 'scheduled';\n\n return {\n noOptions,\n canSendNow: isScheduled,\n canReschedule: isScheduled,\n canReply: !isPinned && !isScheduled && canReply,\n canPin: !isScheduled && canPin,\n canUnpin: !isScheduled && canUnpin,\n canDelete,\n canEdit: !isPinned && canEdit,\n canForward: !isScheduled && canForward,\n canFaveSticker: !isScheduled && canFaveSticker,\n canUnfaveSticker: !isScheduled && canUnfaveSticker,\n canCopy,\n canCopyLink: !isScheduled && canCopyLink,\n canSelect,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'pinMessage',\n 'openForwardMenu',\n 'faveSticker',\n 'unfaveSticker',\n 'toggleMessageSelection',\n 'sendScheduledMessages',\n 'rescheduleMessage',\n 'loadMessageLink',\n ]),\n)(ContextMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { STICKER_SIZE_MODAL } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectStickerSet } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Loading from '../ui/Loading';\nimport StickerButton from './StickerButton';\n\nimport './StickerSetModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n fromSticker: ApiSticker;\n onClose: () => void;\n};\n\ntype StateProps = {\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSet,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const lang = useLang();\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({ stickerSetId, stickerSetAccessHash });\n }\n }, [isOpen, fromSticker, loadStickers]);\n\n const handleSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n sendMessage({ sticker });\n onClose();\n }, [onClose, sendMessage]);\n\n const handleButtonClick = useCallback(() => {\n toggleStickerSet({ stickerSetId: fromSticker.stickerSetId });\n onClose();\n }, [fromSticker.stickerSetId, onClose, toggleStickerSet]);\n\n return (\n \n {stickerSet && stickerSet.stickers ? (\n <>\n
\n {stickerSet.stickers.map((sticker) => (\n \n ))}\n
\n
\n \n {lang(\n stickerSet.installedDate ? 'StickerPack.RemoveStickerCount' : 'StickerPack.AddStickerCount',\n stickerSet.count,\n 'i',\n )}\n \n
\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker }: OwnProps) => {\n return { stickerSet: selectStickerSet(global, fromSticker.stickerSetId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickers',\n 'toggleStickerSet',\n 'sendMessage',\n ]),\n)(StickerSetModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat } from '../../modules/helpers';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Portal from '../ui/Portal';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\nimport DeleteChatModal from '../common/DeleteChatModal';\n\nimport './HeaderMenuContainer.scss';\n\ntype DispatchProps = Pick;\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n isOpen: boolean;\n anchor: IAnchorPosition;\n isChannel?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n onSubscribeChannel: () => void;\n onSearchClick: () => void;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isPrivate?: boolean;\n isMuted?: boolean;\n canDeleteChat?: boolean;\n};\n\nconst HeaderMenuContainer: FC = ({\n chatId,\n isOpen,\n anchor,\n isChannel,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n chat,\n isPrivate,\n isMuted,\n canDeleteChat,\n onSubscribeChannel,\n onSearchClick,\n onClose,\n onCloseAnimationEnd,\n updateChatMutedState,\n enterMessageSelectMode,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const { x, y } = anchor;\n\n useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleToggleMuteClick = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n closeMenu();\n }, [chatId, closeMenu, isMuted, updateChatMutedState]);\n\n const handleSubscribe = useCallback(() => {\n onSubscribeChannel();\n closeMenu();\n }, [closeMenu, onSubscribeChannel]);\n\n const handleSearch = useCallback(() => {\n onSearchClick();\n closeMenu();\n }, [closeMenu, onSearchClick]);\n\n const handleSelectMessages = useCallback(() => {\n enterMessageSelectMode();\n closeMenu();\n }, [closeMenu, enterMessageSelectMode]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const lang = useLang();\n\n return (\n \n
\n \n {IS_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {IS_MOBILE_SCREEN && canSearch && (\n \n {lang('Search')}\n \n )}\n {canMute && (\n \n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n \n )}\n {canSelect && (\n \n {lang('ReportSelectMessages')}\n \n )}\n {canLeave && (\n \n {lang(isPrivate\n ? 'Delete'\n : (canDeleteChat ? 'GroupInfo.DeleteAndExit' : (isChannel ? 'LeaveChannel' : 'Group.LeaveGroup')))}\n \n )}\n \n {chat && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n return {\n chat,\n isMuted: chat.isMuted,\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\n ]),\n)(HeaderMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { debounce } from '../../util/schedulers';\nimport { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { getDayStartAt } from '../../util/dateFormat';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\n\nimport './MobileSearch.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n};\n\ntype StateProps = {\n isActive?: boolean;\n chat?: ApiChat;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n isHistoryCalendarOpen?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n // Fix for iOS keyboard\n useEffect(() => {\n const { visualViewport } = window as any;\n if (!visualViewport) {\n return undefined;\n }\n\n const mainEl = document.getElementById('Main') as HTMLDivElement;\n const handleResize = () => {\n const { activeElement } = document;\n if (activeElement && (activeElement === inputRef.current)) {\n const { pageTop, height } = visualViewport;\n mainEl.style.transform = `translateY(${pageTop}px)`;\n mainEl.style.height = `${height}px`;\n document.documentElement.scrollTop = pageTop;\n } else {\n mainEl.style.transform = '';\n mainEl.style.height = '';\n }\n };\n\n visualViewport.addEventListener('resize', handleResize);\n\n return () => {\n visualViewport.removeEventListener('resize', handleResize);\n };\n }, []);\n\n // Focus message\n useEffect(() => {\n if (chat && foundIds && foundIds.length) {\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1] });\n setFocusedIndex(0);\n } else {\n setFocusedIndex(-1);\n }\n }, [chat, focusMessage, foundIds]);\n\n // Disable native up/down buttons on iOS\n useEffect(() => {\n Array.from(document.querySelectorAll('input')).forEach((input) => {\n input.disabled = Boolean(isActive && input !== inputRef.current);\n });\n\n Array.from(document.querySelectorAll('div[contenteditable]')).forEach((div) => {\n div.contentEditable = isActive ? 'false' : 'true';\n });\n }, [isActive]);\n\n // Blur on exit\n useEffect(() => {\n if (!isActive) {\n inputRef.current!.blur();\n }\n }, [isActive]);\n\n useLayoutEffect(() => {\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.blur();\n }, [isHistoryCalendarOpen]);\n\n const handleMessageSearchQueryChange = useCallback((newQuery: string) => {\n setLocalTextSearchQuery({ query: newQuery });\n\n if (newQuery.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleUp = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex + 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n const handleDown = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex - 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n return (\n
\n
\n \n \n \n \n
\n
\n
\n {query ? (\n foundIds && foundIds.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n )}\n
\n \n \n \n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'openHistoryCalendar',\n ]),\n)(MobileSearchFooter));\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n isHorizontal = false,\n) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const allElements = typeof selectorOrElements === 'string'\n ? container.querySelectorAll(selectorOrElements)\n : selectorOrElements;\n const { length } = allElements;\n const visibleIndexes: number[] = [];\n let isFound = false;\n\n for (let i = 0; i < length; i++) {\n const element = allElements[i];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const isVisible = shouldContainBottom\n ? y2 >= viewportY1 - margin && y2 <= viewportY2 + margin\n : y1 <= viewportY2 + margin && y2 >= viewportY1 - margin;\n\n if (isVisible) {\n visibleIndexes.push(i);\n isFound = true;\n } else if (isFound && !isDense) {\n break;\n }\n }\n\n return { allElements, visibleIndexes };\n}\n","function isFullyVisible(container: HTMLElement, element: HTMLElement, isHorizontal = false) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import React, {\n FC, useCallback, useEffect, useState, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport cycleRestrict from '../../../util/cycleRestrict';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container || index < 0) {\n return;\n }\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.chat-item-clickable',\n VIEWPORT_MARGIN,\n true,\n true,\n );\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first]))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n fastSmoothScroll(container, allElements[index], position, SCROLL_MARGIN);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n filter: string;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredChatMembers?: ApiChatMember[];\n usersById?: Record;\n};\n\nconst MentionTooltip: FC = ({\n isOpen,\n filter,\n onClose,\n onInsertUserName,\n usersById,\n filteredChatMembers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!filteredChatMembers) {\n return -1;\n }\n const membersCount = filteredChatMembers!.length;\n return cycleRestrict(membersCount, newIndex);\n }, [filteredChatMembers]);\n\n const [selectedMentionIndex, setSelectedMentionIndex] = useState(-1);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedMentionIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedMentionIndex, getSelectedIndex]);\n\n const handleUserSelect = useCallback((userId: number, forceFocus = false) => {\n const user = usersById && usersById[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [usersById, onInsertUserName]);\n\n const handleSelectMention = useCallback((e: KeyboardEvent) => {\n if (filteredChatMembers && filteredChatMembers.length && selectedMentionIndex > -1) {\n const member = filteredChatMembers[selectedMentionIndex];\n if (member) {\n e.preventDefault();\n handleUserSelect(member.userId, true);\n }\n }\n }, [filteredChatMembers, selectedMentionIndex, handleUserSelect]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectMention,\n onTab: handleSelectMention,\n }) : undefined), [isOpen, onClose, handleArrowKey, handleSelectMention]);\n\n useEffect(() => {\n if (filteredChatMembers && !filteredChatMembers.length) {\n onClose();\n }\n }, [filteredChatMembers, onClose]);\n\n useEffect(() => {\n setSelectedMentionIndex(0);\n }, [filter]);\n\n useEffect(() => {\n setItemVisible(selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n const prevChatMembers = usePrevious(\n filteredChatMembers && filteredChatMembers.length\n ? filteredChatMembers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredChatMembers && !filteredChatMembers.length\n ? prevChatMembers\n : filteredChatMembers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedChatMembers && renderedChatMembers.map(({ userId }, index) => (\n handleUserSelect(userId)}\n focus={selectedMentionIndex === index}\n >\n \n \n ))}\n
\n );\n};\n\nexport default memo(MentionTooltip);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\nimport { LangCode } from '../../../types';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD, EDITABLE_INPUT_MODAL_ID } from '../../../config';\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionTooltip from './MentionTooltip';\nimport EmojiTooltip from './EmojiTooltip.async';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n canSuggestMembers?: boolean;\n canSuggestEmoji?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n recentEmojis: string[];\n language: LangCode;\n addRecentEmoji: AnyToVoidFunction;\n loadEmojiKeywords: AnyToVoidFunction;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onFileAppend: (files: File[], isQuick: boolean) => void;\n onClear: () => void;\n};\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst AttachmentModal: FC = ({\n attachments,\n caption,\n canSuggestMembers,\n groupChatMembers,\n currentUserId,\n usersById,\n recentEmojis,\n language,\n onCaptionUpdate,\n addRecentEmoji,\n loadEmojiKeywords,\n onSend,\n onFileAppend,\n onClear,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n const isQuick = renderingAttachments && renderingAttachments.every((a) => a.quick);\n const lang = useLang();\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredMembers,\n } = useMentionTooltip(\n canSuggestMembers && isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n currentUserId,\n usersById,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n isOpen,\n caption,\n recentEmojis,\n EDITABLE_INPUT_MODAL_ID,\n onCaptionUpdate,\n );\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n\n const sendAttachments = useCallback(() => {\n if (isOpen) {\n onSend();\n }\n }, [isOpen, onSend]);\n\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget, target: fromTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.drop-target') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(unmarkHovered, DROP_LEAVE_TIMEOUT_MS);\n }\n\n // Prevent DragLeave event from firing when the pointer moves inside the AttachmentModal drop target\n if (fromTarget && (fromTarget as HTMLElement).closest('.AttachmentModal.hovered')) {\n return;\n }\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n unmarkHovered();\n\n const { dataTransfer: { files } } = e;\n\n if (files && files.length) {\n const newFiles = isQuick\n ? Array.from(files).filter((file) => {\n return file.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.includes(file.type);\n })\n : Array.from(files);\n\n onFileAppend(newFiles, false);\n }\n }, [isQuick, onFileAppend, unmarkHovered]);\n\n function handleDragOver(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n }\n\n if (!renderingAttachments) {\n return undefined;\n }\n\n const areAllPhotos = renderingAttachments.every((a) => a.mimeType.startsWith('image/'));\n const areAllVideos = renderingAttachments.every((a) => a.mimeType.startsWith('video/'));\n\n let title = '';\n if (areAllPhotos) {\n title = lang('PreviewSender.SendPhoto', renderingAttachments.length, 'i');\n } else if (areAllVideos) {\n title = lang('PreviewSender.SendVideo', renderingAttachments.length, 'i');\n } else {\n title = lang('PreviewSender.SendFile', renderingAttachments.length, 'i');\n }\n\n function renderHeader() {\n if (!renderingAttachments) {\n return undefined;\n }\n\n return (\n
\n \n
{title}
\n \n {lang('Send')}\n \n
\n );\n }\n\n return (\n \n \n {isQuick ? (\n
\n {renderingAttachments.map((attachment) => (\n attachment.mimeType.startsWith('image/')\n ? \"\"\n :
\n ) : (\n
\n {renderingAttachments.map((attachment) => (\n \n ))}\n
\n )}\n\n
\n \n \n \n
\n \n \n );\n};\n\nexport default memo(AttachmentModal);\n","import { ChangeEvent, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiNewPoll } from '../../../api/types';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport InputText from '../../ui/InputText';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\n\nimport './PollModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSend: (pollSummary: ApiNewPoll) => void;\n onClear: () => void;\n};\n\nconst MAX_LIST_HEIGHT = 320;\nconst MAX_OPTIONS_COUNT = 10;\nconst MAX_OPTION_LENGTH = 100;\nconst MAX_QUESTION_LENGTH = 255;\nconst MAX_SOLUTION_LENGTH = 200;\n\nconst PollModal: FC = ({ isOpen, onSend, onClear }) => {\n // eslint-disable-next-line no-null/no-null\n const questionInputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const optionsListRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const solutionRef = useRef(null);\n\n const [question, setQuestion] = useState('');\n const [options, setOptions] = useState(['']);\n const [isAnonymous, setIsAnonymous] = useState(true);\n const [isMultipleAnswers, setIsMultipleAnswers] = useState(false);\n const [isQuizMode, setIsQuizMode] = useState(false);\n const [solution, setSolution] = useState();\n const [correctOption, setCorrectOption] = useState();\n const [hasErrors, setHasErrors] = useState(false);\n\n const lang = useLang();\n\n const focusInput = useCallback((ref: RefObject) => {\n if (isOpen && ref.current) {\n ref.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n useEffect(() => {\n if (!isOpen) {\n setQuestion('');\n setOptions(['']);\n setIsAnonymous(true);\n setIsMultipleAnswers(false);\n setIsQuizMode(false);\n setSolution('');\n setCorrectOption('');\n setHasErrors(false);\n }\n }, [isOpen]);\n\n useEffect(() => focusInput(questionInputRef), [focusInput, isOpen]);\n\n useLayoutEffect(() => {\n const solutionEl = solutionRef.current;\n\n if (solutionEl && solution !== solutionEl.innerHTML) {\n solutionEl.innerHTML = solution;\n }\n }, [solution]);\n\n const addNewOption = useCallback((newOptions: string[] = []) => {\n setOptions([...newOptions, '']);\n requestAnimationFrame(() => {\n const list = optionsListRef.current;\n if (!list) {\n return;\n }\n\n list.classList.toggle('overflown', list.scrollHeight > MAX_LIST_HEIGHT);\n list.scrollTo({ top: list.scrollHeight, behavior: 'smooth' });\n });\n }, []);\n\n const handleCreate = useCallback(() => {\n setHasErrors(false);\n if (!isOpen) {\n return;\n }\n\n const questionTrimmed = question.trim().substring(0, MAX_QUESTION_LENGTH);\n const optionsTrimmed = options.map((o) => o.trim().substring(0, MAX_OPTION_LENGTH)).filter((o) => o.length);\n\n if (!questionTrimmed || optionsTrimmed.length < 2) {\n setQuestion(questionTrimmed);\n if (optionsTrimmed.length) {\n if (optionsTrimmed.length < 2) {\n addNewOption(optionsTrimmed);\n } else {\n setOptions(optionsTrimmed);\n }\n } else {\n addNewOption();\n }\n setHasErrors(true);\n return;\n }\n\n if (isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)])) {\n setHasErrors(true);\n return;\n }\n\n const answers = optionsTrimmed\n .map((text, index) => ({\n text: text.trim(),\n option: String(index),\n ...(String(index) === correctOption && { correct: true }),\n }));\n\n const payload: ApiNewPoll = {\n summary: {\n question: questionTrimmed,\n answers,\n ...(!isAnonymous && { isPublic: true }),\n ...(isMultipleAnswers && { multipleChoice: true }),\n ...(isQuizMode && { quiz: true }),\n },\n };\n\n if (isQuizMode) {\n const { text, entities } = (solution && parseMessageInput(solution.substring(0, MAX_SOLUTION_LENGTH))) || {};\n\n payload.quiz = {\n correctAnswers: [correctOption],\n ...(text && { solution: text }),\n ...(entities && { solutionEntities: entities }),\n };\n }\n\n onSend(payload);\n }, [\n isOpen,\n question,\n options,\n isQuizMode,\n correctOption,\n isAnonymous,\n isMultipleAnswers,\n onSend,\n addNewOption,\n solution,\n ]);\n\n const updateOption = useCallback((index: number, text: string) => {\n const newOptions = [...options];\n newOptions[index] = text;\n if (newOptions[newOptions.length - 1].trim().length && newOptions.length < MAX_OPTIONS_COUNT) {\n addNewOption(newOptions);\n } else {\n setOptions(newOptions);\n }\n }, [options, addNewOption]);\n\n const removeOption = useCallback((index: number) => {\n const newOptions = [...options];\n newOptions.splice(index, 1);\n setOptions(newOptions);\n requestAnimationFrame(() => {\n if (!optionsListRef.current) {\n return;\n }\n\n optionsListRef.current.classList.toggle('overflown', optionsListRef.current.scrollHeight > MAX_LIST_HEIGHT);\n });\n }, [options]);\n\n const handleCorrectOptionChange = useCallback((newValue: string) => {\n setCorrectOption(newValue);\n }, [setCorrectOption]);\n\n const handleIsAnonymousChange = useCallback((e: ChangeEvent) => {\n setIsAnonymous(e.target.checked);\n }, []);\n\n const handleMultipleAnswersChange = useCallback((e: ChangeEvent) => {\n setIsMultipleAnswers(e.target.checked);\n }, []);\n\n const handleQuizModeChange = useCallback((e: ChangeEvent) => {\n setIsQuizMode(e.target.checked);\n }, []);\n\n const handleKeyPress = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode === 13) {\n handleCreate();\n }\n }, [handleCreate]);\n\n const getQuestionError = useCallback(() => {\n if (hasErrors && !question.trim().length) {\n return lang('lng_polls_choose_question');\n }\n\n return undefined;\n }, [hasErrors, lang, question]);\n\n const getOptionsError = useCallback((index: number) => {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n if (hasErrors && optionsTrimmed.length < 2 && !options[index].trim().length) {\n return lang('lng_polls_choose_answers');\n }\n return undefined;\n }, [hasErrors, lang, options]);\n\n function renderHeader() {\n return (\n
\n \n
{lang('NewPoll')}
\n \n {lang('Create')}\n \n
\n );\n }\n\n function renderOptions() {\n return options.map((option, index) => (\n
\n updateOption(index, e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n {index !== options.length - 1 && (\n removeOption(index)}\n >\n \n \n )}\n
\n ));\n }\n\n function renderRadioOptions() {\n return renderOptions()\n .map((label, index) => ({ value: String(index), label, hidden: index === options.length - 1 }));\n }\n\n function renderQuizNoOptionError() {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n\n return isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)]) && (\n

{lang('lng_polls_choose_correct')}

\n );\n }\n\n return (\n \n setQuestion(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n
\n\n
\n

Options

\n\n {hasErrors && renderQuizNoOptionError()}\n {isQuizMode ? (\n \n ) : (\n renderOptions()\n )}\n\n
\n\n
\n\n
\n \n \n \n {isQuizMode && (\n <>\n

Solution

\n setSolution(e.currentTarget.innerHTML)}\n />\n
{lang('CreatePoll.ExplanationInfo')}
\n \n )}\n
\n \n );\n};\n\nexport default memo(PollModal);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\n\nconst MENU_CLOSE_TIMEOUT = 250;\nlet closeTimeout: number | undefined;\n\nexport default function useMouseInside(\n isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT,\n) {\n const isMouseInside = useRef(false);\n\n useEffect(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n if (isOpen && !IS_TOUCH_ENV) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isOpen, menuCloseTimeout, onClose]);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout);\n }, [menuCloseTimeout, onClose]);\n\n return [handleMouseEnter, handleMouseLeave];\n}\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\n\nimport './EmojiButton.scss';\n\ntype OwnProps = {\n emoji: Emoji;\n focus?: boolean;\n onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC = ({ emoji, focus, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n // Preventing safari from losing focus on Composer MessageInput\n e.preventDefault();\n\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n \n {IS_EMOJI_SUPPORTED\n ? {emoji.native}\n : \"\"}\n
\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport EmojiButton from './EmojiButton';\n\nconst EMOJIS_PER_ROW_ON_DESKTOP = 9;\nconst EMOJI_MARGIN = 4;\nconst MOBILE_CONTAINER_PADDING = 8;\nconst EMOJI_SIZE = 40;\n\ntype OwnProps = {\n category: EmojiCategory;\n index: number;\n allEmojis: AllEmojis;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\nconst EmojiCategory: FC = ({\n category, index, allEmojis, observeIntersection, shouldRender, onEmojiSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const lang = useLang();\n\n const emojisPerRow = IS_MOBILE_SCREEN\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (EMOJI_SIZE + EMOJI_MARGIN))\n : EMOJIS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(category.emojis.length / emojisPerRow) * (EMOJI_SIZE + EMOJI_MARGIN);\n\n return (\n \n

\n {lang(category.id === 'recent' ? 'RecentStickers' : `Emoji${index}`)}\n

\n \n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\n // Some emojis have multiple skins and are represented as an Object with emojis for all skins.\n // For now, we select only the first emoji with 'neutral' skin.\n const displayedEmoji = 'id' in emoji ? emoji : emoji[1];\n\n return (\n \n );\n })}\n
\n \n );\n};\n\nexport default memo(EmojiCategory);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { MENU_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n EmojiModule,\n EmojiRawData,\n EmojiData,\n uncompressEmoji,\n} from '../../../util/emoji';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Loading from '../../ui/Loading';\nimport EmojiCategory from './EmojiCategory';\n\nimport './EmojiPicker.scss';\n\ntype OwnProps = {\n className?: string;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\ntype StateProps = Pick;\ntype EmojiCategoryData = { id: string; name: string; emojis: string[] };\n\nconst ICONS_BY_CATEGORY: Record = {\n recent: 'icon-recent',\n people: 'icon-smile',\n nature: 'icon-animals',\n foods: 'icon-eats',\n activity: 'icon-sport',\n places: 'icon-car',\n objects: 'icon-lamp',\n symbols: 'icon-language',\n flags: 'icon-flag',\n};\n\nconst OPEN_ANIMATION_DELAY = 200;\n// Only a few categories are above this height.\nconst SMOOTH_SCROLL_DISTANCE = 800;\nconst FOCUS_MARGIN = 50;\nconst HEADER_BUTTON_WIDTH = 42; // px. Includes margins\nconst INTERSECTION_THROTTLE = 200;\n\nconst categoryIntersections: boolean[] = [];\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst EmojiPicker: FC = ({\n className, onEmojiSelect, recentEmojis,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n\n const [categories, setCategories] = useState();\n const [emojis, setEmojis] = useState();\n const [activeCategoryIndex, setActiveCategoryIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('emoji-category-')) {\n return;\n }\n\n const index = Number(id.replace('emoji-category-', ''));\n categoryIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = categoryIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveCategoryIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n\n useHorizontalScroll(headerRef.current, !IS_MOBILE_SCREEN);\n\n // Scroll header when active set updates\n useEffect(() => {\n if (!categories) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeCategoryIndex * HEADER_BUTTON_WIDTH - header.offsetWidth / 2 + HEADER_BUTTON_WIDTH / 2;\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [categories, activeCategoryIndex]);\n\n const lang = useLang();\n\n const allCategories = useMemo(() => {\n if (!categories) {\n return MEMO_EMPTY_ARRAY;\n }\n const themeCategories = [...categories];\n if (recentEmojis && recentEmojis.length) {\n themeCategories.unshift({\n id: 'recent',\n name: lang('RecentStickers'),\n emojis: recentEmojis,\n });\n }\n\n return themeCategories;\n }, [categories, lang, recentEmojis]);\n\n // Initialize data on first render.\n useEffect(() => {\n setTimeout(() => {\n const exec = () => {\n setCategories(emojiData.categories);\n\n setEmojis(emojiData.emojis as AllEmojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, OPEN_ANIMATION_DELAY);\n }, []);\n\n const selectCategory = useCallback((index: number) => {\n setActiveCategoryIndex(index);\n const categoryEl = document.getElementById(`emoji-category-${index}`)!;\n fastSmoothScroll(containerRef.current!, categoryEl, 'start', FOCUS_MARGIN, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n onEmojiSelect(emoji, name);\n }, [onEmojiSelect]);\n\n const canRenderContents = useAsyncRendering([], MENU_TRANSITION_DURATION);\n\n function renderCategoryButton(category: EmojiCategoryData, index: number) {\n const icon = ICONS_BY_CATEGORY[category.id];\n\n return icon && (\n selectCategory(index)}\n ariaLabel={category.name}\n >\n \n \n );\n }\n\n const containerClassName = buildClassName('EmojiPicker', className);\n\n if (!emojis || !canRenderContents) {\n return (\n
\n \n
\n );\n }\n\n return (\n
\n
\n {allCategories.map(renderCategoryButton)}\n
\n
\n {allCategories.map((category, i) => (\n = i - 1 && activeCategoryIndex <= i + 1}\n onEmojiSelect={handleEmojiSelect}\n />\n ))}\n
\n
\n );\n};\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['recentEmojis']),\n)(EmojiPicker));\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport StickerButton from '../../common/StickerButton';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n stickerSet: StickerSetOrRecent;\n loadAndPlay: boolean;\n index: number;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n onStickerUnfave: (sticker: ApiSticker) => void;\n};\n\nconst STICKERS_PER_ROW_ON_DESKTOP = 5;\nconst STICKER_MARGIN = IS_MOBILE_SCREEN ? 8 : 16;\nconst MOBILE_CONTAINER_PADDING = 8;\n\nconst StickerSet: FC = ({\n stickerSet,\n loadAndPlay,\n index,\n observeIntersection,\n shouldRender,\n onStickerSelect,\n onStickerUnfave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const stickersPerRow = IS_MOBILE_SCREEN\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (STICKER_SIZE_PICKER + STICKER_MARGIN))\n : STICKERS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(stickerSet.count / stickersPerRow) * (STICKER_SIZE_PICKER + STICKER_MARGIN);\n\n return (\n \n

{stickerSet.title}

\n \n {shouldRender && stickerSet.stickers && stickerSet.stickers.map((sticker) => (\n \n ))}\n \n \n );\n};\n\nexport default memo(StickerSet);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiStickerSet, ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION, STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Loading from '../../ui/Loading';\nimport Button from '../../ui/Button';\nimport StickerButton from '../../common/StickerButton';\nimport StickerSet from './StickerSet';\nimport StickerSetCover from './StickerSetCover';\nimport StickerSetCoverAnimated from './StickerSetCoverAnimated';\n\nimport './StickerPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendStickers: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n recentStickers: ApiSticker[];\n favoriteStickers: ApiSticker[];\n stickerSetsById: Record;\n addedSetIds?: string[];\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SMOOTH_SCROLL_DISTANCE = 500;\nconst HEADER_BUTTON_WIDTH = 52; // px (including margin)\nconst STICKER_INTERSECTION_THROTTLE = 200;\n\nconst stickerSetIntersections: boolean[] = [];\n\nconst StickerPicker: FC = ({\n className,\n loadAndPlay,\n canSendStickers,\n recentStickers,\n favoriteStickers,\n addedSetIds,\n stickerSetsById,\n shouldPlay,\n onStickerSelect,\n loadStickerSets,\n loadRecentStickers,\n loadFavoriteStickers,\n loadAddedStickers,\n addRecentSticker,\n unfaveSticker,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n const [activeSetIndex, setActiveSetIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: STICKER_INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('sticker-set-')) {\n return;\n }\n\n const index = Number(id.replace('sticker-set-', ''));\n stickerSetIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = stickerSetIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveSetIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: headerRef });\n\n const lang = useLang();\n\n const areAddedLoaded = Boolean(addedSetIds);\n\n const allSets = useMemo(() => {\n if (!addedSetIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return [\n {\n id: 'recent',\n title: lang('RecentStickers'),\n stickers: recentStickers,\n count: recentStickers.length,\n },\n {\n id: 'favorite',\n title: lang('FavoriteStickers'),\n stickers: favoriteStickers,\n count: favoriteStickers.length,\n },\n ...addedSetIds.map((id) => stickerSetsById[id]).filter(Boolean),\n ];\n }, [addedSetIds, lang, recentStickers, favoriteStickers, stickerSetsById]);\n\n const noPopulatedSets = useMemo(() => (\n areAddedLoaded\n && allSets.filter((set) => set.stickers && set.stickers.length).length === 0\n ), [allSets, areAddedLoaded]);\n\n useEffect(() => {\n if (loadAndPlay) {\n loadStickerSets();\n loadRecentStickers();\n loadFavoriteStickers();\n }\n }, [loadAndPlay, loadFavoriteStickers, loadRecentStickers, loadStickerSets]);\n\n useEffect(() => {\n if (addedSetIds && addedSetIds.length) {\n loadAddedStickers();\n }\n }, [addedSetIds, loadAddedStickers]);\n\n useHorizontalScroll(headerRef.current);\n\n // Scroll container and header when active set changes\n useEffect(() => {\n if (!areAddedLoaded) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeSetIndex * HEADER_BUTTON_WIDTH - (header.offsetWidth / 2 - HEADER_BUTTON_WIDTH / 2);\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [areAddedLoaded, activeSetIndex]);\n\n const selectStickerSet = useCallback((index: number) => {\n setActiveSetIndex(index);\n const stickerSetEl = document.getElementById(`sticker-set-${index}`)!;\n fastSmoothScroll(containerRef.current!, stickerSetEl, 'start', undefined, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker);\n addRecentSticker({ sticker });\n }, [addRecentSticker, onStickerSelect]);\n\n const handleStickerUnfave = useCallback((sticker: ApiSticker) => {\n unfaveSticker({ sticker });\n }, [unfaveSticker]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n function renderCover(stickerSet: StickerSetOrRecent, index: number) {\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n const buttonClassName = buildClassName(\n 'symbol-set-button sticker-set-button',\n index === activeSetIndex && 'activated',\n );\n\n if (stickerSet.id === 'recent' || stickerSet.id === 'favorite' || stickerSet.hasThumbnail || !firstSticker) {\n return (\n selectStickerSet(index)}\n >\n {stickerSet.id === 'recent' ? (\n \n ) : stickerSet.id === 'favorite' ? (\n \n ) : stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n );\n } else {\n return (\n \n );\n }\n }\n\n const fullClassName = buildClassName('StickerPicker', className);\n\n if (!areAddedLoaded || !canRenderContents || noPopulatedSets || !canSendStickers) {\n return (\n
\n {!canSendStickers ? (\n
Sending stickers is not allowed in this chat.
\n ) : noPopulatedSets ? (\n
You have no saved Stickers.
\n ) : (\n \n )}\n
\n );\n }\n\n return (\n
\n \n {allSets.map(renderCover)}\n
\n
\n {allSets.map((stickerSet, i) => (\n = i - 1 && activeSetIndex <= i + 1}\n onStickerSelect={handleStickerSelect}\n onStickerUnfave={handleStickerUnfave}\n />\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n setsById,\n added,\n recent,\n favorite,\n } = global.stickers;\n\n return {\n recentStickers: recent.stickers,\n favoriteStickers: favorite.stickers,\n stickerSetsById: setsById,\n addedSetIds: added.setIds,\n shouldPlay: global.settings.byKey.shouldLoopStickers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickerSets',\n 'loadRecentStickers',\n 'loadFavoriteStickers',\n 'loadAddedStickers',\n 'addRecentSticker',\n 'unfaveSticker',\n ]),\n)(StickerPicker));\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiVideo } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\nimport useCanvasBlur from '../../hooks/useCanvasBlur';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const hasThumbnail = gif.thumbnail && !!gif.thumbnail.dataUri;\n const localMediaHash = `gif${gif.id}`;\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const loadAndPlay = isIntersecting && !isDisabled;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const thumbRef = useCanvasBlur(gif.thumbnail && gif.thumbnail.dataUri, Boolean(previewBlobUrl));\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { transitionClassNames } = useTransitionForMedia(hasThumbnail || previewBlobUrl || videoData, 'slow');\n const { isBuffered, bufferingHandlers } = useBuffering(true);\n const shouldRenderSpinner = loadAndPlay && !isBuffered;\n\n useVideoCleanup(videoRef, [shouldRenderVideo]);\n\n const handleClick = useCallback(\n () => onClick({\n ...gif,\n blobUrl: videoData,\n }),\n [onClick, gif, videoData],\n );\n\n const className = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\n );\n\n return (\n \n {hasThumbnail && (\n \n )}\n {!hasThumbnail && previewBlobUrl && (\n \n )}\n {(shouldRenderVideo || previewBlobUrl) && (\n \n \n \n )}\n {shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(GifButton);\n","import React, {\n FC, useEffect, memo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiVideo } from '../../../api/types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport Loading from '../../ui/Loading';\nimport GifButton from '../../common/GifButton';\n\nimport './GifPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendGifs: boolean;\n onGifSelect: (gif: ApiVideo) => void;\n};\n\ntype StateProps = {\n savedGifs?: ApiVideo[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC = ({\n className,\n loadAndPlay,\n canSendGifs,\n savedGifs,\n onGifSelect,\n loadSavedGifs,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n useEffect(() => {\n if (loadAndPlay) {\n loadSavedGifs();\n }\n }, [loadAndPlay, loadSavedGifs]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n return (\n
\n {!canSendGifs ? (\n
Sending GIFs is not allowed in this chat.
\n ) : canRenderContents && savedGifs && savedGifs.length ? (\n savedGifs.map((gif) => (\n \n ))\n ) : canRenderContents && savedGifs ? (\n
No saved GIFs.
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n savedGifs: global.gifs.saved.gifs,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadSavedGifs']),\n)(GifPicker));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\ntype OwnProps = {\n activeTab: SymbolMenuTabs;\n onSwitchTab: (tab: SymbolMenuTabs) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n};\n\nexport enum SymbolMenuTabs {\n 'Emoji',\n 'Stickers',\n 'GIFs',\n}\n\n// Getting enum string values for display in Tabs.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings\nexport const SYMBOL_MENU_TAB_TITLES = Object.values(SymbolMenuTabs)\n .filter((value): value is string => typeof value === 'string');\n\nconst SYMBOL_MENU_TAB_ICONS = {\n [SymbolMenuTabs.Emoji]: 'icon-smile',\n [SymbolMenuTabs.Stickers]: 'icon-stickers',\n [SymbolMenuTabs.GIFs]: 'icon-gifs',\n};\n\nconst SymbolMenuFooter: FC = ({\n activeTab, onSwitchTab, onRemoveSymbol, onSearchOpen,\n}) => {\n const lang = useLang();\n\n function renderTabButton(tab: SymbolMenuTabs) {\n return (\n onSwitchTab(tab)}\n ariaLabel={SYMBOL_MENU_TAB_TITLES[tab]}\n round\n faded\n color=\"translucent\"\n >\n \n \n );\n }\n\n const handleSearchOpen = useCallback(() => {\n onSearchOpen(activeTab === SymbolMenuTabs.Stickers ? 'stickers' : 'gifs');\n }, [activeTab, onSearchOpen]);\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n return (\n
\n {activeTab !== SymbolMenuTabs.Emoji && (\n \n \n \n )}\n\n {renderTabButton(SymbolMenuTabs.Emoji)}\n {renderTabButton(SymbolMenuTabs.Stickers)}\n {renderTabButton(SymbolMenuTabs.GIFs)}\n\n {activeTab === SymbolMenuTabs.Emoji && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SymbolMenuFooter);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../util/environment';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Menu from '../../ui/Menu';\nimport Transition from '../../ui/Transition';\nimport EmojiPicker from './EmojiPicker';\nimport StickerPicker from './StickerPicker';\nimport GifPicker from './GifPicker';\nimport SymbolMenuFooter, { SYMBOL_MENU_TAB_TITLES, SymbolMenuTabs } from './SymbolMenuFooter';\nimport Portal from '../../ui/Portal';\n\nimport './SymbolMenu.scss';\n\nconst ANIMATION_DURATION = 350;\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onLoad: () => void;\n onClose: () => void;\n onEmojiSelect: (emoji: string) => void;\n onStickerSelect: (sticker: ApiSticker) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen, addRecentEmoji,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const [recentEmojis, setRecentEmojis] = useState([]);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onClose, false, false);\n\n if (!isActivated && isOpen) {\n isActivated = true;\n }\n\n useEffect(() => {\n onLoad();\n }, [onLoad]);\n\n useLayoutEffect(() => {\n if (!IS_MOBILE_SCREEN) {\n return undefined;\n }\n\n if (isOpen) {\n document.body.classList.add('enable-symbol-menu-transforms');\n document.body.classList.add('is-symbol-menu-open');\n }\n\n return () => {\n if (isOpen) {\n fastRaf(() => {\n document.body.classList.remove('is-symbol-menu-open');\n setTimeout(() => {\n document.body.classList.remove('enable-symbol-menu-transforms');\n }, ANIMATION_DURATION);\n });\n }\n };\n }, [isOpen]);\n\n const recentEmojisRef = useRef(recentEmojis);\n recentEmojisRef.current = recentEmojis;\n useEffect(() => {\n if (!recentEmojisRef.current.length) {\n return;\n }\n\n recentEmojisRef.current.forEach((name) => {\n addRecentEmoji({ emoji: name });\n });\n\n setRecentEmojis([]);\n }, [isOpen, activeTab, addRecentEmoji]);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n setRecentEmojis((emojis) => {\n return [...emojis, name];\n });\n\n onEmojiSelect(emoji);\n }, [onEmojiSelect]);\n\n const handleSearch = useCallback((type: 'stickers' | 'gifs') => {\n onClose();\n onSearchOpen(type);\n }, [onClose, onSearchOpen]);\n\n const lang = useLang();\n\n const { canSendStickers, canSendGifs } = allowedAttachmentOptions;\n\n function renderContent(isActive: boolean, isFrom: boolean) {\n switch (activeTab) {\n case SymbolMenuTabs.Emoji:\n return (\n \n );\n case SymbolMenuTabs.Stickers:\n return (\n \n );\n case SymbolMenuTabs.GIFs:\n return (\n \n );\n }\n\n return undefined;\n }\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n const content = (\n <>\n
\n {isActivated && (\n \n {renderContent}\n \n )}\n
\n {IS_MOBILE_SCREEN && (\n \n \n \n )}\n \n \n );\n\n if (IS_MOBILE_SCREEN) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n );\n\n return (\n \n
\n {content}\n
\n
\n );\n }\n\n return (\n \n {content}\n \n );\n};\n\nexport default memo(SymbolMenu);\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './AttachMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n onPollCreate: () => void;\n onClose: () => void;\n};\n\nconst AttachMenu: FC = ({\n isOpen, allowedAttachmentOptions, onFileSelect, onPollCreate, onClose,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const handleFileSelect = useCallback((e: Event, isQuick: boolean) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n onFileSelect(Array.from(files), isQuick);\n }\n }, [onFileSelect]);\n\n const handleQuickSelect = useCallback(() => {\n openSystemFilesDialog(\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n (e) => handleFileSelect(e, true),\n );\n }, [handleFileSelect]);\n\n const handleDocumentSelect = useCallback(() => {\n openSystemFilesDialog('*', (e) => handleFileSelect(e, false));\n }, [handleFileSelect]);\n\n const lang = useLang();\n\n const { canAttachMedia, canAttachPolls } = allowedAttachmentOptions;\n\n return (\n \n {/*\n ** Using ternary operator here causes some attributes from first clause\n ** transferring to the fragment content in the second clause\n */}\n {!canAttachMedia && (\n Posting media content is not allowed in this group.\n )}\n {canAttachMedia && (\n <>\n \n {lang('AttachmentMenu.PhotoOrVideo')}\n \n {lang('AttachDocument')}\n \n )}\n {canAttachPolls && (\n {lang('Poll')}\n )}\n \n );\n};\n\nexport default memo(AttachMenu);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport Loading from '../../ui/Loading';\nimport StickerButton from '../../common/StickerButton';\n\nimport './StickerTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n stickers?: ApiSticker[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerTooltip: FC = ({\n isOpen,\n onStickerSelect,\n stickers,\n clearStickersForEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const prevStickers = usePrevious(stickers, true);\n const displayedStickers = stickers || prevStickers;\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n useEffect(() => (isOpen ? captureEscKeyListener(clearStickersForEmoji) : undefined), [isOpen, clearStickersForEmoji]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'StickerTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n !(displayedStickers && displayedStickers.length) && 'hidden',\n );\n\n return (\n \n {shouldRender && displayedStickers ? (\n displayedStickers.map((sticker) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { stickers } = global.stickers.forEmoji;\n\n return { stickers };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['clearStickersForEmoji']),\n)(StickerTooltip));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport { selectChatMessage, selectCurrentMessageList } from '../../../modules/selectors';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport Button from '../../ui/Button';\n\nimport './BotKeyboardMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageId: number;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst BotKeyboardMenu: FC = ({\n isOpen, message, onClose, clickInlineButton,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n if (!message || !message.keyboardButtons) {\n return undefined;\n }\n\n return (\n \n
\n {message.keyboardButtons.map((row) => (\n
\n {row.map((button) => (\n clickInlineButton({ button })}\n >\n {button.text}\n \n ))}\n
\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { messageId }): StateProps => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return {};\n }\n\n return { message: selectChatMessage(global, chatId, messageId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'clickInlineButton',\n ]),\n)(BotKeyboardMenu));\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './CustomSendMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSilentSend?: NoneToVoidFunction;\n onScheduleSend?: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n onCloseAnimationEnd?: NoneToVoidFunction;\n};\n\nconst CustomSendMenu: FC = ({\n isOpen, onSilentSend, onScheduleSend, onClose, onCloseAnimationEnd,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const lang = useLang();\n\n return (\n \n {onSilentSend && {lang('SendWithoutSound')}}\n {onScheduleSend && {lang('ScheduleMessage')}}\n \n );\n};\n\nexport default memo(CustomSendMenu);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport cycleRestrict from '../../../util/cycleRestrict';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevDuringAnimation from '../../../hooks/usePrevDuringAnimation';\n\nimport Loading from '../../ui/Loading';\nimport EmojiButton from './EmojiButton';\n\nimport './EmojiTooltip.scss';\nimport { LangCode } from '../../../types';\n\nconst VIEWPORT_MARGIN = 8;\nconst EMOJI_BUTTON_WIDTH = 44;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container) {\n return;\n }\n\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.EmojiButton',\n VIEWPORT_MARGIN,\n true,\n true,\n true,\n );\n\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first], true))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n const newLeft = position === 'start' ? index * EMOJI_BUTTON_WIDTH : 0;\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n language: LangCode;\n onEmojiSelect: (text: string) => void;\n onClose: NoneToVoidFunction;\n addRecentEmoji: AnyToVoidFunction;\n loadEmojiKeywords: AnyToVoidFunction;\n emojis: Emoji[];\n};\n\nconst CLOSE_DURATION = 350;\n\nconst EmojiTooltip: FC = ({\n isOpen,\n language,\n emojis,\n onClose,\n onEmojiSelect,\n addRecentEmoji,\n loadEmojiKeywords,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const listEmojis: Emoji[] = usePrevDuringAnimation(emojis.length ? emojis : undefined, CLOSE_DURATION) || [];\n\n const [selectedIndex, setSelectedIndex] = useState(-1);\n\n useEffect(() => {\n loadEmojiKeywords({ language });\n }, [loadEmojiKeywords, language]);\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [emojis]);\n\n useEffect(() => {\n setItemVisible(selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!emojis.length) {\n return -1;\n }\n\n const emojisCount = emojis.length;\n return cycleRestrict(emojisCount, newIndex);\n }, [emojis]);\n\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedIndex, getSelectedIndex]);\n\n const handleSelectEmoji = useCallback((e: KeyboardEvent) => {\n if (emojis.length && selectedIndex > -1) {\n const emoji = emojis[selectedIndex];\n if (emoji) {\n e.preventDefault();\n onEmojiSelect(emoji.native);\n addRecentEmoji({ emoji: emoji.id });\n }\n }\n }, [addRecentEmoji, emojis, onEmojiSelect, selectedIndex]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onLeft: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onRight: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectEmoji,\n }) : undefined), [handleArrowKey, handleSelectEmoji, isOpen, onClose]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'EmojiTooltip composer-tooltip custom-scroll-x',\n transitionClassNames,\n );\n\n return (\n \n {shouldRender && listEmojis ? (\n listEmojis.map((emoji, index) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(EmojiTooltip);\n","import React, {\n FC, useMemo, memo, useRef,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectUser,\n selectChatMessages,\n selectChat,\n selectCurrentTextSearch,\n} from '../../modules/selectors';\nimport {\n getMessageSummaryText,\n getChatTitle,\n getUserFullName,\n isChatChannel,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport LastMessageMeta from '../common/LastMessageMeta';\nimport Avatar from '../common/Avatar';\n\nimport './RightSearch.scss';\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n messagesById?: Record;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\ninterface Result {\n message: ApiMessage;\n senderUser?: ApiUser;\n senderChat?: ApiChat;\n onClick: NoneToVoidFunction;\n}\n\nconst RightSearch: FC = ({\n chatId,\n threadId,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\n}) => {\n const lang = useLang();\n\n const foundResults = useMemo(() => {\n if (!query || !foundIds || !foundIds.length || !messagesById) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const results = foundIds.map((id) => {\n const message = messagesById[id];\n if (!message) {\n return undefined;\n }\n\n const senderUser = message.senderId ? selectUser(getGlobal(), message.senderId) : undefined;\n\n let senderChat;\n if (chat && isChatChannel(chat)) {\n senderChat = chat;\n } else if (message.forwardInfo) {\n const { isChannelPost, fromChatId } = message.forwardInfo;\n senderChat = isChannelPost && fromChatId ? selectChat(getGlobal(), fromChatId) : undefined;\n } else {\n senderChat = message.senderId ? selectChat(getGlobal(), message.senderId) : undefined;\n }\n\n return {\n message,\n senderUser,\n senderChat,\n onClick: () => focusMessage({ chatId, threadId, messageId: id }),\n };\n }).filter(Boolean) as Result[];\n\n return orderBy(results, ({ message }) => message.date, 'desc');\n }, [chatId, threadId, focusMessage, foundIds, chat, messagesById, query]);\n\n const renderSearchResult = ({\n message, senderUser, senderChat, onClick,\n }: Result) => {\n const title = senderChat ? getChatTitle(lang, senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(lang, message);\n\n return (\n \n \n
\n
\n

{title && renderText(title)}

\n \n
\n
\n {renderText(text, ['emoji', 'highlight'], { highlight: query })}\n
\n
\n \n );\n };\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, true, (index) => {\n if (foundResults && foundResults[index]) {\n foundResults[index].onClick();\n }\n }, '.ListItem-button', true);\n\n return (\n \n

\n {!query ? (\n lang('lng_dlg_search_for_messages')\n ) : (totalCount === 0 || !foundResults.length) ? (\n lang('lng_search_no_results')\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length))} messages found`\n )}\n

\n {foundResults.map(renderSearchResult)}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const messagesById = chat && selectChatMessages(global, chat.id);\n if (!chat || !messagesById) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n };\n },\n (global, actions): DispatchProps => pick(actions, ['searchTextMessagesLocal', 'focusMessage']),\n)(RightSearch));\n","import React, {\n FC, useEffect, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_SEARCH } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectShouldLoopStickers, selectStickerSet } from '../../modules/selectors';\nimport useFlag from '../../hooks/useFlag';\nimport useOnChange from '../../hooks/useOnChange';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport StickerButton from '../common/StickerButton';\nimport StickerSetModal from '../common/StickerSetModal.async';\nimport Spinner from '../ui/Spinner';\n\ntype OwnProps = {\n stickerSetId: string;\n observeIntersection: ObserveFn;\n isSomeModalOpen: boolean;\n onModalToggle: (isOpen: boolean) => void;\n};\n\ntype StateProps = {\n set?: ApiStickerSet;\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC = ({\n stickerSetId, observeIntersection, set, shouldPlay,\n loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\n const lang = useLang();\n const isAdded = set && Boolean(set.installedDate);\n const areStickersLoaded = Boolean(set && set.stickers);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n useOnChange(() => {\n onModalToggle(isModalOpen);\n }, [isModalOpen, onModalToggle]);\n\n const displayedStickers = useMemo(() => {\n if (!set) {\n return [];\n }\n\n const coverStickerIds = (set.covers || []).map(({ id }) => id);\n const otherStickers = set.stickers ? set.stickers.filter(({ id }) => !coverStickerIds.includes(id)) : [];\n\n return [...set.covers || [], ...otherStickers].slice(0, STICKERS_TO_DISPLAY);\n }, [set]);\n\n useEffect(() => {\n // Featured stickers are initialized with one sticker in collection (cover of SickerSet)\n if (!areStickersLoaded && displayedStickers.length < STICKERS_TO_DISPLAY) {\n loadStickers({ stickerSetId });\n }\n }, [areStickersLoaded, displayedStickers.length, loadStickers, stickerSetId]);\n\n const handleAddClick = useCallback(() => {\n toggleStickerSet({ stickerSetId });\n }, [toggleStickerSet, stickerSetId]);\n\n if (!set) {\n return undefined;\n }\n\n const canRenderStickers = displayedStickers.length > 0;\n\n return (\n
\n
\n
\n

{set.title}

\n

{lang('Stickers', set.count, 'i')}

\n
\n \n {lang(isAdded ? 'Stickers.Installed' : 'Stickers.Install')}\n \n
\n
\n {!canRenderStickers && }\n {canRenderStickers && displayedStickers.map((sticker) => (\n \n ))}\n
\n {canRenderStickers && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { stickerSetId }): StateProps => {\n return {\n set: selectStickerSet(global, stickerSetId),\n shouldPlay: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadStickers', 'toggleStickerSet']),\n)(StickerSetResult));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport { throttle } from '../../util/schedulers';\nimport { selectCurrentStickerSearch } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype StateProps = {\n query?: string;\n featuredIds?: string[];\n resultIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst StickerSearch: FC = ({\n query,\n featuredIds,\n resultIds,\n loadFeaturedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const lang = useLang();\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadFeaturedStickers();\n });\n });\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!query && featuredIds) {\n return featuredIds.map((id) => (\n \n ));\n }\n\n if (resultIds) {\n if (!resultIds.length) {\n return

Nothing found.

;\n }\n\n return resultIds.map((id) => (\n \n ));\n }\n\n return ;\n }\n\n return (\n
\n {renderContent()}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentStickerSearch(global);\n const { query, resultIds } = currentSearch || {};\n const { featured } = global.stickers;\n\n return {\n query,\n featuredIds: featured.setIds,\n resultIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFeaturedStickers']),\n)(StickerSearch));\n","import React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiVideo } from '../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n selectCurrentGifSearch,\n selectChat,\n selectIsChatWithBot,\n selectCurrentMessageList,\n} from '../../modules/selectors';\nimport { getAllowedAttachmentOptions } from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype StateProps = {\n query?: string;\n results?: ApiVideo[];\n chat?: ApiChat;\n isChatWithBot?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst PRELOAD_BACKWARDS = 96; // GIF Search bot results are multiplied by 24\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifSearch: FC = ({\n query,\n results,\n chat,\n isChatWithBot,\n searchMoreGifs,\n sendMessage,\n setGifSearchQuery,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n const { canSendGifs } = getAllowedAttachmentOptions(chat, isChatWithBot);\n\n const handleGifClick = useCallback((gif: ApiVideo) => {\n if (canSendGifs) {\n sendMessage({ gif });\n }\n\n if (IS_TOUCH_ENV) {\n setGifSearchQuery({ query: undefined });\n }\n }, [canSendGifs, sendMessage, setGifSearchQuery]);\n\n const lang = useLang();\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!results) {\n return (\n \n );\n }\n\n if (!results.length) {\n return (\n

{lang('NoGIFsFound')}

\n );\n }\n\n return results.map((gif) => (\n \n ));\n }\n\n const hasResults = Boolean(query !== undefined && results && results.length);\n\n return (\n
\n \n {renderContent()}\n \n\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentGifSearch(global);\n const { query, results } = currentSearch || {};\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n\n return {\n query,\n results,\n chat,\n isChatWithBot,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMoreGifs', 'sendMessage', 'setGifSearchQuery']),\n)(GifSearch));\n","import React, {\n FC, useCallback, useState, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat,\n ApiMessage,\n ApiPollAnswer,\n ApiPollResult,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { pick } from '../../util/iteratees';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport ShowMoreButton from '../ui/ShowMoreButton';\nimport Loading from '../ui/Loading';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\n\nimport './PollAnswerResults.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n message: ApiMessage;\n answer: ApiPollAnswer;\n answerVote: ApiPollResult;\n totalVoters: number;\n};\n\ntype StateProps = {\n voters?: number[];\n offset: string;\n};\n\ntype DispatchProps = Pick;\n\nconst INITIAL_LIMIT = 4;\nconst VIEW_MORE_LIMIT = 50;\n\nconst PollAnswerResults: FC = ({\n chat,\n message,\n answer,\n answerVote,\n totalVoters,\n voters,\n offset,\n loadPollOptionResults,\n openChat,\n closePollResults,\n}) => {\n const prevVotersCount = usePrevious(answerVote.votersCount);\n const [isLoading, setIsLoading] = useState(true);\n const areVotersLoaded = Boolean(voters);\n const { option, text } = answer;\n const lang = useLang();\n\n useEffect(() => {\n // For update when new votes arrive or when the user takes back his vote\n if (!areVotersLoaded || prevVotersCount !== answerVote.votersCount) {\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: INITIAL_LIMIT, shouldResetVoters: true,\n });\n }\n // eslint-disable-next-line\n }, [answerVote.votersCount, areVotersLoaded]);\n\n const handleViewMoreClick = useCallback(() => {\n setIsLoading(true);\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: VIEW_MORE_LIMIT,\n });\n }, [chat, loadPollOptionResults, message.id, offset, option]);\n\n useEffect(() => {\n setIsLoading(false);\n }, [voters]);\n\n const handleMemberClick = useCallback((id: number) => {\n openChat({ id });\n closePollResults();\n }, [closePollResults, openChat]);\n\n function renderViewMoreButton() {\n const leftVotersCount = answerVote.votersCount - voters!.length;\n\n return answerVote.votersCount > INITIAL_LIMIT && leftVotersCount > 0 && (\n \n );\n }\n\n return (\n
\n
\n {voters\n ? voters.map((id) => (\n handleMemberClick(id)}\n >\n \n \n ))\n : }\n {voters && renderViewMoreButton()}\n
\n
\n {text}\n \n {getPercentage(answerVote.votersCount, totalVoters)}%\n \n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default memo(withGlobal(\n (global, { answer }: OwnProps): StateProps => {\n const { voters, offsets } = global.pollResults;\n\n return {\n voters: voters && voters[answer.option],\n offset: (offsets && offsets[answer.option]) || '',\n };\n },\n (global, actions): DispatchProps => pick(actions, ['loadPollOptionResults', 'openChat', 'closePollResults']),\n)(PollAnswerResults));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiChat } from '../../api/types';\nimport { selectChat, selectChatMessage } from '../../modules/selectors';\nimport { buildCollectionByKey } from '../../util/iteratees';\nimport { getMessagePoll } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n chat,\n message,\n lastSyncTime,\n}) => {\n const lang = useLang();\n if (!message || !chat) {\n return ;\n }\n\n const { summary, results } = getMessagePoll(message)!;\n if (!results.results) {\n return undefined;\n }\n\n const resultsByOption = buildCollectionByKey(results.results, 'option');\n\n return (\n
\n

{summary.question}

\n
\n {lastSyncTime && summary.answers.map((answer) => (\n \n ))}\n {!lastSyncTime && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n pollResults: { chatId, messageId },\n lastSyncTime,\n } = global;\n\n if (!chatId || !messageId) {\n return {};\n }\n\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n chat,\n message,\n lastSyncTime,\n };\n },\n)(PollResults));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n userId: number;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n};\n\ntype DispatchProps = Pick;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC = ({\n userId,\n user,\n chat,\n progress,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n const currentIsMuted = chat ? chat.isMuted : undefined;\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!currentIsMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!currentIsMuted);\n }, [currentIsMuted]);\n\n useEffect(() => {\n setIsProfileFieldsTouched(false);\n closeDeleteDialog();\n }, [closeDeleteDialog, userId]);\n\n useEffect(() => {\n setFirstName(currentFirstName);\n setLastName(currentLastName);\n }, [currentFirstName, currentLastName, user]);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n closeDeleteDialog();\n }\n }, [closeDeleteDialog, progress]);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleNotificationChange = useCallback((e: ChangeEvent) => {\n setIsNotificationsEnabled(e.target.checked);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n }\n\n updateContact({\n userId,\n isMuted: !isNotificationsEnabled,\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n });\n }, [firstName, lastName, updateContact, userId, isNotificationsEnabled]);\n\n const handleDeleteContact = useCallback(() => {\n deleteHistory({\n chatId: chat.id,\n shouldDeleteForAll: false,\n });\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, closeDeleteDialog, closeManagement, deleteHistory, deleteUser, openChat, userId]);\n\n if (!user) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n {lang('DeleteContact')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId)!;\n const { progress } = global.management;\n\n return {\n user, chat, progress,\n };\n },\n (global, actions): DispatchProps => pick(actions, [\n 'updateContact', 'deleteUser', 'closeManagement', 'openChat', 'deleteHistory',\n ]),\n)(ManageUser));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { getChatAvatarHash, getHasAdminRight, isChatBasicGroup } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { selectChat } from '../../../modules/selectors';\nimport { formatInteger } from '../../../util/textFormat';\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isBasicGroup: boolean;\n hasLinkedChannel: boolean;\n canChangeInfo?: boolean;\n canBanUsers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst GROUP_TITLE_EMPTY = 'Group title can\\'t be empty';\n\n// Some checkboxes control multiple rights, and some rights are not controlled from Permissions screen,\n// so we need to define the amount manually\nconst TOTAL_PERMISSIONS_COUNT = 8;\n\nconst ManageGroup: FC = ({\n chatId,\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo,\n canBanUsers,\n onScreenSelect,\n togglePreHistoryHidden,\n updateChat,\n deleteHistory,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const currentTitle = chat.title;\n const currentAbout = chat.fullInfo ? (chat.fullInfo.about || '') : '';\n\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickPermissions = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateGroup = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(GROUP_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleClickMembers = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupMembers);\n }, [onScreenSelect]);\n\n const handleTogglePreHistory = useCallback(() => {\n if (!chat.fullInfo) {\n return;\n }\n\n const { isPreHistoryHidden } = chat.fullInfo;\n\n togglePreHistoryHidden({ chatId: chat.id, isEnabled: !isPreHistoryHidden });\n }, [chat, togglePreHistoryHidden]);\n\n const enabledPermissionsCount = useMemo(() => {\n if (!chat.defaultBannedRights) {\n return 0;\n }\n\n let totalCount = [\n 'sendMessages',\n 'sendMedia',\n 'embedLinks',\n 'sendPolls',\n 'changeInfo',\n 'inviteUsers',\n 'pinMessages',\n ].filter(\n (key) => !chat.defaultBannedRights![key as keyof ApiChatBannedRights],\n ).length;\n\n const { sendStickers, sendGifs } = chat.defaultBannedRights;\n\n // These two rights are controlled with a single checkbox\n if (!sendStickers && !sendGifs) {\n totalCount += 1;\n }\n\n return totalCount;\n }, [chat]);\n\n const adminsCount = (chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleDeleteGroup = useCallback(() => {\n if (isBasicGroup) {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if (!chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else {\n deleteChannel({ chatId: chat.id });\n }\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [\n isBasicGroup, chat.isCreator, chat.id,\n closeDeleteDialog, closeManagement, deleteHistory, leaveChannel, deleteChannel, openChat,\n ]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('GroupType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n {hasLinkedChannel && (\n \n {lang('LinkedChannel')}\n {lang('DiscussionUnlink')}\n \n )}\n \n {lang('ChannelPermissions')}\n \n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n \n \n \n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n \n
\n
\n \n {lang('GroupMembers')}\n {formatInteger(chat.membersCount!)}\n \n\n {chat.fullInfo && (\n
\n \n
\n )}\n
\n
\n \n {lang('DeleteMega')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const hasLinkedChannel = Boolean(chat.fullInfo && chat.fullInfo.linkedChatId);\n\n return {\n chat,\n progress,\n isBasicGroup: isChatBasicGroup(chat),\n hasLinkedChannel,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'deleteHistory', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageGroup));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FLOATING_BUTTON_ANIMATION_TIMEOUT_MS = 250;\n\nfunction getLangKeyForBannedRightKey(key: string) {\n switch (key) {\n case 'sendMessages':\n return 'UserRestrictionsNoSend';\n case 'sendMedia':\n return 'UserRestrictionsNoSendMedia';\n case 'sendStickers':\n return 'UserRestrictionsNoSendStickers';\n case 'embedLinks':\n return 'UserRestrictionsNoEmbedLinks';\n case 'sendPolls':\n return 'UserRestrictionsNoSendPolls';\n case 'changeInfo':\n return 'UserRestrictionsNoChangeInfo';\n case 'inviteUsers':\n return 'UserRestrictionsInviteUsers';\n case 'pinMessages':\n return 'UserRestrictionsPinMessages';\n default:\n return undefined;\n }\n}\n\nconst ManageGroupPermissions: FC = ({\n onScreenSelect,\n onChatMemberSelect,\n chat,\n currentUserId,\n updateChatDefaultBannedRights,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n const handleRemovedUsersClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupRemovedUsers);\n }, [onScreenSelect]);\n\n const handleAddExceptionClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupUserPermissionsCreate);\n }, [onScreenSelect]);\n\n const handleExceptionMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n useEffect(() => {\n setPermissions((chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setTimeout(() => {\n setIsLoading(false);\n }, FLOATING_BUTTON_ANIMATION_TIMEOUT_MS);\n }, [chat]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat) {\n return;\n }\n\n setIsLoading(true);\n updateChatDefaultBannedRights({ chatId: chat.id, bannedRights: permissions });\n }, [chat, permissions, updateChatDefaultBannedRights]);\n\n const removedUsersCount = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return 0;\n }\n\n return chat.fullInfo.kickedMembers.length;\n }, [chat]);\n\n const exceptionMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return [];\n }\n\n return chat.fullInfo.members.filter(({ bannedRights }) => !!bannedRights);\n }, [chat]);\n\n const getMemberExceptions = useCallback((member: ApiChatMember) => {\n const { bannedRights } = member;\n if (!bannedRights || !chat) {\n return undefined;\n }\n\n const { defaultBannedRights } = chat;\n\n return Object.keys(bannedRights).reduce((result, key) => {\n if (\n !bannedRights[key as keyof ApiChatBannedRights]\n || (defaultBannedRights && defaultBannedRights[key as keyof ApiChatBannedRights])\n || key === 'sendInline' || key === 'viewMessages' || key === 'sendGames'\n ) {\n return result;\n }\n\n const langKey = getLangKeyForBannedRightKey(key);\n\n if (!langKey) {\n return result;\n }\n\n const translatedString = lang(langKey);\n\n return `${result}${!result.length ? translatedString : `, ${translatedString}`}`;\n }, '');\n }, [chat, lang]);\n\n return (\n
\n
\n
\n

{lang('ChannelPermissionsHeader')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n {lang('ChannelBlockedUsers')}\n {removedUsersCount}\n \n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n \n {lang('ChannelAddException')}\n \n\n {exceptionMembers.map((member) => (\n handleExceptionMemberClick(member)}\n >\n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat, currentUserId: global.currentUserId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatDefaultBannedRights']),\n)(ManageGroupPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n updateChatMemberBannedRights,\n}) => {\n const lang = useLang();\n\n const removedMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return [];\n }\n\n return chat.fullInfo.kickedMembers;\n }, [chat]);\n\n const getRemovedBy = useCallback((member: ApiChatMember) => {\n if (!member.kickedByUserId) {\n return undefined;\n }\n\n const kickedByUser = usersById[member.kickedByUserId];\n if (!kickedByUser) {\n return undefined;\n }\n\n return lang('UserRemovedBy', getUserFullName(kickedByUser));\n }, [lang, usersById]);\n\n const getContextActions = useCallback((member: ApiChatMember) => {\n if (!chat) {\n return undefined;\n }\n\n return [{\n title: lang('Unblock'),\n icon: 'delete',\n destructive: true,\n handler: () => updateChatMemberBannedRights({\n chatId: chat.id,\n userId: member.userId,\n bannedRights: {},\n }),\n }];\n }, [lang, chat, updateChatMemberBannedRights]);\n\n return (\n
\n
\n
\n

{lang('NoBlockedGroup2')}

\n\n {removedMembers.map((member) => (\n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n\n return { chat, usersById };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupRemovedUsers));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiMediaFormat } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CHANNEL_TITLE_EMPTY = 'Channel title can\\'t be empty';\n\nconst ManageChannel: FC = ({\n chatId,\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo,\n onScreenSelect,\n updateChat,\n toggleSignatures,\n closeManagement,\n leaveChannel,\n deleteChannel,\n openChat,\n}) => {\n const currentTitle = chat ? (chat.title || '') : '';\n const currentAbout = chat && chat.fullInfo ? (chat.fullInfo.about || '') : '';\n const hasLinkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId;\n\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = chat && getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const adminsCount = (chat && chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateChannel = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(CHANNEL_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleToggleSignatures = useCallback(() => {\n toggleSignatures({ chatId, isEnabled: !isSignaturesShown });\n }, [chatId, isSignaturesShown, toggleSignatures]);\n\n const handleClickSubscribers = useCallback(() => {\n onScreenSelect(ManagementScreens.ChannelSubscribers);\n }, [onScreenSelect]);\n\n\n const handleDeleteChannel = useCallback(() => {\n if (chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n } else {\n leaveChannel({ chatId: chat.id });\n }\n\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.isCreator, chat.id, closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, openChat]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('ChannelType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n \n {lang('Discussion')}\n {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}\n \n \n {lang('ChannelAdministrators')}\n {adminsCount}\n \n
\n \n
\n
\n
\n \n {lang('ChannelSubscribers')}\n {lang('Subscribers', chat.membersCount!, 'i')}\n \n
\n
\n \n {chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const isSignaturesShown = Boolean(chat && chat.isSignaturesShown);\n\n return {\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageChannel));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { selectChat, selectManagement } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport { isChatChannel } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport SafeLink from '../../common/SafeLink';\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport UsernameInput from '../../common/UsernameInput';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype PrivacyType = 'private' | 'public';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat: ApiChat;\n isChannel: boolean;\n progress?: ManagementProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageChatPrivacyType: FC = ({\n chat,\n isChannel,\n progress,\n isUsernameAvailable,\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n}) => {\n const isPublic = Boolean(chat.username);\n const privateLink = chat.fullInfo && chat.fullInfo.inviteLink;\n\n const [privacyType, setPrivacyType] = useState(isPublic ? 'public' : 'private');\n const [username, setUsername] = useState();\n const [isRevokeConfirmDialogOpen, openRevokeConfirmDialog, closeRevokeConfirmDialog] = useFlag();\n\n const canUpdate = (\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic)\n );\n\n useEffect(() => {\n if (privacyType && !privateLink) {\n updatePrivateLink();\n }\n }, [privacyType, privateLink, updatePrivateLink]);\n\n const handleOptionChange = useCallback((value: string) => {\n setPrivacyType(value as PrivacyType);\n }, []);\n\n const handleSave = useCallback(() => {\n updatePublicLink({ username: privacyType === 'public' ? username : '' });\n }, [privacyType, updatePublicLink, username]);\n\n const handleRevokePrivateLink = useCallback(() => {\n closeRevokeConfirmDialog();\n updatePrivateLink();\n }, [closeRevokeConfirmDialog, updatePrivateLink]);\n\n const lang = useLang();\n const langPrefix1 = isChannel ? 'Channel' : 'Mega';\n const langPrefix2 = isChannel ? 'Channel' : 'Group';\n\n const options = [\n { value: 'private', label: lang(`${langPrefix1}Private`), subLabel: lang(`${langPrefix1}PrivateInfo`) },\n { value: 'public', label: lang(`${langPrefix1}Public`), subLabel: lang(`${langPrefix1}PublicInfo`) },\n ];\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n

{lang(`${langPrefix2}Type`)}

\n \n
\n {privacyType === 'private' ? (\n
\n {privateLink ? (\n <>\n \n

\n {lang(`${langPrefix1}PrivateLinkHelp`)}\n

\n\n \n {lang('RevokeLink')}\n \n \n \n ) : (\n \n )}\n
\n ) : (\n
\n \n

\n {lang(`${langPrefix2}.Username.CreatePublicLinkHelp`)}\n

\n
\n )}\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { isUsernameAvailable } = selectManagement(global, chatId)!;\n\n return {\n chat,\n isChannel: isChatChannel(chat),\n progress: global.management.progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'checkPublicLink', 'updatePublicLink', 'updatePrivateLink',\n ]),\n)(ManageChatPrivacyType));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport getAnimationData from '../../common/helpers/animatedAssets';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport renderText from '../../common/helpers/renderText';\nimport Avatar from '../../common/Avatar';\nimport { isChatChannel } from '../../../modules/helpers';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record;\n linkedChat?: ApiChat;\n forDiscussionIds?: number[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageDiscussion: FC = ({\n chat,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n}) => {\n const [linkedGroupId, setLinkedGroupId] = useState();\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n const [isConfirmUnlinkGroupDialogOpen, openConfirmUnlinkGroupDialog, closeConfirmUnlinkGroupDialog] = useFlag();\n const [isConfirmLinkGroupDialogOpen, openConfirmLinkGroupDialog, closeConfirmLinkGroupDialog] = useFlag();\n const lang = useLang();\n const linkedChatId = linkedChat && linkedChat.id;\n\n useEffect(() => {\n loadGroupsForDiscussion();\n }, [loadGroupsForDiscussion]);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('DiscussionGroups').then(setAnimationData);\n }\n }, [animationData]);\n\n const handleUnlinkGroupSessions = useCallback(() => {\n closeConfirmUnlinkGroupDialog();\n unlinkDiscussionGroup({ channelId: isChannel ? chatId : linkedChatId });\n if (!isChannel) {\n onScreenSelect(ManagementScreens.Initial);\n }\n }, [closeConfirmUnlinkGroupDialog, unlinkDiscussionGroup, isChannel, chatId, linkedChatId, onScreenSelect]);\n\n const handleLinkGroupSessions = useCallback(() => {\n closeConfirmLinkGroupDialog();\n linkDiscussionGroup({ channelId: chatId, chatId: linkedGroupId });\n }, [closeConfirmLinkGroupDialog, linkDiscussionGroup, chatId, linkedGroupId]);\n\n const onDiscussionClick = (groupId: number) => {\n setLinkedGroupId(groupId);\n openConfirmLinkGroupDialog();\n };\n\n function renderUnlinkGroupHeader() {\n return (\n
\n \n
\n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n
\n
\n );\n }\n function renderLinkGroupHeader() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n return (\n
\n \n
\n {lang('Channel.DiscussionGroup.LinkGroup')}\n
\n
\n );\n }\n\n function renderLinkGroupConfirmText() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n if (linkedGroup.hasPrivateLink) {\n return renderText(\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPublicAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n return renderText(\n // eslint-disable-next-line max-len\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?\\n\\nAnyone from the channel will be able to see messages in this group.`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPrivateAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n function renderLinkedGroup() {\n return (\n
\n \n \n \n \n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n \n \n
\n );\n }\n\n function renderDiscussionGroups() {\n return (\n
\n

{lang('DiscussionChannelHelp')}

\n\n
\n \n {lang('DiscussionCreateGroup')}\n \n {forDiscussionIds ? (\n forDiscussionIds.map((id, i) => (\n { onDiscussionClick(id); }}\n >\n \n \n ))\n ) : (\n \n )}\n
\n

{lang('DiscussionChannelHelp2')}

\n \n
\n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n {linkedChat && renderLinkedGroup()}\n {!linkedChat && renderDiscussionGroups()}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { forDiscussionIds, byId: chatsByIds } = global.chats;\n const linkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId\n ? selectChat(global, chat.fullInfo.linkedChatId)\n : undefined;\n\n return {\n chat,\n chatsByIds,\n forDiscussionIds,\n linkedChat,\n isChannel: chat && isChatChannel(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGroupsForDiscussion', 'linkDiscussionGroup', 'unlinkDiscussionGroup',\n ]),\n)(ManageDiscussion));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatBannedRights } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isFormFullyDisabled?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupUserPermissions: FC = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n updateChatMemberBannedRights,\n isFormFullyDisabled,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag();\n const lang = useLang();\n\n const selectedChatMember = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n return chat.fullInfo.members.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.bannedRights) || (chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setIsLoading(false);\n }, [chat, selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: permissions,\n });\n }, [chat, selectedChatMemberId, permissions, updateChatMemberBannedRights]);\n\n const handleBanFromGroup = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: {\n viewMessages: true,\n },\n });\n }, [chat, selectedChatMemberId, updateChatMemberBannedRights]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatBannedRights) => {\n if (isFormFullyDisabled) {\n return true;\n }\n\n if (!chat || !chat.defaultBannedRights) {\n return false;\n }\n\n return chat.defaultBannedRights[key];\n }, [chat, isFormFullyDisabled]);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('UserRestrictionsCanDo')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n {!isFormFullyDisabled && (\n
\n \n {lang('UserRestrictionsBlock')}\n \n
\n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return { chat, isFormFullyDisabled };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupUserPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\n\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: number;\n isChannel: boolean;\n usersById: Record;\n};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const lang = useLang();\n\n function handleRecentActionsClick() {\n onScreenSelect(ManagementScreens.GroupRecentActions);\n }\n\n const adminMembers = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const handleAdminMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.ChatAdminRights);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = member.promotedByUserId ? usersById[member.promotedByUserId] : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [lang, usersById]);\n\n return (\n
\n
\n
\n \n {lang('EventLog')}\n {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}\n \n
\n\n
\n

\n {isChannel\n ? 'You can add administrators to help you manage your channel.'\n : 'You can add administrators to help you manage your group.'}\n

\n\n {adminMembers.map((member) => (\n handleAdminMemberClick(member)}\n >\n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n\n return {\n chat,\n currentUserId: global.currentUserId,\n isChannel: isChatChannel(chat),\n usersById,\n };\n },\n // (setGlobal, actions): DispatchProps => pick(actions, ['togglePreHistoryHidden', 'updateChat']),\n)(ManageChatAdministrators));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember } from '../../../api/types';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat }) => {\n const lang = useLang();\n\n const adminMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n return lang('ChannelAdmin');\n }, [lang]);\n\n return (\n
\n
\n
\n

Actions

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n

{lang('Channel.Management.Title')}

\n\n
\n \n
\n\n {adminMembers.map((member) => (\n \n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat };\n },\n)(ManageGroupRecentActions));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName, isChatBasicGroup, isChatChannel } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport InputText from '../../ui/InputText';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record;\n currentUserId?: number;\n isChannel: boolean;\n isFormFullyDisabled: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC = ({\n selectedChatMemberId,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n updateChatAdmin,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [isTouched, setIsTouched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isDismissConfirmationDialogOpen, openDismissConfirmationDialog, closeDismissConfirmationDialog] = useFlag();\n const [customTitle, setCustomTitle] = useState('');\n const lang = useLang();\n\n const selectedChatMember = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return undefined;\n }\n\n return chat.fullInfo.adminMembers.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.adminRights) || {});\n setCustomTitle(((selectedChatMember && selectedChatMember.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH));\n setIsTouched(false);\n setIsLoading(false);\n }, [selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatAdminRights]),\n }));\n setIsTouched(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: permissions,\n customTitle,\n });\n }, [chat, selectedChatMemberId, permissions, customTitle, updateChatAdmin]);\n\n const handleDismissAdmin = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: {},\n });\n closeDismissConfirmationDialog();\n }, [chat.id, closeDismissConfirmationDialog, selectedChatMemberId, updateChatAdmin]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatAdminRights) => {\n if (isChatBasicGroup(chat)) {\n return false;\n }\n\n if (isFormFullyDisabled || !chat.adminRights) {\n return true;\n }\n\n return !chat.adminRights![key];\n }, [chat, isFormFullyDisabled]);\n\n const memberStatus = useMemo(() => {\n if (!selectedChatMember) {\n return undefined;\n }\n\n if (selectedChatMember.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = selectedChatMember.promotedByUserId\n ? usersById[selectedChatMember.promotedByUserId]\n : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [selectedChatMember, usersById, lang]);\n\n const handleCustomTitleChange = useCallback((e) => {\n const { value } = e.target;\n setCustomTitle(value);\n setIsTouched(true);\n }, []);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('EditAdminWhatCanDo')}

\n\n
\n \n
\n {isChannel && (\n
\n \n
\n )}\n {isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n\n {isFormFullyDisabled && (\n

\n {lang('Channel.EditAdmin.CannotEdit')}\n

\n )}\n\n {!isChannel && (\n \n )}\n\n {currentUserId !== selectedChatMemberId && !isFormFullyDisabled && (\n \n {lang('EditAdminRemoveAdmin')}\n \n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n const { currentUserId } = global;\n const isChannel = isChatChannel(chat);\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return {\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatAdmin']),\n)(ManageGroupAdminRights));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(ManageGroupMembers));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number) => void;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.filter((member) => !member.isOwner).map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: number) => {\n onChatMemberSelect(memberId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [onChatMemberSelect, onScreenSelect]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleExceptionMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n };\n },\n)(ManageGroupUserPermissionsCreate));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementType } from '../../../types';\n\nimport { selectCurrentManagementType } from '../../../modules/selectors';\n\nimport ManageUser from './ManageUser';\nimport ManageGroup from './ManageGroup';\nimport ManageGroupPermissions from './ManageGroupPermissions';\nimport ManageGroupRemovedUsers from './ManageGroupRemovedUsers';\nimport ManageChannel from './ManageChannel';\nimport ManageChatPrivacyType from './ManageChatPrivacyType';\nimport ManageDiscussion from './ManageDiscussion';\nimport ManageGroupUserPermissions from './ManageGroupUserPermissions';\nimport ManageChatAdministrators from './ManageChatAdministrators';\nimport ManageGroupRecentActions from './ManageGroupRecentActions';\nimport ManageGroupAdminRights from './ManageGroupAdminRights';\nimport ManageGroupMembers from './ManageGroupMembers';\nimport ManageGroupUserPermissionsCreate from './ManageGroupUserPermissionsCreate';\n\nexport type OwnProps = {\n chatId: number;\n currentScreen: ManagementScreens;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return ;\n case 'group':\n return ;\n case 'channel':\n return ;\n }\n\n break;\n }\n\n case ManagementScreens.ChatPrivacyType:\n return (\n \n );\n\n case ManagementScreens.Discussion:\n return (\n \n );\n\n case ManagementScreens.GroupPermissions:\n return (\n \n );\n\n case ManagementScreens.GroupRemovedUsers:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissionsCreate:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissions:\n return (\n \n );\n\n case ManagementScreens.ChatAdministrators:\n return (\n \n );\n\n case ManagementScreens.GroupRecentActions:\n return (\n \n );\n\n case ManagementScreens.ChatAdminRights:\n return (\n \n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n \n );\n }\n\n return undefined; // Never reached\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const managementType = selectCurrentManagementType(global);\n\n return {\n managementType,\n };\n },\n)(Management));\n","const CURRENCIES: Record = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n RUB: '₽',\n UAH: '₴',\n INR: '₹',\n AED: 'د.إ',\n};\n\nexport function getCurrencySign(currency: string | undefined): string {\n if (!currency) {\n return '';\n }\n return CURRENCIES[currency] || '';\n}\n","const VISA = /^4[0-9]{12}(?:[0-9]{1,3})?$/;\nconst MASTERCARD1 = /^5[1-5][0-9]{11,14}$/;\nconst MASTERCARD2 = /^2[2-7][0-9]{11,14}$/;\n\nexport enum CardType {\n Default,\n Visa,\n Mastercard,\n}\n\nconst cards: Record = {\n [CardType.Default]: '',\n [CardType.Visa]: 'visa',\n [CardType.Mastercard]: 'mastercard',\n};\n\nexport function detectCardType(cardNumber: string): number {\n cardNumber = cardNumber.replace(/\\s/g, '');\n if (VISA.test(cardNumber)) {\n return CardType.Visa;\n }\n if (MASTERCARD1.test(cardNumber) || MASTERCARD2.test(cardNumber)) {\n return CardType.Mastercard;\n }\n return CardType.Default;\n}\n\nexport function detectCardTypeText(cardNumber: string): string {\n const cardType = detectCardType(cardNumber);\n return cards[cardType as number] || '';\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { countryList } from '../../util/phoneNumber';\n\nexport type FormState = {\n streetLine1: string;\n streetLine2: string;\n city: string;\n state: string;\n countryIso2: string;\n postCode: string;\n fullName: string;\n email: string;\n phone: string;\n shipping: string;\n cardNumber: string;\n cardholder: string;\n expiry: string;\n cvv: string;\n billingCountry: string;\n billingZip: string;\n saveInfo: boolean;\n saveCredentials: boolean;\n formErrors: Record;\n};\n\nexport type FormActions = (\n 'changeAddress1' | 'changeAddress2' | 'changeCity' | 'changeState' | 'changeCountry' |\n 'changePostCode' | 'changeFullName' | 'changeEmail' | 'changePhone' | 'changeShipping' | 'updateUserInfo' |\n 'changeCardNumber' | 'changeCardholder' | 'changeExpiryDate' | 'changeCvvCode' | 'changeBillingCountry' |\n 'changeBillingZip' | 'changeSaveInfo' | 'changeSaveCredentials' | 'setFormErrors'\n);\nexport type FormEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FormState = {\n streetLine1: '',\n streetLine2: '',\n city: '',\n state: '',\n countryIso2: '',\n postCode: '',\n fullName: '',\n email: '',\n phone: '',\n shipping: '',\n cardNumber: '',\n cardholder: '',\n expiry: '',\n cvv: '',\n billingCountry: '',\n billingZip: '',\n saveInfo: true,\n saveCredentials: false,\n formErrors: {},\n};\n\nconst reducer: StateReducer = (state, action) => {\n switch (action.type) {\n case 'changeAddress1':\n return {\n ...state,\n streetLine1: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine1: undefined,\n },\n };\n case 'changeAddress2':\n return {\n ...state,\n streetLine2: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine2: undefined,\n },\n };\n case 'changeCity':\n return {\n ...state,\n city: action.payload,\n formErrors: {\n ...state.formErrors,\n city: undefined,\n },\n };\n case 'changeState':\n return {\n ...state,\n state: action.payload,\n formErrors: {\n ...state.formErrors,\n state: undefined,\n },\n };\n case 'changeCountry':\n return {\n ...state,\n countryIso2: action.payload,\n billingCountry: getBillingCountry(action.payload),\n formErrors: {\n ...state.formErrors,\n countryIso2: undefined,\n },\n };\n case 'changePostCode':\n return {\n ...state,\n postCode: action.payload,\n formErrors: {\n ...state.formErrors,\n postCode: undefined,\n },\n };\n case 'changeFullName':\n return {\n ...state,\n fullName: action.payload,\n formErrors: {\n ...state.formErrors,\n fullName: undefined,\n },\n };\n case 'changeEmail':\n return {\n ...state,\n email: action.payload,\n formErrors: {\n ...state.formErrors,\n email: undefined,\n },\n };\n case 'changePhone':\n return {\n ...state,\n phone: action.payload,\n formErrors: {\n ...state.formErrors,\n phone: undefined,\n },\n };\n case 'changeShipping':\n return { ...state, shipping: action.payload };\n case 'changeCardNumber':\n return {\n ...state,\n cardNumber: action.payload,\n formErrors: {\n ...state.formErrors,\n cardNumber: undefined,\n },\n };\n case 'changeCardholder':\n return {\n ...state,\n cardholder: action.payload,\n formErrors: {\n ...state.formErrors,\n cardholder: undefined,\n },\n };\n case 'changeExpiryDate':\n return {\n ...state,\n expiry: action.payload,\n formErrors: {\n ...state.formErrors,\n expiry: undefined,\n },\n };\n case 'changeCvvCode':\n return {\n ...state,\n cvv: action.payload,\n formErrors: {\n ...state.formErrors,\n cvv: undefined,\n },\n };\n case 'changeBillingCountry':\n return {\n ...state,\n billingCountry: action.payload,\n formErrors: {\n ...state.formErrors,\n billingCountry: undefined,\n },\n };\n case 'changeBillingZip':\n return {\n ...state,\n billingZip: action.payload,\n formErrors: {\n ...state.formErrors,\n billingZip: undefined,\n },\n };\n case 'changeSaveInfo':\n return { ...state, saveInfo: action.payload };\n case 'changeSaveCredentials':\n return { ...state, saveCredentials: action.payload };\n case 'updateUserInfo':\n if (action.payload.countryIso2) {\n return {\n ...state,\n ...action.payload,\n billingCountry: getBillingCountry(action.payload.countryIso2),\n };\n }\n return { ...state, ...action.payload };\n case 'setFormErrors':\n return {\n ...state,\n formErrors: {\n ...state.formErrors,\n ...action.payload,\n },\n };\n default:\n return state;\n }\n};\n\nfunction getBillingCountry(countryCode: string) {\n const country = countryList.find(({ id }) => id === countryCode);\n return country ? country.name : '';\n}\n\nexport default () => {\n return useReducer(reducer, INITIAL_STATE);\n};\n","import { RefObject } from 'react';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\nimport { fastRaf } from '../util/schedulers';\nimport { useEffect } from '../lib/teact/teact';\n\nconst DEFAULT_DURATION = 400;\n\nexport default function useFocusAfterAnimation(\n ref: RefObject, animationDuration = DEFAULT_DURATION,\n) {\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n if (ref.current) {\n ref.current.focus();\n }\n });\n }, animationDuration);\n }, [ref, animationDuration]);\n}\n","import { ChangeEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n id?: string;\n value?: string;\n label?: string;\n error?: string;\n ref?: RefObject;\n hasArrow?: boolean;\n placeholder?: string;\n onChange?: (e: ChangeEvent) => void;\n children: any;\n};\n\nconst Select: FC = (props) => {\n const {\n id,\n value,\n label,\n hasArrow,\n error,\n ref,\n placeholder,\n onChange,\n children,\n } = props;\n const labelText = error || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error && 'error',\n labelText && 'with-label',\n hasArrow && 'with-arrow',\n 'input-group',\n );\n\n return (\n
\n \n {children}\n \n {labelText && id && (\n \n )}\n
\n );\n};\n\nexport default memo(Select);\n","import React, {\n FC, useRef, useCallback, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Select from '../ui/Select';\nimport Checkbox from '../ui/Checkbox';\n\nimport './ShippingInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n needEmail: boolean;\n needPhone: boolean;\n needName: boolean;\n needAddress: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst ShippingInfo: FC = ({\n state,\n needEmail,\n needPhone,\n needName,\n needAddress,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const phoneRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.countryIso2) {\n selectCountryRef.current.value = state.countryIso2;\n }\n }, [state.countryIso2]);\n\n const lang = useLang();\n\n useFocusAfterAnimation(inputRef);\n\n const handleAddress1Change = useCallback((e) => {\n dispatch({ type: 'changeAddress1', payload: e.target.value });\n }, [dispatch]);\n\n const handleAddress2Change = useCallback((e) => {\n dispatch({ type: 'changeAddress2', payload: e.target.value });\n }, [dispatch]);\n\n const handleCityChange = useCallback((e) => {\n dispatch({ type: 'changeCity', payload: e.target.value });\n }, [dispatch]);\n\n const handleStateChange = useCallback((e) => {\n dispatch({ type: 'changeState', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handlePostCodeChange = useCallback((e) => {\n dispatch({ type: 'changePostCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleFullNameChange = useCallback((e) => {\n dispatch({ type: 'changeFullName', payload: e.target.value });\n }, [dispatch]);\n\n const handleEmailChange = useCallback((e) => {\n dispatch({ type: 'changeEmail', payload: e.target.value });\n }, [dispatch]);\n\n const handlePhoneChange = useCallback((e) => {\n let { value } = e.target;\n value = `+${value.replace(/\\D/g, '')}`;\n if (phoneRef.current) {\n phoneRef.current.value = value;\n }\n dispatch({ type: 'changePhone', payload: value });\n }, [dispatch]);\n\n const handleSaveInfoChange = useCallback((e) => {\n dispatch({ type: 'changeSaveInfo', payload: e.target.value });\n }, [dispatch]);\n\n const { formErrors } = state;\n return (\n
\n
\n {needAddress ? (\n
\n
{lang('PaymentShippingAddress')}
\n \n \n \n \n \n {countryList.map(({ name, id }) => (\n \n {name}\n \n ))}\n \n\n \n
\n ) : undefined}\n { needName || needEmail || needPhone ? (\n
{lang('PaymentShippingReceiver')}
\n ) : undefined }\n { needName && (\n \n ) }\n { needEmail && (\n \n ) }\n { needPhone && (\n \n ) }\n \n \n
\n );\n};\n\nexport default memo(ShippingInfo);\n","import React, {\n FC, useCallback, memo, useMemo, useEffect,\n} from '../../lib/teact/teact';\n\nimport { ShippingOption } from '../../types/index';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\n\nimport RadioGroup from '../ui/RadioGroup';\n\nimport './Shipping.scss';\n\nexport type OwnProps = {\n state: FormState;\n shippingOptions: ShippingOption[];\n currency: string;\n dispatch: FormEditDispatch;\n};\n\nconst Shipping: FC = ({\n state,\n shippingOptions,\n currency,\n dispatch,\n}) => {\n useEffect(() => {\n if (!shippingOptions || state.shipping) {\n return;\n }\n dispatch({ type: 'changeShipping', payload: shippingOptions[0].id });\n }, [shippingOptions, state.shipping, dispatch]);\n\n const handleShippingSelect = useCallback((value) => {\n dispatch({ type: 'changeShipping', payload: value });\n }, [dispatch]);\n\n const options = useMemo(() => (shippingOptions.map(({ id: value, title: label, amount }) => ({\n label,\n subLabel: `${currency} ${String(amount / 100)}`,\n value,\n }))), [shippingOptions, currency]);\n\n return (\n
\n
\n

Select shipping method

\n \n \n
\n );\n};\n\nexport default memo(Shipping);\n","import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { Price } from '../../types';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: string;\n description?: string;\n text?: string;\n photoUrl?: string;\n };\n checkoutInfo?: {\n paymentMethod?: string;\n paymentProvider?: string;\n shippingAddress?: string;\n name?: string;\n phone?: string;\n shippingMethod?: string;\n };\n prices?: Price[];\n totalPrice?: number;\n shippingPrices?: Price[];\n currency?: string;\n};\n\nconst Checkout: FC = ({\n invoiceContent,\n prices,\n shippingPrices,\n checkoutInfo,\n currency,\n totalPrice,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const { photoUrl, title, text } = (invoiceContent || {});\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n return (\n
\n
\n { photoUrl && (\n \"\"\n )}\n
\n
{ title }
\n

{ text }

\n
\n
\n
\n { prices && prices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem('Total', totalPrice, currency, true)\n ) }\n
\n
\n {paymentMethod && renderCheckoutItem('icon-card', paymentMethod, 'Payment method')}\n {paymentProvider && renderCheckoutItem('stripe-provider', paymentProvider, 'Payment provider')}\n {shippingAddress && renderCheckoutItem('icon-location', shippingAddress, 'Shipping address')}\n {name && renderCheckoutItem('icon-user', name, 'Name')}\n {phone && renderCheckoutItem('icon-phone', phone, 'Phone number')}\n {shippingMethod && renderCheckoutItem('icon-truck', shippingMethod, 'Shipping method')}\n
\n
\n );\n};\n\nfunction renderPaymentItem(title: string, value: number, currency?: string, main = false) {\n return (\n
\n
\n { title }\n
\n
\n { `${currency || ''} ${(value / 100).toFixed(2)}` }\n
\n
\n );\n}\n\nfunction renderCheckoutItem(icon: string, title: string, data: string) {\n return (\n
\n \n
\n
\n { title }\n
\n

\n { data }\n

\n
\n
\n );\n}\n\nexport default memo(Checkout);\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { formatCardExpiry } from '../middle/helpers/inputFormatters';\n\nimport InputText from '../ui/InputText';\n\nconst MAX_FIELD_LENGTH = 5;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst ExpiryInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const expiryInputRef = useRef(null);\n\n const handleKeyDown = useCallback((e) => {\n if (e.key === 'Backspace' && value.charAt(value.length - 1) === '/') {\n const newValue = value.slice(0, value.length - 1);\n if (expiryInputRef.current) {\n expiryInputRef.current.value = newValue;\n }\n }\n }, [value]);\n\n const handleChange = useCallback((e) => {\n onChange(formatCardExpiry(e.target.value));\n }, [onChange]);\n\n return (\n \n );\n};\n\nexport default memo(ExpiryInput);\n","export function formatCardExpiry(input: string) {\n input = input.replace(/[^\\d]/g, '').slice(0, 4);\n const parts = input.match(/.{1,2}/g);\n if (parts && parts[0] && Number(parts[0]) > 12) {\n parts[0] = '12';\n }\n if (parts && parts[0] && parts[0].length === 2 && !parts[1]) {\n parts[1] = '';\n }\n return parts ? parts.join('/') : '';\n}\n\nexport function formatCardNumber(input: string) {\n input = input.replace(/[^\\d]/g, '');\n const parts = input.match(/.{1,4}/g);\n return parts ? parts.join(' ') : '';\n}\n","export default __webpack_public_path__ + \"mastercard.4216118edafe23cc2dec7b8807ba4622.svg\";","export default __webpack_public_path__ + \"visa.e5a7c336e1deb4b92a636e2e053878c4.svg\";","import React, {\n FC, memo, useCallback, useState, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport { formatCardNumber } from '../middle/helpers/inputFormatters';\nimport { detectCardType, CardType } from '../common/helpers/detectCardType';\n\nimport InputText from '../ui/InputText';\n\nimport './CardInput.scss';\n\n// @ts-ignore\nimport mastercardIconPath from '../../assets/mastercard.svg';\n// @ts-ignore\nimport visaIconPath from '../../assets/visa.svg';\n\nconst CARD_NUMBER_MAX_LENGTH = 23;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst CardInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const cardNumberRef = useRef(null);\n\n useFocusAfterAnimation(cardNumberRef);\n\n const [cardType, setCardType] = useState(CardType.Default);\n useEffect(() => {\n const newCardType = detectCardType(value);\n setCardType(newCardType);\n // eslint-disable-next-line\n }, []);\n\n const handleChange = useCallback((e) => {\n const newValue = formatCardNumber(e.target.value);\n const newCardType = detectCardType(e.target.value);\n setCardType(newCardType);\n onChange(newValue);\n if (cardNumberRef.current) {\n cardNumberRef.current.value = newValue;\n }\n }, [onChange, cardNumberRef]);\n\n const cardIcon = getCardIcon(cardType);\n\n return (\n
\n {cardIcon}\n \n
\n );\n};\n\nexport default memo(CardInput);\n\nfunction getCardIcon(cardType: CardType) {\n switch (cardType) {\n case CardType.Mastercard:\n return \"\";\n case CardType.Visa:\n return \"\";\n default:\n return undefined;\n }\n}\n","import React, {\n FC, useCallback, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Checkbox from '../ui/Checkbox';\nimport Select from '../ui/Select';\nimport ExpiryInput from './ExpiryInput';\nimport CardInput from './CardInput';\n\nimport './PaymentInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n canSaveCredentials: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst PaymentInfo: FC = ({\n state,\n canSaveCredentials,\n needCardholderName,\n needCountry,\n needZip,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.billingCountry) {\n selectCountryRef.current.value = state.billingCountry;\n }\n }, [state.billingCountry]);\n\n const handleCardNumberChange = useCallback((value) => {\n dispatch({ type: 'changeCardNumber', payload: value });\n }, [dispatch]);\n\n const handleCardholderChange = useCallback((e) => {\n dispatch({ type: 'changeCardholder', payload: e.target.value.toUpperCase() });\n }, [dispatch]);\n\n const handleExpiryChange = useCallback((value) => {\n dispatch({ type: 'changeExpiryDate', payload: value });\n }, [dispatch]);\n\n const handleCvvChange = useCallback((e) => {\n dispatch({ type: 'changeCvvCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeBillingCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handleBillingPostCodeChange = useCallback((e) => {\n dispatch({ type: 'changeBillingZip', payload: e.target.value });\n }, [dispatch]);\n\n const handleChangeSaveCredentials = useCallback((e) => {\n dispatch({ type: 'changeSaveCredentials', payload: e.target.value });\n }, [dispatch]);\n\n const lang = useLang();\n\n const { formErrors = {} } = state;\n\n return (\n
\n
\n
{lang('PaymentCardTitle')}
\n \n { needCardholderName && (\n \n )}\n
\n \n \n
\n { needCountry || needZip ? (\n
{lang('PaymentBillingAddress')}
\n ) : undefined }\n { needCountry && (\n \n {\n countryList.map(({ name }) => (\n \n {name}\n \n ))\n }\n \n ) }\n { needZip && (\n \n )}\n { canSaveCredentials && (\n \n ) }\n \n
\n );\n};\n\nexport default memo(PaymentInfo);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { PaymentStep, ShippingOption, Price } from '../../types';\nimport { ApiError } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport { getShippingError } from '../../modules/helpers/payments';\nimport usePaymentReducer, { FormState } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\n\nimport ShippingInfo from './ShippingInfo';\nimport Shipping from './Shipping';\nimport Checkout from './Checkout';\nimport PaymentInfo from './PaymentInfo';\nimport Button from '../ui/Button';\nimport Modal from '../ui/Modal';\nimport Transition from '../ui/Transition';\nimport Spinner from '../ui/Spinner';\n\nimport './PaymentModal.scss';\n\nconst DEFAULT_PROVIDER = 'stripe';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n nameRequested?: boolean;\n shippingAddressRequested?: boolean;\n phoneRequested?: boolean;\n emailRequested?: boolean;\n flexible?: boolean;\n phoneToProvider?: boolean;\n emailToProvider?: boolean;\n currency?: string;\n prices?: Price[];\n isProviderError: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n globalErrors?: ApiError[];\n};\n\ntype GlobalStateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst Invoice: FC = ({\n isOpen,\n onClose,\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n phoneToProvider,\n emailToProvider,\n currency,\n passwordMissing,\n isProviderError,\n invoiceContent,\n nativeProvider,\n prices,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalErrors,\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const currencySign = getCurrencySign(currency);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error || globalErrors) {\n setIsLoading(false);\n }\n }, [step, error, globalErrors]);\n\n useEffect(() => {\n if (error && error.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.fieldError,\n },\n });\n return;\n }\n if (globalErrors && globalErrors.length) {\n const errors = getShippingError(globalErrors);\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n ...errors,\n },\n });\n }\n }, [error, globalErrors, paymentDispatch]);\n\n useEffect(() => {\n if (savedInfo) {\n const {\n name: fullName, phone, email, shippingAddress,\n } = savedInfo;\n paymentDispatch({\n type: 'updateUserInfo',\n payload: {\n fullName,\n phone: phone && phone.charAt(0) !== '+'\n ? `+${phone}`\n : phone,\n email,\n ...(shippingAddress || {}),\n },\n });\n }\n }, [savedInfo, paymentDispatch]);\n\n const handleErrorModalClose = useCallback(() => {\n clearPaymentError();\n }, [clearPaymentError]);\n\n const totalPrice = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return 0;\n }\n\n return getTotalPrice(prices, shippingOptions, paymentState.shipping);\n }, [step, paymentState.shipping, prices, shippingOptions]);\n\n const checkoutInfo = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return undefined;\n }\n return getCheckoutInfo(paymentState, shippingOptions, nativeProvider || '');\n }, [step, paymentState, shippingOptions, nativeProvider]);\n\n function renderError() {\n if (!error) {\n return undefined;\n }\n return (\n \n

{error.description || 'Error'}

\n

{error.description || 'Error'}

\n \n {lang('OK')}\n \n
\n );\n }\n\n function renderModalContent(cuurentStep: PaymentStep) {\n switch (cuurentStep) {\n case PaymentStep.ShippingInfo:\n return (\n \n );\n case PaymentStep.Shipping:\n return (\n \n );\n case PaymentStep.PaymentInfo:\n return (\n \n );\n case PaymentStep.Checkout:\n return (\n \n );\n default:\n return undefined;\n }\n }\n\n const validateRequest = useCallback(() => {\n const { saveInfo } = paymentState;\n const requestInfo = getRequestInfo(paymentState);\n validateRequestedInfo({ requestInfo, saveInfo });\n }, [validateRequestedInfo, paymentState]);\n\n const sendCredentials = useCallback(() => {\n const credentials = getCredentials(paymentState);\n sendCredentialsInfo({\n credentials,\n });\n }, [sendCredentialsInfo, paymentState]);\n\n const sendForm = useCallback(() => {\n sendPaymentForm({\n shippingOptionId: paymentState.shipping,\n saveCredentials: paymentState.saveCredentials,\n });\n }, [sendPaymentForm, paymentState]);\n\n const setStep = useCallback((nextStep) => {\n setPaymentStep({ step: nextStep });\n }, [setPaymentStep]);\n\n const handleButtonClick = useCallback(() => {\n setIsLoading(true);\n switch (step) {\n case PaymentStep.ShippingInfo:\n return validateRequest();\n case PaymentStep.Shipping:\n return setStep(PaymentStep.PaymentInfo);\n case PaymentStep.PaymentInfo:\n return sendCredentials();\n case PaymentStep.Checkout:\n return sendForm();\n default:\n return () => {};\n }\n }, [step, validateRequest, setStep, sendCredentials, sendForm]);\n\n const modalHeader = useMemo(() => {\n switch (step) {\n case PaymentStep.ShippingInfo:\n return lang('PaymentShippingInfo');\n case PaymentStep.Shipping:\n return lang('PaymentShippingMethod');\n case PaymentStep.PaymentInfo:\n return lang('PaymentCardInfo');\n case PaymentStep.Checkout:\n return lang('PaymentCheckout');\n default:\n return '';\n }\n }, [step, lang]);\n\n const buttonText = useMemo(() => {\n switch (step) {\n case PaymentStep.Checkout:\n return lang('Checkout.PayPrice', `${currencySign}${(totalPrice / 100).toFixed(2)}`);\n default:\n return lang('Next');\n }\n }, [step, lang, currencySign, totalPrice]);\n\n if (isProviderError) {\n return (\n \n

\n Sorry, Telegram T doesn't support payments with this provider yet.
\n Please use one of our mobile apps to do this.\n

\n \n {lang('OK')}\n \n \n );\n }\n\n return (\n \n
\n \n \n \n

{modalHeader}

\n
\n {step !== undefined ? (\n \n {() => (\n
\n {renderModalContent(step)}\n
\n )}\n
\n ) : (\n
\n \n
\n )}\n
\n \n {buttonText}\n \n
\n {error && !error.field && renderError()}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps & GlobalStateProps => {\n const {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n invoice,\n invoiceContent,\n nativeProvider,\n nativeParams,\n passwordMissing,\n error,\n } = global.payment;\n\n const isProviderError = Boolean(invoice && (!nativeProvider || nativeProvider !== DEFAULT_PROVIDER));\n const { needCardholderName, needCountry, needZip } = (nativeParams || {});\n const {\n nameRequested,\n phoneRequested,\n emailRequested,\n shippingAddressRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n } = (invoice || {});\n\n return {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nativeProvider,\n passwordMissing,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n isProviderError,\n invoiceContent,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalErrors: global.errors,\n };\n },\n (setGlobal, actions): DispatchProps => {\n return pick(actions, [\n 'validateRequestedInfo',\n 'sendPaymentForm',\n 'setPaymentStep',\n 'sendCredentialsInfo',\n 'clearPaymentError',\n ]);\n },\n)(Invoice));\n\nfunction findShippingOption(shippingOptions: ShippingOption[], optionId: string) {\n return shippingOptions.find(({ id }) => id === optionId);\n}\n\nfunction getShippingPrices(shippingOptions: ShippingOption[], shippingOption: string) {\n const option = findShippingOption(shippingOptions, shippingOption);\n return option ? option.prices : undefined;\n}\n\nfunction getTotalPrice(prices: Price[] = [], shippingOptions: ShippingOption[] | undefined, shippingOption: string) {\n const shippingPrices = shippingOptions\n ? getShippingPrices(shippingOptions, shippingOption)\n : [];\n let total = 0;\n const totalPrices = prices.concat(shippingPrices || []);\n total = totalPrices.reduce((acc, cur) => {\n return acc + cur.amount;\n }, total);\n return total;\n}\n\nfunction getCheckoutInfo(state: FormState, shippingOptions: ShippingOption[] | undefined, paymentProvider: string) {\n const cardTypeText = detectCardTypeText(state.cardNumber);\n const paymentMethod = `${cardTypeText} *${state.cardNumber.slice(-4)}`;\n const shippingAddress = state.streetLine1\n ? `${state.streetLine1}, ${state.city}, ${state.countryIso2}`\n : undefined;\n const { phone, fullName: name } = state;\n const shippingOption = shippingOptions ? findShippingOption(shippingOptions, state.shipping) : undefined;\n const shippingMethod = shippingOption ? shippingOption.title : undefined;\n return {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n\nfunction getRequestInfo(paymentState: FormState) {\n const {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n fullName: name,\n phone,\n email,\n } = paymentState;\n\n const shippingAddress = {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n };\n\n return {\n name,\n phone,\n email,\n shippingAddress,\n };\n}\n\nfunction getCredentials(paymentState: FormState) {\n const {\n cardNumber, cardholder, expiry, cvv, billingCountry, billingZip,\n } = paymentState;\n const [expiryMonth, expiryYear] = expiry.split('/');\n const data = {\n cardNumber,\n cardholder,\n expiryMonth,\n expiryYear,\n cvv,\n country: billingCountry,\n zip: billingZip,\n };\n\n return {\n data,\n };\n}\n","import React, {\n FC, memo, useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { Price } from '../../types';\nimport { ApiShippingAddress } from '../../api/types/payments';\n\nimport useLang from '../../hooks/useLang';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\n\nimport Checkout from './Checkout';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './PaymentModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n prices?: Price[];\n shippingPrices: any;\n totalAmount?: number;\n currency?: string;\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n photoUrl?: string;\n text?: string;\n title?: string;\n credentialsTitle?: string;\n shippingMethod?: string;\n};\n\nconst ReceiptModal: FC = ({\n isOpen,\n onClose,\n prices,\n shippingPrices,\n totalAmount,\n currency,\n info,\n photoUrl,\n text,\n title,\n credentialsTitle,\n shippingMethod,\n}) => {\n const lang = useLang();\n const currencySign = getCurrencySign(currency);\n const checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n return (\n \n
\n
\n \n \n \n

{lang('PaymentReceipt')}

\n
\n
\n \n
\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { receipt } = global.payment;\n const {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n } = (receipt || {});\n\n return {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n };\n },\n)(ReceiptModal));\n\nfunction getCheckoutInfo(paymentMethod?: string,\n info?:\n { phone?: string;\n name?: string;\n shippingAddress?: ApiShippingAddress;\n },\n shippingMethod?: string) {\n if (!info) {\n return { paymentMethod };\n }\n const { shippingAddress } = info;\n const fullAddress = shippingAddress && shippingAddress.streetLine1\n ? `${shippingAddress.streetLine1}, ${shippingAddress.city}, ${shippingAddress.countryIso2}`\n : undefined;\n const { phone, name } = info;\n return {\n paymentMethod,\n paymentProvider: 'Stripe',\n shippingAddress: fullAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const lang = useLang();\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n \n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/3.ac6afd4be1c32f54938b.css b/dist/3.e4377d3a1cfc9dfc19d1.css similarity index 100% rename from dist/3.ac6afd4be1c32f54938b.css rename to dist/3.e4377d3a1cfc9dfc19d1.css diff --git a/dist/3.e4377d3a1cfc9dfc19d1.js b/dist/3.e4377d3a1cfc9dfc19d1.js new file mode 100644 index 000000000..70c7c15ff --- /dev/null +++ b/dist/3.e4377d3a1cfc9dfc19d1.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],Array(103).concat([function(e,t,a){"use strict";a.r(t),a.d(t,"MediaViewer",(function(){return de})),a.d(t,"ForwardPicker",(function(){return je})),a.d(t,"Errors",(function(){return ke})),a.d(t,"Notifications",(function(){return Ie})),a.d(t,"SafeLinkModal",(function(){return Pe})),a.d(t,"HistoryCalendar",(function(){return Te})),a.d(t,"CalendarModal",(function(){return Ae})),a.d(t,"DeleteMessageModal",(function(){return Re})),a.d(t,"PinMessageModal",(function(){return De})),a.d(t,"UnpinAllMessagesModal",(function(){return Be})),a.d(t,"MessageSelectToolbar",(function(){return qe})),a.d(t,"LeftSearch",(function(){return Nt})),a.d(t,"Settings",(function(){return on})),a.d(t,"ContactList",(function(){return mn})),a.d(t,"NewChat",(function(){return pn})),a.d(t,"NewChatStep1",(function(){return hn})),a.d(t,"NewChatStep2",(function(){return bn})),a.d(t,"ArchivedChats",(function(){return En})),a.d(t,"ContextMenuContainer",(function(){return Mn})),a.d(t,"StickerSetModal",(function(){return Fn})),a.d(t,"HeaderMenuContainer",(function(){return An})),a.d(t,"MobileSearch",(function(){return Dn})),a.d(t,"AttachmentModal",(function(){return Kn})),a.d(t,"PollModal",(function(){return Qn})),a.d(t,"SymbolMenu",(function(){return jc})),a.d(t,"AttachMenu",(function(){return Cc})),a.d(t,"MentionTooltip",(function(){return _n})),a.d(t,"StickerTooltip",(function(){return yc})),a.d(t,"BotKeyboardMenu",(function(){return kc})),a.d(t,"CustomSendMenu",(function(){return Nc})),a.d(t,"DropArea",(function(){return Ic.b})),a.d(t,"TextFormatter",(function(){return Sc.a})),a.d(t,"EmojiTooltip",(function(){return Pc})),a.d(t,"RightSearch",(function(){return Fc})),a.d(t,"StickerSearch",(function(){return Rc})),a.d(t,"GifSearch",(function(){return Dc})),a.d(t,"PollResults",(function(){return xc})),a.d(t,"Management",(function(){return Jc})),a.d(t,"PaymentModal",(function(){return kr})),a.d(t,"ReceiptModal",(function(){return Sr}));var n=a(0),c=a(2),r=a(5),s=a(20),l=a(1),o=a(7),i=a(115),d=a(6),m=a(4),u=a(3),h=a(132),b=a(47),g=a(177),p=a(26),v=a(108),E=a(120),O=a(192),f=a(38),j=a(48),C=a(146),y=a(56);function k(e,t,a,n){const{mediaEl:c}=P(t,n);if(!c)return;const{width:r}=y.a.get();let o,d=!1;if(n){const{photo:e,video:t,webPage:a}=Object(m.w)(n);d=Boolean(t),o=t?Object(m.cb)(t):Object(m.T)(e||a.photo)}else o=i.a;const{width:u,height:h}=Object(i.j)(e,d),{width:b,height:g}=Object(i.e)(u,h,o.width,o.height),p=(r-b)/2,v=function(e){const t=window.matchMedia(i.b);let a=4.125;e&&(a+=t.matches?.875:3.375);return a*i.c}(e)+(h-g)/2;let{top:E,left:O,width:f,height:j}=c.getBoundingClientRect();if([s.h.SharedMedia,s.h.Album,s.h.ScheduledAlbum,s.h.SearchResult].includes(t)){const e=function(e,t,a,n,c,r){if(e===t){const s=Math.max(c,r)*(e/t);n-=(s-c)/2,a-=(s-r)/2,c=s,r=s}else if(e>t){const a=c;n-=((c=r*(e/t))-a)/2}else if(t>e){const n=r;a-=((r=c*(t/e))-n)/2}return{top:a,left:n,width:c,height:r}}(b,g,E,O,f,j);E=e.top,O=e.left,f=e.width,j=e.height}const C=O+f/2-(p+b/2),k=E+j/2-(v+g/2),N=f/b,S=j/g,F=I(a||c);w(F,{top:v+"px",left:p+"px",width:b+"px",height:g+"px",transform:`translate3d(${C}px, ${k}px, 0) scale(${N}, ${S})`}),M(F,t),document.body.classList.add("ghost-animating"),requestAnimationFrame(()=>{document.body.appendChild(F),requestAnimationFrame(()=>{F.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(F),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(F)&&document.body.removeChild(F),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function N(e,t,a){const{container:n,mediaEl:c}=P(e,a);if(!c)return;const r=document.getElementById("MediaViewer").querySelector(".active .media-viewer-content img, .active .media-viewer-content video");if(!r||!c)return;const{top:o,left:i,width:d,height:m}=r.getBoundingClientRect(),{top:u,left:h,width:b,height:g}=c.getBoundingClientRect();let p=u;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:a}=y.a.get();return t.top<=a&&t.top+t.height>=0}(n)){const{height:e}=y.a.get();p=uf?O=f:f>O&&(f=O));const C=document.getElementsByClassName("ghost")[0],k=C||I(t||c,e===s.h.ProfileAvatar);C||w(k,{top:p+"px",left:h+"px",width:b+"px",height:g+"px",transform:`translate3d(${v}px, ${E}px, 0) scale(${O}, ${f})`}),requestAnimationFrame(()=>{if(C){const{top:e,left:t,width:a,height:n}=C.getBoundingClientRect();w(k,{transition:"none",top:p+"px",left:h+"px",transformOrigin:"top left",transform:`translate3d(${t-h}px, ${e-p}px, 0) scale(${a/b}, ${n/g})`,width:b+"px",height:g+"px"})}document.body.classList.add("ghost-animating"),C||document.body.appendChild(k),requestAnimationFrame(()=>{C&&(C.style.transition=""),k.style.transform="",j&&(k.style.opacity="0"),M(k,e),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(k)&&document.body.removeChild(k),document.body.classList.remove("ghost-animating")})},200+l.c)})})}function I(e,t=!1){const a=document.createElement("div");a.classList.add("ghost");const n=new Image;if("string"==typeof e?n.src=e:e instanceof HTMLVideoElement?n.src=e.poster:n.src=e.src,a.appendChild(n),t){a.classList.add("ProfileInfo");const e=document.querySelector("#RightColumn .ProfileInfo .info");e&&a.appendChild(e.cloneNode(!0))}return a}function S(e,t){const a=document.querySelector(".active > .MessageList");let n=e.offsetTop+t.closest(".content-inner, .WebPage").offsetTop;return e.id.includes("album-media-")&&(n+=e.parentElement.offsetTop+e.closest(".Message").offsetTop),n>a.scrollTop&&n+t.offsetHeight{if(n&&t)return{sender:Object(m.mb)(t)?Object(d.Gb)(e,t):Object(d.f)(e,t)};if(!a||!t)return{};const c=Object(d.k)(e,t,a);return{message:c,sender:c&&Object(d.tb)(e,c)}},(e,t)=>Object(u.l)(t,["closeMediaViewer","focusMessage"]))(({chatId:e,messageId:t,sender:a,isAvatar:c,message:r,closeMediaViewer:s,focusMessage:l})=>{const o=Object(n.m)(()=>{s(),l({chatId:e,messageId:t})},[e,l,t,s]),i=Object(F.a)();if(!a||!r&&!c)return;const d=a.id<0,u=Object(m.W)(i,a);return n.a.createElement("div",{className:"SenderInfo",onClick:o},d?n.a.createElement(x.a,{key:a.id,size:"medium",chat:a}):n.a.createElement(x.a,{key:a.id,size:"medium",user:a}),n.a.createElement("div",{className:"meta"},n.a.createElement("div",{className:"title",dir:"auto"},u&&Object(B.a)(u)),n.a.createElement("div",{className:"date",dir:"auto"},c?i("lng_mediaview_profile_photo"):Object(D.d)(i,1e3*r.date))))}),G=a(62),q=a(42),z=a(121),H=(a(254),a(180));var $=({mediaData:e,isVideo:t,isZoomed:a,message:c,fileName:r,isAvatar:s,onCloseMediaViewer:l,onForward:i,onZoomToggle:d})=>{const{isDownloadStarted:u,downloadProgress:h,handleDownloadClick:b}=Object(H.a)(c&&t?Object(m.E)(c,"download"):void 0),g=Object(F.a)(),p=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]);return o.g?n.a.createElement("div",{className:"MediaViewerActions-mobile"},n.a.createElement(G.a,{trigger:p,positionX:"right"},!s&&n.a.createElement(q.a,{icon:"forward",onClick:i},g("Forward")),t?n.a.createElement(q.a,{icon:u?"close":"download",onClick:b},u?Math.round(100*h)+"% Downloading...":"Download"):n.a.createElement(q.a,{icon:"download",href:e,download:r},g("AccActionDownload"))),u&&n.a.createElement(z.a,{progress:h,size:"s",noCross:!0})):n.a.createElement("div",{className:"MediaViewerActions"},!s&&n.a.createElement(n.a.Fragment,null,n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("Forward"),onClick:i},n.a.createElement("i",{className:"icon-forward"}))),t?n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("AccActionDownload"),onClick:b},u?n.a.createElement(z.a,{progress:h,size:"s",onClick:b}):n.a.createElement("i",{className:"icon-download"})):n.a.createElement(R.a,{href:e,download:r,round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("AccActionDownload")},n.a.createElement("i",{className:"icon-download"})),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:a?"Zoom Out":"Zoom In",onClick:d},n.a.createElement("i",{className:a?"icon-zoom-out":"icon-zoom-in"})),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("Close"),onClick:l},n.a.createElement("i",{className:"icon-close"})))},V=a(9);a(255);var _=({text:e="",isHideable:t,onClick:a})=>{const[c,r]=Object(n.r)(!1);return Object(n.n)(()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;r(t>2*i.c)};t();const a=Object(V.g)(t,500,!0);return window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[]),n.a.createElement("div",{className:"MediaViewerFooter "+(t?"hideable":""),onClick:function(t){e&&t.stopPropagation()}},e&&n.a.createElement("div",{className:"media-viewer-footer-content",onClick:a},n.a.createElement("p",{className:"media-text custom-scroll "+(c?"multiline":""),dir:"auto"},e)))},W=a(35),K=a(137);const Y=function(){if(void 0!==document.fullscreenElement)return"fullscreenElement";if(void 0!==document.mozFullScreenElement)return"mozFullScreenElement";if(void 0!==document.webkitFullscreenElement)return"webkitFullscreenElement";return""}();var Q=a(147),Z=a(136);const X=["bytes","kB","MB","GB","TB","PB"];var J=e=>{const t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**Math.floor(t)).toFixed(1)} ${X[t]}`};a(256);const ee=e=>{e.stopPropagation()};var te=({bufferedProgress:e,currentTime:t,duration:a,fileSize:c,isForceVisible:r,isForceMobileVersion:s,isPlayed:l,isFullscreenSupported:i,isFullscreen:d,onChangeFullscreen:m,onPlayPause:u,onSeek:h})=>{const[b,g]=Object(n.r)(!0);Object(n.n)(()=>{r&&g(r)},[r]),Object(n.n)(()=>{let e;return r||(o.g?g(!1):e=window.setTimeout(()=>{g(!1)},800)),()=>{e&&window.clearTimeout(e)}},[r]),Object(n.n)(()=>((b||r)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")}),[r,b]);const p=Object(F.a)();var v,E;if(b||r)return n.a.createElement("div",{className:"VideoPlayerControls "+(s?"mobile":""),onClick:ee},function(e,t,a,c){const r=e/t*100,s=100*a;return n.a.createElement("div",{className:"player-seekline"},n.a.createElement("div",{className:"player-seekline-track"},n.a.createElement("div",{className:"player-seekline-buffered",style:`width: ${s||0}%`}),n.a.createElement("div",{className:"player-seekline-played",style:`width: ${r||0}%`}),n.a.createElement("input",{min:"0",max:"100",step:.01,type:"range",onInput:c,className:"player-seekline-input",value:r||0})))}(t,a,e,h),n.a.createElement(R.a,{ariaLabel:p("AccActionPlay"),size:"tiny",ripple:!o.g,color:"translucent-white",className:"play",onClick:u},n.a.createElement("i",{className:l?"icon-pause":"icon-play"})),function(e,t){return n.a.createElement("div",{className:"player-time"},`${Object(D.e)(e)} / ${Object(D.e)(t)}`)}(t,a),e<1&&(v=e,E=c,n.a.createElement("div",{className:"player-file-size"},`${J(E*v)} / ${J(E)}`)),i&&n.a.createElement(R.a,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:m},n.a.createElement("i",{className:""+(d?"icon-smallscreen":"icon-fullscreen")})))};a(257);function ae(){return(ae=Object.assign||function(e){for(var t=1;t{const m=Object(n.q)(null),[u,h]=Object(n.r)(!o.l||!o.e),[b,g]=Object(n.r)(0),[p,v]=Object(n.r)(!0),[E,O,f]=function(e,t){const[a,c]=Object(n.r)(Boolean(Y&&document[Y]));return Object(n.o)(()=>{const a=()=>{c(Boolean(Y&&document[Y]))},n=()=>{c(!0)},r=()=>{c(!1),t(!1)},s=e.current;return document.addEventListener("fullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),s&&(s.addEventListener("webkitbeginfullscreen",n,!1),s.addEventListener("webkitendfullscreen",r,!1)),()=>{document.removeEventListener("fullscreenchange",a,!1),document.removeEventListener("webkitfullscreenchange",a,!1),document.removeEventListener("mozfullscreenchange",a,!1),s&&(s.removeEventListener("webkitbeginfullscreen",n,!1),s.removeEventListener("webkitendfullscreen",r,!1))}},[]),Y||"iOS"===o.o?[a,()=>{e.current&&(Y||"iOS"===o.o)&&(e.current.requestFullscreen?e.current.requestFullscreen():e.current.webkitRequestFullscreen?e.current.webkitRequestFullscreen():e.current.webkitEnterFullscreen?e.current.webkitEnterFullscreen():e.current.mozRequestFullScreen&&e.current.mozRequestFullScreen(),c(!0))},()=>{e.current&&(document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen(),c(!1))}]:[!1]}(m,h),{isBuffered:j,bufferedProgress:C,bufferingHandlers:y}=Object(K.a)(),{shouldRender:k,transitionClassNames:N}=Object(W.a)(!j,void 0,void 0,"slow");Object(n.n)(()=>{i||!l?m.current.pause():e&&!o.l&&Object(Z.a)(m.current)},[i,l,e]),Object(n.n)(()=>{m.current.currentTime===m.current.duration?(g(0),h(!1)):g(m.current.currentTime)},[b]);const I=Object(n.m)(e=>{e.stopPropagation(),u?(m.current.pause(),h(!1)):(m.current.play(),h(!0))},[u]);Object(Q.a)(m,[]);const S=Object(n.m)(()=>{v(!0)},[]),w=Object(n.m)(()=>{v(!1)},[]),P=Object(n.m)(e=>{g(e.currentTarget.currentTime)},[]),M=Object(n.m)(()=>{g(0),h(!1)},[]),F=Object(n.m)(()=>{E&&f?f():!E&&O&&O()},[f,E,O]),L=Object(n.m)(e=>{e.stopPropagation(),m.current.currentTime=Number(e.target.value)*m.current.duration/100},[]),A=Object(n.m)(e=>{e.stopPropagation(),v(!p)},[p]);Object(n.n)(()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||I(e)};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}},[I]);const T=c&&`width: ${c.width}px; height: ${c.height}px`,R=`background-image: url(${a})`;return n.a.createElement("div",{className:"VideoPlayer",onClick:!t&&o.g?A:void 0,onMouseOver:t?void 0:S,onMouseOut:t?void 0:w},n.a.createElement("div",{style:T},n.a.createElement("video",ae({ref:m,autoPlay:o.l,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:R,onEnded:M,onClick:I},y,{onTimeUpdate:P}),e&&n.a.createElement("source",{src:e}))),k&&n.a.createElement("div",{className:["spinner-container",N].join(" ")},!j&&n.a.createElement("div",{className:"buffering"},"Buffering..."),n.a.createElement(z.a,{size:"xl",progress:j?1:r,square:!0,onClick:d})),!t&&!k&&n.a.createElement(te,{isPlayed:u,bufferedProgress:C,currentTime:b,isFullscreenSupported:Boolean(O),isFullscreen:E,fileSize:s,duration:m.current?m.current.duration:0,isForceVisible:!u||p,isForceMobileVersion:c&&c.width<400,onSeek:L,onChangeFullscreen:F,onPlayPause:I}))}),ce=a(8);a(258);var re=Object(n.h)(({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:a}=Object(W.a)(e),c=Object(f.a)(e),r=Object(n.q)(null),[s,l]=Object(n.r)(1),i=Object(n.q)(!1);Object(n.n)(()=>{e&&!c&&l(1.5)},[e,c]);const d=Object(n.m)(()=>{i.current=!0},[]),m=Object(n.m)(()=>{i.current=!1,1===s&&t(s,!i.current)},[t,s]);Object(n.n)(()=>{t(s,!i.current)},[s,t]);const u=Object(F.a)(),h=Object(ce.a)("ZoomControls",a);return n.a.createElement("div",{className:h},n.a.createElement(R.a,{disabled:1===s,size:"tiny",color:"translucent-white",ariaLabel:u("ZoomOut"),className:"zoom-out",ripple:!o.g,onClick:()=>{r.current&&l(Math.max(1,s-.5))}},n.a.createElement("i",{className:"icon-zoom-out"})),n.a.createElement(R.a,{disabled:3===s,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!o.g,onClick:()=>{r.current&&l(Math.min(3,s+.5))}},n.a.createElement("i",{className:"icon-zoom-in"})),n.a.createElement("div",{className:"seekline"},n.a.createElement("div",{className:"seekline-track"},n.a.createElement("div",{className:"seekline-played",style:`width: ${50*(s-1)}%`}),n.a.createElement("input",{ref:r,min:1,max:3,step:"0.5",value:s,type:"range",className:"seekline-input",onChange:e=>{l(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:d,onMouseUp:m}))))});a(259);const se=[1,0,0,1,0,0],le={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5};var oe=Object(n.h)(({children:e,className:t,noWrap:a,canPan:c,zoomLevel:r,panDeltaX:s,panDeltaY:l,onPan:o})=>{const i=le[r]||r,[d,m]=Object(n.r)(!1),[h,b]=Object(n.r)({dx:s,dy:l,x:0,y:0}),[g,p]=Object(n.r)(se),v=Object(n.q)(null),E=Object(n.q)(null);Object(n.n)(()=>{const e=i||g[0],t=s||g[4],a=l||g[5],n=[...g];g[0]!==e&&(n[0]=e||n[0],n[3]=e||n[3]),g[4]!==t&&(n[4]=t),g[5]!==a&&(n[5]=a),Object(u.a)(g,n)||p(function(e,t,a){const n=a&&a.querySelector(".active img");if(!a||!n)return t;const c=a.getBoundingClientRect(),r=n.getBoundingClientRect(),s=r.width/e*t[0],l=r.height/e*t[3],o=(c.width-s)/2+t[4],i=(c.height-l)/2+t[5];return c.width&&c.width-150{c||p(se)},[c]),Object(n.n)(()=>{E.current&&(E.current.style.transform=`matrix(${g.toString()})`)},[a,g]);return a?e:n.a.createElement("div",{ref:v,className:"pan-wrapper "+(t||""),onMouseDown:e=>{if(!c)return;e.stopPropagation(),e.preventDefault();const t={dx:g[4],dy:g[5],x:e.pageX,y:e.pageY};b(t),m(!0),v.current&&v.current.classList.add("move")},onMouseUp:()=>{m(!1),v.current&&v.current.classList.remove("move"),o&&o(g[4],g[5])},onMouseMove:e=>{if(d){const t=function(e,t){const a=[...g],n=h.x-e,c=h.y-t;return a[4]=h.dx-n,a[5]=h.dy-c,a}(e.pageX,e.pageY);p(t),E.current&&(E.current.style.transform=`matrix(${g.toString()})`)}}},n.a.createElement("div",{ref:E,className:"pan-container"},e))});a(260);function ie(e,t,a){return e?n.a.createElement("img",{src:e,alt:"",style:t?`width: ${t.width}px`:"",draggable:Boolean(a)}):n.a.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},n.a.createElement(L.a,{color:"white"}))}var de=Object(n.h)(Object(c.h)(e=>{const{chatId:t,threadId:a,messageId:n,avatarOwnerId:c,profilePhotoIndex:r,origin:l}=e.mediaViewer,{animationLevel:o}=e.settings.byKey;if(l===s.h.SearchResult){if(!t||!n)return{animationLevel:o};const a=Object(d.k)(e,t,n);return a?{chatId:t,messageId:n,senderId:a.senderId,origin:l,message:a,animationLevel:o}:{animationLevel:o}}if(c){return{messageId:-1,senderId:c,avatarOwner:Object(d.Gb)(e,c)||Object(d.f)(e,c),profilePhotoIndex:r||0,animationLevel:o,origin:l}}if(!(t&&a&&n))return{animationLevel:o};let i,m,u;if(i=l&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(l)?Object(d.pb)(e,t,n):Object(d.k)(e,t,n),!i)return{animationLevel:o};if(m=l&&[s.h.ScheduledAlbum,s.h.ScheduledInline].includes(l)?Object(d.qb)(e,t):Object(d.m)(e,t),l===s.h.Inline||l===s.h.Album)u=Object(d.gb)(e,t,a)||Object(d.Y)(e,t,a);else if(l===s.h.SharedMedia){const t=Object(d.v)(e),{foundIds:a}=t&&t.resultsByType&&t.resultsByType.media||{};u=a}return{chatId:t,threadId:a,messageId:n,senderId:i.senderId,origin:l,message:i,chatMessages:m,collectionIds:u,animationLevel:o}},(e,t)=>Object(u.l)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"]))(({chatId:e,threadId:t,messageId:a,senderId:c,origin:d,avatarOwner:u,profilePhotoIndex:y,message:I,chatMessages:S,collectionIds:w,openMediaViewer:P,closeMediaViewer:M,openForwardMenu:L,focusMessage:D,animationLevel:B})=>{const x=Object(n.q)(null),G=Boolean(u||a),q=I?Object(m.S)(I):void 0,z=I?Object(m.H)(I):void 0,H=I?Object(m.Q)(I):void 0,V=Boolean(q),W=Boolean(z||q),K=Boolean(H),Y=H?H.isGif:void 0,Q=d===s.h.SharedMedia,Z=d===s.h.SearchResult,X=B>=1?"mv-slide":"none",J=2===B?"slide-fade":"none",ee=2===B,te=u?`avatar${u.id}-${y}.jpg`:I&&Object(m.C)(I),ae=Object(f.a)(c),[ce,se]=Object(n.r)(!1),[le,de]=Object(n.r)(!1),[me,ue]=Object(n.r)(1),[he,be]=Object(n.r)({x:0,y:0}),ge=Object(n.p)(()=>V&&a?[a]:Object(m.i)(S||{},w||[],Q),[V,a,S,w,Q]),pe=a?ge.indexOf(a):-1,ve=0===pe||-1===pe,Ee=pe===ge.length-1||-1===pe;function Oe(e){if(u&&void 0!==y){const{photos:t}=u;return t&&t[y]?`photo${t[y].id}?size=c`:Object(m.f)(u,e?"big":"normal")}return I&&Object(m.E)(I,e?"viewerFull":"viewerPreview")}!G||ae&&ae===c&&x.current||(x.current=pe);const fe=Object(v.a)(I&&(Q||Z)&&Object(m.E)(I,"pictogram"),void 0,r.ApiMediaFormat.BlobUrl,void 0,ee&&350),je=Oe(),Ce=Object(v.a)(je,void 0,u&&je&&je.startsWith("profilePhoto")?r.ApiMediaFormat.DataUri:r.ApiMediaFormat.BlobUrl,void 0,ee&&350),{mediaData:ye,downloadProgress:ke}=Object(E.a)(Oe(!0),void 0,I&&Object(m.D)(I,"viewerFull"),void 0,ee&&350),Ne=z||H?(z||H).blobUrl:void 0;let Ie=!K&&(Ne||ye)||Ce||fe;const Se=Object(O.a)(!Ie&&I&&Object(m.F)(I));Ie||d===s.h.SearchResult||(Ie=Se);const we=W?Object(m.T)(V?Object(m.S)(I):Object(m.H)(I)):void 0,Pe=K?Object(m.cb)(Object(m.Q)(I)):void 0;Object(n.n)(()=>{o.g&&document.body.classList.toggle("is-media-viewer-open",G)},[G]);const Me=Object(p.a)();Object(n.n)(()=>{const e=window.matchMedia(i.b);return"function"==typeof e.addEventListener?e.addEventListener("change",Me):"function"==typeof e.addListener&&e.addListener(Me),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",Me):"function"==typeof e.removeListener&&e.removeListener(Me)}},[Me]);const Fe=Object(f.a)(I),Le=Object(f.a)(d),Ae=Object(f.a)(u),Te=Object(f.a)(Ie);Object(n.n)(()=>{if(ee&&G&&!Fe&&!Ae){Object(j.b)(350+l.c);const e=I?Object(C.a)(I):void 0;k(Boolean(e),d,Ie,I)}ee&&!G&&(Fe||Ae)&&(Object(j.b)(350+l.c),N(Le,Te,Fe||void 0))},[ee,G,d,Le,I,Fe,Ae,Ie,Te]),Object(n.n)(()=>{let e;return le?se(!0):e=window.setTimeout(()=>{se(!1)},350),()=>{e&&window.clearTimeout(e)}},[le]);const Re=()=>{de(!1),ue(1),be({x:0,y:0})},De=Object(n.m)(()=>{de(!le),ue(le?1:1.5),le&&be({x:0,y:0})},[le]),Be=Object(n.m)((e,t=!1)=>{ue(e),1===e&&t&&Re()},[]),xe=Object(n.m)(()=>{M(),Re()},[M]),Ue=Object(n.m)(()=>{xe(),D({chatId:e,threadId:t,messageId:a})},[xe,e,t,D,a]),Ge=Object(n.m)(()=>{L({fromChatId:e,messageIds:[a]}),Re()},[L,e,a]);Object(n.n)(()=>G?Object(b.a)(()=>{le?Re():xe()}):void 0,[xe,G,le]),Object(n.n)(()=>{K&&!Y&&Object(g.b)()},[Y,K]);const qe=Object(n.m)((e,t)=>{let a=ge.indexOf(e);return(-1===t&&a>0||1===t&&a{ve||P({chatId:e,threadId:t,messageId:a?qe(a,-1):void 0,origin:d})},[e,t,qe,ve,a,P,d]),He=Object(n.m)(()=>{Ee||P({chatId:e,threadId:t,messageId:a?qe(a,1):void 0,origin:d})},[e,t,qe,Ee,a,P,d]);Object(n.n)(()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":ze();break;case"Right":case"ArrowRight":He()}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),Object(n.n)(()=>{const e=document.querySelector(".slide-container > .active, .slide-container > .to");if(!e)return;const t=Y&&!o.e;return Object(h.b)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:()=>{le||xe()},onSwipe:o.l?(e,t)=>{t===h.a.Right?ze():t===h.a.Left?He():xe()}:void 0})},[xe,Y,le,He,ze,ce]);const $e=Object(n.m)((e,t)=>{be({x:e,y:t})},[]),Ve=Object(F.a)();function _e(t){if(u)return n.a.createElement("div",{key:e,className:"media-viewer-content"},ie(ye||Ce,Object(i.g)(i.a,!1),!o.g&&!le));if(I){const e=Object(C.a)(I),c=Boolean(e);return n.a.createElement("div",{key:a,className:"media-viewer-content "+(c?"has-footer":"")},W&&ie(Ne||ye||Ce||fe,I&&Object(i.g)(we,c),!o.g&&!le),K&&n.a.createElement(ne,{key:a,url:Ne||ye,isGif:Y,posterData:Ie,posterSize:I&&Object(i.g)(Pe,c,!0),downloadProgress:ke,fileSize:H.size,isMediaViewerOpen:G,noPlay:!t,onClose:xe}),e&&n.a.createElement(_,{text:e,onClick:Ue,isHideable:K}))}}function We(){return n.a.createElement(U,{key:u?u.id:a,chatId:u?u.id:e,messageId:a,isAvatar:Boolean(u)})}return n.a.createElement(A.a,{id:"MediaViewer",className:le?"zoomed":"",isOpen:G},()=>n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"media-viewer-head",dir:Ve.isRtl?"rtl":void 0},o.g&&n.a.createElement(R.a,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:Ve("Close"),onClick:xe},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(T.a,{activeKey:x.current,name:J},We),n.a.createElement($,{mediaData:ye||Ce,isVideo:K,isZoomed:le,message:I,fileName:te,onCloseMediaViewer:xe,onForward:Ge,onZoomToggle:De,isAvatar:Boolean(u)})),n.a.createElement(oe,{noWrap:!ce,canPan:le,panDeltaX:he.x,panDeltaY:he.y,zoomLevel:me,onPan:$e},n.a.createElement(T.a,{className:"slide-container",activeKey:pe,name:X},_e)),!ve&&n.a.createElement("button",{type:"button",className:"navigation prev "+(K&&!Y&&"inline"),"aria-label":Ve("AccDescrPrevious"),dir:Ve.isRtl?"rtl":void 0,onClick:ze}),!Ee&&n.a.createElement("button",{type:"button",className:"navigation next "+(K&&!Y&&"inline"),"aria-label":Ve("Next"),dir:Ve.isRtl?"rtl":void 0,onClick:He}),n.a.createElement(re,{isShown:le,onChangeZoom:Be})))})),me=a(52),ue=a(127),he=a(63),be=a(16),ge=a(110),pe=a(45),ve=a(113),Ee=a(106),Oe=a(109),fe=a(123);a(261);var je=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a},currentUserId:n}=e;return{chatsById:t,activeListIds:a.active,archivedListIds:a.archived,currentUserId:n}},(e,t)=>Object(u.l)(t,["setForwardChatId","exitForwardMode","loadMoreChats"]))(({chatsById:e,activeListIds:t,archivedListIds:a,currentUserId:c,isOpen:s,setForwardChatId:l,exitForwardMode:i,loadMoreChats:d})=>{const[u,h]=Object(n.r)(""),b=Object(n.q)(null),g=Object(F.a)();Object(n.n)(()=>{s?o.g||setTimeout(()=>{requestAnimationFrame(()=>{b.current&&b.current.focus()})},500):(b.current&&b.current.blur(),setTimeout(()=>{h("")},300))},[s]);const p=Object(n.p)(()=>{const n=[...t||[],...a||[]];return Object(m.Eb)([...n.filter(t=>{const a=e[t];return!a||!!Object(m.e)(a,r.MAIN_THREAD_ID)&&(!u||Object(me.a)(Object(m.l)(g,e[t],void 0,t===c),u))})],e,void 0,c?[c]:void 0)},[t,a,e,c,u,g]),[v,E]=Object(ue.a)(d,p,Boolean(u)),O=Object(n.m)(e=>{h(e.currentTarget.value)},[]),f=Object(n.q)(null),j=Object(he.a)(f,s,e=>{v&&l({id:v[e]})},".ListItem-button",!0),C=n.a.createElement("div",{className:"modal-header",dir:g.isRtl?"rtl":void 0},n.a.createElement(R.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:g("Close"),onClick:i},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(pe.a,{ref:b,value:u,onChange:O,onKeyDown:j,placeholder:g("ForwardTo")}));return n.a.createElement(ge.a,{isOpen:s,onClose:i,className:"ForwardPicker",header:C},v&&v.length?n.a.createElement(ve.a,{className:"picker-list custom-scroll",items:v,onLoadMore:E,noScrollRestore:Boolean(u),ref:f,onKeyDown:j},v.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>l({id:e})},Object(m.mb)(e)?n.a.createElement(Oe.a,{status:e===c?g("SavedMessagesInfo"):void 0,userId:e}):n.a.createElement(fe.a,{chatId:e})))):v&&!v.length?n.a.createElement("p",{className:"no-results"},"Sorry, nothing found."):n.a.createElement(be.a,null))})),Ce=a(169);a(262);function ye(e){return e.isSlowMode?"Slowmode enabled":"Something went wrong"}var ke=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["errors"]),(e,t)=>Object(u.l)(t,["dismissError"]))(({errors:e,dismissError:t})=>{const a=Object(F.a)();if(e.length)return n.a.createElement("div",{id:"Errors"},e.map(e=>n.a.createElement(ge.a,{isOpen:!0,onClose:t,className:"error",title:ye(e)},n.a.createElement("p",null,Object(Ce.a)(e)),n.a.createElement(R.a,{isText:!0,onClick:t},a("OK")))))})),Ne=a(181);var Ie=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["notifications"]),(e,t)=>Object(u.l)(t,["dismissNotification"]))(({notifications:e,dismissNotification:t})=>{if(e.length)return n.a.createElement("div",{id:"Notifications"},e.map(({message:e})=>n.a.createElement(Ne.a,{message:Object(B.a)(e,["emoji","br","links"]),onDismiss:t})))})),Se=a(135),we=a(117);var Pe=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(u.l)(t,["toggleSafeLinkModal"]))(({url:e,toggleSafeLinkModal:t})=>{const a=Object(F.a)(),c=Object(n.m)(()=>{window.open(e),t({url:void 0})},[t,e]),r=Object(n.m)(()=>{t({url:void 0})},[t]),s=Object(Se.a)(e);return n.a.createElement(we.a,{isOpen:Boolean(e),onClose:r,title:a("OpenUrlTitle"),textParts:Object(B.a)(a("OpenUrlAlert2",s),["links"]),confirmLabel:a("OpenUrlTitle"),confirmHandler:c})}));a(263);const Me=["M","T","W","T","F","S","S"];function Fe(e,t,a,n,c){const r=new Date(e,t,a,0,0,0,0),s=n&&new Date(n.getFullYear(),n.getMonth(),n.getDate(),0,0,0,0),l=c&&new Date(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0,0);return!!(l&&r>l)||!!(s&&r{const h=Object(F.a)(),b=new Date,g=Object(n.p)(()=>e?new Date(e):new Date,[e]),p=t?new Date(t):void 0,[v,E]=Object(n.r)(g),[O,f]=Object(n.r)(Le(g.getHours())),[j,C]=Object(n.r)(Le(g.getMinutes())),y=v.getFullYear(),k=v.getMonth(),N=v.getDate();Object(n.n)(()=>{r&&E(g)},[r,g]);const I=c&&y>=b.getFullYear()&&k>=b.getMonth()||p&&y>=p.getFullYear()&&k>=p.getMonth(),S=a&&y<=b.getFullYear()&&k<=b.getMonth(),w=Object(n.p)(()=>function(e,t){const a=[],n=new Date;n.setFullYear(e),n.setMonth(t),n.setDate(1);const c=n.getDay();for(let e=1;e{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return f(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),23)),n=new Date(v.getTime());n.setHours(a),E(n);const c=Le(a);f(c),e.target.value=c},[v]),M=Object(n.m)(e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return C(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),59)),n=new Date(v.getTime());n.setMinutes(a),E(n);const c=Le(a);C(c),e.target.value=c},[v]);return n.a.createElement(ge.a,{isOpen:r,onClose:d,className:"CalendarModal"},n.a.createElement("div",{className:"container"},n.a.createElement("div",{className:"month-selector"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:d},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h4",null,Object(D.f)(h,v,o.g)),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",disabled:S,onClick:S?void 0:function(){E(e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t})}},n.a.createElement("i",{className:"icon-previous"})),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",disabled:I,onClick:I?void 0:function(){E(e=>{const t=new Date(e);return t.setMonth(t.getMonth()+1),t})}},n.a.createElement("i",{className:"icon-next"})))),n.a.createElement("div",{className:"calendar-wrapper"},n.a.createElement("div",{className:"calendar-grid"},Me.map(e=>n.a.createElement("div",{className:"day-button faded weekday"},n.a.createElement("span",null,e))),w.map(e=>n.a.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void E(e=>{const a=new Date(e);return a.setDate(t),a});var t},className:Object(ce.a)("day-button",Fe(y,k,e,a?b:void 0,c?b:p)?"disabled":""+(e?"clickable":""),e===N&&"selected")},!!e&&n.a.createElement("span",null,e))))),s&&n.a.createElement("div",{className:"timepicker"},n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:O,onChange:P}),":",n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:j,onChange:M})),n.a.createElement("div",{className:"footer"},n.a.createElement(R.a,{onClick:function(){m(v)}},s?function(e,t){const a=Object(D.c)(e,t,!0);if("Today"===a)return e("Conversation.ScheduleMessage.SendToday",Object(D.h)(t));return e("Conversation.ScheduleMessage.SendOn",a).replace("%@",Object(D.h)(t))}(h,v):l),i&&n.a.createElement(R.a,{onClick:u,isText:!0},i)))});var Te=Object(n.h)(Object(c.h)(e=>({selectedAt:e.historyCalendarSelectedAt}),(e,t)=>Object(u.l)(t,["searchMessagesByDate","closeHistoryCalendar"]))(({isOpen:e,selectedAt:t,searchMessagesByDate:a,closeHistoryCalendar:c})=>{const r=Object(n.m)(e=>{a({timestamp:e.valueOf()/1e3}),c()},[c,a]),s=Object(F.a)();return n.a.createElement(Ae,{isOpen:e,selectedAt:t,isPastMode:!0,submitButtonLabel:s("JumpToDate"),onClose:c,onSubmit:r})}));var Re=Object(n.h)(Object(c.h)((e,{message:t,isSchedule:a})=>{const{threadId:n}=Object(d.y)(e)||{},{canDeleteForAll:c}=n&&Object(d.b)(e,t,n)||{},r=Object(d.f)(e,t.chatId);return{canDeleteForAll:!a&&c,contactName:r&&Object(m.mb)(r.id)?Object(m.Z)(Object(d.Gb)(e,Object(m.V)(r))):void 0,willDeleteForCurrentUserOnly:r&&Object(m.jb)(r)&&!c,willDeleteForAll:r&&Object(m.ob)(r)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages"]))(({isOpen:e,isSchedule:t,message:a,album:c,canDeleteForAll:r,contactName:s,willDeleteForCurrentUserOnly:l,willDeleteForAll:o,onClose:i,deleteMessages:d,deleteScheduledMessages:m})=>{const u=Object(n.m)(()=>{const e=c&&c.messages?c.messages.map(({id:e})=>e):[a.id];d({messageIds:e,shouldDeleteForAll:!0}),i()},[d,a.id,i,c]),h=Object(n.m)(()=>{const e=c&&c.messages?c.messages.map(({id:e})=>e):[a.id];t?m({messageIds:e}):d({messageIds:e,shouldDeleteForAll:!1}),i()},[c,a.id,t,i,m,d]),b=Object(F.a)();return n.a.createElement(ge.a,{isOpen:e,onClose:i,onEnter:e&&!r?h:void 0,className:"delete",title:b("DeleteSingleMessagesTitle")},n.a.createElement("p",null,b("AreYouSureDeleteSingleMessage")),l&&n.a.createElement("p",null,b("lng_delete_for_me_chat_hint")),o&&n.a.createElement("p",null,b("lng_delete_for_everyone_hint",1,"i")),r&&n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},s&&b("Conversation.DeleteMessagesFor",Object(B.a)(s)),!s&&b("Conversation.DeleteMessagesForEveryone")),n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},b(r?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:i},b("Cancel")))}));var De=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.mb)(t),n=Object(d.P)(e,t),c=Object(d.f)(e,t),r=!!c&&Object(m.kb)(c),s=!!c&&Object(m.jb)(c),l=!!c&&Object(m.ob)(c);return{isPrivateChat:a,isChatWithSelf:n,isChannel:r,isGroup:s,isSuperGroup:l,canPinForAll:a&&!n||l||s,contactName:c&&Object(m.mb)(c.id)?Object(m.Z)(Object(d.Gb)(e,Object(m.V)(c))):void 0}},(e,t)=>Object(u.l)(t,["pinMessage"]))(({isOpen:e,messageId:t,chatId:a,isChannel:c,isGroup:r,isSuperGroup:s,canPinForAll:l,contactName:o,onClose:i,pinMessage:d})=>{const m=Object(n.m)(()=>{d({chatId:a,messageId:t,isUnpin:!1}),i()},[d,a,t,i]),u=Object(n.m)(()=>{d({chatId:a,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),i()},[a,t,i,d]),h=Object(F.a)();return n.a.createElement(ge.a,{isOpen:e,onClose:i,className:"pin",title:h("PinMessageAlertTitle")},n.a.createElement("p",null,h(c?"PinMessageAlertChannel":r||s?"PinMessageAlert":"PinMessageAlertChat")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:u},h("DialogPin")),l&&n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:m},o?h("Conversation.PinMessagesFor",o):h("Conversation.PinMessageAlert.PinAndNotifyMembers")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:i},h("Cancel")))}));var Be=Object(n.h)(({isOpen:e,pinnedMessagesCount:t=0,onClose:a,onUnpin:c})=>{const r=Object(F.a)();return n.a.createElement(ge.a,{isOpen:e,onClose:a,className:"unpin-all",title:r("Chat.PanelUnpinAllMessages")},n.a.createElement("p",null,r("Chat.UnpinAllMessagesConfirmation",t,"i")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:c},r("DialogUnpin")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:a},r("Cancel")))}),xe=a(34),Ue=a(55);var Ge=Object(n.h)(Object(c.h)((e,{isSchedule:t})=>{const{messageIds:a}=e.selectedMessages||{},{canDeleteForAll:n}=Object(d.e)(e),c=Object(d.r)(e);return{selectedMessageIds:a,canDeleteForAll:!t&&n,contactName:c&&Object(m.mb)(c.id)?Object(m.Z)(Object(d.Gb)(e,Object(m.V)(c))):void 0,willDeleteForCurrentUserOnly:c&&Object(m.jb)(c)&&!n,willDeleteForAll:c&&Object(m.ob)(c)}},(e,t)=>Object(u.l)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"]))(({isOpen:e,isSchedule:t,selectedMessageIds:a,canDeleteForAll:c,contactName:r,willDeleteForCurrentUserOnly:s,willDeleteForAll:l,onClose:o,deleteMessages:i,deleteScheduledMessages:d,exitMessageSelectMode:m})=>{const u=Object(n.m)(()=>{i({messageIds:a,shouldDeleteForAll:!0}),m(),o()},[i,m,a,o]),h=Object(n.m)(()=>{t?d({messageIds:a}):i({messageIds:a,shouldDeleteForAll:!1}),m(),o()},[t,m,o,d,a,i]),b=Object(F.a)();if(a)return n.a.createElement(ge.a,{isOpen:e,onClose:o,onEnter:c?void 0:h,className:"delete",title:b("Conversation.DeleteManyMessages")},n.a.createElement("p",null,b("AreYouSureDeleteFewMessages")),s&&n.a.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),l&&n.a.createElement("p",null,"This will delete them for everyone in this chat."),c&&n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},r?b("ChatList.DeleteForEveryone",Object(B.a)(r)):b("Conversation.DeleteMessagesForEveryone")),n.a.createElement(R.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},b(c?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(R.a,{className:"confirm-dialog-button",isText:!0,onClick:o},b("Cancel")))}));a(264);var qe=Object(n.h)(Object(c.h)(e=>{const{type:t}=Object(d.y)(e)||{},{canDelete:a}=Object(d.e)(e);return{isSchedule:"scheduled"===t,selectedMessagesCount:Object(d.sb)(e),canDeleteMessages:a}},(e,t)=>Object(u.l)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages"]))(({canPost:e,isActive:t,messageListType:a,isSchedule:c,selectedMessagesCount:r,canDeleteMessages:s,exitMessageSelectMode:l,openForwardMenuForSelectedMessages:o})=>{const[i,d,m]=Object(xe.a)();Object(n.n)(()=>t&&!i?Object(Ue.a)({onBackspace:d,onDelete:d,onEsc:l}):void 0,[t,i,d,l]);const u=Object(f.a)(r||void 0,!0),h=t?r:u,b=Object(F.a)(),g=b("VoiceOver.Chat.MessagesSelected",h),p=Object(ce.a)("MessageSelectToolbar",e&&"with-composer",t&&"shown");return n.a.createElement("div",{className:p},n.a.createElement("div",{className:"MessageSelectToolbar-inner"},n.a.createElement(R.a,{color:"translucent",round:!0,onClick:l,ariaLabel:"Exit select mode"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("span",{className:"MessageSelectToolbar-count",title:g},g),!!r&&n.a.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==a&&n.a.createElement(q.a,{icon:"forward",ariaLabel:"Forward Messages",onClick:o},n.a.createElement("span",{className:"item-text"},b("Forward"))),n.a.createElement(q.a,{destructive:!0,icon:"delete",onClick:d,disabled:!s,ariaLabel:b("EditAdminGroupDeleteMessages")},n.a.createElement("span",{className:"item-text"},b("Delete"))))),n.a.createElement(Ge,{isOpen:i,isSchedule:c,onClose:m}))})),ze=a(168),He=a(50),$e=a(170),Ve=e=>{const t=Object(n.q)(null),a=Object(n.m)(a=>{if("Enter"!==a.key)return;t.current===document.activeElement&&e()},[e]);return Object(n.n)(()=>(window.addEventListener("keydown",a,!1),()=>window.removeEventListener("keydown",a)),[a]),t},_e=a(157);var We=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),n=a&&Object(m.V)(a);return{chat:a,privateChatUser:n?Object(d.Gb)(e,n):void 0,isPinned:Object(d.N)(e,t)}})(({chatId:e,chat:t,privateChatUser:a,isPinned:c,withUsername:r,onClick:s})=>{const[l,o,i]=Object(xe.a)(),d=Object($e.a)({chat:t,privateChatUser:a,isPinned:c,handleDelete:o}),u=()=>{s(e)},h=Ve(u);if(t)return n.a.createElement(Ee.a,{className:"chat-item-clickable search-result",onClick:u,contextActions:d,buttonRef:h},Object(m.mb)(e)?n.a.createElement(Oe.a,{userId:e,withUsername:r,avatarSize:"large"}):n.a.createElement(fe.a,{chatId:e,withUsername:r,avatarSize:"large"}),n.a.createElement(_e.a,{isOpen:l,onClose:i,chat:t}))})),Ke=a(143);a(265);const Ye=Object(V.g)(e=>e(),6e4,!0);var Qe=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.topPeers,a=e.users.byId,{recentlyFoundChatIds:n}=e.globalSearch;return{topUserIds:t,usersById:a,recentlyFoundChatIds:n}},(e,t)=>Object(u.l)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"]))(({topUserIds:e,usersById:t,recentlyFoundChatIds:a,onReset:c,loadTopUsers:r,loadContactList:s,openChat:l,addRecentlyFoundChatId:o,clearRecentlyFoundChats:i})=>{const d=Object(n.q)(null);Object(n.n)(()=>{Ye(()=>{r(),s()})},[r,s]),Object(Ke.a)(d.current,!e);const u=Object(n.m)(e=>{l({id:e}),c(),setTimeout(()=>{o({id:e})},250)},[l,o,c]),h=Object(F.a)();return n.a.createElement("div",{className:"RecentContacts custom-scroll"},e&&n.a.createElement("div",{className:"top-peers-section",dir:h.isRtl?"rtl":void 0},n.a.createElement("div",{ref:d,className:"top-peers no-selection"},e.map(e=>n.a.createElement("div",{className:"top-peer-item",onClick:()=>u(e),dir:h.isRtl?"rtl":void 0},n.a.createElement(x.a,{user:t[e]}),n.a.createElement("div",{className:"top-peer-name"},Object(B.a)(Object(m.Z)(t[e])||" ")))))),a&&n.a.createElement("div",{className:"search-section pt-1"},n.a.createElement("h3",{className:"section-heading mt-0 recent-chats-header",dir:h.isRtl?"rtl":void 0},h("Recent"),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:i,isRtl:h.isRtl},n.a.createElement("i",{className:"icon-close"}))),a.map(e=>n.a.createElement(We,{chatId:e,onClick:u}))))})),Ze=a(133),Xe=a(27);a(266);var Je=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t);if(!a)return{};const n=Object(m.V)(a);return{chat:a,...n&&{privateChatUser:Object(d.Gb)(e,n)},lastSyncTime:e.lastSyncTime}},(e,t)=>Object(u.l)(t,["focusMessage"]))(({message:e,searchQuery:t,chatId:a,chat:c,privateChatUser:r,focusMessage:s,lastSyncTime:l})=>{const i=Object(m.F)(e),d=Object(v.a)(Object(m.E)(e,"micro")),u=Boolean(Object(m.J)(e)),h=Object(n.m)(()=>{s({chatId:a,messageId:e.id})},[a,s,e.id]),b=Object(F.a)(),g=Ve(h);if(c)return n.a.createElement(Ee.a,{className:"ChatMessage chat-item-clickable",ripple:!o.g,onClick:h,buttonRef:g},n.a.createElement(x.a,{chat:c,user:r,withOnlineStatus:!0,isSavedMessages:r&&r.isSelf,lastSyncTime:l}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"info-row"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",{dir:"auto"},Object(B.a)(Object(m.l)(b,c,r))),c.isVerified&&n.a.createElement(Ze.a,null)),n.a.createElement("div",{className:"message-date"},n.a.createElement(Xe.a,{className:"date"},Object(D.g)(b,1e3*e.date)))),n.a.createElement("div",{className:"subtitle"},n.a.createElement("div",{className:"message",dir:"auto"},function(e,t,a,c,r){if(!a)return Object(B.a)(Object(m.O)(e,t));return n.a.createElement("span",{className:"media-preview"},n.a.createElement("img",{src:a,alt:"",className:r?"round":void 0}),Object(m.Q)(t)&&n.a.createElement("i",{className:"icon-play"}),Object(B.a)(Object(m.O)(e,t,!0),["emoji","highlight"],{highlight:c}))}(b,e,d||i,t,u)))))}));a(267);var et=Object(n.h)(({searchDate:e,onSelect:t})=>{const a=Object(n.p)(()=>function(e){if(e.match(/^\d{2,4}-\d{2}-\d{2}$/g)){const t=new Date(e);return[{date:t,text:Object(D.a)(t)}]}const t=[],a=new Date,n=a.getFullYear(),c=a.getTime()>new Date(`${n}-${e}`).getTime()?n:n-1;for(let a=0;a<8;a++){const n=new Date(`${c-a}-${e}`);t.push({date:n,text:Object(D.a)(n)})}return t}(e),[e]);return n.a.createElement("section",{className:"DateSuggest custom-scroll custom-scroll-x"},a.map(({date:e,text:a})=>n.a.createElement("div",{onClick:()=>t(e),className:"date-item",key:a},n.a.createElement("i",{className:"icon-calendar"}),n.a.createElement("span",null,a))))}),tt=a(118),at=a(141);const nt=Object(V.g)(e=>e(),500,!0);var ct=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{byId:a}=e.users,{userIds:n}=e.contactList||{};if(!n)return{chatsById:t,usersById:a};const{currentUserId:c,messages:r,lastSyncTime:s}=e,{fetchingStatus:l,globalResults:o,localResults:i,resultsByType:d}=e.globalSearch,{chatIds:m,userIds:u}=o||{},{chatIds:h,userIds:b}=i||{},{byChatId:g}=r,{foundIds:p}=d&&d.text||{};return{currentUserId:c,localContactIds:n,localChatIds:h,localUserIds:b,globalChatIds:m,globalUserIds:u,foundIds:p,globalMessagesByChatId:g,chatsById:t,usersById:a,fetchingStatus:l,lastSyncTime:s}},(e,t)=>Object(u.l)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"]))(({searchQuery:e,searchDate:t,dateSearchQuery:a,currentUserId:c,localContactIds:r,localChatIds:l,localUserIds:i,globalChatIds:d,globalUserIds:h,foundIds:b,globalMessagesByChatId:g,chatsById:p,usersById:v,fetchingStatus:E,lastSyncTime:O,onReset:f,onSearchDateSelect:j,openChat:C,addRecentlyFoundChatId:y,searchMessagesGlobal:k,setGlobalSearchChatId:N})=>{const I=Object(F.a)(),[S,w]=Object(n.r)(!1),[P,M]=Object(n.r)(!1),L=Object(n.m)(({direction:t})=>{O&&t===s.e.Backwards&&nt(()=>{k({type:"text",query:e})})},[O,k,e]),A=Object(n.m)(e=>{C({id:e}),e!==c&&y({id:e}),o.g||f()},[c,C,y,f]),T=Object(n.m)(e=>{N({id:e})},[N]),R=Object(n.p)(()=>{if(!e||e.startsWith("@")&&e.length<2)return He.a;const t=r?r.filter(t=>{const a=v[t];if(!a)return!1;const n=Object(m.ab)(a);return n&&Object(me.a)(n,e)||Object(me.a)(a.username,e)}):[];return[...c&&Object(me.a)(I("SavedMessages"),e)?[c]:[],...Object(m.Eb)(Object(u.o)([...t,...l||[],...i||[]]),p)]},[e,r,c,I,l,i,p,v]),D=Object(n.p)(()=>!e||e.length<4||!d||!h?He.a:Object(m.Eb)(Object(u.o)([...d,...h]),p,!0),[p,d,h,e]),B=Object(n.p)(()=>(e||t)&&b&&0!==b.length?b.map(e=>{const[t,a]=e.split("_").map(Number);return g&&g[t]&&g[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):He.a,[b,g,e,t]),x=Object(n.m)(()=>{w(!S)},[S]),U=Object(n.m)(()=>{M(!P)},[P]);const G=E&&!E.chats&&!E.messages&&!R.length&&!D.length&&!B.length;return e||t?n.a.createElement(ve.a,{className:"LeftSearch custom-scroll",items:B,onLoadMore:L,noScrollRestoreOnTop:!0,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(et,{searchDate:a,onSelect:j})),G&&n.a.createElement(tt.a,{text:I("ChatList.Search.NoResults"),description:I("ChatList.Search.NoResultsDescription")}),!!R.length&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar",dir:I.isRtl?"rtl":void 0},R.map(e=>n.a.createElement(at.a,{chatOrUserId:e,onClick:T,clickArg:e}))),!!R.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:I.isRtl?"auto":void 0},R.length>3&&n.a.createElement(Xe.a,{onClick:x},I(S?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),I("DialogList.SearchSectionDialogs")),R.map((e,t)=>{if(S||!(t>=3))return n.a.createElement(We,{chatId:e,onClick:A})})),!!D.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:I.isRtl?"auto":void 0},D.length>3&&n.a.createElement(Xe.a,{onClick:U},I(P?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),I("DialogList.SearchSectionGlobal")),D.map((e,t)=>{if(P||!(t>=3))return n.a.createElement(We,{chatId:e,withUsername:!0,onClick:A})})),!!B.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:I.isRtl?"auto":void 0},I("SearchMessages")),B.map((function(t){const a=Object(m.O)(I,t),c=p[t.chatId];if(a&&c)return n.a.createElement(Je,{chatId:t.chatId,message:t,searchQuery:e})})))):n.a.createElement(Qe,{onReset:f})}));const rt=Object(V.g)(e=>e(),500,!0);var st=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{currentUserId:a,messages:{byChatId:n},lastSyncTime:c}=e,{fetchingStatus:r,resultsByType:s}=e.globalSearch,{foundIds:l}=s&&s.text||{};return{currentUserId:a,foundIds:l,globalMessagesByChatId:n,chatsById:t,fetchingStatus:r,lastSyncTime:c}},(e,t)=>Object(u.l)(t,["searchMessagesGlobal"]))(({searchQuery:e,currentUserId:t,dateSearchQuery:a,foundIds:c,globalMessagesByChatId:r,chatsById:l,fetchingStatus:o,lastSyncTime:i,searchMessagesGlobal:d,onSearchDateSelect:u})=>{const h=Object(F.a)(),b=Object(n.m)(({direction:a})=>{i&&a===s.e.Backwards&&rt(()=>{d({type:"text",query:e,chatId:t})})},[t,i,d,e]),g=Object(n.p)(()=>c&&0!==c.length?c.map(e=>{const[t,a]=e.split("_").map(Number);return r&&r[t]&&r[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):He.a,[c,r]);const p=o&&!o.chats&&!o.messages&&!g.length;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content custom-scroll chat-list",items:g,onLoadMore:b,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(et,{searchDate:a,onSelect:u})),p&&n.a.createElement(tt.a,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),!!g.length&&g.map((function(t){const a=Object(m.O)(h,t),c=l[t.chatId];if(a&&c)return n.a.createElement(Je,{chatId:t.chatId,message:t,searchQuery:e})}))))}));function lt(e){return(t,a)=>{const{byId:n}=t.chats,{byId:c}=t.users,{fetchingStatus:r,resultsByType:s,chatId:l}=t.globalSearch,o="audio"!==e?e:a&&a.isVoice?"voice":"audio",{byChatId:i}=t.messages,{foundIds:d}=s&&s[o]||{};return{isLoading:void 0===d||!!r&&Boolean(r.chats||r.messages),chatsById:n,usersById:c,globalMessagesByChatId:i,foundIds:d,searchChatId:l,lastSyncTime:t.lastSyncTime}}}var ot=a(119),it=a(165);const dt=Object(V.g)(e=>e(),500,!0);var mt=Object(n.h)(Object(c.h)(lt("media"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","openMediaViewer"]))(({searchQuery:e,searchChatId:t,isLoading:a,globalMessagesByChatId:c,foundIds:r,lastSyncTime:o,searchMessagesGlobal:i,openMediaViewer:d})=>{const m=Object(F.a)(),u=Object(n.m)(({direction:a})=>{o&&a===s.e.Backwards&&dt(()=>{i({type:"media",query:e,chatId:t})})},[o,i,e,t]),h=Object(n.p)(()=>r&&c?r.map(e=>{const[t,a]=e.split("_").map(Number);return c[t]&&c[t].byId[a]}).filter(Boolean):He.a,[c,r]),b=Object(n.m)((e,t)=>{d({chatId:t,messageId:e,origin:s.h.SearchResult})},[d]);const g=Object(ot.a)([e],l.pb)&&!a,p=g&&r&&r.length>0&&!e,v=g&&r&&r.length>0&&e,E=Object(ce.a)("search-content custom-scroll",v&&"chat-list");return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:E,items:h,itemSelector:e?".ListItem":".Media",onLoadMore:u,noFastList:!0},!g&&n.a.createElement(be.a,null),g&&(!r||0===r.length)&&n.a.createElement(tt.a,{text:m("ChatList.Search.NoResults"),description:m("ChatList.Search.NoResultsDescription")}),p&&n.a.createElement("div",{className:"media-list",dir:m.isRtl?"rtl":void 0},h.map(e=>n.a.createElement(it.a,{key:e.id,idPrefix:"search-media",message:e,onClick:b}))),v&&h.map(e=>n.a.createElement(Je,{key:e.id,chatId:e.chatId,message:e}))))}));function ut(e,t,a,n){const{senderId:c}=t;if(!c)return;const r=Object(m.mb)(c)?n[c]:a[c];let s=Object(m.W)(e,r);const l=a[t.chatId];return l&&(Object(m.mb)(c)&&r.isSelf?s=`${e("FromYou")} → ${Object(m.l)(e,l)}`:Object(m.lb)(l)&&(s+=" → "+Object(m.l)(e,l))),s}var ht=a(186);const bt=Object(V.g)(e=>e(),500,!0);var gt=Object(n.h)(Object(c.h)(lt("links"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:u})=>{const h=Object(F.a)(),b=Object(n.m)(({direction:a})=>{d&&a===s.e.Backwards&&bt(()=>{m({type:"links",query:e,chatId:t})})},[d,m,e,t]),g=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number);return o[t]&&o[t].byId[a]}).filter(Boolean):He.a,[o,i]),p=Object(n.m)((e,t)=>{u({chatId:t,messageId:e})},[u]);const v=Object(ot.a)([e],l.pb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content documents-list custom-scroll",items:g,onLoadMore:b,noFastList:!0},!v&&n.a.createElement(be.a,null),v&&(!i||0===i.length)&&n.a.createElement(tt.a,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),v&&i&&i.length>0&&g.map((e,t)=>{const a=0===t||Object(D.n)(e.date)!==Object(D.n)(g[t-1].date);return n.a.createElement("div",{className:"ListItem",dir:h.isRtl?"rtl":void 0,key:e.id},a&&n.a.createElement("p",{className:"section-heading",dir:h.isRtl?"rtl":void 0},Object(D.f)(h,new Date(1e3*e.date))),n.a.createElement(ht.a,{key:e.id,message:e,senderTitle:ut(h,e,c,r),onMessageClick:p}))})))})),pt=a(160);const vt=Object(V.g)(e=>e(),500,!0);var Et=Object(n.h)(Object(c.h)(lt("documents"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:r,globalMessagesByChatId:o,foundIds:i,lastSyncTime:d,searchMessagesGlobal:u,focusMessage:h})=>{const b=Object(F.a)(),g=Object(n.m)(({direction:a})=>{d&&a===s.e.Backwards&&vt(()=>{u({type:"documents",query:e,chatId:t})})},[d,u,e,t]),p=Object(n.p)(()=>i&&o?i.map(e=>{const[t,a]=e.split("_").map(Number),n=o[t]&&o[t].byId[a];return n&&Object(m.z)(n)?n:void 0}).filter(Boolean):He.a,[o,i]),v=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]);const E=Object(ot.a)([e],l.pb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:g,noFastList:!0},!E&&n.a.createElement(be.a,null),E&&(!i||0===i.length)&&n.a.createElement(tt.a,{text:b("ChatList.Search.NoResults"),description:b("ChatList.Search.NoResultsDescription")}),E&&i&&i.length>0&&p.map((e,t)=>{const a=0===t||Object(D.n)(e.date)!==Object(D.n)(p[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(D.f)(b,new Date(1e3*e.date))),n.a.createElement(pt.a,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:ut(b,e,c,r),className:"scroll-item",onDateClick:v}))})))})),Ot=a(167);const ft=Object(V.g)(e=>e(),500,!0);var jt=Object(n.h)(Object(c.h)(lt("audio"),(e,t)=>Object(u.l)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"]))(({isVoice:e,searchQuery:t,searchChatId:a,isLoading:c,chatsById:r,usersById:o,globalMessagesByChatId:i,foundIds:d,lastSyncTime:m,searchMessagesGlobal:u,focusMessage:h,openAudioPlayer:b})=>{const g=Object(F.a)(),p=e?"voice":"audio",v=Object(n.m)(({direction:e})=>{m&&e===s.e.Backwards&&ft(()=>{u({type:p,query:t,chatId:a})})},[p,m,u,t,a]),E=Object(n.p)(()=>d&&i?d.map(e=>{const[t,a]=e.split("_").map(Number);return i[t]&&i[t].byId[a]}).filter(Boolean):He.a,[i,d]),O=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]),f=Object(n.m)((e,t)=>{b({chatId:t,messageId:e})},[b]);const j=Object(ot.a)([t],l.pb)&&!c;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(ve.a,{className:"search-content documents-list custom-scroll",items:E,onLoadMore:v,noFastList:!0},!j&&n.a.createElement(be.a,null),j&&(!d||0===d.length)&&n.a.createElement(tt.a,{text:g("ChatList.Search.NoResults"),description:g("ChatList.Search.NoResultsDescription")}),j&&d&&d.length>0&&E.map((e,t)=>{const a=0===t||Object(D.n)(e.date)!==Object(D.n)(E[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading",dir:g.isRtl?"rtl":void 0},Object(D.f)(g,new Date(1e3*e.date))),n.a.createElement(Ot.a,{key:e.id,message:e,renderingFor:"searchResult",senderTitle:ut(g,e,r,o),date:e.date,lastSyncTime:m,className:"scroll-item",onPlay:f,onDateClick:O}))})))}));a(268);const Ct=[{type:s.c.ChatList,title:"SearchAllChatsShort"},{type:s.c.Media,title:"SharedMediaTab2"},{type:s.c.Links,title:"SharedLinksTab2"},{type:s.c.Files,title:"SharedFilesTab2"},{type:s.c.Music,title:"SharedMusicTab2"},{type:s.c.Voice,title:"SharedVoiceTab2"}],yt=[{type:s.c.ChatList,title:"All Messages"},...Ct.slice(1)],kt=Object.keys(s.c).length/2;var Nt=Object(n.h)(Object(c.h)(e=>{const{currentContent:t,chatId:a}=e.globalSearch;return{currentContent:t,chatId:a}},(e,t)=>Object(u.l)(t,["setGlobalSearchContent","setGlobalSearchDate"]))(({searchQuery:e,searchDate:t,isActive:a,currentContent:c=s.c.ChatList,chatId:r,setGlobalSearchContent:l,setGlobalSearchDate:o,onReset:i})=>{const d=Object(F.a)(),[m,u]=Object(n.r)(0),h=Object(n.p)(()=>Object(D.l)(e),[e]),b=Object(n.m)(e=>{const t=Ct[e];l({content:t.type}),u(e)},[l]),g=Object(n.m)(e=>{o({date:e.getTime()/1e3})},[o]),p=Object(n.q)(null),v=Object(he.a)(p,a,void 0,".ListItem-button",!0);return n.a.createElement("div",{className:"LeftSearch",ref:p,onKeyDown:v},n.a.createElement(ze.a,{activeTab:m,tabs:r?yt:Ct,onSwitchTab:b}),n.a.createElement(T.a,{name:d.isRtl?"slide-reversed":"slide",renderCount:kt,activeKey:c},()=>{switch(c){case s.c.ChatList:return r?n.a.createElement(st,{searchQuery:e,dateSearchQuery:h,onReset:i,onSearchDateSelect:g}):n.a.createElement(ct,{searchQuery:e,searchDate:t,dateSearchQuery:h,onReset:i,onSearchDateSelect:g});case s.c.Media:return n.a.createElement(mt,{searchQuery:e});case s.c.Links:return n.a.createElement(gt,{searchQuery:e});case s.c.Files:return n.a.createElement(Et,{searchQuery:e});case s.c.Music:return n.a.createElement(jt,{key:"audio",searchQuery:e});case s.c.Voice:return n.a.createElement(jt,{key:"voice",isVoice:!0,searchQuery:e});default:return}}))}));function It(e,t){const a=Object(n.q)(e),[c,r]=Object(n.r)(t);return[c,Object(n.m)(e=>{r(t=>a.current(t,e))},[])]}const St=[{icon:"user",title:"FilterContacts",key:"contacts"},{icon:"non-contacts",title:"FilterNonContacts",key:"nonContacts"},{icon:"group",title:"FilterGroups",key:"groups"},{icon:"channel",title:"FilterChannels",key:"channels"},{icon:"bots",title:"FilterBots",key:"bots"}],wt=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],Pt=["includedChatIds","bots","channels","groups","contacts","nonContacts"],Mt=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function Ft(e,t,a){let n=[],c=[];if("included"===t){const{includedChatIds:t,...r}=a?e.includeFilters||{}:Object(u.l)(e.folder,Pt);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}else{const{excludedChatIds:t,...r}=a?e.excludeFilters||{}:Object(u.l)(e.folder,Mt);n=t||[],c=Object.keys(r).filter(e=>Boolean(r[e]))}return{selectedChatIds:n,selectedChatTypes:c}}function Lt(e){if(e){const{includedChatIds:t,...a}=e;if(Object.values(a).filter(Boolean).length>1||t&&t.length)return"";if(a.bots)return"Bots";if(a.groups)return"Groups";if(a.channels)return"Channels";if(a.contacts)return"Contacts";if(a.nonContacts)return"Non-Contacts"}return""}const At={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},Tt=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:Object(u.l)(e.folder,Pt)};case"editExcludeFilters":return{...e,excludeFilters:Object(u.l)(e.folder,Mt)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...Object(u.j)(e.folder,Pt),title:e.folder.title?e.folder.title:Lt(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...Object(u.j)(e.folder,Mt),...e.excludeFilters},excludeFilters:void 0,chatFilter:"",isTouched:!0}:e;case"editFolder":{const{id:e,description:a,...n}=t.payload;return{mode:"edit",folderId:e,folder:n,chatFilter:""}}case"setChatFilter":return{...e,chatFilter:t.payload};case"setIsLoading":return{...e,isLoading:t.payload};case"setError":return{...e,error:t.payload};case"reset":return At;default:return e}};const Rt={currentPassword:"",password:"",hint:"",email:""},Dt=(e,t)=>{switch(t.type){case"setCurrentPassword":return{...e,currentPassword:t.payload};case"setPassword":return{...e,password:t.payload};case"setHint":return{...e,hint:t.payload};case"setEmail":return{...e,email:t.payload};case"reset":return Rt;default:return e}};var Bt=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(u.l)(t,["signOut","deleteChatFolder"]))(({currentScreen:e,editedFolderId:t,onReset:a,onSaveFilter:c,signOut:r,deleteChatFolder:l})=>{const[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),h=Object(n.m)(()=>{d(!0)},[]),b=Object(n.m)(()=>{d(!1)},[]),g=Object(n.m)(()=>{u(!0)},[]),p=Object(n.m)(()=>{u(!1)},[]),v=Object(n.m)(()=>{b(),r()},[b,r]),E=Object(n.m)(()=>{p(),l({id:t}),a()},[t,p,l,a]),O=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(R.a,{round:!0,ripple:!o.g,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]),f=Object(F.a)();return n.a.createElement("div",{className:"left-header"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:a,ariaLabel:f("AccDescrGoBack")},n.a.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case s.m.EditProfile:return n.a.createElement("h3",null,f("lng_settings_information"));case s.m.General:return n.a.createElement("h3",null,f("General"));case s.m.Notifications:return n.a.createElement("h3",null,f("Notifications"));case s.m.Privacy:return n.a.createElement("h3",null,f("PrivacySettings"));case s.m.Language:return n.a.createElement("h3",null,f("Language"));case s.m.GeneralChatBackground:return n.a.createElement("h3",null,f("ChatBackground"));case s.m.GeneralChatBackgroundColor:return n.a.createElement("h3",null,f("SetColor"));case s.m.PrivacyPhoneNumber:return n.a.createElement("h3",null,f("PrivacyPhone"));case s.m.PrivacyLastSeen:return n.a.createElement("h3",null,f("PrivacyLastSeen"));case s.m.PrivacyProfilePhoto:return n.a.createElement("h3",null,f("Privacy.ProfilePhoto"));case s.m.PrivacyForwarding:return n.a.createElement("h3",null,f("PrivacyForwards"));case s.m.PrivacyGroupChats:return n.a.createElement("h3",null,f("AutodownloadGroupChats"));case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement("h3",null,f("AlwaysShareWith"));case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement("h3",null,f("NeverShareWith"));case s.m.PrivacyActiveSessions:return n.a.createElement("h3",null,f("SessionsTitle"));case s.m.PrivacyBlockedUsers:return n.a.createElement("h3",null,f("BlockedUsers"));case s.m.TwoFaDisabled:case s.m.TwoFaEnabled:return n.a.createElement("h3",null,f("TwoStepVerification"));case s.m.TwoFaNewPassword:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:return n.a.createElement("h3",null,f("EnterPassword"));case s.m.TwoFaNewPasswordConfirm:return n.a.createElement("h3",null,f("PleaseReEnterPassword"));case s.m.TwoFaNewPasswordHint:case s.m.TwoFaChangePasswordHint:return n.a.createElement("h3",null,f("PasswordHint"));case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaRecoveryEmail:return n.a.createElement("h3",null,f("RecoveryEmailTitle"));case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement("h3",null,"Recovery Email Code");case s.m.TwoFaCongratulations:return n.a.createElement("h3",null,f("TwoStepVerificationPasswordSet"));case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement("h3",null,f("PleaseEnterCurrentPassword"));case s.m.Folders:return n.a.createElement("h3",null,f("Filters"));case s.m.FoldersCreateFolder:return n.a.createElement("h3",null,f("FilterNew"));case s.m.FoldersEditFolder:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,f("FilterEdit")),t&&n.a.createElement(G.a,{className:"settings-more-menu",trigger:O,positionX:"right"},n.a.createElement(q.a,{icon:"delete",destructive:!0,onClick:g},"Delete Folder")));case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement("div",{className:"settings-main-header"},e===s.m.FoldersIncludedChats?n.a.createElement("h3",null,f("FilterInclude")):n.a.createElement("h3",null,f("FilterExclude")),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:c,ariaLabel:f("AutoDeleteConfirm")},n.a.createElement("i",{className:"icon-check"})));default:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,f("SETTINGS")),n.a.createElement(G.a,{className:"settings-more-menu",trigger:O,positionX:"right"},n.a.createElement(q.a,{icon:"logout",onClick:h},f("LogOutTitle"))))}}(),n.a.createElement(we.a,{isOpen:i,onClose:b,text:"Are you sure you want to log out?",confirmLabel:"Log Out",confirmHandler:v,confirmIsDestructive:!0}),n.a.createElement(we.a,{isOpen:m,onClose:p,text:"Are you sure you want to delete this folder?",confirmLabel:"Delete",confirmHandler:E,confirmIsDestructive:!0}))})),xt=a(18);var Ut=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e;return{currentUser:t?Object(d.Gb)(e,t):void 0}})(({onScreenSelect:e,currentUser:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-main-menu"},t&&n.a.createElement("div",{className:"settings-current-user"},n.a.createElement(x.a,{user:t,size:"jumbo"}),n.a.createElement("p",{className:"name"},Object(m.ab)(t)),n.a.createElement("p",{className:"phone"},Object(xt.c)(t.phoneNumber))),n.a.createElement(Ee.a,{icon:"edit",onClick:()=>e(s.m.EditProfile)},a("lng_settings_information")),n.a.createElement(Ee.a,{icon:"folder",onClick:()=>e(s.m.Folders)},a("Filters")),n.a.createElement(Ee.a,{icon:"settings",onClick:()=>e(s.m.General)},a("Telegram.GeneralSettingsViewController")),n.a.createElement(Ee.a,{icon:"unmute",onClick:()=>e(s.m.Notifications)},a("Notifications")),n.a.createElement(Ee.a,{icon:"lock",onClick:()=>e(s.m.Privacy)},a("PrivacySettings")),n.a.createElement(Ee.a,{icon:"language",onClick:()=>e(s.m.Language)},a("Language"))))})),Gt=a(130);a(269);var qt=({isShown:e,className:t,color:a="primary",ariaLabel:c,disabled:r,onClick:s,children:l})=>{const o=Object(ce.a)("FloatingActionButton",e&&"revealed",t);return n.a.createElement(R.a,{className:o,color:a,round:!0,disabled:r,onClick:e&&!r?s:void 0,ariaLabel:c,tabIndex:-1},l)};const zt=/https:\/\/t\.me\/?/i,Ht=/^([a-zA-Z0-9_]+)$/,$t=Object(V.a)(e=>e(),250,!1);var Vt=Object(n.h)(({currentUsername:e,asLink:t,isLoading:a,isUsernameAvailable:c,checkUsername:r,onChange:s})=>{const[l,o]=Object(n.r)(e||""),i=Object(F.a)(),d=t?"SetUrl":"Username",m=i(t?"SetUrlPlaceholder":"Username"),[u,h]=Object(n.p)(()=>l.length?l.length<5?[void 0,m+" is too short"]:l.length>32?[void 0,m+" is too long"]:Ht.test(l)?void 0===c?[]:[c?i(d+"Available","Username"):void 0,!1===c?i(d+"InUse"):void 0]:[void 0,m+" contains invalid characters"]:[],[l,c,i,d,m]);Object(n.n)(()=>{o(e||"")},[t,e]);const b=Object(n.m)(e=>{const a=e.target.value.trim().replace(zt,"");o(a),e.target.value=`${t?"https://t.me/":""}${a}`;const n=function(e){return e.length>=5&&e.length<=32&&Ht.test(e)}(a);n&&$t(()=>{r({username:a})}),s&&s(!!n&&a)},[t,r,s]);return n.a.createElement(pe.a,{value:`${t?"https://t.me/":""}${l}`,onChange:b,label:m,error:h,success:u,readOnly:a})});const _t=Object(V.g)(e=>e(),6e4,!0);var Wt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e,{progress:a,isUsernameAvailable:n}=e.profileEdit||{},c=t?Object(d.Gb)(e,t):void 0;if(!c)return{progress:a,isUsernameAvailable:n};const{firstName:r,lastName:s,username:l,fullInfo:o}=c,{bio:i}=o||{};return{currentAvatarHash:Object(m.f)(c),currentFirstName:r,currentLastName:s,currentBio:i,currentUsername:l,progress:a,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["loadCurrentUser","updateProfile","checkUsername"]))(({currentAvatarHash:e,currentFirstName:t,currentLastName:a,currentBio:c,currentUsername:l,progress:o,isUsernameAvailable:i,loadCurrentUser:d,updateProfile:m,checkUsername:u})=>{const[h,b]=Object(n.r)(!1),[g,p]=Object(n.r)(!1),[E,O]=Object(n.r)(),[f,j]=Object(n.r)(),[C,y]=Object(n.r)(t||""),[k,N]=Object(n.r)(a||""),[I,S]=Object(n.r)(c||""),[w,P]=Object(n.r)(l||""),M=Object(v.a)(e,!1,r.ApiMediaFormat.BlobUrl),A=o===s.j.InProgress,T=!1===w,R=Object(n.p)(()=>!T&&(Boolean(f)||g||!0===i),[f,g,T,i]);Object(n.n)(()=>{_t(()=>{d()})},[d]),Object(n.n)(()=>{j(void 0)},[M]),Object(n.n)(()=>{y(t||""),N(a||""),S(c||"")},[t,a,c]),Object(n.n)(()=>{P(l||"")},[l]),Object(n.n)(()=>{o===s.j.Complete&&(p(!1),b(!1),O(void 0))},[o]);const D=Object(n.m)(e=>{j(e)},[]),x=Object(n.m)(e=>{y(e.target.value),p(!0)},[]),U=Object(n.m)(e=>{N(e.target.value),p(!0)},[]),G=Object(n.m)(e=>{S(e.target.value),p(!0)},[]),q=Object(n.m)(e=>{P(e),b(!0)},[]),z=Object(n.m)(()=>{const e=C.trim(),t=k.trim(),a=I.trim();e.length?a.length>70?O("Bio can' be longer than 70 characters"):m({photo:f,...g&&{firstName:e,lastName:t,bio:a},...h&&{username:w}}):O("Please provide your first name")},[f,C,k,I,g,w,h,m]),H=Object(F.a)();return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-edit-profile"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:M,onChange:D,title:"Edit your profile photo",disabled:A}),n.a.createElement(pe.a,{value:C,onChange:x,label:H("FirstName"),disabled:A,error:"Please provide your first name"===E?E:void 0}),n.a.createElement(pe.a,{value:k,onChange:U,label:H("LastName"),disabled:A}),n.a.createElement(pe.a,{value:I,onChange:G,label:H("UserBio"),disabled:A,error:"Bio can' be longer than 70 characters"===E?E:void 0}),n.a.createElement("p",{className:"settings-item-description",dir:H.isRtl?"rtl":void 0},Object(B.a)(H("lng_settings_about_bio"),["br","simple_markdown"]))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:H.isRtl?"rtl":void 0},H("Username")),n.a.createElement(Vt,{currentUsername:w||"",isLoading:A,isUsernameAvailable:i,checkUsername:u,onChange:q}),n.a.createElement("p",{className:"settings-item-description",dir:H.isRtl?"rtl":void 0},Object(B.a)(H("UsernameHelp"),["br","simple_markdown"])),w&&n.a.createElement("p",{className:"settings-item-description",dir:H.isRtl?"rtl":void 0},H("lng_username_link"),n.a.createElement("br",null),n.a.createElement("span",{className:"username-link"},"https://t.me/",w)))),n.a.createElement(qt,{isShown:R,onClick:z,disabled:A,ariaLabel:"Save changes"},A?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),Kt=a(125),Yt=a(116);const Qt=Object(V.g)(e=>e(),6e4,!0);var Zt=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a}}=e,{orderedIds:n,byId:c,recommended:r}=e.chatFolders;return{chatsById:t,usersById:a,orderedFolderIds:n,foldersById:c,recommendedChatFolders:r,notifySettings:Object(d.eb)(e),notifyExceptions:Object(d.db)(e)}},(e,t)=>Object(u.l)(t,["loadRecommendedChatFolders","addChatFolder","showError"]))(({onCreateFolder:e,onEditFolder:t,chatsById:a,usersById:c,orderedFolderIds:r,foldersById:s,recommendedChatFolders:o,notifySettings:i,notifyExceptions:d,loadRecommendedChatFolders:u,addChatFolder:h,showError:b})=>{const[g,p]=Object(n.r)(),[v,E]=Object(n.r)(!1),O=Object(n.m)(()=>E(!0),[]);Object(n.n)(()=>{g||Object(Kt.a)("FoldersAll").then(p)},[g]),Object(n.n)(()=>{Qt(()=>{u()})},[u]);const f=Object(n.m)(()=>{Object.keys(s).length>=10?b({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):e()},[s,b,e]),j=Object(F.a)(),C=Object(n.p)(()=>{if(!r)return;const e=Object.keys(a).map(Number);return r.map(t=>{const n=s[t];return{id:n.id,title:n.title,subtitle:Object(m.o)(j,a,c,n,e,i,d)}})},[r,a,s,c,i,d,j]),y=Object(n.m)(e=>{Object.keys(s).length>=10?b({error:{message:"DIALOG_FILTERS_TOO_MUCH"}}):h({folder:e})},[s,h,b]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},g&&n.a.createElement(Yt.a,{id:"settingsFoldersMain",size:l.tb,animationData:g,play:v,noLoop:!0,onLoad:O})),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},j("CreateNewFilterInfo")),n.a.createElement(R.a,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:f,isRtl:j.isRtl},n.a.createElement("i",{className:"icon-add"}),j("CreateNewFilter"))),n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:j.isRtl?"rtl":void 0},j("Filters")),C&&C.length?C.map(e=>n.a.createElement(Ee.a,{className:"mb-2",narrow:!0,multiline:!0,onClick:()=>t(s[e.id])},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.subtitle))):C&&!C.length?n.a.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):n.a.createElement(be.a,null)),o&&!!o.length&&n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:j.isRtl?"rtl":void 0},j("FilterRecommended")),o.map(e=>n.a.createElement(Ee.a,{className:"mb-2",narrow:!0,onClick:()=>y(e)},n.a.createElement("div",{className:"settings-folders-recommended-item"},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.description)),n.a.createElement(R.a,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:j.isRtl},j("Add")))))))}));a(270);var Xt=({count:e,itemName:t,itemPluralName:a,isLoading:c,onClick:r})=>{const s=Object(F.a)();return n.a.createElement(R.a,{className:"ShowMoreButton",color:"translucent",size:"smaller",isText:!0,isLoading:c,isRtl:s.isRtl,onClick:r},n.a.createElement("i",{className:"icon-down"}),"Show ",e," more ",e>1?a||t+"s":t)};const Jt="Please provide a title for this folder.",ea="Please select at least one chat for this folder.";var ta=Object(n.h)(Object(c.h)(e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}},(e,t)=>Object(u.l)(t,["editChatFolder","addChatFolder","loadMoreChats"]))(({state:e,dispatch:t,onAddIncludedChats:a,onAddExcludedChats:c,onReset:r,loadedActiveChatIds:s,loadedArchivedChatIds:o,editChatFolder:i,addChatFolder:d,loadMoreChats:h})=>{const[b,g]=Object(n.r)(),[p,v]=Object(n.r)(!1),E=Object(n.m)(()=>v(!0),[]),[O,f]=Object(n.r)(!1),[j,C]=Object(n.r)(!1),{selectedChatIds:y,selectedChatTypes:k}=Ft(e,"included"),{selectedChatIds:N,selectedChatTypes:I}=Ft(e,"excluded");Object(n.n)(()=>{b||Object(Kt.a)("FoldersNew").then(g)},[b]),Object(n.n)(()=>{f(!1),C(!1)},[e.folderId]);const[S,w]=Object(n.p)(()=>{const e=new Set([...s||[],...o||[]]),t=Object(u.f)(y,e),a=Object(u.f)(N,e);return[O?t:t.slice(0,5-k.length),j?a:a.slice(0,5-I.length)]},[N,y,k,I,j,O,s,o]);Object(n.n)(()=>{(S.lengthf(!0):()=>C(!0);return n.a.createElement(n.a.Fragment,null,t.map(t=>function(e,t){const a="included"===t?St.find(({key:t})=>t===e):wt.find(({key:t})=>t===e);if(a)return n.a.createElement(Ee.a,{key:a.key,className:"settings-folders-list-item mb-1",icon:a.icon,narrow:!0,inactive:!0},P(a.title))}(t,e)),a.map(e=>n.a.createElement(Ee.a,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},Object(m.mb)(e)?n.a.createElement(Oe.a,{avatarSize:"small",userId:e}):n.a.createElement(fe.a,{avatarSize:"small",chatId:e}))),!c&&r>0&&n.a.createElement(Xt,{count:r,itemName:"chat",onClick:s}))}return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},b&&n.a.createElement(Yt.a,{id:"settingsFoldersEdit",size:l.tb,animationData:b,play:p&&String(e.folderId),noLoop:!0,onLoad:E})),"create"===e.mode&&n.a.createElement("p",{className:"settings-item-description mb-3",dir:P.isRtl?"rtl":void 0},P("FilterIncludeInfo")),n.a.createElement(pe.a,{className:"mb-0",label:P("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:a}=e;t({type:"setTitle",payload:a.value.trim()})},error:e.error&&e.error===Jt?Jt:void 0})),n.a.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===ea&&n.a.createElement("p",{className:"settings-item-description color-danger mb-2",dir:P.isRtl?"rtl":void 0},e.error),n.a.createElement("h4",{className:"settings-item-header mb-3",dir:P.isRtl?"rtl":void 0},P("FilterInclude")),n.a.createElement(Ee.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:a},P("FilterAddChats")),M("included")),n.a.createElement("div",{className:"settings-item no-border pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:P.isRtl?"rtl":void 0},P("FilterExclude")),n.a.createElement(Ee.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:c},P("FilterAddChats")),M("excluded"))),n.a.createElement(qt,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:a}=e.folder;a?y.length||Object.keys(k).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?i({id:e.folderId,folderUpdate:e.folder}):d({folder:e.folder}),setTimeout(()=>{r()},500)):t({type:"setError",payload:ea}):t({type:"setError",payload:Jt})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),aa=a(46);a(187),a(271);var na=Object(n.h)(({mode:e,chatIds:t,selectedIds:a,selectedChatTypes:c,filterValue:r,onSelectedIdsChange:s,onSelectedChatTypesChange:l,onFilterChange:o,onLoadMore:i})=>{const d=Object(n.q)(null),u="included"===e?St:wt,h=a.length+c.length>10,b=a.length>=100;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{d.current.focus()})},500)},[]);const g=Object(n.m)(e=>{const t=[...a];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),s(t)},[a,s]),p=Object(n.m)(e=>{const t=[...c];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),l(t)},[c,l]),v=Object(n.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]),E=Object(F.a)();const[O,f]=Object(ue.a)(i,t,Boolean(r));return n.a.createElement("div",{className:"Picker SettingsFoldersChatsPicker"},n.a.createElement("div",{className:"picker-header custom-scroll"},c.map((function(e){const t=u.find(({key:t})=>e===t);if(t)return n.a.createElement(at.a,{icon:t.icon,title:E(t.title),isMinimized:h,canClose:!0,onClick:p,clickArg:t.key})})),a.map((e,t)=>n.a.createElement(at.a,{chatOrUserId:e,isMinimized:h&&tp(e.key),ripple:!0},n.a.createElement("i",{className:"icon-"+e.icon}),n.a.createElement("h3",{className:"chat-type",dir:"auto"},E(e.title)),n.a.createElement(aa.a,{label:"",checked:c.includes(e.key),round:!0}))})),n.a.createElement("div",{key:"divider",className:"picker-list-divider"}),n.a.createElement("h4",{key:"header2",className:"settings-item-header",dir:E.isRtl?"rtl":void 0},E("FilterChats"))),O&&O.length?O.map((function(e){const t=a.includes(e);return n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>g(e),ripple:!0,disabled:!t&&b},Object(m.mb)(e)?n.a.createElement(Oe.a,{userId:e}):n.a.createElement(fe.a,{chatId:e,withChatType:!0}),n.a.createElement(aa.a,{label:"",checked:t,round:!0}))})):O&&!O.length?n.a.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):n.a.createElement(be.a,{key:"loading"})))});var ca=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a,orderedPinnedIds:n}}=e;return{chatsById:t,listIds:a.active,orderedPinnedIds:n.active,archivedPinnedIds:n.archived,archivedListIds:a.archived}},(e,t)=>Object(u.l)(t,["loadMoreChats"]))(({mode:e,state:t,dispatch:a,chatsById:c,listIds:r,orderedPinnedIds:s,archivedListIds:l,archivedPinnedIds:o,loadMoreChats:i})=>{const{chatFilter:d}=t,{selectedChatIds:u,selectedChatTypes:h}=Ft(t,e,!0),b=Object(F.a)(),g=Object(n.p)(()=>{const e=r?Object(m.Bb)(c,r,s,"all"):void 0,t=l?Object(m.Bb)(c,l,o,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[c,r,s,l,o]),p=Object(n.p)(()=>{if(g)return g.filter(e=>!d||Object(me.a)(Object(m.l)(b,e),d)||u.includes(e.id)).map(({id:e})=>e)},[g,d,b,u]),v=Object(n.m)(e=>{a({type:"setChatFilter",payload:e})},[a]),E=Object(n.m)(n=>{a("included"===e?{type:"setIncludeFilters",payload:{...t.includeFilters,includedChatIds:n}}:{type:"setExcludeFilters",payload:{...t.excludeFilters,excludedChatIds:n}})},[e,t,a]),O=Object(n.m)(t=>{const n={};t.forEach(e=>{n[e]=!0}),a("included"===e?{type:"setIncludeFilters",payload:{includedChatIds:u,...n}}:{type:"setExcludeFilters",payload:{excludedChatIds:u,...n}})},[e,u,a]);return p?n.a.createElement(na,{mode:e,chatIds:p,selectedIds:u,selectedChatTypes:h,filterValue:d,onSelectedIdsChange:E,onSelectedChatTypesChange:O,onFilterChange:v,onLoadMore:i}):n.a.createElement(be.a,null)}));a(272);var ra=Object(n.h)(({currentScreen:e,state:t,dispatch:a,onScreenSelect:c,onReset:r})=>{const l=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{a({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?r():"create"===t.mode?c(s.m.FoldersCreateFolder):c(s.m.FoldersEditFolder)},[t.mode,a,e,r,c]),o=Object(n.m)(()=>{a({type:"reset"}),c(s.m.FoldersCreateFolder)},[c,a]),i=Object(n.m)(e=>{a({type:"editFolder",payload:e}),c(s.m.FoldersEditFolder)},[a,c]),d=Object(n.m)(()=>{a({type:"editIncludeFilters"}),c(s.m.FoldersIncludedChats)},[a,c]),m=Object(n.m)(()=>{a({type:"editExcludeFilters"}),c(s.m.FoldersExcludedChats)},[a,c]);switch(e){case s.m.Folders:return n.a.createElement(Zt,{onCreateFolder:o,onEditFolder:i});case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:return n.a.createElement(ta,{state:t,dispatch:a,onAddIncludedChats:d,onAddExcludedChats:m,onReset:l});case s.m.FoldersIncludedChats:return n.a.createElement(ca,{mode:"included",state:t,dispatch:a});case s.m.FoldersExcludedChats:return n.a.createElement(ca,{mode:"excluded",state:t,dispatch:a});default:return}}),sa=a(107);a(273);var la=Object(n.h)(({options:e,range:t,label:a,value:c,disabled:r,onChange:s})=>{const l=Object(F.a)(),o=Object(n.m)(e=>{s(Number(e.currentTarget.value))},[s]),i=Object(ce.a)("RangeSlider",r&&"disabled"),d=Object(n.p)(()=>{if(e)return c/(e.length-1)*100;if(t){const e=(t.max-t.min)/(t.step||1);return(c-t.min)/e*100}return 0},[c,e,t]),[m,u,h]=Object(n.p)(()=>e?[0,e.length-1,1]:t?[t.min,t.max,t.step||1]:[0,0,0],[t,e]);return n.a.createElement("div",{className:i},a&&n.a.createElement("div",{className:"slider-top-row",dir:l.isRtl?"rtl":void 0},n.a.createElement("span",{className:"label",dir:"auto"},a),t&&n.a.createElement("span",{className:"value",dir:"auto"},c)),n.a.createElement("div",{className:"slider-main"},n.a.createElement("div",{className:"slider-fill-track",style:`width: ${d}%`}),n.a.createElement("input",{min:m,max:u,value:c,step:h,type:"range",onChange:o}),e&&n.a.createElement("div",{className:"slider-options"},e.map((e,t)=>n.a.createElement("div",{className:Object(ce.a)("slider-option no-selection",t===c&&"active"),onClick:()=>s(t)},e)))))}),oa=a(126),ia=a(114),da=a(49);var ma=Object(n.h)(({size:e=l.zb,stickerSet:t,observeIntersection:a})=>{const c=Object(n.q)(null),s=Object(sa.b)(c,a),o="stickerSet"+t.id,i=Object(v.a)(o,!s,r.ApiMediaFormat.Lottie),{shouldRenderFullMedia:d,transitionClassNames:m}=Object(ia.a)(i,"slow");return n.a.createElement("div",{ref:c,className:"sticker-set-cover"},!d&&Object(da.c)(t.title,2),d&&i&&n.a.createElement(Yt.a,{id:o,size:e,animationData:i,className:m}))});var ua=Object(n.h)(({stickerSet:e,observeIntersection:t})=>{const a=Object(n.q)(null),c=Object(sa.b)(a,t),r=Object(v.a)(e.hasThumbnail&&"stickerSet"+e.id,!c),{shouldRenderFullMedia:s,transitionClassNames:l}=Object(ia.a)(r,"slow");return n.a.createElement("div",{ref:a,className:"sticker-set-cover"},!s&&Object(da.c)(e.title,2),s&&n.a.createElement("img",{src:r,className:l,alt:""}))});a(274);var ha=Object(n.h)(({sticker:e,size:t,observeIntersection:a,noAnimate:c,title:s,className:l,onClick:o,clickArg:i,onUnfaveClick:d})=>{const m=Object(n.q)(null),u="sticker"+e.id,h="sticker-button-"+e.id,b=Object(sa.b)(m,a),g=e.thumbnail?e.thumbnail.dataUri:void 0,p=Object(v.a)(u+"?size=m",!b,r.ApiMediaFormat.BlobUrl),E=b&&!c,O=Object(v.a)(e.isAnimated&&u,!E,r.ApiMediaFormat.Lottie),[f,j,C]=Object(xe.a)(Boolean(O)),y=f&&E,{shouldRenderThumb:k,shouldRenderFullMedia:N,transitionClassNames:I}=Object(ia.a)(p||y,"slow");Object(n.n)(()=>{E||C()},[C,E]);const S=Object(ce.a)("StickerButton",e.isAnimated&&"animated",h,l),w=k&&g?`background-image: url('${g}');`:"";return n.a.createElement("div",{ref:m,className:S,title:s||e&&e.emoji,style:w,"data-sticker-id":e.id,onClick:function(){o&&o(i)}},N&&!y&&n.a.createElement("img",{src:p,className:I}),E&&O&&n.a.createElement(Yt.a,{id:u,animationData:O,play:!0,size:t,isLowPriority:!0,onLoad:j}),d&&n.a.createElement(R.a,{className:"sticker-unfave-button",color:"dark",round:!0,onClick:function(t){t.stopPropagation(),t.preventDefault(),d(e)}},n.a.createElement("i",{className:"icon-close"})))});a(275);var ba=Object(n.h)(({stickerSet:e,observeIntersection:t,onClick:a})=>{const c=Object(F.a)();if(!e||!e.stickers)return;const r=e.stickers&&e.stickers[0];return e.hasThumbnail||!r?n.a.createElement(Ee.a,{narrow:!0,className:"SettingsStickerSet",inactive:!r,onClick:()=>r&&a(r)},n.a.createElement(R.a,{ariaLabel:e.title,color:"translucent",isRtl:c.isRtl},e.isAnimated?n.a.createElement(ma,{size:l.ub,stickerSet:e,observeIntersection:t}):n.a.createElement(ua,{stickerSet:e,observeIntersection:t})),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},c("StickerPack.StickerCount",e.count,"i")))):n.a.createElement(Ee.a,{narrow:!0,className:"SettingsStickerSet",onClick:()=>a(r)},n.a.createElement(ha,{sticker:r,size:l.ub,title:e.title,observeIntersection:t}),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},c("StickerPack.StickerCount",e.count,"i"))))}),ga=a(161);const pa=["Solid and Steady","Nice and Fast","Lots of Stuff"];var va=Object(n.h)(Object(c.h)(e=>({...Object(u.l)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById}),(e,t)=>Object(u.l)(t,["setSettingOption","loadStickerSets","loadAddedStickers"]))(({onScreenSelect:e,stickerSetIds:t,stickerSetsById:a,messageTextSize:c,animationLevel:r,messageSendKeyCombo:l,shouldAutoDownloadMediaFromContacts:i,shouldAutoDownloadMediaInPrivateChats:d,shouldAutoDownloadMediaInGroups:m,shouldAutoDownloadMediaInChannels:u,shouldAutoPlayGifs:h,shouldAutoPlayVideos:b,shouldSuggestStickers:g,shouldLoopStickers:p,setSettingOption:v,loadStickerSets:E,loadAddedStickers:O})=>{const f=Object(n.q)(null),{observe:j}=Object(sa.a)({rootRef:f}),[C,y,k]=Object(xe.a)(),[N,I]=Object(n.r)(),S=Object(F.a)(),w=o.l?void 0:[{value:"enter",label:S("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:S(o.f?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}];Object(n.n)(()=>{E()},[E]),Object(n.n)(()=>{t&&t.length&&O()},[t,O]);const P=Object(n.m)(e=>{pa.forEach((t,a)=>{document.body.classList.toggle("animation-level-"+a,e===a)}),v({animationLevel:e})},[v]),M=Object(n.m)(e=>{document.documentElement.style.setProperty("--message-text-size",e+"px"),v({messageTextSize:e})},[v]),L=Object(n.m)(e=>{I(e),y()},[y]),A=t&&t.map(e=>!!(a&&a[e]&&a[e].installedDate)&&a[e]).filter(Boolean);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("SETTINGS")),n.a.createElement(la,{label:S("TextSize"),range:{min:12,max:20},value:c,onChange:M}),n.a.createElement(Ee.a,{icon:"photo",onClick:()=>e(s.m.GeneralChatBackground)},S("ChatBackground"))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},"Animation Level"),n.a.createElement("p",{className:"settings-item-description",dir:S.isRtl?"rtl":void 0},"Choose the desired animations amount."),n.a.createElement(la,{options:pa,value:r,onChange:P})),w&&n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("Keyboard")),n.a.createElement(oa.a,{name:"keyboard-send-settings",options:w,onChange:e=>v({messageSendKeyCombo:e}),selected:l})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AutoDownloadMedia")),n.a.createElement(aa.a,{label:S("Contacts"),checked:i,onCheck:e=>v({shouldAutoDownloadMediaFromContacts:e})}),n.a.createElement(aa.a,{label:S("AutodownloadPrivateChats"),checked:d,onCheck:e=>v({shouldAutoDownloadMediaInPrivateChats:e})}),n.a.createElement(aa.a,{label:S("AutodownloadGroupChats"),checked:m,onCheck:e=>v({shouldAutoDownloadMediaInGroups:e})}),n.a.createElement(aa.a,{label:S("FilterChannels"),checked:u,onCheck:e=>v({shouldAutoDownloadMediaInChannels:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AutoplayMedia")),n.a.createElement(aa.a,{label:S("GifsTab2"),checked:h,onCheck:e=>v({shouldAutoPlayGifs:e})}),n.a.createElement(aa.a,{label:S("VideosTitle"),checked:b,onCheck:e=>v({shouldAutoPlayVideos:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AccDescrStickers")),n.a.createElement(aa.a,{label:S("SuggestStickers"),checked:g,onCheck:e=>v({shouldSuggestStickers:e})}),n.a.createElement(aa.a,{label:S("LoopAnimatedStickers"),checked:p,onCheck:e=>v({shouldLoopStickers:e})}),n.a.createElement("div",{className:"mt-4",ref:f},A&&A.map(e=>n.a.createElement(ba,{key:e.id,stickerSet:e,observeIntersection:j,onClick:L}))),N&&n.a.createElement(ga.a,{isOpen:C,fromSticker:N,onClose:k})))}));let Ea;function Oa(e="*",t,a=!1){Ea||(Ea=document.createElement("input"),Ea.setAttribute("type","file")),Ea.setAttribute("accept",e),a?Ea.removeAttribute("multiple"):Ea.setAttribute("multiple","multiple"),Ea.onchange=null,Ea.value="",Ea.onchange=t,Ea.click()}var fa=a(13);function ja(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function Ca(e){const t=e[0].toString(16),a=e[1].toString(16),n=e[2].toString(16);return(1==t.length?"0"+t:t)+(1==a.length?"0"+a:a)+(1==n.length?"0"+n:n)}function ya([e,t,a]){e/=255,t/=255,a/=255;let n,c,r=Math.max(e,t,a),s=Math.min(e,t,a),l=r,o=r-s;if(c=0==r?0:o/r,r==s)n=0;else{switch(r){case e:n=(t-a)/o+(t.5?Math.max(0,.65*n):Math.max(0,Math.min(1,1-.65*n)),`hsla(${360*t}, ${100*a}%, ${100*n}%, .4)`}var Ia=a(12),Sa=a(162);a(276);var wa=Object(n.h)(({wallpaper:e,theme:t,isSelected:a,onClick:c})=>{const{slug:r,document:o}=e,i="wallpaper"+o.id,d=o.previewBlobUrl,m=Object(v.a)(i+"?size=m"),u=Object(Sa.a)(o.thumbnail&&o.thumbnail.dataUri,Boolean(m),!0),{shouldRenderThumb:h,shouldRenderFullMedia:b,transitionClassNames:g}=Object(ia.a)(m||d,"slow"),[p,O]=Object(n.r)(!1),{mediaData:j,downloadProgress:C}=Object(E.a)(i,!p),y=!1===Object(f.a)(p),{shouldRender:k,transitionClassNames:N}=Object(W.a)(p&&!j||r===s.n,void 0,y,"slow"),I=Object(n.q)();I.current=t;const S=Object(n.m)(()=>{(async()=>{const e=await Object(fa.e)(j);await Ia.d(l.m,I.current,e),c(r)})()},[j,c,r]);Object(n.n)(()=>{j&&S()},[j,S]);const w=Object(n.m)(()=>{j?S():O(e=>!e)},[j,S]),P=Object(ce.a)("WallpaperTile",a&&"selected");return n.a.createElement("div",{className:P,onClick:w},n.a.createElement("div",{className:"media-inner"},h&&n.a.createElement("canvas",{ref:u,className:"thumbnail"}),b&&n.a.createElement("img",{src:m||d,className:"full-media "+g,alt:""}),k&&n.a.createElement("div",{className:Object(ce.a)("spinner-container",N)},n.a.createElement(z.a,{progress:C,onClick:w}))))});a(277);const Pa=Object(V.g)(e=>e(),6e4,!0);var Ma=Object(n.h)(Object(c.h)(e=>{const{theme:t}=e.settings.byKey,{background:a,isBlurred:n}=e.settings.themes[t]||{},{loadedWallpapers:c}=e.settings;return{background:a,isBlurred:n,loadedWallpapers:c,theme:t}},(e,t)=>Object(u.l)(t,["loadWallpapers","uploadWallpaper","setThemeSettings"]))(({onScreenSelect:e,background:t,isBlurred:a,loadedWallpapers:c,theme:r,loadWallpapers:o,uploadWallpaper:i,setThemeSettings:d})=>{const m=Object(n.q)();m.current=r,Object(n.n)(()=>{Pa(()=>{o()})},[o]);const u=Object(n.m)(e=>{const{files:t}=e.target;t&&t.length>0&&i(t[0])},[i]),h=Object(n.m)(()=>{Oa("image/jpeg",u,!0)},[u]),b=Object(n.m)(()=>{e(s.m.GeneralChatBackgroundColor)},[e]),g=Object(n.m)(()=>{d({theme:r,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===r?l.o:l.t})},[d,r]),p=Object(n.m)(e=>{d({theme:m.current,background:e});const t=c&&c.find(t=>t.slug===e);t&&t.document.thumbnail&&async function(e){const t=[0,0,0];let a,n,c,r,s=-4,l=[0,0,0],o=0;const i=document.createElement("canvas"),d=i.getContext&&i.getContext("2d");if(!d)return t;const m=await Object(fa.g)(e);c=m.naturalHeight||m.offsetHeight||m.height,n=m.naturalWidth||m.offsetWidth||m.width,i.height=c,i.width=n,d.drawImage(m,0,0);try{a=d.getImageData(0,0,n,c)}catch(e){return t}for(r=a.data.length;(s+=20){const t=Na(e),a="#"+Ca(e);d({theme:m.current,backgroundColor:a,patternColor:t})})},[c,d]),v=Object(n.m)(e=>{d({theme:m.current,isBlurred:e.target.checked})},[d]),E=Object(F.a)(),O=c&&c[0]&&c[0].slug===s.n;return n.a.createElement("div",{className:"SettingsGeneralBackground settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Ee.a,{icon:"camera-add",className:"mb-0",disabled:O,onClick:h},E("UploadImage")),n.a.createElement(Ee.a,{icon:"colorize",className:"mb-0",onClick:b},E("SetColor")),n.a.createElement(Ee.a,{icon:"favorite",onClick:g},E("ThemeResetToDefaults")),n.a.createElement(aa.a,{label:E("BackgroundBlurred"),checked:Boolean(a),onChange:v})),c?n.a.createElement("div",{className:"settings-wallpapers"},c.map(e=>n.a.createElement(wa,{wallpaper:e,theme:r,isSelected:t===e.slug,onClick:p}))):n.a.createElement(be.a,null))}));a(278);const Fa=ya(ja("e6ebee")),La=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function Aa(e,t){return{colorPosition:[Math.round(e[1]*(t.colorRect.width-1)),Math.round((1-e[2])*(t.colorRect.height-1))],huePosition:Math.round(e[0]*(t.hueRect.width-1))}}function Ta({colorPosition:e,huePosition:t},a){return[t/(a.hueRect.width-1),e[0]/(a.colorRect.width-1),1-e[1]/(a.colorRect.height-1)]}var Ra=Object(n.h)(Object(c.h)(e=>{const{theme:t}=e.settings.byKey,{backgroundColor:a}=e.settings.themes[t]||{};return{backgroundColor:a,theme:t}},(e,t)=>Object(u.l)(t,["setThemeSettings"]))(({theme:e,backgroundColor:t,setThemeSettings:a})=>{const c=Object(n.q)();c.current=e;const r=Object(n.q)(null),s=Object(n.q)(null),l=Object(n.q)(null),o=Object(n.q)(!0),[i,d]=Object(n.r)(function(e){return e&&e.startsWith("#")?ya(ja(e.replace("#",""))):Fa}(t)),m=Object(n.q)(i);Object(n.n)(()=>{m.current=i},[i]);const[b,g,p]=Object(xe.a)(),[v,E]=Object(n.r)(""),[O,f]=Object(n.r)(""),j=Object(n.q)(),C=Object(n.q)();Object(n.n)(()=>{const e={offsetLeft:s.current.offsetLeft,...Object(u.l)(s.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:l.current.offsetLeft,...Object(u.l)(l.current.getBoundingClientRect(),["width"])};function a(t){const a=[Math.min(Math.max(0,t.pageX-e.offsetLeft),e.width-1),Math.min(Math.max(0,t.pageY-e.top+r.current.scrollTop),e.height-1)],{huePosition:n}=Aa(m.current,j.current);d(Ta({colorPosition:a,huePosition:n},j.current)),g()}function n(e){const{colorPosition:a}=Aa(m.current,j.current),n=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);d(Ta({colorPosition:a,huePosition:n},j.current)),g()}j.current={colorRect:e,hueRect:t},Object(h.b)(s.current,{onCapture:a,onDrag:a,onRelease:p,onClick:p,withCursor:!0}),Object(h.b)(l.current,{onCapture:n,onDrag:n,onRelease:p,onClick:p,withCursor:!0})},[g,p]);const{colorPosition:y=[0,0],huePosition:k=0}=j.current?Aa(i,j.current):{},N=Ca(ka(i)),I=i[0],S=Ca(ka([I,1,1]));Object(n.n)(()=>{const e=ka(i),t="#"+Ca(e);if(E(e.join(", ")),f(t),!o.current){const n=Na(e);a({theme:c.current,background:void 0,backgroundColor:t,patternColor:n})}o.current=!1},[i,a]),Object(n.n)(()=>{!function(e,t,a,n){let c,r,s;a.current&&n.current?(c=n.current.colorRect.width,r=n.current.colorRect.height,s=a.current):(c=e.offsetWidth,r=e.offsetHeight,s=e.getContext("2d"),e.width=c,e.height=r,a.current=s);const l=s.createImageData(c,r),o=l.data,i=ka([t,1,1]);let d=0;for(let e=0;e{!function(e){const t=e.offsetWidth;e.width=t,e.height=1;const a=e.getContext("2d"),n=a.createImageData(t,1),c=n.data;let r=0;for(let e=0;e{const t=e.currentTarget.value.replace(/[^\d, ]/g,"").slice(0,13);if(t.match(/^\d{1,3},\s?\d{1,3},\s?\d{1,3}$/)){const e=t.split(",").map(e=>Number(e.trim()));d(ya(e))}e.currentTarget.value=t},[]),P=Object(n.m)(e=>{const t=e.currentTarget.value.replace(/[^0-9a-fA-F]/g,"").slice(0,6);t.match(/^#?[0-9a-fA-F]{6}$/)&&d(ya(ja(t.replace("#","")))),e.currentTarget.value=t},[]),M=Object(n.m)(e=>{d(ya(ja(e.currentTarget.dataset.color.replace("#",""))))},[]),F=Object(ce.a)("SettingsGeneralBackgroundColor settings-content custom-scroll",b&&"is-dragging");return n.a.createElement("div",{ref:r,className:F},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("div",{ref:s,className:"color-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translate(${y[0]}px, ${y[1]}px); background-color: #${N};`})),n.a.createElement("div",{ref:l,className:"hue-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translateX(${k}px); background-color: #${S};`})),n.a.createElement("div",{className:"tools"},n.a.createElement(pe.a,{value:O,label:"HEX",onChange:P}),n.a.createElement(pe.a,{value:v,label:"RGB",onChange:w}))),n.a.createElement("div",{className:"predefined-colors"},La.map(e=>n.a.createElement("div",{className:e==="#"+N?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:M}))))}));var Da=Object(n.h)(Object(c.h)(e=>({hasPrivateChatsNotifications:Boolean(e.settings.byKey.hasPrivateChatsNotifications),hasPrivateChatsMessagePreview:Boolean(e.settings.byKey.hasPrivateChatsMessagePreview),hasGroupNotifications:Boolean(e.settings.byKey.hasGroupNotifications),hasGroupMessagePreview:Boolean(e.settings.byKey.hasGroupMessagePreview),hasBroadcastNotifications:Boolean(e.settings.byKey.hasBroadcastNotifications),hasBroadcastMessagePreview:Boolean(e.settings.byKey.hasBroadcastMessagePreview),hasContactJoinedNotifications:Boolean(e.settings.byKey.hasContactJoinedNotifications)}),(e,t)=>Object(u.l)(t,["loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings"]))(({hasPrivateChatsNotifications:e,hasPrivateChatsMessagePreview:t,hasGroupNotifications:a,hasGroupMessagePreview:c,hasBroadcastNotifications:r,hasBroadcastMessagePreview:s,hasContactJoinedNotifications:l,loadNotificationSettings:o,updateContactSignUpNotification:i,updateNotificationSettings:d})=>{Object(n.n)(()=>{o()},[o]);const m=Object(n.m)((n,l,o)=>{const i="contact"===l?!e:!("group"===l?a:r),m="contact"===l?t:"group"===l?c:s;d({peerType:l,..."silent"===o&&{isSilent:!n.target.checked,shouldShowPreviews:m},..."showPreviews"===o&&{shouldShowPreviews:n.target.checked,isSilent:i}})},[s,r,c,a,t,e,d]),u=Object(n.m)(e=>{i({isSilent:!e.target.checked})},[i]),h=Object(F.a)();return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("AutodownloadPrivateChats")),n.a.createElement(aa.a,{label:h("NotificationsForPrivateChats"),subLabel:h(e?"NotificationsEnabled":"NotificationsDisabled"),checked:e,onChange:e=>{m(e,"contact","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(t?"PreviewEnabled":"PreviewDisabled"),checked:t,onChange:e=>{m(e,"contact","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("FilterGroups")),n.a.createElement(aa.a,{label:h("NotificationsForGroups"),subLabel:h(a?"NotificationsEnabled":"NotificationsDisabled"),checked:a,onChange:e=>{m(e,"group","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(c?"PreviewEnabled":"PreviewDisabled"),checked:c,onChange:e=>{m(e,"group","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("FilterChannels")),n.a.createElement(aa.a,{label:h("NotificationsForChannels"),subLabel:h(r?"NotificationsEnabled":"NotificationsDisabled"),checked:r,onChange:e=>{m(e,"broadcast","silent")}}),n.a.createElement(aa.a,{label:h("MessagePreview"),subLabel:h(s?"PreviewEnabled":"PreviewDisabled"),checked:s,onChange:e=>{m(e,"broadcast","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},h("PhoneOther")),n.a.createElement(aa.a,{label:h("ContactJoined"),checked:l,onChange:u})))}));var Ba=Object(n.h)(Object(c.h)(e=>{const{settings:{byKey:{hasPassword:t},privacy:a},blocked:n,activeSessions:c}=e;return{hasPassword:t,blockedCount:n.totalCount,sessionsCount:c.length,visibilityPrivacyPhoneNumber:a.phoneNumber&&a.phoneNumber.visibility,visibilityPrivacyLastSeen:a.lastSeen&&a.lastSeen.visibility,visibilityPrivacyProfilePhoto:a.profilePhoto&&a.profilePhoto.visibility,visibilityPrivacyForwarding:a.forwards&&a.forwards.visibility,visibilityPrivacyGroupChats:a.chatInvite&&a.chatInvite.visibility}},(e,t)=>Object(u.l)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings"]))(({onScreenSelect:e,hasPassword:t,blockedCount:a,sessionsCount:c,visibilityPrivacyPhoneNumber:r,visibilityPrivacyLastSeen:l,visibilityPrivacyProfilePhoto:o,visibilityPrivacyForwarding:i,visibilityPrivacyGroupChats:d,loadPrivacySettings:m,loadBlockedContacts:u,loadAuthorizations:h})=>{Object(n.n)(()=>{u(),h(),m()},[u,h,m]);const b=Object(F.a)();function g(e){switch(e){case"everybody":return b("P2PEverybody");case"contacts":return b("P2PContacts");case"nobody":return b("P2PNobody")}}return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Ee.a,{icon:"delete-user",narrow:!0,onClick:()=>e(s.m.PrivacyBlockedUsers)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("BlockedUsers")),a>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},b("Users",a)))),n.a.createElement(Ee.a,{icon:"lock",narrow:!0,onClick:()=>e(t?s.m.TwoFaEnabled:s.m.TwoFaDisabled)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("TwoStepVerification")),n.a.createElement("span",{className:"subtitle",dir:"auto"},b(t?"PasswordOn":"PasswordOff")))),n.a.createElement(Ee.a,{icon:"active-sessions",narrow:!0,onClick:()=>e(s.m.PrivacyActiveSessions)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("SessionsTitle")),c>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},1===c?"1 session":c+" sessions")))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:b.isRtl?"rtl":void 0},b("PrivacyTitle")),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyPhoneNumber)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyPhoneTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(r)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyLastSeen)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("LastSeenTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(l)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyProfilePhoto)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyProfilePhotoTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(o)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyForwarding)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("PrivacyForwardsTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(i)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>e(s.m.PrivacyGroupChats)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},b("WhoCanAddMe")),n.a.createElement("span",{className:"subtitle",dir:"auto"},g(d))))))})),xa=a(14);var Ua=Object(n.h)(Object(c.h)(e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language}),(e,t)=>Object(u.l)(t,["loadLanguages","setSettingOption"]))(({languages:e,language:t,loadLanguages:a,setSettingOption:c})=>{const[r,s]=Object(n.r)(t),[l,o,i]=Object(xe.a)();Object(n.n)(()=>{a()},[a]);const d=Object(n.m)(e=>{s(e),o(),Object(xa.c)(e,()=>{i(),c({language:e})})},[o,i,c]),m=Object(n.p)(()=>e?function(e){const t=(window.navigator.language||"en").toLowerCase(),a=t.substr(0,2);return e.map(({langCode:e,nativeName:t,name:a})=>({value:e,label:t,subLabel:a})).sort(e=>!t||e.value!==t&&e.value!==a?0:-1)}(e):void 0,[e]);return n.a.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},m?n.a.createElement(oa.a,{name:"keyboard-send-settings",options:m,selected:r,loadingOption:l?r:void 0,onChange:d}):n.a.createElement(be.a,null))}));function Ga(e){switch(e){case s.m.PrivacyPhoneNumber:case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return"phoneNumber";case s.m.PrivacyLastSeen:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return"lastSeen";case s.m.PrivacyProfilePhoto:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return"profilePhoto";case s.m.PrivacyForwarding:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return"forwards";case s.m.PrivacyGroupChats:case s.m.PrivacyGroupChatsAllowedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return"chatInvite"}}var qa=Object(n.h)(Object(c.h)((e,{screen:t})=>{let a;const{chats:{byId:n},settings:{privacy:c}}=e;switch(t){case s.m.PrivacyPhoneNumber:a=c.phoneNumber;break;case s.m.PrivacyLastSeen:a=c.lastSeen;break;case s.m.PrivacyProfilePhoto:a=c.profilePhoto;break;case s.m.PrivacyForwarding:a=c.forwards;break;case s.m.PrivacyGroupChats:a=c.chatInvite}return a?{...a,chatsById:n}:{}},(e,t)=>Object(u.l)(t,["setPrivacyVisibility"]))(({screen:e,onScreenSelect:t,visibility:a,allowUserIds:c,allowChatIds:r,blockUserIds:l,blockChatIds:o,chatsById:i,setPrivacyVisibility:d})=>{const m=Object(F.a)(),u=Object(n.p)(()=>{switch(e){case s.m.PrivacyProfilePhoto:case s.m.PrivacyGroupChats:return[{value:"everybody",label:m("P2PEverybody")},{value:"contacts",label:m("P2PContacts")}];default:return[{value:"everybody",label:m("P2PEverybody")},{value:"contacts",label:m("P2PContacts")},{value:"nobody",label:m("P2PNobody")}]}},[m,e]),h={shouldShowDenied:"nobody"!==a,shouldShowAllowed:"everybody"!==a},b=Ga(e),g=Object(n.p)(()=>{switch(e){case s.m.PrivacyPhoneNumber:return m("PrivacyPhoneTitle");case s.m.PrivacyLastSeen:return m("LastSeenTitle");case s.m.PrivacyProfilePhoto:return m("PrivacyProfilePhotoTitle");case s.m.PrivacyForwarding:return m("PrivacyForwardsTitle");case s.m.PrivacyGroupChats:return m("WhoCanAddMe");default:return}},[m,e]),p=Object(n.p)(()=>{switch(e){case s.m.PrivacyLastSeen:return m("CustomHelp");default:return}},[m,e]),v=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberAllowedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenAllowedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoAllowedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingAllowedContacts;default:return s.m.PrivacyGroupChatsAllowedContacts}})(),E=(()=>{switch(e){case s.m.PrivacyPhoneNumber:return s.m.PrivacyPhoneNumberDeniedContacts;case s.m.PrivacyLastSeen:return s.m.PrivacyLastSeenDeniedContacts;case s.m.PrivacyProfilePhoto:return s.m.PrivacyProfilePhotoDeniedContacts;case s.m.PrivacyForwarding:return s.m.PrivacyForwardingDeniedContacts;default:return s.m.PrivacyGroupChatsDeniedContacts}})(),O=Object(n.p)(()=>c&&r&&i?r.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),c.length):0,[r,c,i]),f=Object(n.p)(()=>l&&o&&i?o.reduce((e,t)=>e+(i[t]?i[t].membersCount:0),l.length):0,[o,l,i]),j=Object(n.m)(e=>{d({privacyKey:b,visibility:e})},[b,d]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:m.isRtl?"rtl":void 0},g),n.a.createElement(oa.a,{name:"visibility-"+b,options:u,onChange:j,selected:a}),p&&n.a.createElement("p",{className:"settings-item-description-larger",dir:m.isRtl?"rtl":void 0},p)),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:m.isRtl?"rtl":void 0},m("PrivacyExceptions")),h.shouldShowAllowed&&n.a.createElement(Ee.a,{narrow:!0,icon:"add-user",onClick:()=>{t(v)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},O>0&&n.a.createElement("span",{className:"date",dir:"auto"},"+",O),n.a.createElement("span",{className:"title"},m("AlwaysShareWith")),n.a.createElement("span",{className:"subtitle"},m("EditAdminAddUsers")))),h.shouldShowDenied&&n.a.createElement(Ee.a,{narrow:!0,icon:"delete-user",onClick:()=>{t(E)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},f>0&&n.a.createElement("span",{className:"date",dir:"auto"},"−",f),n.a.createElement("span",{className:"title"},m("NeverShareWith")),n.a.createElement("span",{className:"subtitle"},m("EditAdminAddUsers"))))))}));function za(e){return[e.region,e.country].filter(Boolean).join(", ")}function Ha(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}var $a=Object(n.h)(Object(c.h)(e=>({activeSessions:e.activeSessions}),(e,t)=>Object(u.l)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"]))(({activeSessions:e,loadAuthorizations:t,terminateAuthorization:a,terminateAllAuthorizations:c})=>{const[r,s,l]=Object(xe.a)();Object(n.n)(()=>{t()},[t]);const o=Object(n.m)(e=>{a({hash:e})},[a]),i=Object(n.m)(()=>{l(),c()},[l,c]),d=Object(n.p)(()=>e.find(e=>e.isCurrent),[e]),m=Object(n.p)(()=>e.filter(e=>!e.isCurrent),[e]),u=Object(F.a)();function h(e){return n.a.createElement(Ee.a,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{o(e.hash)}}]},n.a.createElement("div",{className:"multiline-menu-item full-size",dir:"auto"},n.a.createElement("span",{className:"date"},Object(D.g)(u,1e3*e.dateActive)),n.a.createElement("span",{className:"title"},e.appName),n.a.createElement("span",{className:"subtitle black tight"},Ha(e)),n.a.createElement("span",{className:"subtitle"},e.ip," - ",za(e))))}return n.a.createElement("div",{className:"settings-content custom-scroll"},d&&(g=d,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:u.isRtl?"rtl":void 0},u("AuthSessions.CurrentSession")),n.a.createElement(Ee.a,{narrow:!0,inactive:!0},n.a.createElement("div",{className:"multiline-menu-item",dir:"auto"},n.a.createElement("span",{className:"title",dir:"auto"},g.appName),n.a.createElement("span",{className:"subtitle black tight"},Ha(g)),n.a.createElement("span",{className:"subtitle"},g.ip," - ",za(g)))),n.a.createElement(Ee.a,{className:"destructive mb-0",icon:"stop",ripple:!0,narrow:!0,onClick:s},u("TerminateAllSessions")))),m&&(b=m,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:u.isRtl?"rtl":void 0},"Other Sessions"),b.map(h))),m&&n.a.createElement(we.a,{isOpen:r,onClose:l,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:i,confirmIsDestructive:!0}),";");var b,g}));var Va=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a},blocked:{ids:n}}=e;return{chatsByIds:t,usersByIds:a,blockedIds:n}},(e,t)=>Object(u.l)(t,["unblockContact"]))(({chatsByIds:e,usersByIds:t,blockedIds:a,unblockContact:c})=>{const r=Object(n.m)(e=>{c({contactId:e})},[c]),s=Object(F.a)();return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content infinite-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("p",{className:"settings-item-description-larger mt-0 mb-2",dir:s.isRtl?"rtl":void 0},s("BlockedUsersInfo"))),n.a.createElement("div",{className:"chat-list custom-scroll"},a&&a.length?n.a.createElement("div",{className:"scroll-container"},a.map((a,c)=>function(a,c,o){const i=Object(m.mb)(a),d=i?t[a]:void 0,u=i?void 0:e[a],h=Object(ce.a)("Chat chat-item-clickable blocked-list-item",i?"private":"group");return n.a.createElement(Ee.a,{key:a,className:h,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{r(a)}}],style:`top: ${(o+c)*l.i}px;`},n.a.createElement(x.a,{size:"medium",user:d,chat:u}),n.a.createElement("div",{className:"contact-info",dir:"auto"},n.a.createElement("h3",{dir:"auto"},Object(B.a)((i?Object(m.ab)(d):Object(m.l)(s,u))||"")),d&&d.phoneNumber&&n.a.createElement("div",{className:"contact-phone",dir:"auto"},Object(xt.c)(d.phoneNumber)),d&&!d.phoneNumber&&d.username&&n.a.createElement("div",{className:"contact-username",dir:"auto"},"@",d.username)))}(a,c,0))):a&&!a.length?n.a.createElement("div",{className:"no-results",dir:"auto"},"List is empty"):n.a.createElement(be.a,{key:"loading"}))),n.a.createElement(qt,{isShown:!0,onClick:()=>{},className:"not-implemented",ariaLabel:"Add a blocked user"},n.a.createElement("i",{className:"icon-add"})))})),_a=a(128);var Wa=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🔐")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},Object(B.a)(a("EnabledPasswordText"),["br"]))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ee.a,{icon:"edit",onClick:()=>t(s.m.TwoFaChangePasswordCurrent)},a("ChangePassword")),n.a.createElement(Ee.a,{icon:"password-off",onClick:()=>t(s.m.TwoFaTurnOff)},a("TurnPasswordOff")),n.a.createElement(Ee.a,{icon:"email",onClick:()=>t(s.m.TwoFaRecoveryEmailCurrentPassword)},a("SetRecoveryEmail"))))})),Ka=a(148),Ya=a(149);var Qa=Object(n.h)(({error:e,isLoading:t,expectedPassword:a,placeholder:c="Current Password",hint:r,submitLabel:s,clearError:l,onSubmit:o})=>{const[i,d]=Object(n.r)(""),[m,u]=Object(n.r)(!1),h=Object(n.m)(e=>{a&&e!==a?d("Passwords Should Be Equal"):o(e)},[o,a]),b=Object(n.m)(()=>{l&&l(),d("")},[l]),g=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ka.a,{isBig:!0,isPasswordVisible:m})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ya.a,{error:i||e,hint:r,placeholder:c,submitLabel:s||g("Next"),clearError:b,isLoading:t,isPasswordVisible:m,onChangePasswordVisibility:u,onSubmit:h})))});var Za=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🔐")}))(({animatedEmoji:e,onStart:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},a("SetAdditionalPasswordInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(R.a,{onClick:t},a("EditAdminTransferSetPassword"))))}));const Xa=o.g?550:400;var Ja=Object(n.h)(Object(c.h)((e,{icon:t})=>({animatedEmoji:Object(d.c)(e,"email"===t?"💌":"💡")}))(({animatedEmoji:e,type:t="text",isLoading:a,error:c,placeholder:r,shouldConfirm:s,clearError:l,onSubmit:i})=>{const d=Object(n.q)(null),[m,u]=Object(n.r)(""),[h,b,g]=Object(xe.a)(!1);Object(n.n)(()=>{o.l||setTimeout(()=>{d.current.focus()},Xa)},[]);const p=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement("form",{action:"",onSubmit:e=>{e.preventDefault(),d.current&&i(m)}},n.a.createElement(pe.a,{ref:d,value:m,inputMode:t,label:r,error:c,onChange:e=>{c&&l&&l(),u(e.target.value)}}),m?n.a.createElement(R.a,{type:"submit",isLoading:a,ripple:!0},p("Continue")):n.a.createElement(R.a,{isText:!0,isLoading:a,ripple:!0,onClick:s?b:()=>{i()}},p("YourEmailSkip"))),s&&n.a.createElement(ge.a,{className:"narrow",isOpen:h,title:p("YourEmailSkipWarning"),onClose:g},Object(B.a)(p("YourEmailSkipWarningText"),["br","simple_markdown"]),n.a.createElement("div",{className:"dialog-buttons"},n.a.createElement(R.a,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{g(),i()}},p("YourEmailSkip")),n.a.createElement(R.a,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:g},p("Cancel"))))))}));var en=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"🥳")}))(({animatedEmoji:e,onScreenSelect:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{sticker:e}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},a("TwoStepVerificationPasswordSetInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(R.a,{onClick:()=>{t(s.m.Privacy)}},a("TwoStepVerificationPasswordReturnSettings"))))}));const tn=o.g?550:400;var an=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(d.c)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength}))(({animatedEmoji:e,codeLength:t,isLoading:a,error:c,clearError:r,onSubmit:s})=>{const l=Object(n.q)(null),[i,d]=Object(n.r)("");Object(n.n)(()=>{o.l||setTimeout(()=>{l.current.focus()},tn)},[]);const m=Object(F.a)();return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(_a.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(pe.a,{value:i,ref:l,inputMode:"decimal",label:m("YourEmailCode"),error:c,onChange:e=>{c&&r&&r();const a=e.target.value.slice(0,t);a.length===t&&s(a),d(a),e.target.value=a}}),a&&n.a.createElement(be.a,null)))}));var nn=Object(n.h)(Object(c.h)(e=>({...e.twoFaSettings}),(e,t)=>Object(u.l)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"]))(({currentScreen:e,state:t,hint:a,isLoading:c,error:r,waitingEmailCodeLength:l,dispatch:o,onScreenSelect:i,updatePassword:d,checkPassword:m,clearTwoFaError:u,updateRecoveryEmail:h,provideTwoFaEmailCode:b,clearPassword:g})=>{Object(n.n)(()=>{l&&(e===s.m.TwoFaNewPasswordEmail?i(s.m.TwoFaNewPasswordEmailCode):e===s.m.TwoFaRecoveryEmail&&i(s.m.TwoFaRecoveryEmailCode))},[e,i,l]);const p=Object(n.m)(()=>{o({type:"reset"}),i(s.m.TwoFaNewPassword)},[o,i]),v=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaNewPasswordConfirm)},[o,i]),E=Object(n.m)(()=>{i(s.m.TwoFaNewPasswordHint)},[i]),O=Object(n.m)(e=>{o({type:"setHint",payload:e}),i(s.m.TwoFaNewPasswordEmail)},[o,i]),f=Object(n.m)(e=>{o({type:"setEmail",payload:e}),d({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,d]),j=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),m({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaChangePasswordNew)}})},[m,o,i]),C=Object(n.m)(e=>{o({type:"setPassword",payload:e}),i(s.m.TwoFaChangePasswordConfirm)},[o,i]),y=Object(n.m)(()=>{i(s.m.TwoFaChangePasswordHint)},[i]),k=Object(n.m)(e=>{o({type:"setHint",payload:e}),d({...t,hint:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,d]),N=Object(n.m)(e=>{g({currentPassword:e,onSuccess:()=>{i(s.m.Privacy)}})},[g,i]),I=Object(n.m)(e=>{o({type:"setCurrentPassword",payload:e}),m({currentPassword:e,onSuccess:()=>{i(s.m.TwoFaRecoveryEmail)}})},[m,o,i]),S=Object(n.m)(e=>{o({type:"setEmail",payload:e}),h({...t,email:e,onSuccess:()=>{i(s.m.TwoFaCongratulations)}})},[o,i,t,h]),w=Object(n.m)(e=>{b({code:e})},[b]),P=Object(F.a)();switch(e){case s.m.TwoFaDisabled:return n.a.createElement(Za,{onStart:p});case s.m.TwoFaNewPassword:return n.a.createElement(Qa,{placeholder:P("EnterPassword"),submitLabel:P("Continue"),onSubmit:v});case s.m.TwoFaNewPasswordConfirm:return n.a.createElement(Qa,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),submitLabel:P("Continue"),onSubmit:E});case s.m.TwoFaNewPasswordHint:return n.a.createElement(Ja,{icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:O});case s.m.TwoFaNewPasswordEmail:return n.a.createElement(Ja,{icon:"email",type:"email",isLoading:c,error:r,clearError:u,placeholder:P("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:f});case s.m.TwoFaNewPasswordEmailCode:return n.a.createElement(an,{isLoading:c,error:r,clearError:u,onSubmit:w});case s.m.TwoFaCongratulations:return n.a.createElement(en,{onScreenSelect:i});case s.m.TwoFaEnabled:return n.a.createElement(Wa,{onScreenSelect:i});case s.m.TwoFaChangePasswordCurrent:return n.a.createElement(Qa,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:j});case s.m.TwoFaChangePasswordNew:return n.a.createElement(Qa,{placeholder:P("PleaseEnterNewFirstPassword"),onSubmit:C});case s.m.TwoFaChangePasswordConfirm:return n.a.createElement(Qa,{expectedPassword:t.password,placeholder:P("PleaseReEnterPassword"),onSubmit:y});case s.m.TwoFaChangePasswordHint:return n.a.createElement(Ja,{isLoading:c,error:r,clearError:u,icon:"hint",placeholder:P("PasswordHintPlaceholder"),onSubmit:k});case s.m.TwoFaTurnOff:return n.a.createElement(Qa,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:N});case s.m.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement(Qa,{isLoading:c,error:r,clearError:u,hint:a,onSubmit:I});case s.m.TwoFaRecoveryEmail:return n.a.createElement(Ja,{icon:"email",type:"email",placeholder:P("RecoveryEmailTitle"),onSubmit:S});case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(an,{isLoading:c,error:r,clearError:u,onSubmit:w});default:return}}));var cn=Object(n.h)(({itemIds:e,selectedIds:t,filterValue:a,filterPlaceholder:c,notFoundText:r,searchInputId:s,isLoading:l,onSelectedIdsChange:o,onFilterChange:i,onLoadMore:d})=>{const u=Object(n.q)(null),h=t.length>10;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{u.current.focus()})},500)},[]);const b=Object(n.m)(e=>{const a=[...t];a.includes(e)?a.splice(a.indexOf(e),1):a.push(e),o(a),i("")},[t,o,i]),g=Object(n.m)(e=>{const{value:t}=e.currentTarget;i(t)},[i]),[p,v]=Object(ue.a)(d,e,Boolean(a)),E=Object(F.a)();return n.a.createElement("div",{className:"Picker"},n.a.createElement("div",{className:"picker-header custom-scroll",dir:E.isRtl?"rtl":void 0},t.map((e,a)=>n.a.createElement(at.a,{chatOrUserId:e,isMinimized:h&&an.a.createElement(Ee.a,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>b(e),ripple:!0},n.a.createElement(aa.a,{label:"",checked:t.includes(e)}),Object(m.mb)(e)?n.a.createElement(Oe.a,{userId:e}):n.a.createElement(fe.a,{chatId:e})))):l||!p||p.length?n.a.createElement(be.a,null):n.a.createElement("p",{className:"no-results"},r||"Sorry, nothing found."))});function rn(e,t){const{privacy:a}=e.settings;switch(t){case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyPhoneNumberDeniedContacts:return a.phoneNumber;case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyLastSeenDeniedContacts:return a.lastSeen;case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:return a.profilePhoto;case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyForwardingDeniedContacts:return a.forwards;case s.m.PrivacyGroupChatsDeniedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return a.chatInvite}}var sn=Object(n.h)(Object(c.h)((e,{screen:t})=>{const{chats:{byId:a,listIds:n,orderedPinnedIds:c},currentUserId:r}=e;return{currentUserId:r,chatsById:a,listIds:n.active,orderedPinnedIds:c.active,archivedPinnedIds:c.archived,archivedListIds:n.archived,settings:rn(e,t)}},(e,t)=>Object(u.l)(t,["setPrivacySettings"]))(({currentUserId:e,isAllowList:t,screen:a,settings:c,chatsById:r,listIds:l,orderedPinnedIds:o,archivedListIds:i,archivedPinnedIds:d,setPrivacySettings:u,onScreenSelect:h})=>{const b=Object(F.a)(),g=Object(n.p)(()=>c?t?[...c.allowUserIds,...c.allowChatIds]:[...c.blockUserIds,...c.blockChatIds]:[],[t,c]),[p,v]=Object(n.r)(""),[E,O]=Object(n.r)(!1),[f,j]=Object(n.r)(g),C=Object(n.p)(()=>{const e=l?Object(m.Bb)(r,l,o,"all"):void 0,t=i?Object(m.Bb)(r,i,d,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[r,l,o,i,d]),y=Object(n.p)(()=>{if(C)return C.filter(t=>(Object(m.mb)(t.id)&&t.id!==e||Object(m.lb)(t))&&(!p||Object(me.a)(Object(m.l)(b,t),p)||g.includes(t.id))).map(({id:e})=>e)},[C,e,b,p,g]),k=Object(n.m)(e=>{j(e),O(!0)},[]),N=Object(n.m)(()=>{u({privacyKey:Ga(a),isAllowList:Boolean(t),contactsIds:f}),h(s.m.Privacy)},[t,f,h,a,u]);return n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(cn,{itemIds:y||[],selectedIds:f,filterValue:p,filterPlaceholder:b(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:k,onFilterChange:v}),n.a.createElement(qt,{isShown:E,onClick:N,ariaLabel:b(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},n.a.createElement("i",{className:"icon-arrow-right"})))}));a(279);const ln=Object.keys(s.m).length/2;var on=Object(n.h)(({currentScreen:e,onScreenSelect:t,onReset:a})=>{const[c,r]=It(Tt,At),[l,i]=It(Dt,Rt),d=Object(n.m)(()=>{e!==s.m.FoldersCreateFolder&&e!==s.m.FoldersEditFolder||setTimeout(()=>{r({type:"reset"})},200),e!==s.m.FoldersIncludedChats&&e!==s.m.FoldersExcludedChats?a():"create"===c.mode?t(s.m.FoldersCreateFolder):t(s.m.FoldersEditFolder)},[c.mode,r,e,a,t]),m=Object(n.m)(()=>{r({type:"saveFilters"}),d()},[r,d]);function u(){return n.a.createElement(n.a.Fragment,null,n.a.createElement(Bt,{currentScreen:e,onReset:d,onSaveFilter:m,editedFolderId:c.folderId}),function(){switch(e){case s.m.Main:return n.a.createElement(Ut,{onScreenSelect:t});case s.m.EditProfile:return n.a.createElement(Wt,null);case s.m.General:return n.a.createElement(va,{onScreenSelect:t});case s.m.Notifications:return n.a.createElement(Da,null);case s.m.Privacy:return n.a.createElement(Ba,{onScreenSelect:t});case s.m.Language:return n.a.createElement(Ua,null);case s.m.GeneralChatBackground:return n.a.createElement(Ma,{onScreenSelect:t});case s.m.GeneralChatBackgroundColor:return n.a.createElement(Ra,{onScreenSelect:t});case s.m.PrivacyActiveSessions:return n.a.createElement($a,null);case s.m.PrivacyBlockedUsers:return n.a.createElement(Va,null);case s.m.PrivacyPhoneNumber:case s.m.PrivacyLastSeen:case s.m.PrivacyProfilePhoto:case s.m.PrivacyForwarding:case s.m.PrivacyGroupChats:return n.a.createElement(qa,{screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberAllowedContacts:case s.m.PrivacyLastSeenAllowedContacts:case s.m.PrivacyProfilePhotoAllowedContacts:case s.m.PrivacyForwardingAllowedContacts:case s.m.PrivacyGroupChatsAllowedContacts:return n.a.createElement(sn,{isAllowList:!0,screen:e,onScreenSelect:t});case s.m.PrivacyPhoneNumberDeniedContacts:case s.m.PrivacyLastSeenDeniedContacts:case s.m.PrivacyProfilePhotoDeniedContacts:case s.m.PrivacyForwardingDeniedContacts:case s.m.PrivacyGroupChatsDeniedContacts:return n.a.createElement(sn,{screen:e,onScreenSelect:t});case s.m.Folders:case s.m.FoldersCreateFolder:case s.m.FoldersEditFolder:case s.m.FoldersIncludedChats:case s.m.FoldersExcludedChats:return n.a.createElement(ra,{currentScreen:e,state:c,dispatch:r,onScreenSelect:t,onReset:d});case s.m.TwoFaDisabled:case s.m.TwoFaNewPassword:case s.m.TwoFaNewPasswordConfirm:case s.m.TwoFaNewPasswordHint:case s.m.TwoFaNewPasswordEmail:case s.m.TwoFaNewPasswordEmailCode:case s.m.TwoFaCongratulations:case s.m.TwoFaEnabled:case s.m.TwoFaChangePasswordCurrent:case s.m.TwoFaChangePasswordNew:case s.m.TwoFaChangePasswordConfirm:case s.m.TwoFaChangePasswordHint:case s.m.TwoFaTurnOff:case s.m.TwoFaRecoveryEmailCurrentPassword:case s.m.TwoFaRecoveryEmail:case s.m.TwoFaRecoveryEmailCode:return n.a.createElement(nn,{currentScreen:e,state:l,dispatch:i,onScreenSelect:t});default:return}}())}return n.a.createElement(T.a,{id:"Settings",name:o.g?"slide-layers":"push-slide",activeKey:e,renderCount:ln},u)});const dn=Object(V.g)(e=>e(),6e4,!0);var mn=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users;return{usersById:a,contactIds:t}},(e,t)=>Object(u.l)(t,["loadContactList","openChat"]))(({filter:e,usersById:t,contactIds:a,loadContactList:c,openChat:r})=>{Object(n.n)(()=>{dn(()=>{c()})});const s=Object(n.m)(e=>{r({id:e})},[r]),l=Object(n.p)(()=>{if(!a)return;const n=e?a.filter(a=>{const n=t[a];if(!n)return!1;const c=Object(m.ab)(n);return c&&Object(me.a)(c,e)}):a;return Object(m.Fb)(n,t)},[e,t,a]),[i,d]=Object(ue.a)(void 0,l,Boolean(e));return n.a.createElement(ve.a,{items:i,onLoadMore:d,className:"chat-list custom-scroll"},i&&i.length?i.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable",onClick:()=>s(e),ripple:!o.g},n.a.createElement(Oe.a,{userId:e,forceShowSelf:!0,avatarSize:"large"}))):i&&!i.length?n.a.createElement("p",{className:"no-results",key:"no-results",dir:"auto"},e.length?"No contacts matched your search.":"Contact list is empty."):n.a.createElement(be.a,{key:"loading"}))}));const un=Object(V.g)(e=>e(),6e4,!0);var hn=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users,{byId:n}=e.chats,{currentUserId:c}=e,{query:r,fetchingStatus:s,globalResults:l,localResults:o}=e.globalSearch,{userIds:i}=l||{},{userIds:d}=o||{};return{currentUserId:c,usersById:a,chatsById:n,localContactIds:t,searchQuery:r,isSearching:s&&s.chats,globalUserIds:i,localUserIds:d}},(e,t)=>Object(u.l)(t,["loadContactList","setGlobalSearchQuery"]))(({isChannel:e,selectedMemberIds:t,onSelectedMemberIdsChange:a,onNextStep:c,onReset:r,currentUserId:s,usersById:l,chatsById:o,localContactIds:i,searchQuery:d,isSearching:h,localUserIds:b,globalUserIds:g,loadContactList:p,setGlobalSearchQuery:v})=>{Object(n.n)(()=>{un(()=>{p()})});const E=Object(n.m)(e=>{v({query:e})},[v]),O=Object(n.p)(()=>{const e=i?Object(m.Eb)(i.filter(e=>e!==s),o):[];if(!d)return e;const a=e.filter(e=>{const t=l[e];if(!t)return!1;const a=Object(m.ab)(t);return a&&Object(me.a)(a,d)});return Object(m.Eb)(Object(u.o)([...a,...b||[],...g||[]]),o,!1,t)},[i,d,b,g,l,o,t,s]),f=Object(n.m)(()=>{(t.length||e)&&(v({query:""}),c())},[t.length,e,v,c]),j=Object(F.a)();return n.a.createElement("div",{className:"NewChat step-1"},n.a.createElement("div",{className:"left-header"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:r,ariaLabel:"Return to Chat List"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,j("GroupAddMembers"))),n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(cn,{itemIds:O,selectedIds:t,filterValue:d,filterPlaceholder:j("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:h,onSelectedIdsChange:a,onFilterChange:E}),n.a.createElement(qt,{isShown:Boolean(t.length||e),onClick:f,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},n.a.createElement("i",{className:"icon-arrow-right"}))))}));var bn=Object(n.h)(Object(c.h)(e=>{const{progress:t,error:a}=e.chatCreation||{};return{creationProgress:t,creationError:a}},(e,t)=>Object(u.l)(t,["createGroupChat","createChannel"]))(({isChannel:e,memberIds:t,onReset:a,creationProgress:c,creationError:r,createGroupChat:l,createChannel:o})=>{const i=Object(F.a)(),[d,m]=Object(n.r)(""),[u,h]=Object(n.r)(""),[b,g]=Object(n.r)(),[p,v]=Object(n.r)(),E=c===s.a.InProgress,O=Object(n.m)(e=>{const{value:t}=e.currentTarget,a=t.replace(/^\s+/,"");m(a),a!==t&&(e.currentTarget.value=a)},[]),f=Object(n.m)(e=>{h(e.currentTarget.value)},[]),j=Object(n.m)(()=>{d.length?t.length>199?v("Sorry, creating supergroups is not yet supported"):l({title:d,photo:b,memberIds:t}):v("Chat title can't be empty")},[d,t,l,b,"Chat title can't be empty","Sorry, creating supergroups is not yet supported"]),C=Object(n.m)(()=>{d.length?o({title:d,about:u,photo:b,memberIds:t}):v("Channel title can't be empty")},[d,o,u,b,t,"Channel title can't be empty"]);Object(n.n)(()=>{c===s.a.Complete&&a(!0)},[c,a]);const y=r||("Chat title can't be empty"!==p&&"Channel title can't be empty"!==p?p:void 0);return n.a.createElement("div",{className:"NewChat"},n.a.createElement("div",{className:"left-header"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>a(),ariaLabel:"Return to member selection"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,i(e?"NewChannel":"NewGroup"))),n.a.createElement("div",{className:"NewChat-inner step-2"},n.a.createElement(Gt.a,{onChange:g,title:i("AddPhoto")}),n.a.createElement(pe.a,{value:d,onChange:O,label:i(e?"EnterChannelName":"GroupName"),error:"Chat title can't be empty"===p||"Channel title can't be empty"===p?p:void 0}),e&&n.a.createElement(n.a.Fragment,null,n.a.createElement(pe.a,{value:u,onChange:f,label:i("DescriptionOptionalPlaceholder")}),n.a.createElement("p",{className:"note"},i("DescriptionInfo"))),y&&n.a.createElement("p",{className:"error"},y),t.length>0&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"chat-members-heading"},i("GroupInfo.ParticipantCount",t.length,"i")),n.a.createElement("div",{className:"chat-members-list custom-scroll"},t.map(e=>n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(Oe.a,{userId:e})))))),n.a.createElement(qt,{isShown:0!==d.length,onClick:e?C:j,disabled:E,ariaLabel:e?i("ChannelIntro.CreateChannel"):"Create Group"},E?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-arrow-right"})))}));a(280);const gn=Object.keys(s.d).length/2;var pn=Object(n.h)(({isChannel:e=!1,content:t,onContentChange:a,onReset:c})=>{const[r,l]=Object(n.r)([]),i=Object(n.m)(()=>{a(e?s.d.NewChannelStep2:s.d.NewGroupStep2)},[e,a]);return n.a.createElement(T.a,{id:"NewChat",name:o.g?"slide-layers":"push-slide",renderCount:gn,activeKey:t},()=>{switch(t){case s.d.NewChannelStep1:case s.d.NewGroupStep1:return n.a.createElement(hn,{isChannel:e,selectedMemberIds:r,onSelectedMemberIdsChange:l,onNextStep:i,onReset:c});case s.d.NewChannelStep2:case s.d.NewGroupStep2:return n.a.createElement(bn,{isChannel:e,memberIds:r,onReset:c});default:return}})}),vn=a(190);a(281);var En=Object(n.h)(({isActive:e,onReset:t})=>{const a=Object(F.a)();return n.a.createElement("div",{className:"ArchivedChats"},n.a.createElement("div",{className:"left-header"},n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:t,ariaLabel:"Return to chat list"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,a("ArchivedChats"))),n.a.createElement(vn.a,{folderType:"archived",noChatsText:"Archive is empty.",isActive:e}))});const On={Down:!0,ArrowDown:!0,Up:!0,ArrowUp:!0,Left:!0,ArrowLeft:!0,Right:!0,ArrowRight:!0," ":!0,PageUp:!0,PageDown:!0,End:!0,Home:!0,Tab:!0},fn=e=>{e.preventDefault()};function jn(e){On[e.key]&&fn(e)}function Cn(){document.addEventListener("wheel",fn,{passive:!1}),window.ontouchmove=fn,document.onkeydown=jn}function yn(){document.removeEventListener("wheel",fn),window.ontouchmove=null,document.onkeydown=null}var kn=a(54),Nn=a(153);function In(e,t){return e?"lng_context_copy_selected":t?"lng_context_copy_text":"Copy"}var Sn=a(173),wn=a(53);a(282);var Pn=({isOpen:e,message:t,anchor:a,canSendNow:c,canReschedule:s,canReply:l,canEdit:o,canPin:i,canUnpin:d,canDelete:u,canForward:h,canFaveSticker:b,canUnfaveSticker:g,canCopy:p,canCopyLink:v,canSelect:E,onReply:O,onEdit:f,onPin:C,onUnpin:y,onForward:k,onDelete:N,onFaveSticker:I,onUnfaveSticker:S,onSelect:w,onSend:P,onReschedule:M,onClose:L,onCloseAnimationEnd:A,onCopyLink:T})=>{Object(n.n)(()=>{Object(j.b)(200)},[e]);const R=function(e,t,a){const n=[],c=Object(m.P)(e),s=Object(m.H)(e),l=Object(m.E)(e,"inline"),o=s&&l&&Nn.a,i=window.getSelection();if(o&&n.push({label:"lng_context_copy_image",handler:()=>{kn.b(l,r.ApiMediaFormat.BlobUrl).then(Nn.b),t&&t()}}),c){const e=Boolean(i&&i.anchorNode&&i.anchorNode.parentNode&&i.anchorNode.parentNode.closest(".Message .content-inner")&&""!==i.toString().replace(/(?:\r\n|\r|\n)/g,""));n.push({label:In(e,o),handler:()=>{const a=e&&i?i.toString():c;Object(Nn.c)(a),t&&t()}})}return a&&n.push({label:"lng_context_copy_message_link",handler:()=>{a(),t&&t()}}),n}(t,L,v?T:void 0),D=Object(n.m)(()=>document.querySelector(`.active > .MessageList div[data-message-id="${t.id}"]`),[t.id]),B=Object(n.m)(()=>document.querySelector(".active > .MessageList"),[]),x=Object(n.m)(()=>document.querySelector(".MessageContextMenu .bubble"),[]),{positionX:U,positionY:G,style:z}=Object(Sn.a)(a,D,B,x,10,document.querySelector(".MiddleHeader").offsetHeight),H=Object(F.a)();return n.a.createElement(wn.a,{isOpen:e,positionX:U,positionY:G,style:z,className:"MessageContextMenu fluid",onClose:L,onCloseAnimationEnd:A},c&&n.a.createElement(q.a,{icon:"send-outline",onClick:P},H("MessageScheduleSend")),s&&n.a.createElement(q.a,{icon:"schedule",onClick:M},H("MessageScheduleEditTime")),l&&n.a.createElement(q.a,{icon:"reply",onClick:O},H("Reply")),o&&n.a.createElement(q.a,{icon:"edit",onClick:f},H("Edit")),b&&n.a.createElement(q.a,{icon:"favorite",onClick:I},H("AddToFavorites")),g&&n.a.createElement(q.a,{icon:"favorite",onClick:S},H("Stickers.RemoveFromFavorites")),p&&R.map(e=>n.a.createElement(q.a,{key:e.label,icon:"copy",onClick:e.handler},H(e.label))),i&&n.a.createElement(q.a,{icon:"pin",onClick:C},H("DialogPin")),d&&n.a.createElement(q.a,{icon:"unpin",onClick:y},H("DialogUnpin")),h&&n.a.createElement(q.a,{icon:"forward",onClick:k},H("Forward")),E&&n.a.createElement(q.a,{icon:"select",onClick:w},H("Common.Select")),u&&n.a.createElement(q.a,{destructive:!0,icon:"delete",onClick:N},H("Delete")))};var Mn=Object(n.h)(Object(c.h)((e,{message:t,messageListType:a})=>{const{threadId:n}=Object(d.y)(e)||{},{noOptions:c,canReply:r,canPin:s,canUnpin:l,canDelete:o,canEdit:i,canForward:m,canFaveSticker:u,canUnfaveSticker:h,canCopy:b,canCopyLink:g,canSelect:p}=n&&Object(d.b)(e,t,n)||{},v="pinned"===a,E="scheduled"===a;return{noOptions:c,canSendNow:E,canReschedule:E,canReply:!v&&!E&&r,canPin:!E&&s,canUnpin:!E&&l,canDelete:o,canEdit:!v&&i,canForward:!E&&m,canFaveSticker:!E&&u,canUnfaveSticker:!E&&h,canCopy:b,canCopyLink:!E&&g,canSelect:p}},(e,t)=>Object(u.l)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink"]))(({isOpen:e,messageListType:t,message:a,album:c,anchor:r,onClose:s,onCloseAnimationEnd:l,noOptions:o,canSendNow:i,canReschedule:d,canReply:m,canPin:u,canUnpin:h,canDelete:b,canEdit:g,canForward:p,canFaveSticker:v,canUnfaveSticker:E,canCopy:O,canCopyLink:f,canSelect:j,setReplyingToId:C,setEditingId:y,pinMessage:k,openForwardMenu:N,faveSticker:I,unfaveSticker:S,toggleMessageSelection:w,sendScheduledMessages:P,rescheduleMessage:M,loadMessageLink:F})=>{const{transitionClassNames:L}=Object(W.a)(e,l,void 0,!1),[A,T]=Object(n.r)(!0),[R,B]=Object(n.r)(!1),[x,U]=Object(n.r)(!1),[G,q,z]=Object(xe.a)(),H=Object(n.m)(()=>{T(!1),B(!0)},[]),$=Object(n.m)(()=>{T(!1),s()},[s]),V=Object(n.m)(()=>{B(!1),s()},[s]),_=Object(n.m)(()=>{U(!1),s()},[s]),K=Object(n.m)(()=>{z(),s()},[z,s]),Y=Object(n.m)(()=>{C({messageId:a.id}),$()},[C,a.id,$]),Q=Object(n.m)(()=>{y({messageId:a.id}),$()},[y,a.id,$]),Z=Object(n.m)(()=>{T(!1),U(!0)},[]),X=Object(n.m)(()=>{k({messageId:a.id,isUnpin:!0}),$()},[k,a.id,$]),J=Object(n.m)(()=>{if($(),c&&c.messages){const e=c.messages.map(({id:e})=>e);N({fromChatId:a.chatId,messageIds:e})}else N({fromChatId:a.chatId,messageIds:[a.id]})},[N,a,$,c]),ee=Object(n.m)(()=>{$(),I({sticker:a.content.sticker})},[$,a.content.sticker,I]),te=Object(n.m)(()=>{$(),S({sticker:a.content.sticker})},[$,a.content.sticker,S]),ae=Object(n.m)(()=>{const e=c&&c.messages?{messageId:a.id,childMessageIds:c.messages.map(({id:e})=>e),withShift:!1}:{messageId:a.id,withShift:!1};w(e),$()},[$,a.id,w,c]),ne=Object(n.m)(()=>{P({chatId:a.chatId,id:a.id}),$()},[$,a.chatId,a.id,P]),ce=Object(n.m)(()=>{T(!1),q()},[q]),re=Object(n.m)(e=>{M({chatId:a.chatId,messageId:a.id,scheduledAt:Math.round(e.getTime()/1e3)})},[a.chatId,a.id,M]),se=Object(n.m)(()=>{F({messageId:a.id,chatId:a.chatId}),$()},[$,F,a.chatId,a.id]);if(Object(n.n)(()=>(Cn(),yn),[]),o)return void $();const le=new Date;return le.setFullYear(le.getFullYear()+1),n.a.createElement("div",{className:["ContextMenuContainer",L].join(" ")},n.a.createElement(Pn,{message:a,isOpen:A,anchor:r,canSendNow:i,canReschedule:d,canReply:m,canDelete:b,canPin:u,canUnpin:h,canEdit:g,canForward:p,canFaveSticker:v,canUnfaveSticker:E,canCopy:O,canCopyLink:f,canSelect:j,onReply:Y,onEdit:Q,onPin:Z,onUnpin:X,onForward:J,onDelete:H,onFaveSticker:ee,onUnfaveSticker:te,onSelect:ae,onSend:ne,onReschedule:ce,onClose:$,onCopyLink:se}),n.a.createElement(Re,{isOpen:R,isSchedule:"scheduled"===t,onClose:V,album:c,message:a}),n.a.createElement(De,{isOpen:x,messageId:a.id,chatId:a.chatId,onClose:_}),n.a.createElement(Ae,{isOpen:G,withTimePicker:!0,selectedAt:1e3*a.date,maxAt:Object(D.k)(le),isFutureMode:!0,onClose:K,onSubmit:re}))}));a(283);var Fn=Object(n.h)(Object(c.h)((e,{fromSticker:t})=>({stickerSet:Object(d.xb)(e,t.stickerSetId)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet","sendMessage"]))(({isOpen:e,fromSticker:t,stickerSet:a,onClose:c,loadStickers:r,toggleStickerSet:s,sendMessage:o})=>{const i=Object(n.q)(null),d=Object(F.a)(),{observe:m}=Object(sa.a)({rootRef:i,throttleMs:200,isDisabled:!e});Object(n.n)(()=>{if(e){const{stickerSetId:e,stickerSetAccessHash:a}=t;r({stickerSetId:e,stickerSetAccessHash:a})}},[e,t,r]);const u=Object(n.m)(e=>{e={...e,isPreloadedGlobally:!0},o({sticker:e}),c()},[c,o]),h=Object(n.m)(()=>{s({stickerSetId:t.stickerSetId}),c()},[t.stickerSetId,c,s]);return n.a.createElement(ge.a,{className:"StickerSetModal",isOpen:e,onClose:c,hasCloseButton:!0,title:a?a.title:d("AccDescrStickerSet")},a&&a.stickers?n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{ref:i,className:"stickers custom-scroll"},a.stickers.map(e=>n.a.createElement(ha,{sticker:e,size:l.xb,observeIntersection:m,onClick:u,clickArg:e}))),n.a.createElement("div",{className:"button-wrapper"},n.a.createElement(R.a,{size:"smaller",fluid:!0,color:a.installedDate?"danger":"primary",onClick:h},d(a.installedDate?"StickerPack.RemoveStickerCount":"StickerPack.AddStickerCount",a.count,"i")))):n.a.createElement(be.a,null))})),Ln=a(122);a(284);var An=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t);return!a||a.isRestricted?{}:{chat:a,isMuted:a.isMuted,isPrivate:Object(m.mb)(a.id),canDeleteChat:Object(m.d)(a)}},(e,t)=>Object(u.l)(t,["updateChatMutedState","enterMessageSelectMode"]))(({chatId:e,isOpen:t,anchor:a,isChannel:c,canSubscribe:r,canSearch:s,canMute:l,canSelect:i,canLeave:d,chat:m,isPrivate:u,isMuted:h,canDeleteChat:b,onSubscribeChannel:g,onSearchClick:p,onClose:v,onCloseAnimationEnd:E,updateChatMutedState:O,enterMessageSelectMode:f})=>{const[j,C]=Object(n.r)(!0),[y,k]=Object(n.r)(!1),{x:N,y:I}=a;Object(W.a)(t,E,void 0,!1);const S=Object(n.m)(()=>{C(!1),k(!0)},[]),w=Object(n.m)(()=>{C(!1),v()},[v]),P=Object(n.m)(()=>{k(!1),v()},[v]),M=Object(n.m)(()=>{O({chatId:e,isMuted:!h}),w()},[e,w,h,O]),L=Object(n.m)(()=>{g(),w()},[w,g]),A=Object(n.m)(()=>{p(),w()},[w,p]),T=Object(n.m)(()=>{f(),w()},[w,f]);Object(n.n)(()=>(Cn(),yn),[]);const R=Object(F.a)();return n.a.createElement(Ln.a,null,n.a.createElement("div",{className:"HeaderMenuContainer"},n.a.createElement(wn.a,{isOpen:j,positionX:"right",style:`left: ${N}px;top: ${I}px;`,onClose:w},o.g&&r&&n.a.createElement(q.a,{icon:c?"channel":"group",onClick:L},R(c?"Subscribe":"Join Group")),o.g&&s&&n.a.createElement(q.a,{icon:"search",onClick:A},R("Search")),l&&n.a.createElement(q.a,{icon:h?"unmute":"mute",onClick:M},R(h?"ChatsUnmute":"ChatsMute")),i&&n.a.createElement(q.a,{icon:"select",onClick:T},R("ReportSelectMessages")),d&&n.a.createElement(q.a,{destructive:!0,icon:"delete",onClick:S},R(u?"Delete":b?"GroupInfo.DeleteAndExit":c?"LeaveChannel":"Group.LeaveGroup"))),m&&n.a.createElement(_e.a,{isOpen:y,onClose:P,chat:m})))})),Tn=a(154);a(285);const Rn=Object(V.a)(e=>e(),200,!1);var Dn=Object(n.h)(Object(c.h)(e=>{const t=Object(d.r)(e);if(!t)return{};const{query:a,results:n}=Object(d.A)(e)||{},{totalCount:c,foundIds:r}=n||{};return{chat:t,query:a,totalCount:c,foundIds:r,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}},(e,t)=>Object(u.l)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","openHistoryCalendar"]))(({isActive:e,chat:t,query:a,totalCount:c,foundIds:r,isHistoryCalendarOpen:s,setLocalTextSearchQuery:l,searchTextMessagesLocal:o,focusMessage:i,closeLocalTextSearch:d,openHistoryCalendar:m})=>{const u=Object(n.q)(null),[h,b]=Object(n.r)(0);Object(n.n)(()=>{const{visualViewport:e}=window;if(!e)return;const t=document.getElementById("Main"),a=()=>{const{activeElement:a}=document;if(a&&a===u.current){const{pageTop:a,height:n}=e;t.style.transform=`translateY(${a}px)`,t.style.height=n+"px",document.documentElement.scrollTop=a}else t.style.transform="",t.style.height=""};return e.addEventListener("resize",a),()=>{e.removeEventListener("resize",a)}},[]),Object(n.n)(()=>{t&&r&&r.length?(i({chatId:t.id,messageId:r[r.length-1]}),b(0)):b(-1)},[t,i,r]),Object(n.n)(()=>{Array.from(document.querySelectorAll("input")).forEach(t=>{t.disabled=Boolean(e&&t!==u.current)}),Array.from(document.querySelectorAll("div[contenteditable]")).forEach(t=>{t.contentEditable=e?"false":"true"})},[e]),Object(n.n)(()=>{e||u.current.blur()},[e]),Object(n.o)(()=>{document.querySelector("#MobileSearch input").blur()},[s]);const g=Object(n.m)(e=>{l({query:e}),e.length&&Rn(o)},[o,l]),p=Object(n.m)(()=>{if(t&&r){const e=h+1;i({chatId:t.id,messageId:r[r.length-1-e]}),b(e)}},[t,h,i,r]),v=Object(n.m)(()=>{if(t&&r){const e=h-1;i({chatId:t.id,messageId:r[r.length-1-e]}),b(e)}},[t,h,i,r]);return n.a.createElement("div",{id:"MobileSearch",className:e?"active":""},n.a.createElement("div",{className:"header"},n.a.createElement(R.a,{size:"smaller",round:!0,color:"translucent",onClick:d},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement(Tn.a,{ref:u,value:a,onChange:g})),n.a.createElement("div",{className:"footer"},n.a.createElement("div",{className:"counter"},a?r&&r.length?`${h+1} of ${c}`:r&&!r.length?"No results":"":n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>m({selectedAt:Object(D.k)(Date.now())}),ariaLabel:"Search messages by date"},n.a.createElement("i",{className:"icon-calendar"}))),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:p,disabled:!r||!r.length||h===r.length-1},n.a.createElement("i",{className:"icon-up"})),n.a.createElement(R.a,{round:!0,size:"smaller",color:"translucent",onClick:v,disabled:!r||!r.length||0===h},n.a.createElement("i",{className:"icon-down"}))))})),Bn=a(59),xn=a(191),Un=a(183),Gn=a(179),qn=a(185);function zn(e,t,a=0,n=!1,c=!1,r=!1){const s=e[r?"scrollLeft":"scrollTop"],l=s+e[r?"offsetWidth":"offsetHeight"],o="string"==typeof t?e.querySelectorAll(t):t,{length:i}=o,d=[];let m=!1;for(let e=0;e=s-a&&u<=l+a:i<=l+a&&u>=s-a)d.push(e),m=!0;else if(m&&!n)break}return{allElements:o,visibleIndexes:d}}var Hn=function(e,t,a=!1){const n=e[a?"scrollLeft":"scrollTop"],c=n+e[a?"offsetWidth":"offsetHeight"],r=t[a?"offsetLeft":"offsetTop"],s=r+t[a?"offsetWidth":"offsetHeight"];return r>n&&s{const l=Object(n.q)(null),{shouldRender:o,transitionClassNames:i}=Object(W.a)(e,void 0,void 0,!1),d=Object(n.m)(e=>{if(!s)return-1;const t=s.length;return Object(Vn.a)(t,e)},[s]),[m,u]=Object(n.r)(-1),h=Object(n.m)((e,t)=>{t.preventDefault(),u(t=>d(t+e))},[u,d]),b=Object(n.m)((e,t=!1)=>{const a=r&&r[e];a&&c(a,t)},[r,c]),g=Object(n.m)(e=>{if(s&&s.length&&m>-1){const t=s[m];t&&(e.preventDefault(),b(t.userId,!0))}},[s,m,b]);Object(n.n)(()=>e?Object(Ue.a)({onEsc:a,onUp:e=>h(-1,e),onDown:e=>h(1,e),onEnter:g,onTab:g}):void 0,[e,a,h,g]),Object(n.n)(()=>{s&&!s.length&&a()},[s,a]),Object(n.n)(()=>{u(0)},[t]),Object(n.n)(()=>{!function(e,t){const a=t.current;if(!a||e<0)return;const{visibleIndexes:n,allElements:c}=zn(a,".chat-item-clickable",8,!0,!0);if(!c.length||!c[e])return;const r=n[0];if(!n.includes(e)||e===r&&!Hn(a,c[r])){const t=e>n[n.length-1]?"start":"end";Object($n.a)(a,c[e],t,10)}}(m,l)},[m]);const p=Object(f.a)(s&&s.length?s:void 0,o),v=s&&!s.length?p:s;if(!o||v&&!v.length)return;const E=Object(ce.a)("MentionTooltip composer-tooltip custom-scroll",i);return n.a.createElement("div",{className:E,ref:l},v&&v.map(({userId:e},t)=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>b(e),focus:m===t},n.a.createElement(Oe.a,{userId:e,avatarSize:"small",withUsername:!0}))))}),Wn=a(184);a(287);var Kn=Object(n.h)(({attachments:e,caption:t,canSuggestMembers:a,groupChatMembers:c,currentUserId:r,usersById:s,recentEmojis:o,language:i,onCaptionUpdate:d,addRecentEmoji:m,loadEmojiKeywords:u,onSend:h,onFileAppend:g,onClear:p})=>{const v=Object(n.q)(null),E=Object(f.a)(e),O=e.length?e:E,j=Boolean(e.length),[C,y,k]=Object(xe.a)(),N=O&&O.every(e=>e.quick),I=Object(F.a)(),{isMentionTooltipOpen:S,mentionFilter:w,closeMentionTooltip:P,insertMention:M,mentionFilteredMembers:L}=Object(xn.a)(a&&j,t,d,l.w,c,r,s),{isEmojiTooltipOpen:A,closeEmojiTooltip:T,filteredEmojis:D,insertEmoji:B}=Object(Un.a)(j,t,o,l.w,d);Object(n.n)(()=>j?Object(b.a)(p):void 0,[j,p]);const x=Object(n.m)(()=>{j&&h()},[j,h]),U=Object(n.m)(e=>{e.preventDefault(),k();const{dataTransfer:{files:t}}=e;if(t&&t.length){const e=N?Array.from(t).filter(e=>e.type&&l.l.includes(e.type)):Array.from(t);g(e,!1)}},[N,g,k]);if(!O)return;const G=O.every(e=>e.mimeType.startsWith("image/")),q=O.every(e=>e.mimeType.startsWith("video/"));let z="";return z=I(G?"PreviewSender.SendPhoto":q?"PreviewSender.SendVideo":"PreviewSender.SendFile",O.length,"i"),n.a.createElement(ge.a,{isOpen:j,onClose:p,header:function(){if(O)return n.a.createElement("div",{className:"modal-header-condensed",dir:I.isRtl?"rtl":void 0},n.a.createElement(R.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:p},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},z),n.a.createElement(R.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:x},I("Send")))}(),className:"AttachmentModal "+(C?"hovered":"")},n.a.createElement("div",{className:"drop-target",onDragEnter:y,onDrop:U,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),v.current&&window.clearTimeout(v.current)},onDragLeave:e=>{const{relatedTarget:t,target:a}=e;a.matches(".drop-target")&&!t&&(v.current=window.setTimeout(k,150)),a&&a.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),k())},"data-attach-description":I("Preview.Dragging.AddItems",10)},N?n.a.createElement("div",{className:"media-wrapper custom-scroll"},O.map(e=>e.mimeType.startsWith("image/")?n.a.createElement("img",{src:e.blobUrl,alt:""}):n.a.createElement("video",{src:e.blobUrl,autoPlay:!0,muted:!0,loop:!0}))):n.a.createElement("div",{className:"document-wrapper custom-scroll"},O.map(e=>n.a.createElement(Gn.a,{name:e.filename,extension:Object(Bn.d)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0}))),n.a.createElement("div",{className:"attachment-caption-wrapper"},n.a.createElement(_n,{isOpen:S,onClose:P,filter:w,onInsertUserName:M,filteredChatMembers:L,usersById:s}),n.a.createElement(Wn.a,{isOpen:A,emojis:D,onClose:T,language:i,onEmojiSelect:B,addRecentEmoji:m,loadEmojiKeywords:u}),n.a.createElement(qn.a,{id:"caption-input-text",html:t,editableInputId:l.w,placeholder:I("Caption"),onUpdate:d,onSend:h,shouldSetFocus:j}))))}),Yn=a(138);a(288);var Qn=Object(n.h)(({isOpen:e,onSend:t,onClear:a})=>{const c=Object(n.q)(null),r=Object(n.q)(null),s=Object(n.q)(null),[l,o]=Object(n.r)(""),[i,d]=Object(n.r)([""]),[m,u]=Object(n.r)(!0),[h,g]=Object(n.r)(!1),[p,v]=Object(n.r)(!1),[E,O]=Object(n.r)(),[f,j]=Object(n.r)(),[C,y]=Object(n.r)(!1),k=Object(F.a)(),N=Object(n.m)(t=>{e&&t.current&&t.current.focus()},[e]);Object(n.n)(()=>e?Object(b.a)(a):void 0,[e,a]),Object(n.n)(()=>{e||(o(""),d([""]),u(!0),g(!1),v(!1),O(""),j(""),y(!1))},[e]),Object(n.n)(()=>N(c),[N,e]),Object(n.o)(()=>{const e=s.current;e&&E!==e.innerHTML&&(e.innerHTML=E)},[E]);const I=Object(n.m)((e=[])=>{d([...e,""]),requestAnimationFrame(()=>{const e=r.current;e&&(e.classList.toggle("overflown",e.scrollHeight>320),e.scrollTo({top:e.scrollHeight,behavior:"smooth"}))})},[]),S=Object(n.m)(()=>{if(y(!1),!e)return;const a=l.trim().substring(0,255),n=i.map(e=>e.trim().substring(0,100)).filter(e=>e.length);if(!a||n.length<2)return o(a),n.length?n.length<2?I(n):d(n):I(),void y(!0);if(p&&(!f||!n[Number(f)]))return void y(!0);const c={summary:{question:a,answers:n.map((e,t)=>({text:e.trim(),option:String(t),...String(t)===f&&{correct:!0}})),...!m&&{isPublic:!0},...h&&{multipleChoice:!0},...p&&{quiz:!0}}};if(p){const{text:e,entities:t}=E&&Object(Yn.a)(E.substring(0,200))||{};c.quiz={correctAnswers:[f],...e&&{solution:e},...t&&{solutionEntities:t}}}t(c)},[e,l,i,p,f,m,h,t,I,E]),w=Object(n.m)((e,t)=>{const a=[...i];a[e]=t,a[a.length-1].trim().length&&a.length<10?I(a):d(a)},[i,I]),P=Object(n.m)(e=>{const t=[...i];t.splice(e,1),d(t),requestAnimationFrame(()=>{r.current&&r.current.classList.toggle("overflown",r.current.scrollHeight>320)})},[i]),M=Object(n.m)(e=>{j(e)},[j]),L=Object(n.m)(e=>{u(e.target.checked)},[]),A=Object(n.m)(e=>{g(e.target.checked)},[]),T=Object(n.m)(e=>{v(e.target.checked)},[]),D=Object(n.m)(e=>{13===e.keyCode&&S()},[S]),B=Object(n.m)(()=>{if(C&&!l.trim().length)return k("lng_polls_choose_question")},[C,k,l]),x=Object(n.m)(e=>{const t=i.map(e=>e.trim()).filter(e=>e.length);if(C&&t.length<2&&!i[e].trim().length)return k("lng_polls_choose_answers")},[C,k,i]);function U(){return i.map((e,t)=>n.a.createElement("div",{className:"option-wrapper"},n.a.createElement(pe.a,{label:t!==i.length-1||10===i.length?k("OptionHint"):k("CreatePoll.AddOption"),error:x(t),value:e,onChange:e=>w(t,e.currentTarget.value),onKeyPress:D}),t!==i.length-1&&n.a.createElement(R.a,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:k("Delete"),onClick:()=>P(t)},n.a.createElement("i",{className:"icon-close"}))))}return n.a.createElement(ge.a,{isOpen:e,onClose:a,header:n.a.createElement("div",{className:"modal-header-condensed"},n.a.createElement(R.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel poll creation",onClick:a},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},k("NewPoll")),n.a.createElement(R.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:S},k("Create"))),className:"PollModal"},n.a.createElement(pe.a,{ref:c,label:k("AskAQuestion"),value:l,error:B(),onChange:e=>o(e.currentTarget.value),onKeyPress:D}),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"options-list custom-scroll",ref:r},n.a.createElement("h3",{className:"options-header"},"Options"),C&&function(){const e=i.map(e=>e.trim()).filter(e=>e.length);return p&&(!f||!e[Number(f)])&&n.a.createElement("p",{className:"error"},k("lng_polls_choose_correct"))}(),p?n.a.createElement(oa.a,{name:"correctOption",options:U().map((e,t)=>({value:String(t),label:e,hidden:t===i.length-1})),onChange:M}):U()),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"quiz-mode"},n.a.createElement(aa.a,{label:k("PollAnonymous"),checked:m,onChange:L}),n.a.createElement(aa.a,{label:k("PollMultiple"),checked:h,disabled:p,onChange:A}),n.a.createElement(aa.a,{label:k("PollQuiz"),checked:p,disabled:h,onChange:T}),p&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"options-header"},"Solution"),n.a.createElement("div",{ref:s,className:"form-control",contentEditable:!0,dir:"auto",onChange:e=>O(e.currentTarget.innerHTML)}),n.a.createElement("div",{className:"note"},k("CreatePoll.ExplanationInfo")))))});let Zn;function Xn(e,t,a=250){const c=Object(n.q)(!1);Object(n.n)(()=>{Zn&&(clearTimeout(Zn),Zn=void 0),e&&!o.l&&(Zn=window.setTimeout(()=>{c.current||t()},2*a))},[e,a,t]);return[Object(n.m)(()=>{c.current=!0},[]),Object(n.m)(()=>{c.current=!1,Zn&&(clearTimeout(Zn),Zn=void 0),Zn=window.setTimeout(()=>{c.current||t()},a)},[a,t])]}var Jn=a(65),ec=a(142);a(289);var tc=Object(n.h)(({emoji:e,focus:t,onClick:a})=>{const c=Object(n.m)(t=>{t.preventDefault(),a(e.native,e.id)},[e,a]);return n.a.createElement("div",{className:"EmojiButton "+(t?"focus":""),onMouseDown:c,title:`:${e.names[0]}:`},o.d?n.a.createElement("span",{className:"font-emoji"},e.native):n.a.createElement("img",{src:`./img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))});var ac=Object(n.h)(({category:e,index:t,allEmojis:a,observeIntersection:c,shouldRender:r,onEmojiSelect:s})=>{const l=Object(n.q)(null);Object(sa.c)(l,c);const{transitionClassNames:i}=Object(W.a)(r,void 0,void 0,"slow"),d=Object(F.a)(),m=o.g?Math.floor((y.a.get().width-8)/44):9,u=44*Math.ceil(e.emojis.length/m);return n.a.createElement("div",{ref:l,key:e.id,id:"emoji-category-"+t,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name",dir:"auto"},d("recent"===e.id?"RecentStickers":"Emoji"+t)),n.a.createElement("div",{className:Object(ce.a)("symbol-set-container",i),style:`height: ${u}px;`,dir:d.isRtl?"rtl":void 0},r&&e.emojis.map(e=>{const t=a[e],c="id"in t?t:t[1];return n.a.createElement(tc,{key:c.id,emoji:c,onClick:s})})))});a(290);const nc={recent:"icon-recent",people:"icon-smile",nature:"icon-animals",foods:"icon-eats",activity:"icon-sport",places:"icon-car",objects:"icon-lamp",symbols:"icon-language",flags:"icon-flag"},cc=[];let rc,sc,lc;var oc=Object(n.h)(Object(c.h)(e=>Object(u.l)(e,["recentEmojis"]))(({className:e,onEmojiSelect:t,recentEmojis:c})=>{const r=Object(n.q)(null),s=Object(n.q)(null),[i,d]=Object(n.r)(),[m,u]=Object(n.r)(),[h,b]=Object(n.r)(0),{observe:g}=Object(sa.a)({rootRef:r,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("emoji-category-"))return;const a=Number(t.replace("emoji-category-",""));cc[a]=e.isIntersecting});const t=cc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&b(t[Math.floor(t.length/2)].index)});Object(Ke.a)(s.current,!o.g),Object(n.n)(()=>{if(!i)return;const e=s.current;if(!e)return;const t=42*h-e.offsetWidth/2+21;Object(ec.a)(e,t)},[i,h]);const p=Object(F.a)(),v=Object(n.p)(()=>{if(!i)return He.a;const e=[...i];return c&&c.length&&e.unshift({id:"recent",name:p("RecentStickers"),emojis:c}),e},[i,p,c]);Object(n.n)(()=>{setTimeout(()=>{const e=()=>{d(lc.categories),u(lc.emojis)};lc?e():async function(){rc||(rc=a.e(1).then(a.t.bind(null,315,3)),sc=(await rc).default,lc=Object(Jn.b)(sc));return rc}().then(e)},200)},[]);const E=Object(n.m)(e=>{b(e);const t=document.getElementById("emoji-category-"+e);Object($n.a)(r.current,t,"start",50,800)},[]),O=Object(n.m)((e,a)=>{t(e,a)},[t]),f=Object(ot.a)([],l.T);const j=Object(ce.a)("EmojiPicker",e);return m&&f?n.a.createElement("div",{className:j},n.a.createElement("div",{ref:s,className:"EmojiPicker-header",dir:p.isRtl?"rtl":""},v.map((function(e,t){const a=nc[e.id];return a&&n.a.createElement(R.a,{className:"symbol-set-button "+(t===h?"activated":""),round:!0,faded:!0,color:"translucent",onClick:()=>E(t),ariaLabel:e.name},n.a.createElement("i",{className:a}))}))),n.a.createElement("div",{ref:r,className:"EmojiPicker-main no-selection no-scrollbar"},v.map((e,t)=>n.a.createElement(ac,{category:e,index:t,allEmojis:m,observeIntersection:g,shouldRender:h>=t-1&&h<=t+1,onEmojiSelect:O})))):n.a.createElement("div",{className:j},n.a.createElement(be.a,null))}));const ic=o.g?8:16;var dc=Object(n.h)(({stickerSet:e,loadAndPlay:t,index:a,observeIntersection:c,shouldRender:r,onStickerSelect:s,onStickerUnfave:i})=>{const d=Object(n.q)(null);Object(sa.c)(d,c);const{transitionClassNames:m}=Object(W.a)(r,void 0,void 0,"slow"),u=o.g?Math.floor((y.a.get().width-8)/(l.yb+ic)):5,h=Math.ceil(e.count/u)*(l.yb+ic);return n.a.createElement("div",{ref:d,key:e.id,id:"sticker-set-"+a,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name"},e.title),n.a.createElement("div",{className:Object(ce.a)("symbol-set-container",m),style:`height: ${h}px;`},r&&e.stickers&&e.stickers.map(a=>n.a.createElement(ha,{key:a.id,sticker:a,size:l.yb,observeIntersection:c,noAnimate:!t,onClick:s,clickArg:a,onUnfaveClick:"favorite"===e.id?i:void 0}))))});a(291);const mc=[];var uc=Object(n.h)(Object(c.h)(e=>{const{setsById:t,added:a,recent:n,favorite:c}=e.stickers;return{recentStickers:n.stickers,favoriteStickers:c.stickers,stickerSetsById:t,addedSetIds:a.setIds,shouldPlay:e.settings.byKey.shouldLoopStickers}},(e,t)=>Object(u.l)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"]))(({className:e,loadAndPlay:t,canSendStickers:a,recentStickers:c,favoriteStickers:r,addedSetIds:s,stickerSetsById:o,shouldPlay:i,onStickerSelect:d,loadStickerSets:m,loadRecentStickers:u,loadFavoriteStickers:h,loadAddedStickers:b,addRecentSticker:g,unfaveSticker:p})=>{const v=Object(n.q)(null),E=Object(n.q)(null),[O,f]=Object(n.r)(0),{observe:j}=Object(sa.a)({rootRef:v,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("sticker-set-"))return;const a=Number(t.replace("sticker-set-",""));mc[a]=e.isIntersecting});const t=mc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&f(t[Math.floor(t.length/2)].index)}),{observe:C}=Object(sa.a)({rootRef:E}),y=Object(F.a)(),k=Boolean(s),N=Object(n.p)(()=>s?[{id:"recent",title:y("RecentStickers"),stickers:c,count:c.length},{id:"favorite",title:y("FavoriteStickers"),stickers:r,count:r.length},...s.map(e=>o[e]).filter(Boolean)]:He.a,[s,y,c,r,o]),I=Object(n.p)(()=>k&&0===N.filter(e=>e.stickers&&e.stickers.length).length,[N,k]);Object(n.n)(()=>{t&&(m(),u(),h())},[t,h,u,m]),Object(n.n)(()=>{s&&s.length&&b()},[s,b]),Object(Ke.a)(E.current),Object(n.n)(()=>{if(!k)return;const e=E.current;if(!e)return;const t=52*O-(e.offsetWidth/2-26);Object(ec.a)(e,t)},[k,O]);const S=Object(n.m)(e=>{f(e);const t=document.getElementById("sticker-set-"+e);Object($n.a)(v.current,t,"start",void 0,500)},[]),w=Object(n.m)(e=>{d(e),g({sticker:e})},[g,d]),P=Object(n.m)(e=>{p({sticker:e})},[p]),M=Object(ot.a)([],l.pb);const L=Object(ce.a)("StickerPicker",e);return k&&M&&!I&&a?n.a.createElement("div",{className:L},n.a.createElement("div",{ref:E,className:"StickerPicker-header no-selection no-scrollbar"},N.map((function(e,t){const a=e.stickers&&e.stickers[0],c=Object(ce.a)("symbol-set-button sticker-set-button",t===O&&"activated");return"recent"===e.id||"favorite"===e.id||e.hasThumbnail||!a?n.a.createElement(R.a,{key:e.id,className:c,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>S(t)},"recent"===e.id?n.a.createElement("i",{className:"icon-recent"}):"favorite"===e.id?n.a.createElement("i",{className:"icon-favorite"}):e.isAnimated?n.a.createElement(ma,{stickerSet:e,observeIntersection:C}):n.a.createElement(ua,{stickerSet:e,observeIntersection:C})):n.a.createElement(ha,{key:e.id,sticker:a,size:l.zb,title:e.title,className:c,observeIntersection:C,onClick:S,clickArg:t})}))),n.a.createElement("div",{ref:v,className:"StickerPicker-main no-scrollbar"},N.map((e,a)=>n.a.createElement(dc,{key:e.id,stickerSet:e,loadAndPlay:Boolean(i&&t),index:a,observeIntersection:j,shouldRender:O>=a-1&&O<=a+1,onStickerSelect:w,onStickerUnfave:P})))):n.a.createElement("div",{className:L},a?I?n.a.createElement("div",{className:"picker-disabled"},"You have no saved Stickers."):n.a.createElement(be.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending stickers is not allowed in this chat."))}));a(292);function hc(){return(hc=Object.assign||function(e){for(var t=1;t{const s=Object(n.q)(null),l=Object(n.q)(null),o=e.thumbnail&&!!e.thumbnail.dataUri,i="gif"+e.id,d=Object(sa.b)(s,t)&&!a,m=Object(v.a)(i+"?size=m",!d,r.ApiMediaFormat.BlobUrl),u=Object(Sa.a)(e.thumbnail&&e.thumbnail.dataUri,Boolean(m)),h=Object(v.a)(i,!d,r.ApiMediaFormat.BlobUrl),b=Boolean(d&&h),{transitionClassNames:g}=Object(ia.a)(o||m||h,"slow"),{isBuffered:p,bufferingHandlers:E}=Object(K.a)(!0),O=d&&!p;Object(Q.a)(l,[b]);const f=Object(n.m)(()=>c({...e,blobUrl:h}),[c,e,h]),j=Object(ce.a)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs}),(e,t)=>Object(u.l)(t,["loadSavedGifs"]))(({className:e,loadAndPlay:t,canSendGifs:a,savedGifs:c,onGifSelect:r,loadSavedGifs:s})=>{const o=Object(n.q)(null),{observe:i}=Object(sa.a)({rootRef:o,debounceMs:300});Object(n.n)(()=>{t&&s()},[t,s]);const d=Object(ot.a)([],l.pb);return n.a.createElement("div",{ref:o,className:Object(ce.a)("GifPicker no-scrollbar",e)},a?d&&c&&c.length?c.map(e=>n.a.createElement(bc,{key:e.id,gif:e,observeIntersection:i,isDisabled:!t,onClick:r})):d&&c?n.a.createElement("div",{className:"picker-disabled"},"No saved GIFs."):n.a.createElement(be.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))}));let pc;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(pc||(pc={}));const vc=Object.values(pc).filter(e=>"string"==typeof e),Ec={[pc.Emoji]:"icon-smile",[pc.Stickers]:"icon-stickers",[pc.GIFs]:"icon-gifs"};var Oc=Object(n.h)(({activeTab:e,onSwitchTab:t,onRemoveSymbol:a,onSearchOpen:c})=>{const r=Object(F.a)();function s(a){return n.a.createElement(R.a,{className:"symbol-tab-button "+(e===a?"activated":""),onClick:()=>t(a),ariaLabel:vc[a],round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:Ec[a]}))}const l=Object(n.m)(()=>{c(e===pc.Stickers?"stickers":"gifs")},[e,c]);return n.a.createElement("div",{className:"SymbolMenu-footer",onClick:function(e){e.stopPropagation()},dir:r.isRtl?"rtl":void 0},e!==pc.Emoji&&n.a.createElement(R.a,{className:"symbol-search-button",ariaLabel:e===pc.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:l},n.a.createElement("i",{className:"icon-search"})),s(pc.Emoji),s(pc.Stickers),s(pc.GIFs),e===pc.Emoji&&n.a.createElement(R.a,{className:"symbol-delete-button",onClick:a,ariaLabel:"Remove Symbol",round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:"icon-delete-left"})))});a(294);let fc=!1;var jc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onLoad:a,onClose:c,onEmojiSelect:r,onStickerSelect:s,onGifSelect:l,onRemoveSymbol:i,onSearchOpen:d,addRecentEmoji:m})=>{const[u,h]=Object(n.r)(0),[b,g]=Object(n.r)([]),[p,v]=Xn(e,c),{shouldRender:E,transitionClassNames:O}=Object(W.a)(e,c,!1,!1);!fc&&e&&(fc=!0),Object(n.n)(()=>{a()},[a]),Object(n.o)(()=>{if(o.g)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&Object(V.b)(()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout(()=>{document.body.classList.remove("enable-symbol-menu-transforms")},350)})}},[e]);const f=Object(n.q)(b);f.current=b,Object(n.n)(()=>{f.current.length&&(f.current.forEach(e=>{m({emoji:e})}),g([]))},[e,u,m]);const j=Object(n.m)((e,t)=>{g(e=>[...e,t]),r(e)},[r]),C=Object(n.m)(e=>{c(),d(e)},[c,d]),y=Object(F.a)(),{canSendStickers:k,canSendGifs:N}=t;function I(t,a){switch(u){case pc.Emoji:return n.a.createElement(oc,{className:"picker-tab",onEmojiSelect:j});case pc.Stickers:return n.a.createElement(uc,{className:"picker-tab",loadAndPlay:!!k&&(e&&(t||a)),canSendStickers:k,onStickerSelect:s});case pc.GIFs:return n.a.createElement(gc,{className:"picker-tab",loadAndPlay:!!N&&(e&&(t||a)),canSendGifs:N,onGifSelect:l})}}const S=n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},fc&&n.a.createElement(T.a,{name:"slide",activeKey:u,renderCount:vc.length},I)),o.g&&n.a.createElement(R.a,{round:!0,faded:!0,color:"translucent",ariaLabel:y("Close"),className:"symbol-close-button",size:"tiny",onClick:c},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(Oc,{activeTab:u,onSwitchTab:h,onRemoveSymbol:i,onSearchOpen:C}));if(o.g){if(!E)return;const e=Object(ce.a)("SymbolMenu mobile-menu",O);return n.a.createElement(Ln.a,null,n.a.createElement("div",{className:e},S))}return n.a.createElement(wn.a,{isOpen:e,positionX:"left",positionY:"bottom",onClose:c,className:"SymbolMenu",onCloseAnimationEnd:c,onMouseEnter:o.l?void 0:p,onMouseLeave:o.l?void 0:v,noCloseOnBackdrop:!o.l},S)});a(295);var Cc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onFileSelect:a,onPollCreate:c,onClose:r})=>{const[s,i]=Xn(e,r),d=Object(n.m)((e,t)=>{const{files:n}=e.target;n&&n.length>0&&a(Array.from(n),t)},[a]),m=Object(n.m)(()=>{Oa(l.l,e=>d(e,!0))},[d]),u=Object(n.m)(()=>{Oa("*",e=>d(e,!1))},[d]),h=Object(F.a)(),{canAttachMedia:b,canAttachPolls:g}=t;return n.a.createElement(wn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:r,className:"AttachMenu fluid",onCloseAnimationEnd:r,onMouseEnter:o.l?void 0:s,onMouseLeave:o.l?void 0:i,noCloseOnBackdrop:!o.l},!b&&n.a.createElement(q.a,{className:"media-disabled",disabled:!0},"Posting media content is not allowed in this group."),b&&n.a.createElement(n.a.Fragment,null,n.a.createElement(q.a,{icon:"photo",onClick:m},h("AttachmentMenu.PhotoOrVideo")),n.a.createElement(q.a,{icon:"document",onClick:u},h("AttachDocument"))),g&&n.a.createElement(q.a,{icon:"poll",onClick:c},h("Poll")))});a(296);var yc=Object(n.h)(Object(c.h)(e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}},(e,t)=>Object(u.l)(t,["clearStickersForEmoji"]))(({isOpen:e,onStickerSelect:t,stickers:a,clearStickersForEmoji:c})=>{const r=Object(n.q)(null),{shouldRender:s,transitionClassNames:i}=Object(W.a)(e,void 0,void 0,!1),d=Object(f.a)(a,!0),m=a||d,{observe:u}=Object(sa.a)({rootRef:r,throttleMs:200});Object(n.n)(()=>e?Object(b.a)(c):void 0,[e,c]);const h=Object(ce.a)("StickerTooltip composer-tooltip custom-scroll",i,!(m&&m.length)&&"hidden");return n.a.createElement("div",{ref:r,className:h,onMouseEnter:o.l?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:o.l?void 0:()=>{document.body.classList.remove("no-select")}},s&&m?m.map(e=>n.a.createElement(ha,{key:e.id,sticker:e,size:l.yb,observeIntersection:u,onClick:t,clickArg:e})):s?n.a.createElement(be.a,null):void 0)}));a(297);var kc=Object(n.h)(Object(c.h)((e,{messageId:t})=>{const{chatId:a}=Object(d.y)(e)||{};return a?{message:Object(d.k)(e,a,t)}:{}},(e,t)=>Object(u.l)(t,["clickInlineButton"]))(({isOpen:e,message:t,onClose:a,clickInlineButton:c})=>{const[r,s]=Xn(e,a);if(t&&t.keyboardButtons)return n.a.createElement(wn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:a,className:"KeyboardMenu",onCloseAnimationEnd:a,onMouseEnter:o.l?void 0:r,onMouseLeave:o.l?void 0:s,noCloseOnBackdrop:!o.l},n.a.createElement("div",{className:"content"},t.keyboardButtons.map(e=>n.a.createElement("div",{className:"row"},e.map(e=>n.a.createElement(R.a,{ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>c({button:e})},e.text))))))}));a(298);var Nc=Object(n.h)(({isOpen:e,onSilentSend:t,onScheduleSend:a,onClose:c,onCloseAnimationEnd:r})=>{const[s,l]=Xn(e,c),i=Object(F.a)();return n.a.createElement(wn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:c,onCloseAnimationEnd:r,onMouseEnter:o.l?void 0:s,onMouseLeave:o.l?void 0:l,noCloseOnBackdrop:!o.l},t&&n.a.createElement(q.a,{icon:"mute",onClick:t},i("SendWithoutSound")),a&&n.a.createElement(q.a,{icon:"schedule",onClick:a},i("ScheduleMessage")))}),Ic=a(139),Sc=a(164),wc=a(175);a(299);var Pc=Object(n.h)(({isOpen:e,language:t,emojis:a,onClose:c,onEmojiSelect:r,addRecentEmoji:s,loadEmojiKeywords:l})=>{const i=Object(n.q)(null),{shouldRender:d,transitionClassNames:m}=Object(W.a)(e,void 0,void 0,!1),u=Object(wc.a)(a.length?a:void 0,350)||[],[h,b]=Object(n.r)(-1);Object(n.n)(()=>{l({language:t})},[l,t]),Object(n.n)(()=>{b(0)},[a]),Object(n.n)(()=>{!function(e,t){const a=t.current;if(!a)return;const{visibleIndexes:n,allElements:c}=zn(a,".EmojiButton",8,!0,!0,!0);if(!c.length||!c[e])return;const r=n[0];if(!n.includes(e)||e===r&&!Hn(a,c[r],!0)){const t="start"===(e>n[n.length-1]?"start":"end")?44*e:0;Object(ec.a)(a,t)}}(h,i)},[h]);const g=Object(n.m)(e=>{if(!a.length)return-1;const t=a.length;return Object(Vn.a)(t,e)},[a]),p=Object(n.m)((e,t)=>{t.preventDefault(),b(t=>g(t+e))},[b,g]),v=Object(n.m)(e=>{if(a.length&&h>-1){const t=a[h];t&&(e.preventDefault(),r(t.native),s({emoji:t.id}))}},[s,a,r,h]);Object(n.n)(()=>e?Object(Ue.a)({onEsc:c,onLeft:e=>p(-1,e),onRight:e=>p(1,e),onEnter:v}):void 0,[p,v,e,c]);const E=Object(ce.a)("EmojiTooltip composer-tooltip custom-scroll-x",m);return n.a.createElement("div",{ref:i,className:E,onMouseEnter:o.l?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:o.l?void 0:()=>{document.body.classList.remove("no-select")}},d&&u?u.map((e,t)=>n.a.createElement(tc,{key:e.id,emoji:e,focus:h===t,onClick:r})):d?n.a.createElement(be.a,null):void 0)}),Mc=a(171);a(300);var Fc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),n=a&&Object(d.m)(e,a.id);if(!a||!n)return{};const{query:c,results:r}=Object(d.A)(e)||{},{totalCount:s,foundIds:l}=r||{};return{chat:a,messagesById:n,query:c,totalCount:s,foundIds:l}},(e,t)=>Object(u.l)(t,["searchTextMessagesLocal","focusMessage"]))(({chatId:e,threadId:t,chat:a,messagesById:r,query:s,totalCount:l,foundIds:o,searchTextMessagesLocal:i,focusMessage:h})=>{const b=Object(F.a)(),g=Object(n.p)(()=>{if(!(s&&o&&o.length&&r))return He.a;const n=o.map(n=>{const s=r[n];if(!s)return;const l=s.senderId?Object(d.Gb)(Object(c.e)(),s.senderId):void 0;let o;if(a&&Object(m.kb)(a))o=a;else if(s.forwardInfo){const{isChannelPost:e,fromChatId:t}=s.forwardInfo;o=e&&t?Object(d.f)(Object(c.e)(),t):void 0}else o=s.senderId?Object(d.f)(Object(c.e)(),s.senderId):void 0;return{message:s,senderUser:l,senderChat:o,onClick:()=>h({chatId:e,threadId:t,messageId:n})}}).filter(Boolean);return Object(u.k)(n,({message:e})=>e.date,"desc")},[e,t,h,o,a,r,s]),p=Object(n.q)(null),v=Object(he.a)(p,!0,e=>{g&&g[e]&&g[e].onClick()},".ListItem-button",!0);return n.a.createElement(ve.a,{className:"RightSearch custom-scroll",items:g,preloadBackwards:0,onLoadMore:i,noFastList:!0,onKeyDown:v,ref:p},n.a.createElement("p",{className:"helper-text",dir:"auto"},s?0!==l&&g.length?1===l?"1 message found":(g.length&&(l||g.length))+" messages found":b("lng_search_no_results"):b("lng_dlg_search_for_messages")),g.map(({message:e,senderUser:t,senderChat:a,onClick:c})=>{const r=a?Object(m.l)(b,a):Object(m.ab)(t),l=Object(m.O)(b,e);return n.a.createElement(Ee.a,{className:"chat-item-clickable search-result-message m-0",onClick:c},n.a.createElement(x.a,{chat:a,user:t}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",{dir:"auto"},r&&Object(B.a)(r)),n.a.createElement(Mc.a,{message:e})),n.a.createElement("div",{className:"subtitle",dir:"auto"},Object(B.a)(l,["emoji","highlight"],{highlight:s}))))}))})),Lc=a(51);var Ac=Object(n.h)(Object(c.h)((e,{stickerSetId:t})=>({set:Object(d.xb)(e,t),shouldPlay:Object(d.wb)(e)}),(e,t)=>Object(u.l)(t,["loadStickers","toggleStickerSet"]))(({stickerSetId:e,observeIntersection:t,set:a,shouldPlay:c,loadStickers:r,toggleStickerSet:s,isSomeModalOpen:o,onModalToggle:i})=>{const d=Object(F.a)(),m=a&&Boolean(a.installedDate),u=Boolean(a&&a.stickers),[h,b,g]=Object(xe.a)();Object(Lc.a)(()=>{i(h)},[h,i]);const p=Object(n.p)(()=>{if(!a)return[];const e=(a.covers||[]).map(({id:e})=>e),t=a.stickers?a.stickers.filter(({id:t})=>!e.includes(t)):[];return[...a.covers||[],...t].slice(0,5)},[a]);Object(n.n)(()=>{!u&&p.length<5&&r({stickerSetId:e})},[u,p.length,r,e]);const v=Object(n.m)(()=>{s({stickerSetId:e})},[s,e]);if(!a)return;const E=p.length>0;return n.a.createElement("div",{key:a.id,className:"sticker-set",dir:d.isRtl?"rtl":void 0},n.a.createElement("div",{className:"sticker-set-header"},n.a.createElement("div",{className:"title-wrapper"},n.a.createElement("h3",{className:"title",dir:"auto"},a.title),n.a.createElement("p",{className:"count",dir:"auto"},d("Stickers",a.count,"i"))),n.a.createElement(R.a,{className:m?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:v},d(m?"Stickers.Installed":"Stickers.Install"))),n.a.createElement("div",{className:"sticker-set-main"},!E&&n.a.createElement(L.a,null),E&&p.map(e=>n.a.createElement(ha,{sticker:e,size:l.Ab,observeIntersection:t,noAnimate:!c||h||o,onClick:b}))),E&&n.a.createElement(ga.a,{isOpen:h,fromSticker:p[0],onClose:g}))}));a(301);const Tc=Object(V.g)(e=>e(),6e4,!0);var Rc=Object(n.h)(Object(c.h)(e=>{const t=Object(d.z)(e),{query:a,resultIds:n}=t||{},{featured:c}=e.stickers;return{query:a,featuredIds:c.setIds,resultIds:n}},(e,t)=>Object(u.l)(t,["loadFeaturedStickers"]))(({query:e,featuredIds:t,resultIds:a,loadFeaturedStickers:c})=>{const r=Object(n.q)(null),s=Object(F.a)(),[l,o]=Object(n.r)(!1),{observe:i}=Object(sa.a)({rootRef:r,throttleMs:200});return Object(n.n)(()=>{Tc(()=>{c()})}),n.a.createElement("div",{ref:r,className:"StickerSearch custom-scroll",dir:s.isRtl?"rtl":void 0},function(){if(void 0!==e)return!e&&t?t.map(e=>n.a.createElement(Ac,{key:e,stickerSetId:e,observeIntersection:i,isSomeModalOpen:l,onModalToggle:o})):a?a.length?a.map(e=>n.a.createElement(Ac,{key:e,stickerSetId:e,observeIntersection:i,isSomeModalOpen:l,onModalToggle:o})):n.a.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):n.a.createElement(be.a,null)}())}));a(302);var Dc=Object(n.h)(Object(c.h)(e=>{const t=Object(d.s)(e),{query:a,results:n}=t||{},{chatId:c}=Object(d.y)(e)||{},r=c?Object(d.f)(e,c):void 0;return{query:a,results:n,chat:r,isChatWithBot:r?Object(d.O)(e,r):void 0}},(e,t)=>Object(u.l)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"]))(({query:e,results:t,chat:a,isChatWithBot:c,searchMoreGifs:r,sendMessage:s,setGifSearchQuery:l})=>{const i=Object(n.q)(null),{observe:d}=Object(sa.a)({rootRef:i,debounceMs:300}),{canSendGifs:u}=Object(m.c)(a,c),h=Object(n.m)(e=>{u&&s({gif:e}),o.l&&l({query:void 0})},[u,s,l]),b=Object(F.a)();const g=Boolean(void 0!==e&&t&&t.length);return n.a.createElement("div",{className:"GifSearch",dir:b.isRtl?"rtl":void 0},n.a.createElement(ve.a,{ref:i,className:Object(ce.a)("gif-container custom-scroll",g&&"grid"),items:t,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:r},function(){if(void 0!==e)return t?t.length?t.map(e=>n.a.createElement(bc,{key:e.id,gif:e,observeIntersection:d,onClick:h})):n.a.createElement("p",{className:"helper-text",dir:"auto"},b("NoGIFsFound")):n.a.createElement(be.a,null)}()))}));a(303);var Bc=Object(n.h)(Object(c.h)((e,{answer:t})=>{const{voters:a,offsets:n}=e.pollResults;return{voters:a&&a[t.option],offset:n&&n[t.option]||""}},(e,t)=>Object(u.l)(t,["loadPollOptionResults","openChat","closePollResults"]))(({chat:e,message:t,answer:a,answerVote:c,totalVoters:r,voters:s,offset:l,loadPollOptionResults:o,openChat:i,closePollResults:d})=>{const m=Object(f.a)(c.votersCount),[u,h]=Object(n.r)(!0),b=Boolean(s),{option:g,text:p}=a,v=Object(F.a)();Object(n.n)(()=>{b&&m===c.votersCount||o({chat:e,messageId:t.id,option:g,offset:l,limit:4,shouldResetVoters:!0})},[c.votersCount,b]);const E=Object(n.m)(()=>{h(!0),o({chat:e,messageId:t.id,option:g,offset:l,limit:50})},[e,o,t.id,l,g]);Object(n.n)(()=>{h(!1)},[s]);const O=Object(n.m)(e=>{i({id:e}),d()},[d,i]);return n.a.createElement("div",{className:"PollAnswerResults"},n.a.createElement("div",{className:"poll-voters"},s?s.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable",onClick:()=>O(e)},n.a.createElement(Oe.a,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0}))):n.a.createElement(be.a,null),s&&function(){const e=c.votersCount-s.length;return c.votersCount>4&&e>0&&n.a.createElement(Xt,{count:e,itemName:"voter",isLoading:u,onClick:E})}()),n.a.createElement("div",{className:"answer-head",dir:v.isRtl?"rtl":void 0},n.a.createElement("span",{className:"answer-title",dir:"auto"},p),n.a.createElement("span",{className:"answer-percent",dir:v.isRtl?"auto":void 0},(j=c.votersCount,(C=r)>0?(j/C*100).toFixed():0),"%")));var j,C}));a(304);var xc=Object(n.h)(Object(c.h)(e=>{const{pollResults:{chatId:t,messageId:a},lastSyncTime:n}=e;if(!t||!a)return{};return{chat:Object(d.f)(e,t),message:Object(d.k)(e,t,a),lastSyncTime:n}})(({chat:e,message:t,lastSyncTime:a})=>{const c=Object(F.a)();if(!t||!e)return n.a.createElement(be.a,null);const{summary:r,results:s}=Object(m.I)(t);if(!s.results)return;const l=Object(u.c)(s.results,"option");return n.a.createElement("div",{className:"PollResults",dir:c.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"poll-question",dir:"auto"},r.question),n.a.createElement("div",{className:"poll-results-list custom-scroll"},a&&r.answers.map(a=>n.a.createElement(Bc,{key:`${t.id}-${a.option}`,chat:e,message:t,answer:a,answerVote:l[a.option],totalVoters:s.totalVoters})),!a&&n.a.createElement(be.a,null)))}));a(166);var Uc=Object(n.h)(Object(c.h)((e,{userId:t})=>{const a=Object(d.Gb)(e,t),n=Object(d.f)(e,t),{progress:c}=e.management;return{user:a,chat:n,progress:c}},(e,t)=>Object(u.l)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"]))(({userId:e,user:t,chat:a,progress:c,updateContact:r,deleteUser:l,deleteHistory:o,closeManagement:i,openChat:d})=>{const[m,u,h]=Object(xe.a)(),[b,g]=Object(n.r)(!1),[p,v]=Object(n.r)(),E=Object(F.a)(),O=t&&t.firstName||"",f=t&&t.lastName||"",j=a?a.isMuted:void 0,[C,y]=Object(n.r)(O),[k,N]=Object(n.r)(f),[I,S]=Object(n.r)(!j);Object(n.n)(()=>{S(!j)},[j]),Object(n.n)(()=>{g(!1),h()},[h,e]),Object(n.n)(()=>{y(O),N(f)},[O,f,t]),Object(n.n)(()=>{c===s.f.Complete&&(g(!1),v(void 0),h())},[h,c]);const w=Object(n.m)(e=>{y(e.target.value),g(!0)},[]),P=Object(n.m)(e=>{N(e.target.value),g(!0)},[]),M=Object(n.m)(e=>{S(e.target.checked),g(!0)},[]),A=Object(n.m)(()=>{const t=C.trim(),a=k.trim();t.length||v("Please provide first name"),r({userId:e,isMuted:!I,firstName:t,lastName:a})},[C,k,r,e,I]),T=Object(n.m)(()=>{o({chatId:a.id,shouldDeleteForAll:!1}),l({userId:e}),h(),i(),d({id:void 0})},[a.id,h,i,o,l,d,e]);if(!t)return;const R=c===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Oe.a,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),n.a.createElement(pe.a,{id:"user-first-name",label:E("UserInfo.FirstNamePlaceholder"),onChange:w,value:C,error:"Please provide first name"===p?p:void 0}),n.a.createElement(pe.a,{id:"user-last-name",label:E("UserInfo.LastNamePlaceholder"),onChange:P,value:k}),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(aa.a,{checked:I,label:E("Notifications"),subLabel:E(I?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:M}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:u},E("DeleteContact")))),n.a.createElement(qt,{isShown:b,onClick:A,disabled:R,ariaLabel:E("Save")},R?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:m,onClose:h,text:E("AreYouSureDeleteContact"),confirmLabel:E("DeleteContact"),confirmHandler:T,confirmIsDestructive:!0}))}));var Gc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{progress:n}=e.management,c=Boolean(a.fullInfo&&a.fullInfo.linkedChatId);return{chat:a,progress:n,isBasicGroup:Object(m.jb)(a),hasLinkedChannel:c,canChangeInfo:Object(m.q)(a,"changeInfo"),canBanUsers:Object(m.q)(a,"banUsers")}},(e,t)=>Object(u.l)(t,["togglePreHistoryHidden","updateChat","closeManagement","deleteHistory","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isBasicGroup:c,hasLinkedChannel:l,canChangeInfo:o,canBanUsers:i,onScreenSelect:d,togglePreHistoryHidden:u,updateChat:h,deleteHistory:b,leaveChannel:g,deleteChannel:p,closeManagement:E,openChat:O})=>{const[f,j,C]=Object(xe.a)(),y=t.title,k=t.fullInfo&&t.fullInfo.about||"",[N,I]=Object(n.r)(!1),[S,w]=Object(n.r)(y),[P,M]=Object(n.r)(k),[A,T]=Object(n.r)(),[R,D]=Object(n.r)(),x=Object(m.f)(t),U=Object(v.a)(x,!1,r.ApiMediaFormat.BlobUrl),G=Object(F.a)();Object(n.n)(()=>{a===s.f.Complete&&(I(!1),D(void 0))},[a]);const q=Object(n.m)(()=>{d(s.g.ChatPrivacyType)},[d]),z=Object(n.m)(()=>{d(s.g.Discussion)},[d]),H=Object(n.m)(()=>{d(s.g.GroupPermissions)},[d]),$=Object(n.m)(()=>{d(s.g.ChatAdministrators)},[d]),V=Object(n.m)(e=>{T(e),I(!0)},[]),_=Object(n.m)(e=>{w(e.target.value),I(!0)},[]),W=Object(n.m)(e=>{M(e.target.value),I(!0)},[]),K=Object(n.m)(()=>{const t=S.trim(),a=P.trim();t.length?h({chatId:e,title:t,about:a,photo:A}):D("Group title can't be empty")},[P,e,A,S,h]),Y=Object(n.m)(()=>{d(s.g.GroupMembers)},[d]),Q=Object(n.m)(()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;u({chatId:t.id,isEnabled:!e})},[t,u]),Z=Object(n.p)(()=>{if(!t.defaultBannedRights)return 0;let e=["sendMessages","sendMedia","embedLinks","sendPolls","changeInfo","inviteUsers","pinMessages"].filter(e=>!t.defaultBannedRights[e]).length;const{sendStickers:a,sendGifs:n}=t.defaultBannedRights;return a||n||(e+=1),e},[t]),X=t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,J=Object(n.m)(()=>{c?b({chatId:t.id,shouldDeleteForAll:!1}):t.isCreator?p({chatId:t.id}):g({chatId:t.id}),C(),E(),O({id:void 0})},[c,t.isCreator,t.id,C,E,b,g,p,O]);if(t.isRestricted)return;const ee=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:U,onChange:V,disabled:!o}),n.a.createElement(pe.a,{id:"group-title",label:G("GroupName"),onChange:_,value:S,error:"Group title can't be empty"===R?R:void 0,disabled:!o}),n.a.createElement(pe.a,{id:"group-about",className:"mb-2",label:G("DescriptionPlaceholder"),onChange:W,value:P,disabled:!o}),t.isCreator&&n.a.createElement(Ee.a,{icon:"lock",multiline:!0,ripple:!0,onClick:q},n.a.createElement("span",{className:"title"},G("GroupType")),n.a.createElement("span",{className:"subtitle"},t.username?G("TypePublic"):G("TypePrivate"))),l&&n.a.createElement(Ee.a,{icon:"message",multiline:!0,ripple:!0,onClick:z},n.a.createElement("span",{className:"title"},G("LinkedChannel")),n.a.createElement("span",{className:"subtitle"},G("DiscussionUnlink"))),n.a.createElement(Ee.a,{icon:"permissions",multiline:!0,ripple:!0,onClick:H,disabled:!i},n.a.createElement("span",{className:"title"},G("ChannelPermissions")),n.a.createElement("span",{className:"subtitle",dir:"auto"},Z,"/",8)),n.a.createElement(Ee.a,{icon:"admin",multiline:!0,ripple:!0,onClick:$},n.a.createElement("span",{className:"title"},G("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},Object(da.a)(X)))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"group",multiline:!0,ripple:!0,onClick:Y},n.a.createElement("span",{className:"title"},G("GroupMembers")),n.a.createElement("span",{className:"subtitle"},Object(da.a)(t.membersCount))),t.fullInfo&&n.a.createElement("div",{className:"ListItem narrow no-selection"},n.a.createElement(aa.a,{checked:!t.fullInfo.isPreHistoryHidden,label:G("ChatHistory"),onChange:Q,disabled:!i}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},G("DeleteMega")))),n.a.createElement(qt,{isShown:N,onClick:K,disabled:ee,ariaLabel:G("Save")},ee?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:f,onClose:C,textParts:Object(B.a)(c||!t.isCreator?G("AreYouSureDeleteAndExit"):G("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:c||!t.isCreator?G("DeleteMega"):G("DeleteGroupForAll"),confirmHandler:J,confirmIsDestructive:!0}))}));var qc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(d.f)(e,t),currentUserId:e.currentUserId}),(e,t)=>Object(u.l)(t,["updateChatDefaultBannedRights"]))(({onScreenSelect:e,onChatMemberSelect:t,chat:a,currentUserId:c,updateChatDefaultBannedRights:r})=>{const[l,o]=Object(n.r)({}),[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),h=Object(F.a)(),b=Object(n.m)(()=>{e(s.g.GroupRemovedUsers)},[e]),g=Object(n.m)(()=>{e(s.g.GroupUserPermissionsCreate)},[e]),p=Object(n.m)(a=>{t(a.userId,a.promotedByUserId===c),e(s.g.GroupUserPermissions)},[c,t,e]);Object(n.n)(()=>{o(a&&a.defaultBannedRights||{}),d(!1),setTimeout(()=>{u(!1)},250)},[a]);const v=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),d(!0)},[]),E=Object(n.m)(()=>{a&&(u(!0),r({chatId:a.id,bannedRights:l}))},[a,l,r]),O=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.kickedMembers?a.fullInfo.kickedMembers.length:0,[a]),f=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.members?a.fullInfo.members.filter(({bannedRights:e})=>!!e):[],[a]),j=Object(n.m)(e=>{const{bannedRights:t}=e;if(!t||!a)return;const{defaultBannedRights:n}=a;return Object.keys(t).reduce((e,a)=>{if(!t[a]||n&&n[a]||"sendInline"===a||"viewMessages"===a||"sendGames"===a)return e;const c=function(e){switch(e){case"sendMessages":return"UserRestrictionsNoSend";case"sendMedia":return"UserRestrictionsNoSendMedia";case"sendStickers":return"UserRestrictionsNoSendStickers";case"embedLinks":return"UserRestrictionsNoEmbedLinks";case"sendPolls":return"UserRestrictionsNoSendPolls";case"changeInfo":return"UserRestrictionsNoChangeInfo";case"inviteUsers":return"UserRestrictionsInviteUsers";case"pinMessages":return"UserRestrictionsPinMessages";default:return}}(a);if(!c)return e;const r=h(c);return`${e}${e.length?", "+r:r}`},"")},[a,h]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading",dir:"auto"},h("ChannelPermissionsHeader")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMessages",checked:!l.sendMessages,label:h("UserRestrictionsSend"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMedia",checked:!l.sendMedia,label:h("UserRestrictionsSendMedia"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:h("UserRestrictionsSendStickers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendPolls",checked:!l.sendPolls,label:h("UserRestrictionsSendPolls"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"embedLinks",checked:!l.embedLinks,label:h("UserRestrictionsEmbedLinks"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!l.inviteUsers,label:h("UserRestrictionsInviteUsers"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!l.pinMessages,label:h("UserRestrictionsPinMessages"),blocking:!0,onChange:v})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!l.changeInfo,label:h("UserRestrictionsChangeInfo"),blocking:!0,onChange:v}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete-user",multiline:!0,ripple:!0,narrow:!0,onClick:b},n.a.createElement("span",{className:"title"},h("ChannelBlockedUsers")),n.a.createElement("span",{className:"subtitle"},O))),n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading",dir:"auto"},h("PrivacyExceptions")),n.a.createElement(Ee.a,{icon:"add-user",ripple:!0,onClick:g},h("ChannelAddException")),f.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable exceptions-member",ripple:!0,onClick:()=>p(e)},n.a.createElement(Oe.a,{userId:e.userId,status:j(e)}))))),n.a.createElement(qt,{isShown:i,onClick:E,ariaLabel:h("Save"),disabled:m},m?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var zc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{chat:a,usersById:n}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,usersById:t,updateChatMemberBannedRights:a})=>{const c=Object(F.a)(),r=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[],[e]),s=Object(n.m)(e=>{if(!e.kickedByUserId)return;const a=t[e.kickedByUserId];return a?c("UserRemovedBy",Object(m.ab)(a)):void 0},[c,t]),l=Object(n.m)(t=>{if(e)return[{title:c("Unblock"),icon:"delete",destructive:!0,handler:()=>a({chatId:e.id,userId:t.userId,bannedRights:{}})}]},[c,e,a]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",dir:c.isRtl?"rtl":void 0},n.a.createElement("p",{className:"text-muted"},c("NoBlockedGroup2")),r.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:l(e)},n.a.createElement(Oe.a,{userId:e.userId,status:s(e)}))))))}));var Hc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{progress:n}=e.management;return{chat:a,progress:n,isSignaturesShown:Boolean(a&&a.isSignaturesShown),canChangeInfo:Object(m.q)(a,"changeInfo")}},(e,t)=>Object(u.l)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isSignaturesShown:c,canChangeInfo:l,onScreenSelect:o,updateChat:i,toggleSignatures:d,closeManagement:u,leaveChannel:h,deleteChannel:b,openChat:g})=>{const p=t&&t.title||"",E=t&&t.fullInfo&&t.fullInfo.about||"",O=t&&t.fullInfo&&t.fullInfo.linkedChatId,[f,j,C]=Object(xe.a)(),[y,k]=Object(n.r)(!1),[N,I]=Object(n.r)(p),[S,w]=Object(n.r)(E),[P,M]=Object(n.r)(),[A,T]=Object(n.r)(),R=t&&Object(m.f)(t),D=Object(v.a)(R,!1,r.ApiMediaFormat.BlobUrl),B=Object(F.a)();Object(n.n)(()=>{a===s.f.Complete&&(k(!1),T(void 0))},[a]);const x=t&&t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,U=Object(n.m)(()=>{o(s.g.ChatPrivacyType)},[o]),G=Object(n.m)(()=>{o(s.g.Discussion)},[o]),q=Object(n.m)(()=>{o(s.g.ChatAdministrators)},[o]),z=Object(n.m)(e=>{M(e),k(!0)},[]),H=Object(n.m)(e=>{I(e.target.value),k(!0)},[]),$=Object(n.m)(e=>{w(e.target.value),k(!0)},[]),V=Object(n.m)(()=>{const t=N.trim(),a=S.trim();t.length?i({chatId:e,title:t,about:a,photo:P}):T("Channel title can't be empty")},[S,e,P,N,i]),_=Object(n.m)(()=>{d({chatId:e,isEnabled:!c})},[e,c,d]),W=Object(n.m)(()=>{o(s.g.ChannelSubscribers)},[o]),K=Object(n.m)(()=>{t.isCreator?b({chatId:t.id}):h({chatId:t.id}),C(),u(),g({id:void 0})},[t.isCreator,t.id,C,u,h,b,g]);if(t.isRestricted)return;const Y=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Gt.a,{currentAvatarBlobUrl:D,onChange:z,disabled:!l}),n.a.createElement(pe.a,{id:"channel-title",label:B("EnterChannelName"),onChange:H,value:N,error:"Channel title can't be empty"===A?A:void 0,disabled:!l}),n.a.createElement(pe.a,{id:"channel-about",className:"mb-2",label:B("DescriptionPlaceholder"),onChange:$,value:S,disabled:!l}),t.isCreator&&n.a.createElement(Ee.a,{icon:"lock",ripple:!0,multiline:!0,onClick:U},n.a.createElement("span",{className:"title"},B("ChannelType")),n.a.createElement("span",{className:"subtitle"},t.username?B("TypePublic"):B("TypePrivate"))),n.a.createElement(Ee.a,{icon:"message",multiline:!0,ripple:!0,onClick:G,disabled:!l},n.a.createElement("span",{className:"title"},B("Discussion")),n.a.createElement("span",{className:"subtitle"},B(O?"DiscussionUnlink":"Add"))),n.a.createElement(Ee.a,{icon:"admin",multiline:!0,ripple:!0,onClick:q},n.a.createElement("span",{className:"title"},B("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},x)),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(aa.a,{checked:c,label:B("ChannelSignMessages"),onChange:_}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"group",multiline:!0,ripple:!0,onClick:W},n.a.createElement("span",{className:"title",dir:"auto"},B("ChannelSubscribers")),n.a.createElement("span",{className:"subtitle",dir:"auto"},B("Subscribers",t.membersCount,"i")))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},t.isCreator?B("ChannelDelete"):B("LeaveChannel")))),n.a.createElement(qt,{isShown:y,onClick:V,disabled:Y,ariaLabel:B("Save")},Y?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:f,onClose:C,text:t.isCreator?B("ChannelDeleteAlert"):B("ChannelLeaveAlert"),confirmLabel:t.isCreator?B("ChannelDelete"):B("LeaveChannel"),confirmHandler:K,confirmIsDestructive:!0}))})),$c=a(57);var Vc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{isUsernameAvailable:n}=Object(d.Z)(e,t);return{chat:a,isChannel:Object(m.kb)(a),progress:e.management.progress,isUsernameAvailable:n}},(e,t)=>Object(u.l)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"]))(({chat:e,isChannel:t,progress:a,isUsernameAvailable:c,checkPublicLink:r,updatePublicLink:l,updatePrivateLink:o})=>{const i=Boolean(e.username),d=e.fullInfo&&e.fullInfo.inviteLink,[m,u]=Object(n.r)(i?"public":"private"),[h,b]=Object(n.r)(),[g,p,v]=Object(xe.a)(),E="public"===m&&h&&c||"private"===m&&i;Object(n.n)(()=>{m&&!d&&o()},[m,d,o]);const O=Object(n.m)(e=>{u(e)},[]),f=Object(n.m)(()=>{l({username:"public"===m?h:""})},[m,l,h]),j=Object(n.m)(()=>{v(),o()},[v,o]),C=Object(F.a)(),y=t?"Channel":"Mega",k=t?"Channel":"Group",N=[{value:"private",label:C(y+"Private"),subLabel:C(y+"PrivateInfo")},{value:"public",label:C(y+"Public"),subLabel:C(y+"PublicInfo")}],I=a===s.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",dir:C.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading"},C(k+"Type")),n.a.createElement(oa.a,{selected:m,name:"channel-type",options:N,onChange:O})),"private"===m?n.a.createElement("div",{className:"section",dir:C.isRtl?"rtl":void 0},d?n.a.createElement(n.a.Fragment,null,n.a.createElement($c.a,{url:d,className:"group-link",text:d}),n.a.createElement("p",{className:"section-info",dir:C.isRtl?"rtl":void 0},C(y+"PrivateLinkHelp")),n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:p},C("RevokeLink")),n.a.createElement(we.a,{isOpen:g,onClose:v,text:C("RevokeAlert"),confirmLabel:C("RevokeButton"),confirmHandler:j,confirmIsDestructive:!0})):n.a.createElement(be.a,null)):n.a.createElement("div",{className:"section no-border"},n.a.createElement(Vt,{asLink:!0,currentUsername:e.username,isLoading:I,isUsernameAvailable:c,checkUsername:r,onChange:b}),n.a.createElement("p",{className:"section-info",dir:"auto"},C(k+".Username.CreatePublicLinkHelp")))),n.a.createElement(qt,{isShown:E,disabled:I,ariaLabel:C("Save"),onClick:f},I?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var _c=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{forDiscussionIds:n,byId:c}=e.chats;return{chat:a,chatsByIds:c,forDiscussionIds:n,linkedChat:a&&a.fullInfo&&a.fullInfo.linkedChatId?Object(d.f)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&Object(m.kb)(a)}},(e,t)=>Object(u.l)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"]))(({chat:e,chatId:t,chatsByIds:a,linkedChat:c,forDiscussionIds:r,isChannel:o,onScreenSelect:i,loadGroupsForDiscussion:d,linkDiscussionGroup:m,unlinkDiscussionGroup:u})=>{const[h,b]=Object(n.r)(),[g,p]=Object(n.r)(),[v,E]=Object(n.r)(!1),O=Object(n.m)(()=>E(!0),[]),[f,j,C]=Object(xe.a)(),[y,k,N]=Object(xe.a)(),I=Object(F.a)(),S=c&&c.id;Object(n.n)(()=>{d()},[d]),Object(n.n)(()=>{g||Object(Kt.a)("DiscussionGroups").then(p)},[g]);const w=Object(n.m)(()=>{C(),u({channelId:o?t:S}),o||i(s.g.Initial)},[C,u,o,t,S,i]),P=Object(n.m)(()=>{N(),m({channelId:t,chatId:h})},[N,m,t,h]);function M(){const e=a[h];if(e)return n.a.createElement("div",{className:"modal-header"},n.a.createElement(x.a,{size:"tiny",chat:e}),n.a.createElement("div",{className:"modal-title"},I("Channel.DiscussionGroup.LinkGroup")))}function L(){const t=a[h];if(t)return t.hasPrivateLink?Object(B.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):Object(B.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?\n\nAnyone from the channel will be able to see messages in this group.`,["br","simple_markdown"])}return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("div",{className:"section-icon"},g&&n.a.createElement(Yt.a,{id:"discussionGroupsDucks",size:l.sb,animationData:g,play:v,noLoop:!0,onLoad:O})),c&&n.a.createElement("div",null,n.a.createElement(Ee.a,{className:"chat-item-clickable",inactive:!0},n.a.createElement(fe.a,{chatId:c.id})),n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),n.a.createElement(we.a,{isOpen:f,onClose:C,header:n.a.createElement("div",{className:"modal-header"},n.a.createElement(x.a,{size:"tiny",chat:c}),n.a.createElement("div",{className:"modal-title"},I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:Object(B.a)(I(o?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",c.title),["br","simple_markdown"]),confirmLabel:I(o?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:w,confirmIsDestructive:!0})),!c&&n.a.createElement("div",null,n.a.createElement("p",{className:"section-help",dir:"auto"},I("DiscussionChannelHelp")),n.a.createElement("div",{teactFastList:!0},n.a.createElement(Ee.a,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},I("DiscussionCreateGroup")),r?r.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{b(e),k()}},n.a.createElement(fe.a,{chatId:e}))):n.a.createElement(tt.a,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),n.a.createElement("p",{className:"mt-4 mb-0 section-help",dir:"auto"},I("DiscussionChannelHelp2")),n.a.createElement(we.a,{isOpen:y,onClose:N,header:M(),textParts:L(),confirmLabel:I("DiscussionLinkGroup"),confirmHandler:P,isButtonsInOneRow:!0})))))}));var Wc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(d.f)(e,t);return{chat:n,isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatMemberBannedRights"]))(({chat:e,selectedChatMemberId:t,onScreenSelect:a,updateChatMemberBannedRights:c,isFormFullyDisabled:r})=>{const[l,o]=Object(n.r)({}),[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),[h,b,g]=Object(xe.a)(),p=Object(F.a)(),v=Object(n.p)(()=>{if(e&&e.fullInfo&&e.fullInfo.members)return e.fullInfo.members.find(({userId:e})=>e===t)},[e,t]);Object(n.n)(()=>{e&&e.fullInfo&&t&&!v&&a(s.g.GroupPermissions)},[e,a,v,t]),Object(n.n)(()=>{o(v&&v.bannedRights||e&&e.defaultBannedRights||{}),d(!1),u(!1)},[e,v]);const E=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}o(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),d(!0)},[]),O=Object(n.m)(()=>{e&&t&&(u(!0),c({chatId:e.id,userId:t,bannedRights:l}))},[e,t,l,c]),f=Object(n.m)(()=>{e&&t&&c({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})},[e,t,c]),j=Object(n.m)(t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t],[e,r]);if(v)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(Oe.a,{userId:v.userId})),n.a.createElement("h3",{className:"section-heading mt-4",dir:"auto"},p("UserRestrictionsCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMessages",checked:!l.sendMessages,label:p("UserRestrictionsSend"),blocking:!0,disabled:j("sendMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendMedia",checked:!l.sendMedia,label:p("UserRestrictionsSendMedia"),blocking:!0,disabled:j("sendMedia"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendStickers",checked:!l.sendStickers&&!l.sendGifs,label:p("UserRestrictionsSendStickers"),blocking:!0,disabled:j("sendStickers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"sendPolls",checked:!l.sendPolls,label:p("UserRestrictionsSendPolls"),blocking:!0,disabled:j("sendPolls"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"embedLinks",checked:!l.embedLinks,label:p("UserRestrictionsEmbedLinks"),blocking:!0,disabled:j("embedLinks"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!l.inviteUsers,label:p("UserRestrictionsInviteUsers"),blocking:!0,disabled:j("inviteUsers"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!l.pinMessages,label:p("UserRestrictionsPinMessages"),blocking:!0,disabled:j("pinMessages"),onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!l.changeInfo,label:p("UserRestrictionsChangeInfo"),blocking:!0,disabled:j("changeInfo"),onChange:E}))),!r&&n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete-user",ripple:!0,destructive:!0,onClick:b},p("UserRestrictionsBlock")))),n.a.createElement(qt,{isShown:i,onClick:O,ariaLabel:p("Save"),disabled:m},m?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:h,onClose:g,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:f,confirmIsDestructive:!0}))}));var Kc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{chat:a,currentUserId:e.currentUserId,isChannel:Object(m.kb)(a),usersById:n}})(({chat:e,isChannel:t,currentUserId:a,usersById:c,onScreenSelect:r,onChatMemberSelect:l})=>{const o=Object(F.a)();const i=Object(n.p)(()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),d=Object(n.m)(e=>{l(e.userId,e.promotedByUserId===a),r(s.g.ChatAdminRights)},[a,l,r]),u=Object(n.m)(e=>{if(e.isOwner)return o("ChannelCreator");const t=e.promotedByUserId?c[e.promotedByUserId]:void 0;return t?o("EditAdminPromotedBy",Object(m.ab)(t)):o("ChannelAdmin")},[o,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"recent",multiline:!0,ripple:!0,onClick:function(){r(s.g.GroupRecentActions)}},n.a.createElement("span",{className:"title"},o("EventLog")),n.a.createElement("span",{className:"subtitle"},o(t?"EventLogInfoDetailChannel":"EventLogInfoDetail")))),n.a.createElement("div",{className:"section",dir:o.isRtl?"rtl":void 0},n.a.createElement("p",{className:"text-muted",dir:"auto"},t?"You can add administrators to help you manage your channel.":"You can add administrators to help you manage your group."),i.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,onClick:()=>d(e)},n.a.createElement(Oe.a,{userId:e.userId,status:u(e),forceShowSelf:!0}))))))}));var Yc=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(d.f)(e,t)}))(({chat:e})=>{const t=Object(F.a)(),a=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),c=Object(n.m)(e=>e.isOwner?t("ChannelCreator"):t("ChannelAdmin"),[t]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section not-implemented",dir:t.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading",dir:"auto"},"Actions"),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogAllEvents"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewAdmins"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterNewMembers"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterChannelInfo"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterDeletedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterEditedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogFilterLeavingMembers"),onChange:void 0}))),n.a.createElement("div",{className:"section not-implemented",dir:t.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading",dir:"auto"},t("Channel.Management.Title")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!0,label:t("EventLogAllAdmins"),onChange:void 0})),a.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},n.a.createElement(aa.a,{label:"",checked:!0}),n.a.createElement(Oe.a,{userId:e.userId,status:c(e),forceShowSelf:!0}))))))}));var Qc=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(d.f)(e,t),{byId:c}=e.users,{currentUserId:r}=e;return{chat:n,usersById:c,currentUserId:r,isChannel:Object(m.kb)(n),isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(u.l)(t,["updateChatAdmin"]))(({selectedChatMemberId:e,onScreenSelect:t,chat:a,usersById:c,currentUserId:r,isChannel:l,isFormFullyDisabled:o,updateChatAdmin:i})=>{const[d,u]=Object(n.r)({}),[h,b]=Object(n.r)(!1),[g,p]=Object(n.r)(!1),[v,E,O]=Object(xe.a)(),[f,j]=Object(n.r)(""),C=Object(F.a)(),y=Object(n.p)(()=>{if(a.fullInfo&&a.fullInfo.adminMembers)return a.fullInfo.adminMembers.find(({userId:t})=>t===e)},[a,e]);Object(n.n)(()=>{a&&a.fullInfo&&e&&!y&&t(s.g.ChatAdministrators)},[a,t,y,e]),Object(n.n)(()=>{u(y&&y.adminRights||{}),j((y&&y.customTitle||"").substr(0,16)),b(!1),p(!1)},[y]);const k=Object(n.m)(e=>{const{name:t}=e.target;u(e=>{return{...e,[t]:(a=e[t],!a||void 0)};var a}),b(!0)},[]),N=Object(n.m)(()=>{e&&(p(!0),i({chatId:a.id,userId:e,adminRights:d,customTitle:f}))},[a,e,d,f,i]),I=Object(n.m)(()=>{e&&(i({chatId:a.id,userId:e,adminRights:{}}),O())},[a.id,O,e,i]),S=Object(n.m)(e=>!Object(m.jb)(a)&&(!(!o&&a.adminRights)||!a.adminRights[e]),[a,o]),w=Object(n.p)(()=>{if(!y)return;if(y.isOwner)return C("ChannelCreator");const e=y.promotedByUserId?c[y.promotedByUserId]:void 0;return e?C("EditAdminPromotedBy",Object(m.ab)(e)):C("ChannelAdmin")},[y,c,C]),P=Object(n.m)(e=>{const{value:t}=e.target;j(t),b(!0)},[]);if(y)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(Oe.a,{userId:y.userId,status:w,forceShowSelf:!0})),n.a.createElement("h3",{className:"section-heading mt-4",dir:"auto"},C("EditAdminWhatCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"changeInfo",checked:!!d.changeInfo,label:C(l?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:S("changeInfo"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"postMessages",checked:!!d.postMessages,label:C("EditAdminPostMessages"),blocking:!0,disabled:S("postMessages"),onChange:k})),l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"editMessages",checked:!!d.editMessages,label:C("EditAdminEditMessages"),blocking:!0,disabled:S("editMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"deleteMessages",checked:!!d.deleteMessages,label:C(l?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:S("deleteMessages"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"banUsers",checked:!!d.banUsers,label:C("EditAdminBanUsers"),blocking:!0,disabled:S("banUsers"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"inviteUsers",checked:!!d.inviteUsers,label:C("EditAdminAddUsers"),blocking:!0,disabled:S("inviteUsers"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"pinMessages",checked:!!d.pinMessages,label:C("EditAdminPinMessages"),blocking:!0,disabled:S("pinMessages"),onChange:k})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"addAdmins",checked:!!d.addAdmins,label:C("EditAdminAddAdmins"),blocking:!0,disabled:S("addAdmins"),onChange:k})),!l&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(aa.a,{name:"anonymous",checked:!!d.anonymous,label:C("EditAdminSendAnonymously"),blocking:!0,disabled:S("anonymous"),onChange:k})),o&&n.a.createElement("p",{className:"section-info mb-4",dir:"auto"},C("Channel.EditAdmin.CannotEdit")),!l&&n.a.createElement(pe.a,{id:"admin-title",label:C("EditAdminRank"),onChange:P,value:f,disabled:o,maxLength:16}),r!==e&&!o&&n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:E},C("EditAdminRemoveAdmin")))),n.a.createElement(qt,{isShown:h,onClick:N,ariaLabel:C("Save"),disabled:g},g?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(we.a,{isOpen:v,onClose:O,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:I,confirmIsDestructive:!0}))}));var Zc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(m.kb)(a)}},(e,t)=>Object(u.l)(t,["openUserInfo"]))(({members:e,usersById:t,isChannel:a,openUserInfo:c})=>{const r=Object(n.p)(()=>{if(e&&t)return Object(m.Fb)(e.map(({userId:e})=>e),t)},[e,t]),s=Object(n.m)(e=>{c({id:e})},[c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},r?r.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>s(e)},n.a.createElement(Oe.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(tt.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Xc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(d.f)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(m.kb)(a)}})(({usersById:e,members:t,isChannel:a,onScreenSelect:c,onChatMemberSelect:r})=>{const l=Object(n.p)(()=>{if(t&&e)return Object(m.Fb)(t.filter(e=>!e.isOwner).map(({userId:e})=>e),e)},[t,e]),o=Object(n.m)(e=>{r(e),c(s.g.GroupUserPermissions)},[r,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},l?l.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>o(e)},n.a.createElement(Oe.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(tt.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var Jc=Object(n.h)(Object(c.h)(e=>({managementType:Object(d.u)(e)}))(({chatId:e,currentScreen:t,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r,onChatMemberSelect:l,managementType:o})=>{switch(t){case s.g.Initial:switch(o){case"user":return n.a.createElement(Uc,{key:e,userId:e});case"group":return n.a.createElement(Gc,{key:e,chatId:e,onScreenSelect:r});case"channel":return n.a.createElement(Hc,{key:e,chatId:e,onScreenSelect:r})}break;case s.g.ChatPrivacyType:return n.a.createElement(Vc,{chatId:e});case s.g.Discussion:return n.a.createElement(_c,{chatId:e,onScreenSelect:r});case s.g.GroupPermissions:return n.a.createElement(qc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRemovedUsers:return n.a.createElement(zc,{chatId:e});case s.g.GroupUserPermissionsCreate:return n.a.createElement(Xc,{chatId:e,onChatMemberSelect:l,onScreenSelect:r});case s.g.GroupUserPermissions:return n.a.createElement(Wc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChatAdministrators:return n.a.createElement(Kc,{chatId:e,onScreenSelect:r,onChatMemberSelect:l});case s.g.GroupRecentActions:return n.a.createElement(Yc,{chatId:e});case s.g.ChatAdminRights:return n.a.createElement(Qc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:r});case s.g.ChannelSubscribers:case s.g.GroupMembers:return n.a.createElement(Zc,{chatId:e})}}));const er={USD:"$",EUR:"€",GBP:"£",JPY:"¥",RUB:"₽",UAH:"₴",INR:"₹",AED:"د.إ"};function tr(e){return e&&er[e]||""}const ar=/^4[0-9]{12}(?:[0-9]{1,3})?$/,nr=/^5[1-5][0-9]{11,14}$/,cr=/^2[2-7][0-9]{11,14}$/;let rr;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(rr||(rr={}));const sr={[rr.Default]:"",[rr.Visa]:"visa",[rr.Mastercard]:"mastercard"};function lr(e){return e=e.replace(/\s/g,""),ar.test(e)?rr.Visa:nr.test(e)||cr.test(e)?rr.Mastercard:rr.Default}var or=a(60);const ir={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},dr=(e,t)=>{switch(t.type){case"changeAddress1":return{...e,streetLine1:t.payload,formErrors:{...e.formErrors,streetLine1:void 0}};case"changeAddress2":return{...e,streetLine2:t.payload,formErrors:{...e.formErrors,streetLine2:void 0}};case"changeCity":return{...e,city:t.payload,formErrors:{...e.formErrors,city:void 0}};case"changeState":return{...e,state:t.payload,formErrors:{...e.formErrors,state:void 0}};case"changeCountry":return{...e,countryIso2:t.payload,billingCountry:mr(t.payload),formErrors:{...e.formErrors,countryIso2:void 0}};case"changePostCode":return{...e,postCode:t.payload,formErrors:{...e.formErrors,postCode:void 0}};case"changeFullName":return{...e,fullName:t.payload,formErrors:{...e.formErrors,fullName:void 0}};case"changeEmail":return{...e,email:t.payload,formErrors:{...e.formErrors,email:void 0}};case"changePhone":return{...e,phone:t.payload,formErrors:{...e.formErrors,phone:void 0}};case"changeShipping":return{...e,shipping:t.payload};case"changeCardNumber":return{...e,cardNumber:t.payload,formErrors:{...e.formErrors,cardNumber:void 0}};case"changeCardholder":return{...e,cardholder:t.payload,formErrors:{...e.formErrors,cardholder:void 0}};case"changeExpiryDate":return{...e,expiry:t.payload,formErrors:{...e.formErrors,expiry:void 0}};case"changeCvvCode":return{...e,cvv:t.payload,formErrors:{...e.formErrors,cvv:void 0}};case"changeBillingCountry":return{...e,billingCountry:t.payload,formErrors:{...e.formErrors,billingCountry:void 0}};case"changeBillingZip":return{...e,billingZip:t.payload,formErrors:{...e.formErrors,billingZip:void 0}};case"changeSaveInfo":return{...e,saveInfo:t.payload};case"changeSaveCredentials":return{...e,saveCredentials:t.payload};case"updateUserInfo":return t.payload.countryIso2?{...e,...t.payload,billingCountry:mr(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function mr(e){const t=xt.a.find(({id:t})=>t===e);return t?t.name:""}function ur(e,t=400){Object(n.n)(()=>{o.l||setTimeout(()=>{Object(V.b)(()=>{e.current&&e.current.focus()})},t)},[e,t])}var hr=Object(n.h)(e=>{const{id:t,value:a,label:c,hasArrow:r,error:s,ref:l,placeholder:o,onChange:i,children:d}=e,m=s||c,u=Object(ce.a)("input-group",a&&"touched",s&&"error",m&&"with-label",r&&"with-arrow","input-group");return n.a.createElement("div",{className:u},n.a.createElement("select",{className:"form-control",id:t,value:a||"",onChange:i,placeholder:o||c,ref:l},d),m&&t&&n.a.createElement("label",{htmlFor:t},m))});a(305);var br=Object(n.h)(({state:e,needEmail:t,needPhone:a,needName:c,needAddress:r,dispatch:s})=>{const l=Object(n.q)(null),o=Object(n.q)(null),i=Object(n.q)(null);Object(n.n)(()=>{i.current&&i.current.value!==e.countryIso2&&(i.current.value=e.countryIso2)},[e.countryIso2]);const d=Object(F.a)();ur(l);const m=Object(n.m)(e=>{s({type:"changeAddress1",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeAddress2",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeCity",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeState",payload:e.target.value})},[s]),g=Object(n.m)(e=>{s({type:"changeCountry",payload:e.target.value})},[s]),p=Object(n.m)(e=>{s({type:"changePostCode",payload:e.target.value})},[s]),v=Object(n.m)(e=>{s({type:"changeFullName",payload:e.target.value})},[s]),E=Object(n.m)(e=>{s({type:"changeEmail",payload:e.target.value})},[s]),O=Object(n.m)(e=>{let{value:t}=e.target;t="+"+t.replace(/\D/g,""),o.current&&(o.current.value=t),s({type:"changePhone",payload:t})},[s]),f=Object(n.m)(e=>{s({type:"changeSaveInfo",payload:e.target.value})},[s]),{formErrors:j}=e;return n.a.createElement("div",{className:"ShippingInfo"},n.a.createElement("form",null,r?n.a.createElement("div",null,n.a.createElement("h5",null,d("PaymentShippingAddress")),n.a.createElement(pe.a,{ref:l,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:j.streetLine1}),n.a.createElement(pe.a,{label:"Address2 (Street)",onChange:u,value:e.streetLine2,inputMode:"text",error:j.streetLine2}),n.a.createElement(pe.a,{label:"City",onChange:h,value:e.city,inputMode:"text",error:j.city}),n.a.createElement(pe.a,{label:"State",onChange:b,value:e.state,inputMode:"text",error:j.state}),n.a.createElement(hr,{label:"Country",placeholder:"Country",onChange:g,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:j.countryIso2,ref:i},xt.a.map(({name:e,id:t})=>n.a.createElement("option",{value:t,className:"county-item"},e))),n.a.createElement(pe.a,{label:"Post Code",onChange:p,value:e.postCode,inputMode:"text",error:j.postCode})):void 0,c||t||a?n.a.createElement("h5",null,d("PaymentShippingReceiver")):void 0,c&&n.a.createElement(pe.a,{label:"Full name",onChange:v,value:e.fullName,inputMode:"text",error:j.fullName}),t&&n.a.createElement(pe.a,{label:"Email",onChange:E,value:e.email,inputMode:"email",error:j.email}),a&&n.a.createElement(pe.a,{label:"Phone number",onChange:O,value:e.phone,inputMode:"tel",error:j.phone,ref:o}),n.a.createElement(aa.a,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:f})))});a(306);var gr=Object(n.h)(({state:e,shippingOptions:t,currency:a,dispatch:c})=>{Object(n.n)(()=>{t&&!e.shipping&&c({type:"changeShipping",payload:t[0].id})},[t,e.shipping,c]);const r=Object(n.m)(e=>{c({type:"changeShipping",payload:e})},[c]),s=Object(n.p)(()=>t.map(({id:e,title:t,amount:n})=>({label:t,subLabel:`${a} ${String(n/100)}`,value:e})),[t,a]);return n.a.createElement("div",{className:"Shipping"},n.a.createElement("form",null,n.a.createElement("p",null,"Select shipping method"),n.a.createElement(oa.a,{name:"shipping-options",options:s,onChange:r,selected:e.shipping})))});a(307);function pr(e,t,a,c=!1){return n.a.createElement("div",{className:"price-info-item "+(c?"price-info-item-main":"")},n.a.createElement("div",{className:"title"},e),n.a.createElement("div",{className:"value"},`${a||""} ${(t/100).toFixed(2)}`))}function vr(e,t,a){return n.a.createElement("div",{className:"checkout-info-item"},n.a.createElement("i",{className:e}," "),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},t),n.a.createElement("p",{className:"data"},a)))}var Er=Object(n.h)(({invoiceContent:e,prices:t,shippingPrices:a,checkoutInfo:c,currency:r,totalPrice:s})=>{const{photoUrl:l,title:o,text:i}=e||{},{paymentMethod:d,paymentProvider:m,shippingAddress:u,name:h,phone:b,shippingMethod:g}=c||{};return n.a.createElement("div",{className:"Checkout"},n.a.createElement("div",{className:"description has-image"},l&&n.a.createElement("img",{src:l,alt:""}),n.a.createElement("div",{className:"text"},n.a.createElement("h5",null,o),n.a.createElement("p",null,i))),n.a.createElement("div",{className:"price-info"},t&&t.map(e=>pr(e.label,e.amount,r,!1)),a&&a.map(e=>pr(e.label,e.amount,r,!1)),void 0!==s&&pr("Total",s,r,!0)),n.a.createElement("div",{className:"invoice-info"},d&&vr("icon-card",d,"Payment method"),m&&vr("stripe-provider",m,"Payment provider"),u&&vr("icon-location",u,"Shipping address"),h&&vr("icon-user",h,"Name"),b&&vr("icon-phone",b,"Phone number"),g&&vr("icon-truck",g,"Shipping method")))});var Or=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null),r=Object(n.m)(t=>{if("Backspace"===t.key&&"/"===e.charAt(e.length-1)){const t=e.slice(0,e.length-1);c.current&&(c.current.value=t)}},[e]),s=Object(n.m)(e=>{a(function(e){const t=(e=e.replace(/[^\d]/g,"").slice(0,4)).match(/.{1,2}/g);return t&&t[0]&&Number(t[0])>12&&(t[0]="12"),t&&t[0]&&2===t[0].length&&!t[1]&&(t[1]=""),t?t.join("/"):""}(e.target.value))},[a]);return n.a.createElement(pe.a,{label:"Expiry date",ref:c,onChange:s,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}),fr=(a(308),a.p+"mastercard.4216118edafe23cc2dec7b8807ba4622.svg"),jr=a.p+"visa.e5a7c336e1deb4b92a636e2e053878c4.svg";var Cr=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null);ur(c);const[r,s]=Object(n.r)(rr.Default);Object(n.n)(()=>{const t=lr(e);s(t)},[]);const l=Object(n.m)(e=>{const t=function(e){const t=(e=e.replace(/[^\d]/g,"")).match(/.{1,4}/g);return t?t.join(" "):""}(e.target.value),n=lr(e.target.value);s(n),a(t),c.current&&(c.current.value=t)},[a,c]),o=function(e){switch(e){case rr.Mastercard:return n.a.createElement("img",{src:fr,alt:""});case rr.Visa:return n.a.createElement("img",{src:jr,alt:""});default:return}}(r);return n.a.createElement("div",{className:"CardInput"},n.a.createElement("span",{className:"left-addon"},o),n.a.createElement(pe.a,{ref:c,label:"Card number",onChange:l,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))});a(309);var yr=Object(n.h)(({state:e,canSaveCredentials:t,needCardholderName:a,needCountry:c,needZip:r,dispatch:s})=>{const l=Object(n.q)(null);Object(n.n)(()=>{l.current&&l.current.value!==e.billingCountry&&(l.current.value=e.billingCountry)},[e.billingCountry]);const o=Object(n.m)(e=>{s({type:"changeCardNumber",payload:e})},[s]),i=Object(n.m)(e=>{s({type:"changeCardholder",payload:e.target.value.toUpperCase()})},[s]),d=Object(n.m)(e=>{s({type:"changeExpiryDate",payload:e})},[s]),m=Object(n.m)(e=>{s({type:"changeCvvCode",payload:e.target.value})},[s]),u=Object(n.m)(e=>{s({type:"changeBillingCountry",payload:e.target.value})},[s]),h=Object(n.m)(e=>{s({type:"changeBillingZip",payload:e.target.value})},[s]),b=Object(n.m)(e=>{s({type:"changeSaveCredentials",payload:e.target.value})},[s]),g=Object(F.a)(),{formErrors:p={}}=e;return n.a.createElement("div",{className:"PaymentInfo"},n.a.createElement("form",null,n.a.createElement("h5",null,g("PaymentCardTitle")),n.a.createElement(Cr,{onChange:o,value:e.cardNumber,error:p.cardNumber}),a&&n.a.createElement(pe.a,{label:"Name on card",onChange:i,value:e.cardholder,inputMode:"text",error:p.cardholder}),n.a.createElement("section",{className:"inline-inputs"},n.a.createElement(Or,{value:e.expiry,onChange:d,error:p.expiry}),n.a.createElement(pe.a,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:p.cvv})),c||r?n.a.createElement("h5",null,g("PaymentBillingAddress")):void 0,c&&n.a.createElement(hr,{label:"Country",placeholder:"Country",onChange:u,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:p.billingCountry,ref:l},xt.a.map(({name:e})=>n.a.createElement("option",{value:e,className:"county-item"},e))),r&&n.a.createElement(pe.a,{label:"Post Code",onChange:h,value:e.billingZip,inputMode:"text",error:p.billingZip}),t&&n.a.createElement(aa.a,{label:g("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:b})))});a(188);var kr=Object(n.h)(Object(c.h)(e=>{const{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,invoice:r,invoiceContent:s,nativeProvider:l,nativeParams:o,passwordMissing:i,error:d}=e.payment,m=Boolean(r&&(!l||"stripe"!==l)),{needCardholderName:u,needCountry:h,needZip:b}=o||{},{nameRequested:g,phoneRequested:p,emailRequested:v,shippingAddressRequested:E,flexible:O,phoneToProvider:f,emailToProvider:j,currency:C,prices:y}=r||{};return{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,nativeProvider:l,passwordMissing:i,nameRequested:g,shippingAddressRequested:E,phoneRequested:p,emailRequested:v,flexible:O,phoneToProvider:f,emailToProvider:j,currency:C,prices:y,isProviderError:m,invoiceContent:s,needCardholderName:u,needCountry:h,needZip:b,error:d,globalErrors:e.errors}},(e,t)=>Object(u.l)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"]))(({isOpen:e,onClose:t,step:a,shippingOptions:c,savedInfo:r,canSaveCredentials:l,nameRequested:o,shippingAddressRequested:i,phoneRequested:d,emailRequested:m,phoneToProvider:u,emailToProvider:h,currency:b,passwordMissing:g,isProviderError:p,invoiceContent:v,nativeProvider:E,prices:O,needCardholderName:f,needCountry:j,needZip:C,error:y,globalErrors:k,validateRequestedInfo:N,sendPaymentForm:I,setPaymentStep:S,sendCredentialsInfo:w,clearPaymentError:P})=>{const[M,A]=It(dr,ir),D=tr(b),[B,x]=Object(n.r)(!1),U=Object(F.a)();Object(n.n)(()=>{(a||y||k)&&x(!1)},[a,y,k]),Object(n.n)(()=>{if(y&&y.field)A({type:"setFormErrors",payload:{[y.field]:y.fieldError}});else if(k&&k.length){const e=Object(or.a)(k);A({type:"setFormErrors",payload:{...e}})}},[y,k,A]),Object(n.n)(()=>{if(r){const{name:e,phone:t,email:a,shippingAddress:n}=r;A({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?"+"+t:t,email:a,...n||{}}})}},[r,A]);const G=Object(n.m)(()=>{P()},[P]),q=Object(n.p)(()=>a!==s.i.Checkout?0:function(e=[],t,a){const n=t?Ir(t,a):[];let c=0;const r=e.concat(n||[]);return c=r.reduce((e,t)=>e+t.amount,c),c}(O,c,M.shipping),[a,M.shipping,O,c]),z=Object(n.p)(()=>{if(a===s.i.Checkout)return function(e,t,a){const n=`${function(e){const t=lr(e);return sr[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,c=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:r,fullName:s}=e,l=t?Nr(t,e.shipping):void 0,o=l?l.title:void 0;return{paymentMethod:n,paymentProvider:a,shippingAddress:c,name:s,phone:r,shippingMethod:o}}(M,c,E||"")},[a,M,c,E]);const H=Object(n.m)(()=>{const{saveInfo:e}=M,t=function(e){const{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s,fullName:l,phone:o,email:i}=e;return{name:l,phone:o,email:i,shippingAddress:{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:r,postCode:s}}}(M);N({requestInfo:t,saveInfo:e})},[N,M]),$=Object(n.m)(()=>{const e=function(e){const{cardNumber:t,cardholder:a,expiry:n,cvv:c,billingCountry:r,billingZip:s}=e,[l,o]=n.split("/");return{data:{cardNumber:t,cardholder:a,expiryMonth:l,expiryYear:o,cvv:c,country:r,zip:s}}}(M);w({credentials:e})},[w,M]),V=Object(n.m)(()=>{I({shippingOptionId:M.shipping,saveCredentials:M.saveCredentials})},[I,M]),_=Object(n.m)(e=>{S({step:e})},[S]),W=Object(n.m)(()=>{switch(x(!0),a){case s.i.ShippingInfo:return H();case s.i.Shipping:return _(s.i.PaymentInfo);case s.i.PaymentInfo:return $();case s.i.Checkout:return V();default:return()=>{}}},[a,H,_,$,V]),K=Object(n.p)(()=>{switch(a){case s.i.ShippingInfo:return U("PaymentShippingInfo");case s.i.Shipping:return U("PaymentShippingMethod");case s.i.PaymentInfo:return U("PaymentCardInfo");case s.i.Checkout:return U("PaymentCheckout");default:return""}},[a,U]),Y=Object(n.p)(()=>{switch(a){case s.i.Checkout:return U("Checkout.PayPrice",`${D}${(q/100).toFixed(2)}`);default:return U("Next")}},[a,U,D,q]);return p?n.a.createElement(ge.a,{className:"error",isOpen:e,onClose:t},n.a.createElement("p",null,"Sorry, Telegram T doesn't support payments with this provider yet. ",n.a.createElement("br",null),"Please use one of our mobile apps to do this."),n.a.createElement(R.a,{isText:!0,onClick:t},U("OK"))):n.a.createElement(ge.a,{className:"PaymentModal",isOpen:e,onClose:t},n.a.createElement("div",{className:"header",dir:U.isRtl?"rtl":void 0},n.a.createElement(R.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null,K)),void 0!==a?n.a.createElement(T.a,{name:"slide",activeKey:a},()=>n.a.createElement("div",{className:"content custom-scroll"},function(e){switch(e){case s.i.ShippingInfo:return n.a.createElement(br,{state:M,dispatch:A,needAddress:Boolean(i),needEmail:Boolean(m||h),needPhone:Boolean(d||u),needName:Boolean(o)});case s.i.Shipping:return n.a.createElement(gr,{state:M,dispatch:A,shippingOptions:c||[],currency:D});case s.i.PaymentInfo:return n.a.createElement(yr,{state:M,dispatch:A,canSaveCredentials:Boolean(!g&&l),needCardholderName:f,needCountry:j,needZip:C});case s.i.Checkout:return n.a.createElement(Er,{prices:O,shippingPrices:M.shipping&&c?Ir(c,M.shipping):void 0,totalPrice:q,invoiceContent:v,checkoutInfo:z,currency:D});default:return}}(a))):n.a.createElement("div",{className:"empty-content"},n.a.createElement(L.a,{color:"gray"})),n.a.createElement("div",{className:"footer"},n.a.createElement(R.a,{type:"submit",onClick:W,disabled:B,isLoading:B},Y)),y&&!y.field&&function(){if(y)return n.a.createElement(ge.a,{className:"error",isOpen:Boolean(y),onClose:G},n.a.createElement("h4",null,y.description||"Error"),n.a.createElement("p",null,y.description||"Error"),n.a.createElement(R.a,{isText:!0,onClick:P},U("OK")))}())}));function Nr(e,t){return e.find(({id:e})=>e===t)}function Ir(e,t){const a=Nr(e,t);return a?a.prices:void 0}var Sr=Object(n.h)(Object(c.h)(e=>{const{receipt:t}=e.payment,{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:d,title:m}=t||{};return{currency:a,prices:n,info:c,totalAmount:r,credentialsTitle:s,shippingPrices:l,shippingMethod:o,photoUrl:i,text:d,title:m}})(({isOpen:e,onClose:t,prices:a,shippingPrices:c,totalAmount:r,currency:s,info:l,photoUrl:o,text:i,title:d,credentialsTitle:m,shippingMethod:u})=>{const h=Object(F.a)(),b=tr(s),g=Object(n.p)(()=>function(e,t,a){if(!t)return{paymentMethod:e};const{shippingAddress:n}=t,c=n&&n.streetLine1?`${n.streetLine1}, ${n.city}, ${n.countryIso2}`:void 0,{phone:r,name:s}=t;return{paymentMethod:e,paymentProvider:"Stripe",shippingAddress:c,name:s,phone:r,shippingMethod:a}}(m,l,u),[l,u,m]);return n.a.createElement(ge.a,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},n.a.createElement("div",null,n.a.createElement("div",{className:"header",dir:h.isRtl?"rtl":void 0},n.a.createElement(R.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null," ",h("PaymentReceipt")," ")),n.a.createElement("div",{className:"receipt-content custom-scroll"},n.a.createElement(Er,{prices:a,shippingPrices:c,totalPrice:r,invoiceContent:{photoUrl:o,text:i,title:d},checkoutInfo:g,currency:b}))))}))},,,,,,,,,,,,,,,,,,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return s}));var n=a(5),c=a(54);const r={MonkeyIdle:a.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:a.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:a.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:a.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:a.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:a.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:a.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function s(e){const t=r[e].replace(window.location.origin,"");return c.b("file"+t,n.ApiMediaFormat.Lottie)}},,,,,function(e,t,a){"use strict";var n=a(0),c=a(8),r=a(1),s=a(13),l=a(25),o=a(32),i=a(110),d=a(16);a(151);const m={type:"blob",quality:.8,format:"jpeg",circle:!1};let u,h,b;var g=Object(n.h)(({file:e,onChange:t,onClose:c})=>{const[g,p]=Object(n.r)(!1);Object(n.n)(()=>{e&&(g?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:a,offsetHeight:n}=t;b=new u(t,{enableZoom:!0,boundary:{width:a,height:n},viewport:{width:a-16,height:n-16,type:"circle"}});const c=await Object(s.a)(e);await b.bind({url:c})}catch(e){r.p&&console.error(e)}}(e):async function(){return h||(h=Promise.all([a.e(6),a.e(8)]).then(a.bind(null,316)),u=(await h).default),h}().then(()=>p(!0)))},[e,g]);const v=Object(l.a)();return n.a.createElement(i.a,{isOpen:Boolean(e),onClose:c,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},g?n.a.createElement("div",{id:"avatar-crop"}):n.a.createElement(d.a,null),n.a.createElement(o.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!b)return;const e=await b.result(m),a="string"==typeof e?e:Object(s.b)(e,"avatar.jpg");t(a)},ariaLabel:v("CropImage")},n.a.createElement("i",{className:"icon-check"})))});a(152);t.a=Object(n.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:a,onChange:r})=>{const[s,l]=Object(n.r)(),[o,i]=Object(n.r)(a);Object(n.n)(()=>{i(a)},[a]);const d=Object(c.a)(o&&"filled",t&&"disabled");return n.a.createElement("div",{className:"AvatarEditable"},n.a.createElement("label",{className:d,role:"button",tabIndex:0,title:e},n.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(l(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),n.a.createElement("i",{className:"icon-camera-add"}),o&&n.a.createElement("img",{src:o,alt:"Avatar"})),n.a.createElement(g,{file:s,onClose:function(){l(void 0)},onChange:function(e){l(void 0),r(e),o&&URL.revokeObjectURL(o),i(URL.createObjectURL(e))}}))})},,,,,,,,,,function(e,t,a){},,,,,,,,function(e,t,a){"use strict";var n=a(0),c=a(1),r=a(7),s=a(125),l=a(116);a(140);const o=[0,50],i=[0,20],d=[20,0],m=r.g?c.rb:c.qb;t.a=Object(n.h)(({isPasswordVisible:e,isBig:t})=>{const[a,r]=Object(n.r)(),[u,h]=Object(n.r)(),[b,g]=Object(n.r)(!1),[p,v]=Object(n.r)(!1);Object(n.n)(()=>{a?setTimeout(()=>v(!0),2e3):Object(s.a)("MonkeyClose").then(r)},[a]),Object(n.n)(()=>{u||Object(s.a)("MonkeyPeek").then(h)},[u]);const E=Object(n.m)(()=>g(!0),[]);return n.a.createElement("div",{id:"monkey",className:t?"big":""},!b&&n.a.createElement("div",{className:"monkey-preview"}),a&&n.a.createElement(l.a,{id:"closeMonkey",size:t?c.Bb:m,className:p?"hidden":"shown",animationData:a,playSegment:o,noLoop:!0,onLoad:E}),u&&n.a.createElement(l.a,{id:"peekMonkey",size:t?c.Bb:m,className:p?"shown":"hidden",animationData:u,playSegment:e?i:d,noLoop:!0}))})},function(e,t,a){"use strict";var n=a(0),c=a(1),r=a(7),s=a(8),l=a(25),o=a(32);const i=r.g?550:400;t.a=Object(n.h)(({isLoading:e=!1,isPasswordVisible:t,error:a,hint:d,placeholder:m="Password",submitLabel:u="Next",clearError:h,onChangePasswordVisibility:b,onInputChange:g,onSubmit:p})=>{const v=Object(n.q)(null),E=Object(l.a)(),[O,f]=Object(n.r)(""),[j,C]=Object(n.r)(!1);return Object(n.n)(()=>{r.l||setTimeout(()=>{v.current.focus()},i)},[]),Object(n.n)(()=>{a&&requestAnimationFrame(()=>{v.current.focus(),v.current.select()})},[a]),n.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||j&&p(O)},autoComplete:"off"},n.a.createElement("div",{className:Object(s.a)("input-group password-input",O&&"touched",a&&"error"),dir:E.isRtl?"rtl":void 0},n.a.createElement("input",{ref:v,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:O||"",autoComplete:"current-password",onChange:function(e){a&&h();const{target:t}=e;f(t.value),C(t.value.length>=c.Y),g&&g(t.value)},dir:"auto"}),n.a.createElement("label",null,a||d||m),n.a.createElement("div",{className:"toggle-password",onClick:function(){b(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},n.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),j&&n.a.createElement(o.a,{type:"submit",ripple:!0,isLoading:e},u))})},,function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,,function(e,t,a){},,,,,,,,,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){}])]); +//# sourceMappingURL=3.e4377d3a1cfc9dfc19d1.js.map \ No newline at end of file diff --git a/dist/3.e4377d3a1cfc9dfc19d1.js.map b/dist/3.e4377d3a1cfc9dfc19d1.js.map new file mode 100644 index 000000000..76e385589 --- /dev/null +++ b/dist/3.e4377d3a1cfc9dfc19d1.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack:///./src/components/mediaViewer/SenderInfo.tsx","webpack:///./src/components/mediaViewer/MediaViewerActions.tsx","webpack:///./src/components/mediaViewer/MediaViewerFooter.tsx","webpack:///./src/hooks/useFullscreen.ts","webpack:///./src/components/mediaViewer/helpers/formatFileSize.ts","webpack:///./src/components/mediaViewer/VideoPlayerControls.tsx","webpack:///./src/components/mediaViewer/VideoPlayer.tsx","webpack:///./src/components/mediaViewer/ZoomControls.tsx","webpack:///./src/components/mediaViewer/PanZoom.tsx","webpack:///./src/components/mediaViewer/MediaViewer.tsx","webpack:///./src/components/main/ForwardPicker.tsx","webpack:///./src/components/main/Errors.tsx","webpack:///./src/components/main/Notifications.tsx","webpack:///./src/components/main/SafeLinkModal.tsx","webpack:///./src/components/common/CalendarModal.tsx","webpack:///./src/components/main/HistoryCalendar.tsx","webpack:///./src/components/common/DeleteMessageModal.tsx","webpack:///./src/components/common/PinMessageModal.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.tsx","webpack:///./src/components/middle/DeleteSelectedMessagesModal.tsx","webpack:///./src/components/middle/MessageSelectToolbar.tsx","webpack:///./src/hooks/useSelectWithEnter.ts","webpack:///./src/components/left/search/LeftSearchResultChat.tsx","webpack:///./src/components/left/search/RecentContacts.tsx","webpack:///./src/components/left/search/ChatMessage.tsx","webpack:///./src/components/left/search/DateSuggest.tsx","webpack:///./src/components/left/search/ChatResults.tsx","webpack:///./src/components/left/search/ChatMessageResults.tsx","webpack:///./src/components/left/search/helpers/createMapStateToProps.ts","webpack:///./src/components/left/search/MediaResults.tsx","webpack:///./src/components/left/search/helpers/getSenderName.ts","webpack:///./src/components/left/search/LinkResults.tsx","webpack:///./src/components/left/search/FileResults.tsx","webpack:///./src/components/left/search/AudioResults.tsx","webpack:///./src/components/left/search/LeftSearch.tsx","webpack:///./src/hooks/useReducer.ts","webpack:///./src/hooks/reducers/useFoldersReducer.ts","webpack:///./src/hooks/reducers/useTwoFaReducer.ts","webpack:///./src/components/left/settings/SettingsHeader.tsx","webpack:///./src/components/left/settings/SettingsMain.tsx","webpack:///./src/components/ui/FloatingActionButton.tsx","webpack:///./src/components/common/UsernameInput.tsx","webpack:///./src/components/left/settings/SettingsEditProfile.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack:///./src/components/ui/ShowMoreButton.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack:///./src/components/left/settings/folders/SettingsFolders.tsx","webpack:///./src/components/ui/RangeSlider.tsx","webpack:///./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack:///./src/components/middle/composer/StickerSetCover.tsx","webpack:///./src/components/common/StickerButton.tsx","webpack:///./src/components/left/settings/SettingsStickerSet.tsx","webpack:///./src/components/left/settings/SettingsGeneral.tsx","webpack:///./src/util/systemFilesDialog.ts","webpack:///./src/util/colors.ts","webpack:///./src/components/left/settings/WallpaperTile.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackground.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack:///./src/components/left/settings/SettingsNotifications.tsx","webpack:///./src/components/left/settings/SettingsPrivacy.tsx","webpack:///./src/components/left/settings/SettingsLanguage.tsx","webpack:///./src/components/left/settings/helper/privacy.ts","webpack:///./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack:///./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack:///./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack:///./src/components/common/Picker.tsx","webpack:///./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack:///./src/components/left/settings/Settings.tsx","webpack:///./src/components/left/main/ContactList.tsx","webpack:///./src/components/left/newChat/NewChatStep1.tsx","webpack:///./src/components/left/newChat/NewChatStep2.tsx","webpack:///./src/components/left/newChat/NewChat.tsx","webpack:///./src/components/left/ArchivedChats.tsx","webpack:///./src/util/scrollLock.ts","webpack:///./src/components/middle/message/helpers/copyOptions.ts","webpack:///./src/components/middle/message/MessageContextMenu.tsx","webpack:///./src/components/middle/message/ContextMenuContainer.tsx","webpack:///./src/components/common/StickerSetModal.tsx","webpack:///./src/components/middle/HeaderMenuContainer.tsx","webpack:///./src/components/middle/MobileSearch.tsx","webpack:///./src/util/findInViewport.ts","webpack:///./src/util/isFullyVisible.ts","webpack:///./src/components/middle/composer/MentionTooltip.tsx","webpack:///./src/components/middle/composer/AttachmentModal.tsx","webpack:///./src/components/middle/composer/PollModal.tsx","webpack:///./src/hooks/useMouseInside.ts","webpack:///./src/components/middle/composer/EmojiButton.tsx","webpack:///./src/components/middle/composer/EmojiCategory.tsx","webpack:///./src/components/middle/composer/EmojiPicker.tsx","webpack:///./src/components/middle/composer/StickerSet.tsx","webpack:///./src/components/middle/composer/StickerPicker.tsx","webpack:///./src/components/common/GifButton.tsx","webpack:///./src/components/middle/composer/GifPicker.tsx","webpack:///./src/components/middle/composer/SymbolMenuFooter.tsx","webpack:///./src/components/middle/composer/SymbolMenu.tsx","webpack:///./src/components/middle/composer/AttachMenu.tsx","webpack:///./src/components/middle/composer/StickerTooltip.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.tsx","webpack:///./src/components/middle/composer/EmojiTooltip.tsx","webpack:///./src/components/right/RightSearch.tsx","webpack:///./src/components/right/StickerSetResult.tsx","webpack:///./src/components/right/StickerSearch.tsx","webpack:///./src/components/right/GifSearch.tsx","webpack:///./src/components/right/PollAnswerResults.tsx","webpack:///./src/components/right/PollResults.tsx","webpack:///./src/components/right/management/ManageUser.tsx","webpack:///./src/components/right/management/ManageGroup.tsx","webpack:///./src/components/right/management/ManageGroupPermissions.tsx","webpack:///./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack:///./src/components/right/management/ManageChannel.tsx","webpack:///./src/components/right/management/ManageChatPrivacyType.tsx","webpack:///./src/components/right/management/ManageDiscussion.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissions.tsx","webpack:///./src/components/right/management/ManageChatAdministrators.tsx","webpack:///./src/components/right/management/ManageGroupRecentActions.tsx","webpack:///./src/components/right/management/ManageGroupAdminRights.tsx","webpack:///./src/components/right/management/ManageGroupMembers.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack:///./src/components/right/management/Management.tsx","webpack:///./src/components/middle/helpers/getCurrencySign.ts","webpack:///./src/components/common/helpers/detectCardType.ts","webpack:///./src/hooks/reducers/usePaymentReducer.ts","webpack:///./src/hooks/useFocusAfterAnimation.tsx","webpack:///./src/components/ui/Select.tsx","webpack:///./src/components/payment/ShippingInfo.tsx","webpack:///./src/components/payment/Shipping.tsx","webpack:///./src/components/payment/Checkout.tsx","webpack:///./src/components/payment/ExpiryInput.tsx","webpack:///./src/components/middle/helpers/inputFormatters.ts","webpack:///./src/assets/mastercard.svg","webpack:///./src/assets/visa.svg","webpack:///./src/components/payment/CardInput.tsx","webpack:///./src/components/payment/PaymentInfo.tsx","webpack:///./src/components/payment/PaymentModal.tsx","webpack:///./src/components/payment/ReceiptModal.tsx","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["animateOpening","hasFooter","origin","bestImageData","message","mediaEl","fromImage","getNodes","width","windowWidth","windowSize","get","mediaSize","isVideo","photo","video","webPage","getMessageContent","Boolean","getVideoDimensions","getPhotoFullDimensions","AVATAR_FULL_DIMENSIONS","availableWidth","height","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","mql","window","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","topOffsetRem","matches","REM","getTopOffset","top","fromTop","left","fromLeft","fromWidth","fromHeight","getBoundingClientRect","MediaViewerOrigin","SharedMedia","Album","ScheduledAlbum","SearchResult","includes","uncovered","realWidth","realHeight","size","Math","max","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","ghost","createGhost","applyStyles","transform","applyShape","document","body","classList","add","requestAnimationFrame","appendChild","style","firstChild","objectFit","remove","clearShape","setTimeout","contains","removeChild","ANIMATION_END_DELAY","animateClosing","container","toImage","getElementById","querySelector","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","Inline","ScheduledInline","isMessageImageFullyVisible","existingGhost","getElementsByClassName","ProfileAvatar","transition","transformOrigin","opacity","source","shouldAppendProfileInfo","createElement","img","Image","src","HTMLVideoElement","poster","profileInfo","cloneNode","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","parentElement","scrollTop","offsetHeight","element","styles","Object","assign","containerSelector","mediaSelector","MiddleHeaderAvatar","mediaEls","querySelectorAll","length","withGlobal","global","chatId","messageId","isAvatar","sender","isChatPrivate","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","lang","useLang","isFromChat","senderTitle","getSenderTitle","className","onClick","Avatar","key","chat","user","dir","renderText","formatMediaDateTime","date","MediaViewerActions","mediaData","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","isDownloadStarted","downloadProgress","handleDownloadClick","useMediaDownload","getMessageMediaHash","undefined","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_MOBILE_SCREEN","DropdownMenu","trigger","positionX","MenuItem","icon","href","download","ProgressSpinner","progress","noCross","MediaViewerFooter","text","isHideable","isMultiline","setIsMultiline","useState","useEffect","footerContent","checkIsMultiline","clientHeight","handleResize","throttle","addEventListener","removeEventListener","e","stopPropagation","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","getBrowserFullscreenElementProp","units","bytes","number","floor","log","toFixed","stopEvent","VideoPlayerControls","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","timeout","clearTimeout","downloadedPercent","totalSize","percentagePlayed","percentageBuffered","min","step","type","onInput","value","renderSeekLine","ripple","formatMediaDuration","renderTime","formatFileSize","memo","url","isGif","posterData","posterSize","isMediaViewerOpen","noPlay","onClose","videoRef","useRef","setIsPlayed","IS_TOUCH_ENV","IS_IOS","setCurrentTime","isControlsVisible","setIsControlsVisible","setFullscreen","exitFullscreen","elRef","setIsFullscreen","useLayoutEffect","listener","listenerEnter","listenerExit","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","wrapperStyle","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","buildClassName","disabled","onChange","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","1","1.5","2","2.5","3","children","noWrap","canPan","panDeltaX","panDeltaY","onPan","tunedZoomLevel","isDragging","setIsDragging","dragData","setDragData","dx","dy","x","y","matrixData","setMatrixData","panWrapperRef","panContainerRef","newZoomLevel","newPandx","newPandy","newMatrixData","areSortedArraysEqual","oldScale","wrapper","image","wrapperRect","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","toString","preventDefault","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","renderPhoto","blobUrl","imageSize","canDrag","alt","draggable","Spinner","threadId","avatarOwnerId","profilePhotoIndex","mediaViewer","animationLevel","settings","byKey","senderId","avatarOwner","chatMessages","collectionIds","selectScheduledMessage","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","animationKey","webPagePhoto","getMessageWebPagePhoto","getMessagePhoto","getMessageVideo","isWebPagePhoto","isPhoto","isFromSharedMedia","isFromSearch","slideAnimation","headerAnimation","isGhostAnimation","getMessageMediaFilename","prevSenderId","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","getMediaHash","full","photos","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","BlobUrl","previewMediaHash","blobUrlPreview","startsWith","DataUri","fullMediaData","useMediaWithDownloadProgress","getMessageMediaFormat","localBlobUrl","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","photoDimensions","videoDimensions","toggle","forceUpdate","useForceUpdate","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","textParts","renderMessageText","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","Right","Left","handlePan","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","ShowTransition","isRtl","Transition","activeKey","name","aria-label","chats","byId","chatsById","listIds","currentUserId","activeListIds","active","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatIds","sortChatIds","getCanPostInChat","MAIN_THREAD_ID","searchWords","getChatTitle","viewportIds","getMore","useInfiniteScroll","handleFilterChange","containerRef","useKeyboardListNavigation","modalHeader","InputText","onKeyDown","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","getErrorHeader","error","isSlowMode","errors","dismissError","title","getReadableErrorText","isText","notifications","dismissNotification","Notification","onDismiss","toggleSafeLinkModal","handleOpen","open","handleDismiss","renderingUrl","useCurrentOrPrev","ConfirmDialog","confirmLabel","confirmHandler","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","Date","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","now","defaultSelectedDate","selectedDate","setSelectedDate","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","currentDate","shouldDisableNextMonth","shouldDisablePrevMonth","calendarGrid","grid","setFullYear","setMonth","setDate","monthStartDay","getDay","i","push","gridDate","buildCalendarGrid","handleChangeHours","replace","hours","getTime","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","formatMonthAndYear","d","dateCopy","letter","role","tabIndex","handleDateSelect","inputMode","formatHumanDate","formatTime","formatSubmitLabel","historyCalendarSelectedAt","searchMessagesByDate","closeHistoryCalendar","handleJumpToDate","timestamp","valueOf","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChannel","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","messageListType","canDelete","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","useFlag","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","onSelect","buttonRef","activeElement","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","withUsername","contextActions","useChatContextActions","handleDelete","handleClick","useSelectWithEnter","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","formatDateToString","suggestion","latestYear","getSuggestionsFromDate","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChatIds","globalUserIds","localChatIds","localUserIds","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","Backwards","query","handleChatClick","handlePickerItemClick","MEMO_EMPTY_ARRAY","foundContactIds","fullName","getUserFullName","username","unique","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","description","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","isLoading","searchChatId","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","classNames","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","WebLink","onMessageClick","getMessageDocument","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","renderingFor","onPlay","TABS","GlobalSearchContent","ChatList","Links","Files","Music","Voice","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","useReducer","reducer","initialState","reducerRef","state","setState","action","currentState","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","folder","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","values","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","payload","isTouched","omit","folderId","currentPassword","password","hint","email","twoFaReducer","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","EditProfile","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyPhoneNumberAllowedContacts","PrivacyLastSeenAllowedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyForwardingAllowedContacts","PrivacyGroupChatsAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsDeniedContacts","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaNewPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaChangePasswordHint","TwoFaNewPasswordEmail","TwoFaRecoveryEmail","TwoFaNewPasswordEmailCode","TwoFaRecoveryEmailCode","TwoFaCongratulations","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","Folders","FoldersCreateFolder","FoldersEditFolder","FoldersIncludedChats","FoldersExcludedChats","renderHeaderContent","confirmIsDestructive","currentUser","onScreenSelect","formatPhoneNumberWithCode","phoneNumber","FloatingActionButton","buttonClassName","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","label","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","InProgress","isUsernameError","isSaveButtonShown","Complete","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showError","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","userFolders","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","noLoop","onLoad","pill","fluid","narrow","multiline","ShowMoreButton","count","itemName","itemPluralName","ERROR_NO_TITLE","ERROR_NO_CHATS","loadedActiveChatIds","loadedArchivedChatIds","dispatch","onAddIncludedChats","onAddExcludedChats","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","includedChatTypes","excludedChatTypes","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","find","typeKey","inactive","renderChatType","event","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","onFilterChange","chatTypes","shouldMinimize","hasMaxChats","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","isMinimized","canClose","Checkbox","checked","isSelected","withChatType","orderedPinnedIds","archivedPinnedIds","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","handleSelectedChatTypesChange","newFilters","forEach","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","options","range","handleChange","trackWidth","possibleValuesLength","option","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","Lottie","shouldRenderFullMedia","useTransitionForMedia","getFirstLetters","hasThumbnail","sticker","noAnimate","onUnfaveClick","localMediaHash","stickerSelector","thumbnail","dataUri","previewBlobUrl","shouldPlay","isAnimated","markLoaded","unmarkLoaded","canAnimatedPlay","shouldRenderThumb","shouldRenderPreview","previewTransitionClassNames","fullClassName","emoji","data-sticker-id","isLowPriority","stickers","firstSticker","STICKER_SIZE_GENERAL_SETTINGS","ANIMATION_LEVEL_OPTIONS","stickerSetIds","added","setIds","stickerSetsById","setsById","messageTextSize","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers","setSettingOption","loadStickerSets","loadAddedStickers","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","isModalOpen","openModal","closeModal","setSticker","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","handleStickerSetClick","stickerSets","installedDate","RadioGroup","selected","onCheck","isChecked","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","setAttribute","removeAttribute","onchange","click","hex2rgb","param","parseInt","substring","rgb2hex","p0","p1","p2","rgb2hsb","r","g","h","s","v","hsb2rgb","f","p","q","t","getPatternColor","rgbColor","hue","saturation","wallpaper","theme","slug","thumbRef","useCanvasBlur","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","cacheKeyRef","handleSelect","blob","fetchBlob","cacheApi","CUSTOM_BG_CACHE_NAME","isAllowed","background","isBlurred","themes","loadedWallpapers","loadWallpapers","uploadWallpaper","setThemeSettings","themeRef","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","backgroundColor","patternColor","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","data","rgb","canvas","context","getContext","preloadImage","naturalHeight","naturalWidth","offsetWidth","drawImage","getImageData","blockSize","getAverageColor","handleWallPaperBlurChange","isUploading","DEFAULT_HSB","PREDEFINED_COLORS","hsb2positions","hsb","rects","colorPosition","colorRect","huePosition","hueRect","positions2hsb","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","onCapture","onDrag","onRelease","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","data-color","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","handleSettingsChange","peerType","setting","currentIsSilent","currentShouldShowPreviews","shouldShowPreviews","handleContactNotificationChange","hasPassword","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","langCode","setLanguage","currentLangCode","navigator","toLowerCase","shortLangCode","substr","nativeName","buildOptions","loadingOption","getPrivacyKey","screen","privacySettings","allowUserIds","allowChatIds","blockUserIds","blockChatIds","setPrivacyVisibility","visibilityOptions","exceptionLists","shouldShowDenied","shouldShowAllowed","privacyKey","headerText","descriptionText","allowedContactsScreen","deniedContactsScreen","allowedCount","reduce","result","membersCount","blockCount","handleVisibilityChange","getLocation","session","region","country","getDeviceEnvironment","deviceModel","platform","systemVersion","terminateAuthorization","terminateAllAuthorizations","isConfirmTerminateAllDialogOpen","openConfirmTerminateAllDialog","closeConfirmTerminateAllDialog","handleTerminateSessionClick","hash","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","renderSession","handler","dateActive","appName","ip","sessions","chatsByIds","usersByIds","blockedIds","unblockContact","handleUnblockClick","contactId","viewportOffset","isPrivate","CHAT_HEIGHT_PX","renderContact","animatedEmoji","selectAnimatedEmoji","AnimatedEmoji","expectedPassword","submitLabel","clearError","validationError","setValidationError","shouldShowPassword","setShouldShowPassword","handleSubmit","newPassword","handleClearError","PasswordMonkey","isBig","isPasswordVisible","PasswordForm","onChangePasswordVisibility","onStart","FOCUS_DELAY_TIMEOUT_MS","shouldConfirm","setValue","isConfirmShown","markIsConfirmShown","unmarkIsConfirmShown","codeLength","twoFaSettings","waitingEmailCodeLength","newValue","updatePassword","checkPassword","clearTwoFaError","updateRecoveryEmail","provideTwoFaEmailCode","clearPassword","handleStartWizard","handleNewPassword","handleNewPasswordConfirm","handleNewPasswordHint","handleNewPasswordEmail","onSuccess","handleChangePasswordCurrent","handleChangePasswordNew","handleChangePasswordConfirm","handleChangePasswordHint","handleTurnOff","handleRecoveryEmailCurrentPassword","handleRecoveryEmail","handleEmailCode","code","itemIds","filterPlaceholder","notFoundText","searchInputId","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","foldersState","foldersDispatch","twoFaState","twoFaDispatch","handleSaveFilter","renderCurrentSection","Main","renderCurrentSectionContent","contactIds","resultIds","sortUserIds","forceShowSelf","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","ChatCreationProgress","handleTitleChange","handleDescriptionChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","NewChannelStep2","NewGroupStep2","NewChannelStep1","NewGroupStep1","folderType","noChatsText","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","ArrowLeft","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","canImageBeCopied","MessageContextMenu","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","scheduledMaxDate","getDayStartAt","selectStickerSet","stickerSetId","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","isMuted","canDeleteChat","getCanDeleteChat","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","isHistoryCalendarOpen","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","openHistoryCalendar","focusedIndex","setFocusedIndex","visualViewport","mainEl","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","y1","y2","isFullyVisible","onInsertUserName","filteredChatMembers","getSelectedIndex","newIndex","cycleRestrict","selectedMentionIndex","setSelectedMentionIndex","handleArrowKey","handleUserSelect","forceFocus","handleSelectMention","member","onUp","onDown","onTab","first","position","fastSmoothScroll","setItemVisible","prevChatMembers","renderedChatMembers","attachments","caption","canSuggestMembers","groupChatMembers","recentEmojis","onCaptionUpdate","addRecentEmoji","loadEmojiKeywords","onFileAppend","onClear","hideTimeoutRef","prevAttachments","renderingAttachments","isHovered","markHovered","unmarkHovered","isQuick","every","quick","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredMembers","useMentionTooltip","EDITABLE_INPUT_MODAL_ID","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","sendAttachments","handleFilesDrop","dataTransfer","newFiles","file","CONTENT_TYPES_FOR_QUICK_UPLOAD","areAllPhotos","mimeType","areAllVideos","renderHeader","onDragEnter","onDrop","onDragOver","onDragLeave","relatedTarget","toTarget","fromTarget","data-attach-description","attachment","File","filename","extension","getFileExtension","previewData","emojis","onEmojiSelect","MessageInput","html","editableInputId","onUpdate","shouldSetFocus","questionInputRef","optionsListRef","solutionRef","question","setQuestion","setOptions","isAnonymous","setIsAnonymous","isMultipleAnswers","setIsMultipleAnswers","isQuizMode","setIsQuizMode","solution","setSolution","correctOption","setCorrectOption","hasErrors","setHasErrors","focusInput","solutionEl","innerHTML","addNewOption","newOptions","list","scrollHeight","scrollTo","behavior","handleCreate","questionTrimmed","optionsTrimmed","o","summary","answers","correct","isPublic","multipleChoice","quiz","entities","parseMessageInput","correctAnswers","solutionEntities","updateOption","removeOption","handleCorrectOptionChange","handleIsAnonymousChange","handleMultipleAnswersChange","handleQuizModeChange","handleKeyPress","keyCode","getQuestionError","getOptionsError","renderOptions","onKeyPress","renderQuizNoOptionError","hidden","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","native","names","IS_EMOJI_SUPPORTED","loading","category","allEmojis","useOnIntersect","emojisPerRow","ceil","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","headerRef","categories","setCategories","setEmojis","activeCategoryIndex","setActiveCategoryIndex","entries","entry","intersectingWithIndexes","newLeft","HEADER_BUTTON_WIDTH","fastSmoothScrollHorizontal","allCategories","themeCategories","unshift","exec","default","uncompressEmoji","ensureEmojiData","selectCategory","categoryEl","handleEmojiSelect","MENU_TRANSITION_DURATION","containerClassName","faded","STICKER_MARGIN","loadAndPlay","onStickerSelect","onStickerUnfave","stickersPerRow","STICKER_SIZE_PICKER","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","canSendStickers","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","gif","videoData","shouldRenderVideo","preload","savedGifs","gifs","saved","canSendGifs","onGifSelect","loadSavedGifs","debounceMs","SymbolMenuTabs","SYMBOL_MENU_TAB_TITLES","SYMBOL_MENU_TAB_ICONS","Emoji","Stickers","GIFs","onRemoveSymbol","onSearchOpen","renderTabButton","handleSearchOpen","isActivated","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","fastRaf","recentEmojisRef","renderContent","isFrom","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","clickInlineButton","keyboardButtons","row","button","onSilentSend","onScheduleSend","listEmojis","usePrevDuringAnimation","selectedIndex","setSelectedIndex","emojisCount","handleSelectEmoji","onLeft","onRight","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","useOnChange","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","getAllowedAttachmentOptions","handleGifClick","hasResults","answer","voters","offsets","pollResults","offset","answerVote","totalVoters","loadPollOptionResults","closePollResults","prevVotersCount","votersCount","setIsLoading","areVotersLoaded","limit","shouldResetVoters","handleViewMoreClick","handleMemberClick","noStatusOrTyping","leftVotersCount","renderViewMoreButton","total","getMessagePoll","resultsByOption","buildCollectionByKey","management","updateContact","deleteUser","deleteHistory","closeManagement","isDeleteDialogOpen","openDeleteDialog","closeDeleteDialog","currentIsMuted","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","withFullInfo","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","ChatPrivacyType","handleClickDiscussion","Discussion","handleClickPermissions","GroupPermissions","handleClickAdministrators","ChatAdministrators","handleSetPhoto","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","GroupMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","isCreator","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","GroupRemovedUsers","handleAddExceptionClick","GroupUserPermissionsCreate","handleExceptionMemberClick","promotedByUserId","GroupUserPermissions","handlePermissionChange","getUpdatedPermissionValue","handleSavePermissions","bannedRights","removedUsersCount","kickedMembers","exceptionMembers","members","getMemberExceptions","langKey","getLangKeyForBannedRightKey","translatedString","sendMessages","blocking","sendMedia","sendPolls","embedLinks","inviteUsers","pinMessages","changeInfo","updateChatMemberBannedRights","removedMembers","getRemovedBy","kickedByUserId","kickedByUser","getContextActions","isSignaturesShown","toggleSignatures","hasLinkedChat","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","ChannelSubscribers","handleDeleteChannel","selectManagement","checkPublicLink","updatePublicLink","updatePrivateLink","privateLink","inviteLink","privacyType","setPrivacyType","isRevokeConfirmDialogOpen","openRevokeConfirmDialog","closeRevokeConfirmDialog","canUpdate","handleOptionChange","handleSave","handleRevokePrivateLink","langPrefix1","langPrefix2","SafeLink","forDiscussionIds","linkedChat","loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup","linkedGroupId","setLinkedGroupId","isConfirmUnlinkGroupDialogOpen","openConfirmUnlinkGroupDialog","closeConfirmUnlinkGroupDialog","isConfirmLinkGroupDialogOpen","openConfirmLinkGroupDialog","closeConfirmLinkGroupDialog","handleUnlinkGroupSessions","channelId","Initial","handleLinkGroupSessions","renderLinkGroupHeader","linkedGroup","renderLinkGroupConfirmText","hasPrivateLink","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","isOwner","handleAdminMemberClick","ChatAdminRights","getMemberStatus","promotedByUser","GroupRecentActions","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","CURRENCIES","USD","EUR","GBP","JPY","RUB","UAH","INR","AED","getCurrencySign","currency","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","getBillingCountry","countryCode","countryList","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","handleShippingSelect","amount","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","item","expiryInputRef","charAt","parts","formatCardExpiry","cardNumberRef","cardType","setCardType","newCardType","formatCardNumber","cardIcon","mastercardIconPath","visaIconPath","getCardIcon","canSaveCredentials","needCardholderName","needCountry","needZip","handleCardNumberChange","handleCardholderChange","toUpperCase","handleExpiryChange","handleCvvChange","handleBillingPostCodeChange","handleChangeSaveCredentials","savedInfo","invoice","nativeProvider","nativeParams","passwordMissing","payment","isProviderError","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","globalErrors","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","currencySign","field","fieldError","getShippingError","handleErrorModalClose","PaymentStep","Checkout","shippingOption","getShippingPrices","totalPrices","concat","acc","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","ShippingInfo","Shipping","PaymentInfo","buttonText","cuurentStep","renderModalContent","renderError","optionId","receipt","mapedPrices","info","totalAmount","credentialsTitle","fullAddress","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","path","location","cropperResultOptions","quality","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","enableZoom","boundary","viewport","blobToDataUri","bind","err","DEBUG","console","initCropper","ensureCroppie","croppedImg","blobToFile","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","URL","revokeObjectURL","createObjectURL","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","playSegment","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH"],"mappings":"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","file":"3.e4377d3a1cfc9dfc19d1.js","sourcesContent":["import { ApiMessage } from '../../../api/types';\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { getMessageContent, getPhotoFullDimensions, getVideoDimensions } from '../../../modules/helpers';\nimport {\n AVATAR_FULL_DIMENSIONS,\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\n\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean, origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n let isVideo = false;\n let mediaSize;\n if (message) {\n const { photo, video, webPage } = getMessageContent(message);\n isVideo = Boolean(video);\n mediaSize = video ? getVideoDimensions(video)! : getPhotoFullDimensions((photo || webPage!.photo)!)!;\n } else {\n mediaSize = AVATAR_FULL_DIMENSIONS;\n }\n\n // eslint-disable-next-line max-len\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, mediaSize.width, mediaSize.height,\n );\n const toLeft = (windowWidth - toWidth) / 2;\n const toTop = getTopOffset(hasFooter) + (availableHeight - toHeight) / 2;\n\n let {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n const uncovered = uncover(toWidth, toHeight, fromTop, fromLeft, fromWidth, fromHeight);\n fromTop = uncovered.top;\n fromLeft = uncovered.left;\n fromWidth = uncovered.width;\n fromHeight = uncovered.height;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n const fromScaleX = fromWidth / toWidth;\n const fromScaleY = fromHeight / toHeight;\n\n const ghost = createGhost(bestImageData || fromImage);\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n applyShape(ghost, origin);\n\n document.body.classList.add('ghost-animating');\n\n requestAnimationFrame(() => {\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n clearShape(ghost);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nexport function animateClosing(origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage) {\n const { container, mediaEl: toImage } = getNodes(origin, message);\n if (!toImage) {\n return;\n }\n\n const fromImage = document.getElementById('MediaViewer')!.querySelector(\n '.active .media-viewer-content img, .active .media-viewer-content video',\n );\n if (!fromImage || !toImage) {\n return;\n }\n\n const {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n const {\n top: targetTop, left: toLeft, width: toWidth, height: toHeight,\n } = toImage.getBoundingClientRect();\n\n let toTop = targetTop;\n if (!isElementInViewport(container)) {\n const { height: windowHeight } = windowSize.get();\n toTop = targetTop < fromTop ? -toHeight : windowHeight;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n let fromScaleX = fromWidth / toWidth;\n let fromScaleY = fromHeight / toHeight;\n\n const shouldFadeOut = (\n [MediaViewerOrigin.Inline, MediaViewerOrigin.ScheduledInline].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n ) || (\n [MediaViewerOrigin.Album, MediaViewerOrigin.ScheduledAlbum].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n );\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n if (fromScaleX > fromScaleY) {\n fromScaleX = fromScaleY;\n } else if (fromScaleY > fromScaleX) {\n fromScaleY = fromScaleX;\n }\n }\n\n const existingGhost = document.getElementsByClassName('ghost')[0] as HTMLDivElement;\n\n const ghost = existingGhost || createGhost(bestImageData || toImage, origin === MediaViewerOrigin.ProfileAvatar);\n if (!existingGhost) {\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n }\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n const {\n top,\n left,\n width,\n height,\n } = existingGhost.getBoundingClientRect();\n const scaleX = width / toWidth;\n const scaleY = height / toHeight;\n\n applyStyles(ghost, {\n transition: 'none',\n top: `${toTop}px`,\n left: `${toLeft}px`,\n transformOrigin: 'top left',\n transform: `translate3d(${left - toLeft}px, ${top - toTop}px, 0) scale(${scaleX}, ${scaleY})`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n });\n }\n document.body.classList.add('ghost-animating');\n if (!existingGhost) document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n existingGhost.style.transition = '';\n }\n\n ghost.style.transform = '';\n\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement, shouldAppendProfileInfo = false) {\n const ghost = document.createElement('div');\n ghost.classList.add('ghost');\n\n const img = new Image();\n\n if (typeof source === 'string') {\n img.src = source;\n } else if (source instanceof HTMLVideoElement) {\n img.src = source.poster;\n } else {\n img.src = source.src;\n }\n\n ghost.appendChild(img);\n\n if (shouldAppendProfileInfo) {\n ghost.classList.add('ProfileInfo');\n const profileInfo = document.querySelector('#RightColumn .ProfileInfo .info');\n if (profileInfo) {\n ghost.appendChild(profileInfo.cloneNode(true));\n }\n }\n\n return ghost;\n}\n\nfunction uncover(realWidth: number, realHeight: number, top: number, left: number, width: number, height: number) {\n if (realWidth === realHeight) {\n const size = Math.max(width, height) * (realWidth / realHeight);\n left -= (size - width) / 2;\n top -= (size - height) / 2;\n width = size;\n height = size;\n } else if (realWidth > realHeight) {\n const srcWidth = width;\n width = height * (realWidth / realHeight);\n left -= (width - srcWidth) / 2;\n } else if (realHeight > realWidth) {\n const srcHeight = height;\n height = width * (realHeight / realWidth);\n top -= (height - srcHeight) / 2;\n }\n\n return {\n top, left, width, height,\n };\n}\n\nfunction isElementInViewport(el: HTMLElement) {\n if (el.style.display === 'none') {\n return false;\n }\n\n const rect = el.getBoundingClientRect();\n const { height: windowHeight } = windowSize.get();\n\n return (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n}\n\nfunction isMessageImageFullyVisible(container: HTMLElement, imageEl: HTMLElement) {\n const messageListElement = document.querySelector('.active > .MessageList')!;\n let imgOffsetTop = container.offsetTop + imageEl.closest('.content-inner, .WebPage')!.offsetTop;\n if (container.id.includes('album-media-')) {\n imgOffsetTop += container.parentElement!.offsetTop + container.closest('.Message')!.offsetTop;\n }\n\n return imgOffsetTop > messageListElement.scrollTop\n && imgOffsetTop + imageEl.offsetHeight < messageListElement.scrollTop + messageListElement.offsetHeight;\n}\n\nfunction getTopOffset(hasFooter: boolean) {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n let topOffsetRem = 4.125;\n if (hasFooter) {\n topOffsetRem += mql.matches ? 0.875 : 3.375;\n }\n\n return topOffsetRem * REM;\n}\n\nfunction applyStyles(element: HTMLElement, styles: Record) {\n Object.assign(element.style, styles);\n}\n\nfunction getNodes(origin: MediaViewerOrigin, message?: ApiMessage) {\n let containerSelector;\n let mediaSelector;\n\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n containerSelector = `.active > .MessageList #album-media-${message!.id}`;\n mediaSelector = '.full-media';\n break;\n\n case MediaViewerOrigin.SharedMedia:\n containerSelector = `#shared-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.SearchResult:\n containerSelector = `#search-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n containerSelector = '.MiddleHeader .ChatInfo .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .ProfileInfo .active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ScheduledInline:\n case MediaViewerOrigin.Inline:\n default:\n containerSelector = `.active > .MessageList #message${message!.id}`;\n mediaSelector = '.message-content .full-media, .message-content .thumbnail';\n }\n\n const container = document.querySelector(containerSelector)!;\n const mediaEls = container && container.querySelectorAll(mediaSelector);\n\n return {\n container,\n mediaEl: mediaEls && mediaEls[mediaEls.length - 1],\n };\n}\n\nfunction applyShape(ghost: HTMLDivElement, origin: MediaViewerOrigin) {\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n case MediaViewerOrigin.Inline:\n case MediaViewerOrigin.ScheduledInline:\n ghost.classList.add('rounded-corners');\n break;\n\n case MediaViewerOrigin.SharedMedia:\n case MediaViewerOrigin.ProfileAvatar:\n case MediaViewerOrigin.SearchResult:\n (ghost.firstChild as HTMLElement).style.objectFit = 'cover';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n ghost.classList.add('circle');\n break;\n }\n}\n\nfunction clearShape(ghost: HTMLDivElement) {\n (ghost.firstChild as HTMLElement).style.objectFit = 'default';\n ghost.classList.remove('rounded-corners', 'circle');\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../api/types';\n\nimport { getSenderTitle, isChatPrivate } from '../../modules/helpers';\nimport { formatMediaDateTime } from '../../util/dateFormat';\nimport renderText from '../common/helpers/renderText';\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from '../common/Avatar';\n\nimport './SenderInfo.scss';\n\ntype OwnProps = {\n chatId?: number;\n messageId?: number;\n isAvatar?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst SenderInfo: FC = ({\n chatId, messageId, sender, isAvatar, message, closeMediaViewer, focusMessage,\n}) => {\n const handleFocusMessage = useCallback(() => {\n closeMediaViewer();\n focusMessage({ chatId, messageId });\n }, [chatId, focusMessage, messageId, closeMediaViewer]);\n\n const lang = useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const isFromChat = sender.id < 0;\n const senderTitle = getSenderTitle(lang, sender);\n\n return (\n
\n {isFromChat ? (\n \n ) : (\n \n )}\n
\n
\n {senderTitle && renderText(senderTitle)}\n
\n
\n {isAvatar ? lang('lng_mediaview_profile_photo') : formatMediaDateTime(lang, message!.date * 1000)}\n
\n
\n
\n );\n};\n\nexport default withGlobal(\n (global, { chatId, messageId, isAvatar }): StateProps => {\n if (isAvatar && chatId) {\n return {\n sender: isChatPrivate(chatId) ? selectUser(global, chatId) : selectChat(global, chatId),\n };\n }\n\n if (!messageId || !chatId) {\n return {};\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n message,\n sender: message && selectSender(global, message),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['closeMediaViewer', 'focusMessage']),\n)(SenderInfo);\n","import React, { FC, useMemo } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './MediaViewerActions.scss';\nimport useMediaDownload from '../../hooks/useMediaDownload';\n\ntype OwnProps = {\n mediaData?: string;\n isVideo: boolean;\n isZoomed: boolean;\n message?: ApiMessage;\n fileName?: string;\n isAvatar?: boolean;\n onCloseMediaViewer: NoneToVoidFunction;\n onForward: NoneToVoidFunction;\n onZoomToggle: NoneToVoidFunction;\n};\n\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const {\n isDownloadStarted,\n downloadProgress,\n handleDownloadClick,\n } = useMediaDownload(message && isVideo ? getMessageMediaHash(message, 'download') : undefined);\n\n const lang = useLang();\n\n const MenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n if (IS_MOBILE_SCREEN) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isDownloadStarted ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isDownloadStarted && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isDownloadStarted ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n )}\n \n \n \n \n \n \n
\n );\n};\n\nexport default MediaViewerActions;\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport { REM } from '../common/helpers/mediaDimensions';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHideable: boolean;\n};\n\nconst MediaViewerFooter: FC = ({ text = '', isHideable, onClick }) => {\n const [isMultiline, setIsMultiline] = useState(false);\n useEffect(() => {\n const footerContent = document.querySelector('.MediaViewerFooter .media-text') as HTMLDivElement | null;\n\n const checkIsMultiline = () => {\n const height = footerContent ? footerContent.clientHeight : 0;\n\n setIsMultiline(height > REM * 2);\n };\n\n // First run for initial detection of multiline footer text\n checkIsMultiline();\n\n const handleResize = throttle(checkIsMultiline, RESIZE_THROTTLE_MS, true);\n\n window.addEventListener('resize', handleResize, false);\n\n return () => {\n window.removeEventListener('resize', handleResize, false);\n };\n }, []);\n\n function stopEvent(e: React.MouseEvent) {\n if (text) {\n e.stopPropagation();\n }\n }\n\n return (\n
\n {text && (\n
\n

{text}

\n
\n )}\n
\n );\n};\n\nexport default MediaViewerFooter;\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\nimport { PLATFORM_ENV } from '../util/environment';\n\ntype RefType = {\n current: HTMLElement | null;\n};\n\ntype ReturnType = [boolean, () => void, () => void] | [false];\ntype CallbackType = (isPlayed: boolean) => void;\n\nconst prop = getBrowserFullscreenElementProp();\n\nexport default function useFullscreenStatus(elRef: RefType, setIsPlayed: CallbackType): ReturnType {\n const [isFullscreen, setIsFullscreen] = useState(Boolean(prop && document[prop]));\n\n const setFullscreen = () => {\n if (!elRef.current || !(prop || PLATFORM_ENV === 'iOS')) {\n return;\n }\n\n if (elRef.current.requestFullscreen) {\n elRef.current.requestFullscreen();\n } else if (elRef.current.webkitRequestFullscreen) {\n elRef.current.webkitRequestFullscreen();\n } else if (elRef.current.webkitEnterFullscreen) {\n elRef.current.webkitEnterFullscreen();\n } else if (elRef.current.mozRequestFullScreen) {\n elRef.current.mozRequestFullScreen();\n }\n\n setIsFullscreen(true);\n };\n\n const exitFullscreen = () => {\n if (!elRef.current) {\n return;\n }\n\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n\n setIsFullscreen(false);\n };\n\n useLayoutEffect(() => {\n const listener = () => { setIsFullscreen(Boolean(prop && document[prop])); };\n const listenerEnter = () => { setIsFullscreen(true); };\n const listenerExit = () => {\n setIsFullscreen(false);\n setIsPlayed(false);\n };\n const video = elRef.current;\n\n document.addEventListener('fullscreenchange', listener, false);\n document.addEventListener('webkitfullscreenchange', listener, false);\n document.addEventListener('mozfullscreenchange', listener, false);\n\n if (video) {\n video.addEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.addEventListener('webkitendfullscreen', listenerExit, false);\n }\n\n return () => {\n document.removeEventListener('fullscreenchange', listener, false);\n document.removeEventListener('webkitfullscreenchange', listener, false);\n document.removeEventListener('mozfullscreenchange', listener, false);\n if (video) {\n video.removeEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.removeEventListener('webkitendfullscreen', listenerExit, false);\n }\n };\n // eslint-disable-next-line\n }, []);\n\n if (!prop && PLATFORM_ENV !== 'iOS') {\n return [false];\n }\n\n return [isFullscreen, setFullscreen, exitFullscreen];\n}\n\nfunction getBrowserFullscreenElementProp() {\n if (typeof document.fullscreenElement !== 'undefined') {\n return 'fullscreenElement';\n } else if (typeof document.mozFullScreenElement !== 'undefined') {\n return 'mozFullScreenElement';\n } else if (typeof document.webkitFullscreenElement !== 'undefined') {\n return 'webkitFullscreenElement';\n }\n\n return '';\n}\n","const units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];\n\nexport default (bytes: number) => {\n const number = bytes === 0 ? 0 : Math.floor(Math.log(bytes) / Math.log(1024));\n\n return `${(bytes / 1024 ** Math.floor(number)).toFixed(1)} ${units[number]}`;\n};\n","import React, { FC, useState, useEffect } from '../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport formatFileSize from './helpers/formatFileSize';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './VideoPlayerControls.scss';\n\ntype IProps = {\n bufferedProgress: number;\n currentTime: number;\n duration: number;\n fileSize: number;\n isForceVisible: boolean;\n isForceMobileVersion?: boolean;\n isPlayed: boolean;\n isFullscreenSupported: boolean;\n isFullscreen: boolean;\n onChangeFullscreen: (e: React.MouseEvent) => void;\n onPlayPause: (e: React.MouseEvent) => void;\n onSeek: OnChangeHandler;\n};\n\ntype OnChangeHandler = (e: React.ChangeEvent) => void;\n\nconst stopEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n};\n\nconst HIDE_CONTROLS_TIMEOUT_MS = 800;\n\nconst VideoPlayerControls: FC = ({\n bufferedProgress,\n currentTime,\n duration,\n fileSize,\n isForceVisible,\n isForceMobileVersion,\n isPlayed,\n isFullscreenSupported,\n isFullscreen,\n onChangeFullscreen,\n onPlayPause,\n onSeek,\n}) => {\n const [isVisible, setVisibility] = useState(true);\n\n useEffect(() => {\n if (isForceVisible) {\n setVisibility(isForceVisible);\n }\n }, [isForceVisible]);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n if (!isForceVisible) {\n if (IS_MOBILE_SCREEN) {\n setVisibility(false);\n } else {\n timeout = window.setTimeout(() => {\n setVisibility(false);\n }, HIDE_CONTROLS_TIMEOUT_MS);\n }\n }\n\n return () => {\n if (timeout) {\n window.clearTimeout(timeout);\n }\n };\n }, [isForceVisible]);\n\n useEffect(() => {\n if (isVisible || isForceVisible) {\n document.body.classList.add('video-controls-visible');\n }\n\n return () => {\n document.body.classList.remove('video-controls-visible');\n };\n }, [isForceVisible, isVisible]);\n\n const lang = useLang();\n\n if (!isVisible && !isForceVisible) {\n return undefined;\n }\n\n return (\n
\n {renderSeekLine(currentTime, duration, bufferedProgress, onSeek)}\n \n \n \n {renderTime(currentTime, duration)}\n {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)}\n {isFullscreenSupported && (\n \n \n \n )}\n
\n );\n};\n\nfunction renderTime(currentTime: number, duration: number) {\n return (\n
\n {`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`}\n
\n );\n}\n\nfunction renderFileSize(downloadedPercent: number, totalSize: number) {\n return (\n
\n {`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`}\n
\n );\n}\n\nfunction renderSeekLine(currentTime: number, duration: number, bufferedProgress: number, onSeek: OnChangeHandler) {\n const percentagePlayed = (currentTime / duration) * 100;\n const percentageBuffered = bufferedProgress * 100;\n\n return (\n
\n
\n \n \n \n
\n
\n );\n}\n\nexport default VideoPlayerControls;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IDimensions } from '../../modules/helpers';\n\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useFullscreenStatus from '../../hooks/useFullscreen';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport safePlay from '../../util/safePlay';\n\nimport VideoPlayerControls from './VideoPlayerControls';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: IDimensions;\n downloadProgress?: number;\n fileSize: number;\n isMediaViewerOpen?: boolean;\n noPlay?: boolean;\n onClose: (e: React.MouseEvent) => void;\n};\n\nconst MOBILE_VERSION_CONTROL_WIDTH = 400;\n\nconst VideoPlayer: FC = ({\n url,\n isGif,\n posterData,\n posterSize,\n downloadProgress,\n fileSize,\n isMediaViewerOpen,\n noPlay,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n const [isPlayed, setIsPlayed] = useState(!IS_TOUCH_ENV || !IS_IOS);\n const [currentTime, setCurrentTime] = useState(0);\n const [isControlsVisible, setIsControlsVisible] = useState(true);\n\n const [isFullscreen, setFullscreen, exitFullscreen] = useFullscreenStatus(videoRef, setIsPlayed);\n\n const { isBuffered, bufferedProgress, bufferingHandlers } = useBuffering();\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(!isBuffered, undefined, undefined, 'slow');\n\n useEffect(() => {\n if (noPlay || !isMediaViewerOpen) {\n videoRef.current!.pause();\n } else if (url && !IS_TOUCH_ENV) {\n // Chrome does not automatically start playing when `url` becomes available (even with `autoPlay`),\n // so we force it here. Contrary, iOS does not allow to call `play` without mouse event,\n // so we need to use `autoPlay` instead to allow pre-buffering.\n safePlay(videoRef.current!);\n }\n }, [noPlay, isMediaViewerOpen, url]);\n\n useEffect(() => {\n if (videoRef.current!.currentTime === videoRef.current!.duration) {\n setCurrentTime(0);\n setIsPlayed(false);\n } else {\n setCurrentTime(videoRef.current!.currentTime);\n }\n }, [currentTime]);\n\n const togglePlayState = useCallback((e: React.MouseEvent | KeyboardEvent) => {\n e.stopPropagation();\n if (isPlayed) {\n videoRef.current!.pause();\n setIsPlayed(false);\n } else {\n videoRef.current!.play();\n setIsPlayed(true);\n }\n }, [isPlayed]);\n\n useVideoCleanup(videoRef, []);\n\n const handleMouseOver = useCallback(() => {\n setIsControlsVisible(true);\n }, []);\n\n const handleMouseOut = useCallback(() => {\n setIsControlsVisible(false);\n }, []);\n\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setCurrentTime(e.currentTarget.currentTime);\n }, []);\n\n const handleEnded = useCallback(() => {\n setCurrentTime(0);\n setIsPlayed(false);\n }, []);\n\n const handleFullscreenChange = useCallback(() => {\n if (isFullscreen && exitFullscreen) {\n exitFullscreen();\n } else if (!isFullscreen && setFullscreen) {\n setFullscreen();\n }\n }, [exitFullscreen, isFullscreen, setFullscreen]);\n\n const handleSeek = useCallback((e: React.ChangeEvent) => {\n e.stopPropagation();\n\n videoRef.current!.currentTime = (Number(e.target.value) * videoRef.current!.duration) / 100;\n }, []);\n\n const toggleControls = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n togglePlayState(e);\n }\n };\n\n document.addEventListener('keydown', togglePayingStateBySpace, false);\n\n return () => {\n document.removeEventListener('keydown', togglePayingStateBySpace, false);\n };\n }, [togglePlayState]);\n\n const wrapperStyle = posterSize && `width: ${posterSize.width}px; height: ${posterSize.height}px`;\n const videoStyle = `background-image: url(${posterData})`;\n\n return (\n \n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n {url && }\n \n \n {shouldRenderSpinner && (\n
\n {!isBuffered &&
Buffering...
}\n \n
\n )}\n {!isGif && !shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(VideoPlayer);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ZoomControls.scss';\n\ntype OwnProps = {\n isShown: boolean;\n onChangeZoom: (level: number, canCloseZoom?: boolean) => void;\n};\n\nexport const MAX_ZOOM_LEVEL = 3;\nexport const MIN_ZOOM_LEVEL = 1;\nconst ONE_STEP_PERCENT = 100 / (MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL);\nconst RESET_ZOOM_LEVEL = 1.5;\n\nconst ZoomControls: FC = ({ isShown, onChangeZoom }) => {\n const { transitionClassNames } = useShowTransition(isShown);\n const prevIsShown = usePrevious(isShown);\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [zoomLevel, setZoomLevel] = useState(1);\n const isSeeking = useRef(false);\n\n useEffect(() => {\n if (isShown && !prevIsShown) {\n setZoomLevel(RESET_ZOOM_LEVEL);\n }\n }, [isShown, prevIsShown]);\n\n const handleZoomOut = () => {\n if (inputRef.current) {\n setZoomLevel(Math.max(MIN_ZOOM_LEVEL, zoomLevel - 0.5));\n }\n };\n\n const handleZoomIn = () => {\n if (inputRef.current) {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, zoomLevel + 0.5));\n }\n };\n\n const handleStartSeek = useCallback(() => {\n isSeeking.current = true;\n }, []);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (zoomLevel === 1) {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }\n }, [onChangeZoom, zoomLevel]);\n\n const handleSeeklineChange = (e:React.ChangeEvent) => {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, Math.max(Number(e.target.value), MIN_ZOOM_LEVEL)));\n };\n\n useEffect(() => {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }, [zoomLevel, onChangeZoom]);\n\n const lang = useLang();\n\n const className = buildClassName(\n 'ZoomControls',\n transitionClassNames,\n );\n\n return (\n
\n \n \n \n \n \n \n
\n
\n \n \n
\n
\n
\n );\n};\n\nexport default memo(ZoomControls);\n","/*\n @source https://github.com/ajainarayanan/react-pan-zoom\n\n Heavily inspired/lifted from this idea: https://stackoverflow.com/a/39311435/661768\n without jqueryUI or jquery dependency.\n*/\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nimport './PanZoom.scss';\n\nexport interface IDragData {\n x: number;\n y: number;\n dx: number;\n dy: number;\n}\n\nexport interface OwnProps {\n children: any;\n className?: string;\n noWrap: boolean;\n canPan: boolean;\n zoomLevel: number;\n panDeltaX: number;\n panDeltaY: number;\n onPan?: (x: number, y: number) => void;\n}\n\nconst INITIAL_MATRIX = [\n 1, 0, 0, 1, 0, 0,\n];\n\nconst SCALE_VALUES = {\n 1: 1,\n 1.5: 1.5,\n 2: 2.2,\n 2.5: 3.3,\n 3: 5.5,\n};\n\nconst ZOOM_SAFE_AREA = 150;\n\nfunction calculateSafeZoneOnZoom(oldScale: number, matrixData: number[], wrapper: HTMLDivElement | null) {\n const image = wrapper && wrapper.querySelector('.active img');\n if (!wrapper || !image) {\n return matrixData;\n }\n const wrapperRect = wrapper.getBoundingClientRect();\n const imageRect = image.getBoundingClientRect();\n\n const newImgWidth = (imageRect.width / oldScale) * matrixData[0];\n const newImgHeight = (imageRect.height / oldScale) * matrixData[3];\n const newImgX = (wrapperRect.width - newImgWidth) / 2 + matrixData[4];\n const newImgY = (wrapperRect.height - newImgHeight) / 2 + matrixData[5];\n if (wrapperRect.width && wrapperRect.width - ZOOM_SAFE_AREA < newImgX) {\n matrixData[4] -= newImgX + wrapperRect.width - ZOOM_SAFE_AREA;\n } else if (newImgWidth && newImgWidth + newImgX < ZOOM_SAFE_AREA) {\n matrixData[4] -= newImgWidth + newImgX - ZOOM_SAFE_AREA;\n }\n if (wrapperRect.height && wrapperRect.height - ZOOM_SAFE_AREA < newImgY) {\n matrixData[5] -= newImgY + wrapperRect.height - ZOOM_SAFE_AREA;\n } else if (newImgHeight && newImgHeight + newImgY < ZOOM_SAFE_AREA) {\n matrixData[5] -= newImgHeight + newImgY - ZOOM_SAFE_AREA;\n }\n\n return matrixData;\n}\n\nconst PanZoom: FC = ({\n children,\n className,\n noWrap,\n canPan,\n zoomLevel,\n panDeltaX,\n panDeltaY,\n onPan,\n}) => {\n const tunedZoomLevel = SCALE_VALUES[zoomLevel as keyof typeof SCALE_VALUES] || zoomLevel;\n const [isDragging, setIsDragging] = useState(false);\n const [dragData, setDragData] = useState({\n dx: panDeltaX, dy: panDeltaY, x: 0, y: 0,\n });\n // [zoom, skew, skew, zoom, dx, dy] - see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix()\n const [matrixData, setMatrixData] = useState(INITIAL_MATRIX);\n // Used to set cursor while moving.\n // eslint-disable-next-line no-null/no-null\n const panWrapperRef = useRef(null);\n // Used to set transform for pan.\n // eslint-disable-next-line no-null/no-null\n const panContainerRef = useRef(null);\n\n useEffect(() => {\n const newZoomLevel = tunedZoomLevel || matrixData[0];\n const newPandx = panDeltaX || matrixData[4];\n const newPandy = panDeltaY || matrixData[5];\n\n const newMatrixData = [...matrixData];\n if (matrixData[0] !== newZoomLevel) {\n newMatrixData[0] = newZoomLevel || newMatrixData[0];\n newMatrixData[3] = newZoomLevel || newMatrixData[3];\n }\n if (matrixData[4] !== newPandx) {\n newMatrixData[4] = newPandx;\n }\n if (matrixData[5] !== newPandy) {\n newMatrixData[5] = newPandy;\n }\n\n if (!areSortedArraysEqual(matrixData, newMatrixData)) {\n setMatrixData(calculateSafeZoneOnZoom(matrixData[0], newMatrixData, panWrapperRef.current));\n }\n // eslint-disable-next-line\n }, [panDeltaX, panDeltaY, tunedZoomLevel]);\n\n useEffect(() => {\n if (!canPan) {\n setMatrixData(INITIAL_MATRIX);\n }\n }, [canPan]);\n\n useEffect(() => {\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }, [noWrap, matrixData]);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!canPan) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n const offsetX = matrixData[4];\n const offsetY = matrixData[5];\n const newDragData: IDragData = {\n dx: offsetX,\n dy: offsetY,\n x: e.pageX,\n y: e.pageY,\n };\n setDragData(newDragData);\n setIsDragging(true);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.add('move');\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.remove('move');\n }\n\n if (onPan) {\n onPan(matrixData[4], matrixData[5]);\n }\n };\n\n function getNewMatrixData(x: number, y: number): number[] {\n const newMatrixData = [...matrixData];\n const deltaX = dragData.x - x;\n const deltaY = dragData.y - y;\n newMatrixData[4] = dragData.dx - deltaX;\n newMatrixData[5] = dragData.dy - deltaY;\n\n return newMatrixData;\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (isDragging) {\n const newMatrixData = getNewMatrixData(e.pageX, e.pageY);\n setMatrixData(newMatrixData);\n\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }\n };\n\n if (noWrap) {\n return children;\n }\n\n return (\n \n \n {children}\n \n \n );\n};\n\nexport default memo(PanZoom);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment';\nimport {\n AVATAR_FULL_DIMENSIONS,\n MEDIA_VIEWER_MEDIA_QUERY,\n calculateMediaViewerDimensions,\n} from '../common/helpers/mediaDimensions';\nimport {\n selectChat,\n selectChatMessage,\n selectChatMessages,\n selectCurrentMediaSearch,\n selectListedIds,\n selectOutlyingIds,\n selectScheduledMessage,\n selectScheduledMessages,\n selectUser,\n} from '../../modules/selectors';\nimport {\n getChatAvatarHash,\n getChatMediaMessageIds,\n getMessageMediaFilename,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getPhotoFullDimensions,\n getVideoDimensions,\n IDimensions,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { stopCurrentAudio } from '../../util/audioPlayer';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport { animateClosing, animateOpening } from './helpers/ghostAnimation';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\nimport ShowTransition from '../ui/ShowTransition';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport SenderInfo from './SenderInfo';\nimport MediaViewerActions from './MediaViewerActions';\nimport MediaViewerFooter from './MediaViewerFooter';\nimport VideoPlayer from './VideoPlayer';\nimport ZoomControls from './ZoomControls';\nimport PanZoom from './PanZoom';\n\nimport './MediaViewer.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageId?: number;\n senderId?: number;\n origin?: MediaViewerOrigin;\n avatarOwner?: ApiChat | ApiUser;\n profilePhotoIndex?: number;\n message?: ApiMessage;\n chatMessages?: Record;\n collectionIds?: number[];\n animationLevel: 0 | 1 | 2;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewer: FC = ({\n chatId,\n threadId,\n messageId,\n senderId,\n origin,\n avatarOwner,\n profilePhotoIndex,\n message,\n chatMessages,\n collectionIds,\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n animationLevel,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const animationKey = useRef(null);\n const isOpen = Boolean(avatarOwner || messageId);\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const isWebPagePhoto = Boolean(webPagePhoto);\n const isPhoto = Boolean(photo || webPagePhoto);\n const isVideo = Boolean(video);\n const isGif = video ? video.isGif : undefined;\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n const fileName = avatarOwner\n ? `avatar${avatarOwner.id}-${profilePhotoIndex}.jpg`\n : message && getMessageMediaFilename(message);\n const prevSenderId = usePrevious(senderId);\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panDelta, setPanDelta] = useState({ x: 0, y: 0 });\n\n const messageIds = useMemo(() => {\n return isWebPagePhoto && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isWebPagePhoto, messageId, chatMessages, collectionIds, isFromSharedMedia]);\n\n const selectedMediaMessageIndex = messageId ? messageIds.indexOf(messageId) : -1;\n const isFirst = selectedMediaMessageIndex === 0 || selectedMediaMessageIndex === -1;\n const isLast = selectedMediaMessageIndex === messageIds.length - 1 || selectedMediaMessageIndex === -1;\n if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n\n function getMediaHash(full?: boolean) {\n if (avatarOwner && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner, full ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, full ? 'viewerFull' : 'viewerPreview');\n }\n\n const blobUrlPictogram = useMedia(\n message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'),\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const previewMediaHash = getMediaHash();\n const blobUrlPreview = useMedia(\n previewMediaHash,\n undefined,\n avatarOwner && previewMediaHash && previewMediaHash.startsWith('profilePhoto')\n ? ApiMediaFormat.DataUri\n : ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const { mediaData: fullMediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMediaHash(true),\n undefined,\n message && getMessageMediaFormat(message, 'viewerFull'),\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n\n const localBlobUrl = (photo || video) ? (photo || video)!.blobUrl : undefined;\n let bestImageData = (!isVideo && (localBlobUrl || fullMediaData)) || blobUrlPreview || blobUrlPictogram;\n const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message));\n if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) {\n bestImageData = thumbDataUri;\n }\n\n const photoDimensions = isPhoto ? getPhotoFullDimensions((\n isWebPagePhoto ? getMessageWebPagePhoto(message!) : getMessagePhoto(message!)\n )!) : undefined;\n const videoDimensions = isVideo ? getVideoDimensions(getMessageVideo(message!)!) : undefined;\n\n useEffect(() => {\n if (!IS_MOBILE_SCREEN) {\n return;\n }\n\n document.body.classList.toggle('is-media-viewer-open', isOpen);\n }, [isOpen]);\n\n const forceUpdate = useForceUpdate();\n useEffect(() => {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', forceUpdate);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(forceUpdate);\n }\n\n return () => {\n if (typeof mql.removeEventListener === 'function') {\n mql.removeEventListener('change', forceUpdate);\n } else if (typeof mql.removeListener === 'function') {\n mql.removeListener(forceUpdate);\n }\n };\n }, [forceUpdate]);\n\n const prevMessage = usePrevious(message);\n const prevOrigin = usePrevious(origin);\n const prevAvatarOwner = usePrevious(avatarOwner);\n const prevBestImageData = usePrevious(bestImageData);\n useEffect(() => {\n if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n const textParts = message ? renderMessageText(message) : undefined;\n const hasFooter = Boolean(textParts);\n animateOpening(hasFooter, origin!, bestImageData!, message);\n }\n\n if (isGhostAnimation && !isOpen && (prevMessage || prevAvatarOwner)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n animateClosing(prevOrigin!, prevBestImageData!, prevMessage || undefined);\n }\n }, [\n isGhostAnimation, isOpen, origin, prevOrigin,\n message, prevMessage, prevAvatarOwner, bestImageData, prevBestImageData,\n ]);\n\n useEffect(() => {\n let timer: number | undefined;\n\n if (isZoomed) {\n setCanPanZoomWrap(true);\n } else {\n timer = window.setTimeout(() => {\n setCanPanZoomWrap(false);\n }, ANIMATION_DURATION);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [isZoomed]);\n\n const closeZoom = () => {\n setIsZoomed(false);\n setZoomLevel(1);\n setPanDelta({ x: 0, y: 0 });\n };\n\n const handleZoomToggle = useCallback(() => {\n setIsZoomed(!isZoomed);\n setZoomLevel(!isZoomed ? 1.5 : 1);\n if (isZoomed) {\n setPanDelta({ x: 0, y: 0 });\n }\n }, [isZoomed]);\n\n const handleZoomValue = useCallback((level: number, canCloseZoom = false) => {\n setZoomLevel(level);\n if (level === 1 && canCloseZoom) {\n closeZoom();\n }\n }, []);\n\n const close = useCallback(() => {\n closeMediaViewer();\n closeZoom();\n }, [closeMediaViewer]);\n\n const handleFooterClick = useCallback(() => {\n close();\n focusMessage({ chatId, threadId, messageId });\n }, [close, chatId, threadId, focusMessage, messageId]);\n\n const handleForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n closeZoom();\n }, [openForwardMenu, chatId, messageId]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(() => {\n if (isZoomed) {\n closeZoom();\n } else {\n close();\n }\n }) : undefined), [close, isOpen, isZoomed]);\n\n useEffect(() => {\n if (isVideo && !isGif) {\n stopCurrentAudio();\n }\n }, [isGif, isVideo]);\n\n const getMessageId = useCallback((fromId: number, direction: number): number => {\n let index = messageIds.indexOf(fromId);\n if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) {\n index += direction;\n }\n\n return messageIds[index];\n }, [messageIds]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, -1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isFirst, messageId, openMediaViewer, origin]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, 1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isLast, messageId, openMediaViewer, origin]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Left': // IE/Edge specific value\n case 'ArrowLeft':\n selectPreviousMedia();\n break;\n\n case 'Right': // IE/Edge specific value\n case 'ArrowRight':\n selectNextMedia();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector('.slide-container > .active, .slide-container > .to');\n if (!element) {\n return undefined;\n }\n\n const shouldCloseOnVideo = isGif && !IS_IOS;\n\n return captureEvents(element, {\n // eslint-disable-next-line max-len\n excludedClosestSelector: `.backdrop, .navigation, .media-viewer-head, .media-viewer-footer${!shouldCloseOnVideo ? ', .VideoPlayer' : ''}`,\n onClick: () => {\n if (!isZoomed) {\n close();\n }\n },\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n } else {\n close();\n }\n } : undefined,\n });\n }, [close, isGif, isZoomed, selectNextMedia, selectPreviousMedia, canPanZoomWrap]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const lang = useLang();\n\n function renderSlide(isActive: boolean) {\n if (avatarOwner) {\n return (\n
\n {renderPhoto(\n fullMediaData || blobUrlPreview,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n !IS_MOBILE_SCREEN && !isZoomed,\n )}\n
\n );\n } else if (message) {\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n\n return (\n
\n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaData || blobUrlPreview || blobUrlPictogram,\n message && calculateMediaViewerDimensions(photoDimensions!, hasFooter),\n !IS_MOBILE_SCREEN && !isZoomed,\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n
\n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_MOBILE_SCREEN && (\n \n \n \n )}\n \n {renderSenderInfo}\n \n \n
\n \n \n {renderSlide}\n \n \n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n \n \n )}\n \n );\n};\n\nfunction renderPhoto(blobUrl?: string, imageSize?: IDimensions, canDrag?: boolean) {\n return blobUrl\n ? (\n \n )\n : (\n \n \n \n );\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = global.mediaViewer;\n const {\n animationLevel,\n } = global.settings.byKey;\n\n if (origin === MediaViewerOrigin.SearchResult) {\n if (!(chatId && messageId)) {\n return { animationLevel };\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n if (!message) {\n return { animationLevel };\n }\n\n return {\n chatId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n animationLevel,\n };\n }\n\n if (avatarOwnerId) {\n const sender = selectUser(global, avatarOwnerId) || selectChat(global, avatarOwnerId);\n\n return {\n messageId: -1,\n senderId: avatarOwnerId,\n avatarOwner: sender,\n profilePhotoIndex: profilePhotoIndex || 0,\n animationLevel,\n origin,\n };\n }\n\n if (!(chatId && threadId && messageId)) {\n return { animationLevel };\n }\n\n let message: ApiMessage | undefined;\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n message = selectScheduledMessage(global, chatId, messageId);\n } else {\n message = selectChatMessage(global, chatId, messageId);\n }\n\n if (!message) {\n return { animationLevel };\n }\n\n let chatMessages: Record | undefined;\n\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n chatMessages = selectScheduledMessages(global, chatId);\n } else {\n chatMessages = selectChatMessages(global, chatId);\n }\n let collectionIds: number[] | undefined;\n\n if (origin === MediaViewerOrigin.Inline || origin === MediaViewerOrigin.Album) {\n collectionIds = selectOutlyingIds(global, chatId, threadId) || selectListedIds(global, chatId, threadId);\n } else if (origin === MediaViewerOrigin.SharedMedia) {\n const currentSearch = selectCurrentMediaSearch(global);\n const { foundIds } = (currentSearch && currentSearch.resultsByType && currentSearch.resultsByType.media) || {};\n collectionIds = foundIds;\n }\n\n return {\n chatId,\n threadId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n chatMessages,\n collectionIds,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openMediaViewer', 'closeMediaViewer', 'openForwardMenu', 'focusMessage',\n ]),\n)(MediaViewer));\n","import React, {\n FC, useMemo, useState, memo, useRef, useEffect, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport {\n getCanPostInChat, getChatTitle, isChatPrivate, sortChatIds,\n} from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick } from '../../util/iteratees';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\n\nimport Loading from '../ui/Loading';\nimport Modal from '../ui/Modal';\nimport InputText from '../ui/InputText';\nimport Button from '../ui/Button';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\n\nimport './ForwardPicker.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n activeListIds?: number[];\n archivedListIds?: number[];\n orderedPinnedIds?: number[];\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\nconst MODAL_HIDE_DELAY_MS = 300;\n\nconst ForwardPicker: FC = ({\n chatsById,\n activeListIds,\n archivedListIds,\n currentUserId,\n isOpen,\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n}) => {\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (isOpen) {\n if (!IS_MOBILE_SCREEN) {\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n });\n }, FOCUS_DELAY_MS);\n }\n } else {\n if (inputRef.current) {\n inputRef.current.blur();\n }\n\n setTimeout(() => {\n setFilter('');\n }, MODAL_HIDE_DELAY_MS);\n }\n }, [isOpen]);\n\n const chatIds = useMemo(() => {\n const listIds = [\n ...activeListIds || [],\n ...archivedListIds || [],\n ];\n\n return sortChatIds([\n ...listIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return true;\n }\n\n if (!getCanPostInChat(chat, MAIN_THREAD_ID)) {\n return false;\n }\n\n if (!filter) {\n return true;\n }\n\n return searchWords(getChatTitle(lang, chatsById[id], undefined, id === currentUserId), filter);\n }),\n ], chatsById, undefined, currentUserId ? [currentUserId] : undefined);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter, lang]);\n\n const [viewportIds, getMore] = useInfiniteScroll(loadMoreChats, chatIds, Boolean(filter));\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n setFilter(e.currentTarget.value);\n }, []);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isOpen, (index) => {\n if (viewportIds) {\n setForwardChatId({ id: viewportIds[index] });\n }\n }, '.ListItem-button', true);\n\n const modalHeader = (\n
\n \n \n \n \n
\n );\n\n return (\n \n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n setForwardChatId({ id })}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n },\n currentUserId,\n } = global;\n\n return {\n chatsById,\n activeListIds: listIds.active,\n archivedListIds: listIds.archived,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setForwardChatId', 'exitForwardMode', 'loadMoreChats']),\n)(ForwardPicker));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiError } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Errors.scss';\n\ntype StateProps = {\n errors: ApiError[];\n};\n\ntype DispatchProps = Pick;\n\nconst Errors: FC = ({ errors, dismissError }) => {\n const lang = useLang();\n\n if (!errors.length) {\n return undefined;\n }\n\n return (\n
\n {errors.map((error) => (\n \n

{getReadableErrorText(error)}

\n \n \n ))}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['errors']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissError']),\n)(Errors));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiNotification } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Notification from '../ui/Notification';\nimport renderText from '../common/helpers/renderText';\n\ntype StateProps = {\n notifications: ApiNotification[];\n};\n\ntype DispatchProps = Pick;\n\nconst Notifications: FC = ({ notifications, dismissNotification }) => {\n if (!notifications.length) {\n return undefined;\n }\n\n return (\n
\n {notifications.map(({ message }) => (\n \n ))}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['notifications']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissNotification']),\n)(Notifications));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\n\nexport type OwnProps = {\n url?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLinkModal: FC = ({ url, toggleSafeLinkModal }) => {\n const lang = useLang();\n\n const handleOpen = useCallback(() => {\n window.open(url);\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal, url]);\n\n const handleDismiss = useCallback(() => {\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal]);\n\n const renderingUrl = useCurrentOrPrev(url);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['toggleSafeLinkModal']),\n)(SafeLinkModal));\n","import React, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport {\n formatMonthAndYear, formatHumanDate, formatTime,\n} from '../../util/dateFormat';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './CalendarModal.scss';\n\nexport type OwnProps = {\n selectedAt?: number;\n maxAt?: number;\n isFutureMode?: boolean;\n isPastMode?: boolean;\n isOpen: boolean;\n withTimePicker?: boolean;\n submitButtonLabel?: string;\n secondButtonLabel?: string;\n onClose: () => void;\n onSubmit: (date: Date) => void;\n onSecondButtonClick?: NoneToVoidFunction;\n};\n\nconst WEEKDAY_LETTERS = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];\n\nconst CalendarModal: FC = ({\n selectedAt,\n maxAt,\n isFutureMode,\n isPastMode,\n isOpen,\n withTimePicker,\n submitButtonLabel,\n secondButtonLabel,\n onClose,\n onSubmit,\n onSecondButtonClick,\n}) => {\n const lang = useLang();\n const now = new Date();\n const defaultSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const maxDate = maxAt ? new Date(maxAt) : undefined;\n\n const [selectedDate, setSelectedDate] = useState(defaultSelectedDate);\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(defaultSelectedDate.getMinutes()),\n );\n\n const currentYear = selectedDate.getFullYear();\n const currentMonth = selectedDate.getMonth();\n const currentDate = selectedDate.getDate();\n\n useEffect(() => {\n if (isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate]);\n\n const shouldDisableNextMonth = (isPastMode && currentYear >= now.getFullYear() && currentMonth >= now.getMonth())\n || (maxDate && currentYear >= maxDate.getFullYear() && currentMonth >= maxDate.getMonth());\n const shouldDisablePrevMonth = isFutureMode && currentYear <= now.getFullYear() && currentMonth <= now.getMonth();\n\n const calendarGrid = useMemo(() => (\n buildCalendarGrid(currentYear, currentMonth)\n ), [currentMonth, currentYear]);\n\n function handlePrevMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() - 1);\n\n return dateCopy;\n });\n }\n\n function handleNextMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() + 1);\n\n return dateCopy;\n });\n }\n\n function handleDateSelect(date: number) {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setDate(date);\n\n return dateCopy;\n });\n }\n\n function handleSubmit() {\n onSubmit(selectedDate);\n }\n\n const handleChangeHours = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedHours('');\n e.target.value = '';\n return;\n }\n\n const hours = Math.max(0, Math.min(Number(value), 23));\n\n const date = new Date(selectedDate.getTime());\n date.setHours(hours);\n setSelectedDate(date);\n\n const hoursStr = formatInputTime(hours);\n setSelectedHours(hoursStr);\n e.target.value = hoursStr;\n }, [selectedDate]);\n\n const handleChangeMinutes = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedMinutes('');\n e.target.value = '';\n return;\n }\n\n const minutes = Math.max(0, Math.min(Number(value), 59));\n\n const date = new Date(selectedDate.getTime());\n date.setMinutes(minutes);\n setSelectedDate(date);\n\n const minutesStr = formatInputTime(minutes);\n setSelectedMinutes(minutesStr);\n e.target.value = minutesStr;\n }, [selectedDate]);\n\n function renderTimePicker() {\n return (\n
\n \n :\n \n
\n );\n }\n\n return (\n \n
\n
\n \n \n \n\n

\n {formatMonthAndYear(lang, selectedDate, IS_MOBILE_SCREEN)}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((letter) => (\n
\n {letter}\n
\n ))}\n {calendarGrid.map((gridDate) => (\n handleDateSelect(gridDate)}\n className={buildClassName(\n 'day-button',\n isDisabledDay(\n currentYear, currentMonth, gridDate, isFutureMode ? now : undefined, isPastMode ? now : maxDate,\n )\n ? 'disabled'\n : `${gridDate ? 'clickable' : ''}`,\n gridDate === currentDate && 'selected',\n )}\n >\n {!!gridDate && (\n {gridDate}\n )}\n
\n ))}\n
\n \n\n {withTimePicker && renderTimePicker()}\n\n
\n \n {secondButtonLabel && (\n \n )}\n
\n \n );\n};\n\nfunction buildCalendarGrid(year: number, month: number) {\n const grid: number[] = [];\n\n const date = new Date();\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(1);\n\n const monthStartDay = date.getDay();\n // Fill empty cells\n for (let i = 1; i < monthStartDay; i++) {\n grid.push(0);\n }\n\n while (date.getMonth() === month) {\n const gridDate = date.getDate();\n grid.push(gridDate);\n date.setDate(gridDate + 1);\n }\n\n return grid;\n}\n\nfunction isDisabledDay(year: number, month: number, day: number, minDate?: Date, maxDate?: Date) {\n const selectedDay = new Date(year, month, day, 0, 0, 0, 0);\n const fixedMinDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0, 0, 0);\n const fixedMaxDate = maxDate && new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 0, 0, 0, 0);\n\n if (fixedMaxDate && selectedDay > fixedMaxDate) {\n return true;\n } else if (fixedMinDate && selectedDay < fixedMinDate) {\n return true;\n }\n\n return false;\n}\n\nfunction formatInputTime(value: string | number) {\n return String(value).padStart(2, '0');\n}\n\nfunction formatSubmitLabel(lang: LangFn, date: Date) {\n const day = formatHumanDate(lang, date, true);\n\n if (day === 'Today') {\n return lang('Conversation.ScheduleMessage.SendToday', formatTime(date));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', day).replace('%@', formatTime(date));\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport CalendarModal from '../common/CalendarModal';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n selectedAt?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst HistoryCalendar: FC = ({\n isOpen, selectedAt, searchMessagesByDate, closeHistoryCalendar,\n}) => {\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeHistoryCalendar();\n }, [closeHistoryCalendar, searchMessagesByDate]);\n\n const lang = useLang();\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n selectedAt: global.historyCalendarSelectedAt,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesByDate', 'closeHistoryCalendar',\n ]),\n)(HistoryCalendar));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { IAlbum } from '../../types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectAllowedMessageActions,\n selectChat,\n selectCurrentMessageList,\n selectUser,\n} from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n message: ApiMessage;\n album?: IAlbum;\n onClose: () => void;\n};\n\ntype StateProps = {\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteMessageModal: FC = ({\n isOpen,\n isSchedule,\n message,\n album,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n deleteMessages({ messageIds, shouldDeleteForAll: true });\n onClose();\n }, [deleteMessages, message.id, onClose, album]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n if (isSchedule) {\n deleteScheduledMessages({ messageIds });\n } else {\n deleteMessages({\n messageIds,\n shouldDeleteForAll: false,\n });\n }\n onClose();\n }, [album, message.id, isSchedule, onClose, deleteScheduledMessages, deleteMessages]);\n\n const lang = useLang();\n\n return (\n \n

{lang('AreYouSureDeleteSingleMessage')}

\n {willDeleteForCurrentUserOnly && (\n

{lang('lng_delete_for_me_chat_hint')}

\n )}\n {willDeleteForAll && (\n

{lang('lng_delete_for_everyone_hint', 1, 'i')}

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message, isSchedule }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const { canDeleteForAll } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const chat = selectChat(global, message.chatId);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages', 'deleteScheduledMessages',\n ]),\n)(DeleteMessageModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectChat, selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: number;\n messageId: number;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isPrivateChat: boolean;\n isChatWithSelf: boolean;\n isGroup: boolean;\n isSuperGroup: boolean;\n canPinForAll: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst PinMessageModal: FC = ({\n isOpen,\n messageId,\n chatId,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n onClose,\n pinMessage,\n}) => {\n const handlePinMessageForAll = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false,\n });\n onClose();\n }, [pinMessage, chatId, messageId, onClose]);\n\n const handlePinMessage = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false, isOneSide: true, isSilent: true,\n });\n onClose();\n }, [chatId, messageId, onClose, pinMessage]);\n\n const lang = useLang();\n\n function renderMessage() {\n if (isChannel) {\n return lang('PinMessageAlertChannel');\n }\n\n if (isGroup || isSuperGroup) {\n return lang('PinMessageAlert');\n }\n\n return lang('PinMessageAlertChat');\n }\n\n return (\n \n

{renderMessage()}

\n \n {canPinForAll && (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const isPrivateChat = isChatPrivate(chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const chat = selectChat(global, chatId);\n const isChannel = !!chat && isChatChannel(chat);\n const isGroup = !!chat && isChatBasicGroup(chat);\n const isSuperGroup = !!chat && isChatSuperGroup(chat);\n const canPinForAll = (isPrivateChat && !isChatWithSelf) || isSuperGroup || isGroup;\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['pinMessage']),\n)(PinMessageModal));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId?: number;\n pinnedMessagesCount?: number;\n onClose: () => void;\n onUnpin: () => void;\n};\n\nconst UnpinAllMessagesModal: FC = ({\n isOpen,\n pinnedMessagesCount = 0,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n return (\n \n

{lang('Chat.UnpinAllMessagesConfirmation', pinnedMessagesCount, 'i')}

\n \n \n \n );\n};\n\nexport default memo(UnpinAllMessagesModal);\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectCanDeleteSelectedMessages, selectCurrentChat, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n selectedMessageIds?: number[];\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteSelectedMessagesModal: FC = ({\n isOpen,\n isSchedule,\n selectedMessageIds,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n exitMessageSelectMode,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n exitMessageSelectMode();\n onClose();\n }, [deleteMessages, exitMessageSelectMode, selectedMessageIds, onClose]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n if (isSchedule) {\n deleteScheduledMessages({ messageIds: selectedMessageIds });\n } else {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: false });\n }\n\n exitMessageSelectMode();\n onClose();\n }, [\n isSchedule, exitMessageSelectMode, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages,\n ]);\n\n const lang = useLang();\n\n if (!selectedMessageIds) {\n return undefined;\n }\n\n return (\n \n

{lang('AreYouSureDeleteFewMessages')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete them just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete them for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { isSchedule }): StateProps => {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { canDeleteForAll } = selectCanDeleteSelectedMessages(global);\n const chat = selectCurrentChat(global);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n selectedMessageIds,\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages',\n 'deleteScheduledMessages',\n 'exitMessageSelectMode',\n ]),\n)(DeleteSelectedMessagesModal));\n","import React, { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCurrentMessageList,\n selectSelectedMessagesCount,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useFlag from '../../hooks/useFlag';\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport MenuItem from '../ui/MenuItem';\n\nimport DeleteSelectedMessagesModal from './DeleteSelectedMessagesModal';\n\nimport './MessageSelectToolbar.scss';\n\nexport type OwnProps = {\n isActive?: boolean;\n canPost?: boolean;\n messageListType?: MessageListType;\n};\n\ntype StateProps = {\n isSchedule: boolean;\n selectedMessagesCount?: number;\n canDeleteMessages?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, openDeleteModal, exitMessageSelectMode]);\n\n const prevSelectedMessagesCount = usePrevious(selectedMessagesCount || undefined, true);\n const renderingSelectedMessagesCount = isActive ? selectedMessagesCount : prevSelectedMessagesCount;\n\n const lang = useLang();\n\n const formattedMessagesCount = lang('VoiceOver.Chat.MessagesSelected', renderingSelectedMessagesCount);\n\n const className = buildClassName(\n 'MessageSelectToolbar',\n canPost && 'with-composer',\n isActive && 'shown',\n );\n\n return (\n
\n
\n \n \n \n \n {formattedMessagesCount}\n \n\n {!!selectedMessagesCount && (\n
\n {messageListType !== 'scheduled' && (\n \n \n {lang('Forward')}\n \n \n )}\n \n \n {lang('Delete')}\n \n \n
\n )}\n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']),\n)(MessageSelectToolbar));\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nexport default (\n onSelect: NoneToVoidFunction,\n) => {\n // eslint-disable-next-line no-null/no-null\n const buttonRef = useRef(null);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n const isFocused = buttonRef.current === document.activeElement;\n\n if (isFocused) {\n onSelect();\n }\n }, [onSelect]);\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown, false);\n\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n return buttonRef;\n};\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport { isChatPrivate, getPrivateChatUserId } from '../../../modules/helpers';\nimport { selectChat, selectUser, selectIsChatPinned } from '../../../modules/selectors';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n withUsername?: boolean;\n onClick: (id: number) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n isPinned?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n handleDelete: openDeleteModal,\n });\n\n const handleClick = () => {\n onClick(chatId);\n };\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const privateChatUserId = chat && getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n const isPinned = selectIsChatPinned(global, chatId);\n\n return {\n chat,\n privateChatUser,\n isPinned,\n };\n },\n)(LeftSearchResultChat));\n","import React, {\n FC, useEffect, useCallback, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFirstOrLastName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport LeftSearchResultChat from './LeftSearchResultChat';\n\nimport './RecentContacts.scss';\n\ntype OwnProps = {\n onReset: () => void;\n};\n\ntype StateProps = {\n topUserIds?: number[];\n usersById: Record;\n recentlyFoundChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SEARCH_CLOSE_TIMEOUT_MS = 250;\nconst NBSP = '\\u00A0';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst RecentContacts: FC = ({\n topUserIds, usersById, recentlyFoundChatIds,\n onReset, loadTopUsers, loadContactList, openChat,\n addRecentlyFoundChatId, clearRecentlyFoundChats,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const topUsersRef = useRef(null);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadTopUsers();\n // Loading full contact list for quick local search before user enters the query\n loadContactList();\n });\n }, [loadTopUsers, loadContactList]);\n\n useHorizontalScroll(topUsersRef.current, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\n onReset();\n setTimeout(() => {\n addRecentlyFoundChatId({ id });\n }, SEARCH_CLOSE_TIMEOUT_MS);\n },\n [openChat, addRecentlyFoundChatId, onReset],\n );\n\n const lang = useLang();\n\n return (\n
\n {topUserIds && (\n
\n
\n {topUserIds.map((userId) => (\n
handleClick(userId)} dir={lang.isRtl ? 'rtl' : undefined}>\n \n
{renderText(getUserFirstOrLastName(usersById[userId]) || NBSP)}
\n
\n ))}\n
\n
\n )}\n {recentlyFoundChatIds && (\n
\n

\n {lang('Recent')}\n\n \n \n \n

\n {recentlyFoundChatIds.map((id) => (\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: topUserIds } = global.topPeers;\n const usersById = global.users.byId;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n return {\n topUserIds,\n usersById,\n recentlyFoundChatIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadTopUsers',\n 'loadContactList',\n 'openChat',\n 'addRecentlyFoundChatId',\n 'clearRecentlyFoundChats',\n ]),\n)(RecentContacts));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus,\n} from '../../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport renderText from '../../common/helpers/renderText';\nimport { pick } from '../../../util/iteratees';\nimport useMedia from '../../../hooks/useMedia';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useLang, { LangFn } from '../../../hooks/useLang';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport ListItem from '../../ui/ListItem';\nimport Link from '../../ui/Link';\n\nimport './ChatMessage.scss';\n\ntype OwnProps = {\n searchQuery?: string;\n message: ApiMessage;\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatMessage: FC = ({\n message,\n searchQuery,\n chatId,\n chat,\n privateChatUser,\n focusMessage,\n lastSyncTime,\n}) => {\n const mediaThumbnail = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro'));\n const isRoundVideo = Boolean(getMessageRoundVideo(message));\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n const lang = useLang();\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n \n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n
\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n\n
\n
\n
\n {renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}\n
\n
\n
\n \n );\n};\n\nfunction renderMessageSummary(\n lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean,\n) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, message, true), ['emoji', 'highlight'], { highlight: searchQuery })}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const privateChatUserId = getPrivateChatUserId(chat);\n\n return {\n chat,\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n ]),\n)(ChatMessage));\n","import React, { FC, memo, useMemo } from '../../../lib/teact/teact';\nimport { formatDateToString } from '../../../util/dateFormat';\n\nimport './DateSuggest.scss';\n\nconst SUGGESTION_COUNT = 8;\n\nexport type OwnProps = {\n searchDate: string;\n onSelect: (value: Date) => void;\n};\n\nconst DateSuggest: FC = ({\n searchDate, onSelect,\n}) => {\n const suggestions = useMemo(() => getSuggestionsFromDate(searchDate), [searchDate]);\n return (\n
\n {suggestions.map(({ date, text }) => {\n return (\n onSelect(date)}\n className=\"date-item\"\n key={text}\n >\n \n {text}\n \n );\n })}\n
\n );\n};\n\nfunction getSuggestionsFromDate(searchDate: string) {\n const hasYear = searchDate.match(/^\\d{2,4}-\\d{2}-\\d{2}$/g);\n if (hasYear) {\n const date = new Date(searchDate);\n return [{ date, text: formatDateToString(date) }];\n }\n\n const suggestion = [];\n const currentDate = new Date();\n const currentYear = currentDate.getFullYear();\n const latestYear = currentDate.getTime() > (new Date(`${currentYear}-${searchDate}`)).getTime()\n ? currentYear\n : currentYear - 1;\n\n for (let i = 0; i < SUGGESTION_COUNT; i++) {\n const date = new Date(`${latestYear - i}-${searchDate}`);\n suggestion.push({ date, text: formatDateToString(date) });\n }\n\n return suggestion;\n}\n\nexport default memo(DateSuggest);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport searchWords from '../../../util/searchWords';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getUserFullName, getMessageSummaryText, sortChatIds } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport LeftSearchResultChat from './LeftSearchResultChat';\nimport RecentContacts from './RecentContacts';\nimport ChatMessage from './ChatMessage';\nimport DateSuggest from './DateSuggest';\nimport Link from '../../ui/Link';\nimport NothingFound from '../../common/NothingFound';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n searchDate?: number;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n localContactIds?: number[];\n localChatIds?: number[];\n localUserIds?: number[];\n globalChatIds?: number[];\n globalUserIds?: number[];\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n usersById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH = 4;\nconst LESS_LIST_ITEMS_AMOUNT = 3;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatResults: FC = ({\n searchQuery, searchDate, dateSearchQuery, currentUserId,\n localContactIds, localChatIds, localUserIds, globalChatIds, globalUserIds,\n foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime,\n onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n}) => {\n const lang = useLang();\n\n const [shouldShowMoreLocal, setShouldShowMoreLocal] = useState(false);\n const [shouldShowMoreGlobal, setShouldShowMoreGlobal] = useState(false);\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const handleChatClick = useCallback(\n (id: number) => {\n openChat({ id });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_MOBILE_SCREEN) {\n onReset();\n }\n },\n [currentUserId, openChat, addRecentlyFoundChatId, onReset],\n );\n\n const handlePickerItemClick = useCallback((id: number) => {\n setGlobalSearchChatId({ id });\n }, [setGlobalSearchChatId]);\n\n const localResults = useMemo(() => {\n if (!searchQuery || (searchQuery.startsWith('@') && searchQuery.length < 2)) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const foundContactIds = localContactIds\n ? localContactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const fullName = getUserFullName(user);\n return (fullName && searchWords(fullName, searchQuery)) || searchWords(user.username, searchQuery);\n })\n : [];\n\n return [\n ...(currentUserId && searchWords(lang('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...sortChatIds(unique([\n ...foundContactIds,\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById),\n ];\n }, [searchQuery, localContactIds, currentUserId, lang, localChatIds, localUserIds, chatsById, usersById]);\n\n const globalResults = useMemo(() => {\n if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChatIds || !globalUserIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return sortChatIds(unique([...globalChatIds, ...globalUserIds]), chatsById, true);\n }, [chatsById, globalChatIds, globalUserIds, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if ((!searchQuery && !searchDate) || !foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId, searchQuery, searchDate]);\n\n const handleClickShowMoreLocal = useCallback(() => {\n setShouldShowMoreLocal(!shouldShowMoreLocal);\n }, [shouldShowMoreLocal]);\n\n const handleClickShowMoreGlobal = useCallback(() => {\n setShouldShowMoreGlobal(!shouldShowMoreGlobal);\n }, [shouldShowMoreGlobal]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages\n && !localResults.length && !globalResults.length && !foundMessages.length;\n\n if (!searchQuery && !searchDate) {\n return ;\n }\n\n return (\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && (\n \n )}\n {!!localResults.length && (\n
\n {localResults.map((id) => (\n \n ))}\n
\n )}\n {!!localResults.length && (\n
\n

\n {localResults.length > LESS_LIST_ITEMS_AMOUNT && (\n \n {lang(shouldShowMoreLocal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionDialogs')}\n

\n {localResults.map((id, index) => {\n if (!shouldShowMoreLocal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!globalResults.length && (\n
\n

\n {globalResults.length > LESS_LIST_ITEMS_AMOUNT && (\n \n {lang(shouldShowMoreGlobal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionGlobal')}\n

\n {globalResults.map((id, index) => {\n if (!shouldShowMoreGlobal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!foundMessages.length && (\n
\n

{lang('SearchMessages')}

\n {foundMessages.map(renderFoundMessage)}\n
\n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n\n const { userIds: localContactIds } = global.contactList || {};\n\n if (!localContactIds) {\n return {\n chatsById,\n usersById,\n };\n }\n\n const { currentUserId, messages, lastSyncTime } = global;\n const {\n fetchingStatus, globalResults, localResults, resultsByType,\n } = global.globalSearch;\n const { chatIds: globalChatIds, userIds: globalUserIds } = globalResults || {};\n const { chatIds: localChatIds, userIds: localUserIds } = localResults || {};\n const { byChatId: globalMessagesByChatId } = messages;\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n localContactIds,\n localChatIds,\n localUserIds,\n globalChatIds,\n globalUserIds,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n usersById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'addRecentlyFoundChatId',\n 'searchMessagesGlobal',\n 'setGlobalSearchChatId',\n ]),\n)(ChatResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getMessageSummaryText } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport DateSuggest from './DateSuggest';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatMessageResults: FC = ({\n searchQuery,\n currentUserId,\n dateSearchQuery,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n searchMessagesGlobal,\n onSearchDateSelect,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n chatId: currentUserId,\n });\n });\n }\n }, [currentUserId, lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages && !foundMessages.length;\n\n return (\n
\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && (\n \n )}\n {!!foundMessages.length && foundMessages.map(renderFoundMessage)}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { currentUserId, messages: { byChatId: globalMessagesByChatId }, lastSyncTime } = global;\n const { fetchingStatus, resultsByType } = global.globalSearch;\n\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMessagesGlobal']),\n)(ChatMessageResults));\n","import { GlobalState } from '../../../../global/types';\nimport {\n ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser,\n} from '../../../../api/types';\n\nexport type StateProps = {\n isLoading?: boolean;\n chatsById: Record;\n usersById: Record;\n globalMessagesByChatId?: Record }>;\n foundIds?: string[];\n lastSyncTime?: number;\n searchChatId?: number;\n};\n\nexport function createMapStateToProps(type: ApiGlobalMessageSearchType) {\n return (global: GlobalState, props: any) => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n const {\n fetchingStatus, resultsByType, chatId,\n } = global.globalSearch;\n\n // One component is used for two different types of results.\n // The differences between them are only in the isVoice property.\n // The rest of the search results use their own personal components.\n const currentType = type !== 'audio' ? type : (props && props.isVoice ? 'voice' : 'audio');\n\n const { byChatId: globalMessagesByChatId } = global.messages;\n const { foundIds } = (resultsByType && resultsByType[currentType]) || {};\n\n return {\n isLoading: foundIds === undefined\n || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false),\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n searchChatId: chatId,\n lastSyncTime: global.lastSyncTime,\n };\n };\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection, MediaViewerOrigin } from '../../../types';\n\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'media';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst MediaResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n openMediaViewer,\n}) => {\n const lang = useLang();\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleSelectMedia = useCallback((messageId: number, chatId: number) => {\n openMediaViewer({\n chatId,\n messageId,\n origin: MediaViewerOrigin.SearchResult,\n });\n }, [openMediaViewer]);\n\n function renderGallery() {\n return (\n
\n {foundMessages.map((message) => (\n \n ))}\n
\n );\n }\n\n function renderSearchResult() {\n return foundMessages.map((message) => (\n \n ));\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n const isMediaGrid = canRenderContents && foundIds && foundIds.length > 0 && !searchQuery;\n const isMessageList = canRenderContents && foundIds && foundIds.length > 0 && searchQuery;\n\n const classNames = buildClassName(\n 'search-content custom-scroll',\n isMessageList && 'chat-list',\n );\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {isMediaGrid && renderGallery()}\n {isMessageList && renderSearchResult()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'openMediaViewer',\n ]),\n)(MediaResults));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isChatPrivate,\n isChatGroup,\n} from '../../../../modules/helpers';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport function getSenderName(\n lang: LangFn, message: ApiMessage, chatsById: Record, usersById: Record,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isChatPrivate(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(lang, sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isChatPrivate(senderId) && (sender as ApiUser).isSelf) {\n senderName = `${lang('FromYou')} → ${getChatTitle(lang, chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(lang, chat)}`;\n }\n }\n\n return senderName;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport WebLink from '../../common/WebLink';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'links';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst LinkResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(LinkResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport { getMessageDocument } from '../../../modules/helpers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport Document from '../../common/Document';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'documents';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst FileResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n const message = globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n\n return message && getMessageDocument(message) ? message : undefined;\n }).filter(Boolean) as ApiMessage[];\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(lang, new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(FileResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Audio from '../../common/Audio';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n isVoice?: boolean;\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst AudioResults: FC = ({\n isVoice,\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n}) => {\n const lang = useLang();\n const currentType = isVoice ? 'voice' : 'audio';\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: currentType,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [currentType, lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n const handlePlayAudio = useCallback((messageId: number, chatId: number) => {\n openAudioPlayer({ chatId, messageId });\n }, [openAudioPlayer]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps('audio'),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n 'openAudioPlayer',\n ]),\n)(AudioResults));\n","import React, {\n FC, memo, useCallback, useState, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { GlobalSearchContent } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { parseDateString } from '../../../util/dateFormat';\nimport useKeyboardListNavigation from '../../../hooks/useKeyboardListNavigation';\nimport useLang from '../../../hooks/useLang';\n\nimport TabList from '../../ui/TabList';\nimport Transition from '../../ui/Transition';\nimport ChatResults from './ChatResults';\nimport UserChatResults from './ChatMessageResults';\nimport MediaResults from './MediaResults';\nimport LinkResults from './LinkResults';\nimport FileResults from './FileResults';\nimport AudioResults from './AudioResults';\n\nimport './LeftSearch.scss';\n\nexport type OwnProps = {\n searchQuery?: string;\n searchDate?: number;\n isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: GlobalSearchContent.ChatList, title: 'SearchAllChatsShort' },\n { type: GlobalSearchContent.Media, title: 'SharedMediaTab2' },\n { type: GlobalSearchContent.Links, title: 'SharedLinksTab2' },\n { type: GlobalSearchContent.Files, title: 'SharedFilesTab2' },\n { type: GlobalSearchContent.Music, title: 'SharedMusicTab2' },\n { type: GlobalSearchContent.Voice, title: 'SharedVoiceTab2' },\n];\n\nconst CHAT_TABS = [\n { type: GlobalSearchContent.ChatList, title: 'All Messages' },\n ...TABS.slice(1),\n];\n\nconst TRANSITION_RENDER_COUNT = Object.keys(GlobalSearchContent).length / 2;\n\nconst LeftSearch: FC = ({\n searchQuery,\n searchDate,\n isActive,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(0);\n const dateSearchQuery = useMemo(() => parseDateString(searchQuery), [searchQuery]);\n\n const handleSwitchTab = useCallback((index: number) => {\n const tab = TABS[index];\n setGlobalSearchContent({ content: tab.type });\n setActiveTab(index);\n }, [setGlobalSearchContent]);\n\n const handleSearchDateSelect = useCallback((value: Date) => {\n setGlobalSearchDate({ date: value.getTime() / 1000 });\n }, [setGlobalSearchDate]);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isActive, undefined, '.ListItem-button', true);\n\n return (\n
\n \n \n {() => {\n switch (currentContent) {\n case GlobalSearchContent.ChatList:\n if (chatId) {\n return (\n \n );\n }\n return (\n \n );\n case GlobalSearchContent.Media:\n return ;\n case GlobalSearchContent.Links:\n return ;\n case GlobalSearchContent.Files:\n return ;\n case GlobalSearchContent.Music:\n return (\n \n );\n case GlobalSearchContent.Voice:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentContent, chatId } = global.globalSearch;\n\n return { currentContent, chatId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setGlobalSearchContent', 'setGlobalSearchDate']),\n)(LeftSearch));\n","import { useState, useCallback, useRef } from '../lib/teact/teact';\n\nexport type ReducerAction = { type: Actions; payload?: any };\nexport type StateReducer = (state: State, action: ReducerAction) => State;\nexport type Dispatch = (action: ReducerAction) => void;\n\nexport default function useReducer(\n reducer: StateReducer,\n initialState: State,\n) {\n const reducerRef = useRef(reducer);\n const [state, setState] = useState(initialState);\n\n const dispatch = useCallback((action: ReducerAction) => {\n setState((currentState) => reducerRef.current(currentState, action));\n }, []);\n\n return [\n state,\n dispatch,\n ] as [State, Dispatch];\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { ApiChatFolder } from '../../api/types';\nimport { pick, omit } from '../../util/iteratees';\n\nexport type FolderChatType = {\n icon: string;\n title: string;\n key: keyof Pick;\n};\n\nexport const INCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'user', title: 'FilterContacts', key: 'contacts' },\n { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' },\n { icon: 'group', title: 'FilterGroups', key: 'groups' },\n { icon: 'channel', title: 'FilterChannels', key: 'channels' },\n { icon: 'bots', title: 'FilterBots', key: 'bots' },\n];\n\nexport const EXCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' },\n { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' },\n { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' },\n];\n\nconst INCLUDE_FILTER_FIELDS: Array = [\n 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts',\n];\nconst EXCLUDE_FILTER_FIELDS: Array = [\n 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead',\n];\n\nexport function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) {\n let selectedChatIds: number[] = [];\n let selectedChatTypes: FolderChatType['key'][] = [];\n\n if (mode === 'included') {\n const {\n includedChatIds,\n ...includeFilters\n } = selectTemp\n ? state.includeFilters || {}\n : pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = includedChatIds || [];\n selectedChatTypes = (Object.keys(includeFilters) as Array)\n .filter((key) => Boolean(includeFilters[key]));\n } else {\n const {\n excludedChatIds,\n ...excludeFilters\n } = selectTemp\n ? state.excludeFilters || {}\n : pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = excludedChatIds || [];\n selectedChatTypes = (Object.keys(excludeFilters) as Array)\n .filter((key) => Boolean(excludeFilters[key]));\n }\n\n return {\n selectedChatIds,\n selectedChatTypes,\n };\n}\n\nfunction getSuggestedFolderName(includeFilters?: FolderIncludeFilters) {\n if (includeFilters) {\n const {\n includedChatIds,\n ...filters\n } = includeFilters;\n\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (includedChatIds && includedChatIds.length)\n ) {\n return '';\n }\n\n if (filters.bots) {\n return 'Bots';\n } else if (filters.groups) {\n return 'Groups';\n } else if (filters.channels) {\n return 'Channels';\n } else if (filters.contacts) {\n return 'Contacts';\n } else if (filters.nonContacts) {\n return 'Non-Contacts';\n }\n }\n\n return '';\n}\n\ntype FolderIncludeFilters = Pick;\ntype FolderExcludeFilters = Pick;\n\nexport type FoldersState = {\n mode: 'create' | 'edit';\n isLoading?: boolean;\n isTouched?: boolean;\n error?: string;\n folderId?: number;\n chatFilter: string;\n folder: Omit;\n includeFilters?: FolderIncludeFilters;\n excludeFilters?: FolderExcludeFilters;\n};\nexport type FoldersActions = (\n 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' |\n 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters'\n);\nexport type FolderEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FoldersState = {\n mode: 'create',\n chatFilter: '',\n folder: {\n title: '',\n includedChatIds: [],\n excludedChatIds: [],\n },\n};\n\nconst foldersReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setTitle':\n return {\n ...state,\n folder: {\n ...state.folder,\n title: action.payload,\n },\n isTouched: true,\n };\n case 'editIncludeFilters':\n return {\n ...state,\n includeFilters: pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n ),\n };\n case 'editExcludeFilters':\n return {\n ...state,\n excludeFilters: pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n ),\n };\n case 'setIncludeFilters':\n return {\n ...state,\n includeFilters: action.payload,\n chatFilter: '',\n };\n case 'setExcludeFilters':\n return {\n ...state,\n excludeFilters: action.payload,\n chatFilter: '',\n };\n case 'saveFilters':\n if (state.includeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, INCLUDE_FILTER_FIELDS),\n title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters),\n ...state.includeFilters,\n },\n includeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else if (state.excludeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, EXCLUDE_FILTER_FIELDS),\n ...state.excludeFilters,\n },\n excludeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else {\n return state;\n }\n case 'editFolder': {\n const { id: folderId, description, ...folder } = action.payload;\n\n return {\n mode: 'edit',\n folderId,\n folder,\n chatFilter: '',\n };\n }\n case 'setChatFilter': {\n return {\n ...state,\n chatFilter: action.payload,\n };\n }\n case 'setIsLoading': {\n return {\n ...state,\n isLoading: action.payload,\n };\n }\n case 'setError': {\n return {\n ...state,\n error: action.payload,\n };\n }\n case 'reset':\n return INITIAL_STATE;\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(foldersReducer, INITIAL_STATE);\n};\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\n\nexport type TwoFaActions = (\n 'setCurrentPassword' | 'setPassword' | 'setHint' | 'setEmail' | 'reset'\n);\nexport type TwoFaDispatch = Dispatch;\n\nexport type TwoFaState = {\n currentPassword: string;\n password: string;\n hint: string;\n email: string;\n};\n\nconst INITIAL_STATE: TwoFaState = {\n currentPassword: '',\n password: '',\n hint: '',\n email: '',\n};\n\nconst twoFaReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setCurrentPassword':\n return {\n ...state,\n currentPassword: action.payload,\n };\n\n case 'setPassword':\n return {\n ...state,\n password: action.payload,\n };\n\n case 'setHint':\n return {\n ...state,\n hint: action.payload,\n };\n\n case 'setEmail':\n return {\n ...state,\n email: action.payload,\n };\n\n case 'reset':\n return INITIAL_STATE;\n\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(twoFaReducer, INITIAL_STATE);\n};\n","import React, {\n FC, useCallback, useMemo, memo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n currentScreen: SettingsScreens;\n editedFolderId?: number;\n onReset: () => void;\n onSaveFilter: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\n}) => {\n const [isSignOutDialogOpen, setIsSignOutDialogOpen] = useState(false);\n const [isDeleteFolderDialogOpen, setIsDeleteFolderDialogOpen] = useState(false);\n\n const openSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(true);\n }, []);\n\n const closeSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(false);\n }, []);\n\n const openDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(true);\n }, []);\n\n const closeDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(false);\n }, []);\n\n const handleSignOutMessage = useCallback(() => {\n closeSignOutConfirmation();\n signOut();\n }, [closeSignOutConfirmation, signOut]);\n\n const handleDeleteFolderMessage = useCallback(() => {\n closeDeleteFolderConfirmation();\n deleteChatFolder({ id: editedFolderId });\n onReset();\n }, [editedFolderId, closeDeleteFolderConfirmation, deleteChatFolder, onReset]);\n\n const SettingsMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n const lang = useLang();\n\n function renderHeaderContent() {\n switch (currentScreen) {\n case SettingsScreens.EditProfile:\n return

{lang('lng_settings_information')}

;\n case SettingsScreens.General:\n return

{lang('General')}

;\n case SettingsScreens.Notifications:\n return

{lang('Notifications')}

;\n case SettingsScreens.Privacy:\n return

{lang('PrivacySettings')}

;\n case SettingsScreens.Language:\n return

{lang('Language')}

;\n\n case SettingsScreens.GeneralChatBackground:\n return

{lang('ChatBackground')}

;\n case SettingsScreens.GeneralChatBackgroundColor:\n return

{lang('SetColor')}

;\n\n case SettingsScreens.PrivacyPhoneNumber:\n return

{lang('PrivacyPhone')}

;\n case SettingsScreens.PrivacyLastSeen:\n return

{lang('PrivacyLastSeen')}

;\n case SettingsScreens.PrivacyProfilePhoto:\n return

{lang('Privacy.ProfilePhoto')}

;\n case SettingsScreens.PrivacyForwarding:\n return

{lang('PrivacyForwards')}

;\n case SettingsScreens.PrivacyGroupChats:\n return

{lang('AutodownloadGroupChats')}

;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return

{lang('AlwaysShareWith')}

;\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return

{lang('NeverShareWith')}

;\n\n case SettingsScreens.PrivacyActiveSessions:\n return

{lang('SessionsTitle')}

;\n case SettingsScreens.PrivacyBlockedUsers:\n return

{lang('BlockedUsers')}

;\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n return

{lang('TwoStepVerification')}

;\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return

{lang('EnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return

{lang('PleaseReEnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaChangePasswordHint:\n return

{lang('PasswordHint')}

;\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaRecoveryEmail:\n return

{lang('RecoveryEmailTitle')}

;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return

Recovery Email Code

;\n case SettingsScreens.TwoFaCongratulations:\n return

{lang('TwoStepVerificationPasswordSet')}

;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return

{lang('PleaseEnterCurrentPassword')}

;\n\n case SettingsScreens.Folders:\n return

{lang('Filters')}

;\n case SettingsScreens.FoldersCreateFolder:\n return

{lang('FilterNew')}

;\n case SettingsScreens.FoldersEditFolder:\n return (\n
\n

{lang('FilterEdit')}

\n\n {editedFolderId && (\n \n \n Delete Folder\n \n \n )}\n
\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n
\n {currentScreen === SettingsScreens.FoldersIncludedChats ? (\n

{lang('FilterInclude')}

\n ) : (\n

{lang('FilterExclude')}

\n )}\n\n \n \n \n
\n );\n\n default:\n return (\n
\n

{lang('SETTINGS')}

\n\n \n {lang('LogOutTitle')}\n \n
\n );\n }\n }\n\n return (\n
\n \n \n \n {renderHeaderContent()}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['signOut', 'deleteChatFolder']),\n)(SettingsHeader));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n};\n\nconst SettingsMain: FC = ({\n onScreenSelect,\n currentUser,\n}) => {\n const lang = useLang();\n\n return (\n
\n
\n {currentUser && (\n
\n \n

{getUserFullName(currentUser)}

\n

{formatPhoneNumberWithCode(currentUser.phoneNumber)}

\n
\n )}\n onScreenSelect(SettingsScreens.EditProfile)}\n >\n {lang('lng_settings_information')}\n \n onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\n \n onScreenSelect(SettingsScreens.General)}\n >\n {lang('Telegram.GeneralSettingsViewController')}\n \n onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n \n onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n \n onScreenSelect(SettingsScreens.Language)}\n >\n {lang('Language')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n };\n },\n)(SettingsMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\nimport './FloatingActionButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n className?: string;\n color?: ButtonProps['color'];\n ariaLabel?: ButtonProps['ariaLabel'];\n disabled?: boolean;\n onClick: () => void;\n children: any;\n};\n\nconst FloatingActionButton: FC = ({\n isShown,\n className,\n color = 'primary',\n ariaLabel,\n disabled,\n onClick,\n children,\n}) => {\n const buttonClassName = buildClassName(\n 'FloatingActionButton',\n isShown && 'revealed',\n className,\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default FloatingActionButton;\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\n\ntype OwnProps = {\n currentUsername?: string;\n asLink?: boolean;\n isLoading?: boolean;\n isUsernameAvailable?: boolean;\n checkUsername: AnyToVoidFunction;\n onChange: (value: string | false) => void;\n};\n\nconst MIN_USERNAME_LENGTH = 5;\nconst MAX_USERNAME_LENGTH = 32;\nconst LINK_PREFIX = 'https://t.me/';\nconst LINK_PREFIX_REGEX = /https:\\/\\/t\\.me\\/?/i;\nconst USERNAME_REGEX = /^([a-zA-Z0-9_]+)$/;\n\nconst runDebouncedForCheckUsername = debounce((cb) => cb(), 250, false);\n\nfunction isUsernameValid(username: string) {\n return username.length >= MIN_USERNAME_LENGTH\n && username.length <= MAX_USERNAME_LENGTH\n && USERNAME_REGEX.test(username);\n}\n\nconst SettingsEditProfile: FC = ({\n currentUsername,\n asLink,\n isLoading,\n isUsernameAvailable,\n checkUsername,\n onChange,\n}) => {\n const [username, setUsername] = useState(currentUsername || '');\n\n const lang = useLang();\n const langPrefix = asLink ? 'SetUrl' : 'Username';\n const label = asLink ? lang('SetUrlPlaceholder') : lang('Username');\n\n const [usernameSuccess, usernameError] = useMemo(() => {\n if (!username.length) {\n return [];\n }\n\n if (username.length < MIN_USERNAME_LENGTH) {\n return [undefined, `${label} is too short`];\n }\n if (username.length > MAX_USERNAME_LENGTH) {\n return [undefined, `${label} is too long`];\n }\n if (!USERNAME_REGEX.test(username)) {\n return [undefined, `${label} contains invalid characters`];\n }\n\n if (isUsernameAvailable === undefined) {\n return [];\n }\n\n // Variable `isUsernameAvailable` is initialized with `undefined`, so a strict false check is required\n return [\n isUsernameAvailable ? lang(`${langPrefix}Available`, 'Username') : undefined,\n isUsernameAvailable === false ? lang(`${langPrefix}InUse`) : undefined,\n ];\n }, [username, isUsernameAvailable, lang, langPrefix, label]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [asLink, currentUsername]);\n\n const handleUsernameChange = useCallback((e: ChangeEvent) => {\n const newUsername = e.target.value.trim().replace(LINK_PREFIX_REGEX, '');\n setUsername(newUsername);\n e.target.value = `${asLink ? LINK_PREFIX : ''}${newUsername}`;\n\n const isValid = isUsernameValid(newUsername);\n\n if (isValid) {\n runDebouncedForCheckUsername(() => {\n checkUsername({ username: newUsername });\n });\n }\n\n if (onChange) {\n onChange(isValid ? newUsername : false);\n }\n }, [asLink, checkUsername, onChange]);\n\n return (\n \n );\n};\n\nexport default memo(SettingsEditProfile);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { ProfileEditProgress } from '../../../types';\n\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\nimport { getChatAvatarHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport InputText from '../../ui/InputText';\nimport renderText from '../../common/helpers/renderText';\nimport UsernameInput from '../../common/UsernameInput';\n\ntype StateProps = {\n currentAvatarHash?: string;\n currentFirstName?: string;\n currentLastName?: string;\n currentBio?: string;\n currentUsername?: string;\n progress?: ProfileEditProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst MAX_BIO_LENGTH = 70;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide your first name';\nconst ERROR_BIO_TOO_LONG = 'Bio can\\' be longer than 70 characters';\n\nconst SettingsEditProfile: FC = ({\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const [isUsernameTouched, setIsUsernameTouched] = useState(false);\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n\n const [photo, setPhoto] = useState();\n const [firstName, setFirstName] = useState(currentFirstName || '');\n const [lastName, setLastName] = useState(currentLastName || '');\n const [bio, setBio] = useState(currentBio || '');\n const [username, setUsername] = useState(currentUsername || '');\n\n const currentAvatarBlobUrl = useMedia(currentAvatarHash, false, ApiMediaFormat.BlobUrl);\n\n const isLoading = progress === ProfileEditProgress.InProgress;\n const isUsernameError = username === false;\n\n const isSaveButtonShown = useMemo(() => {\n if (isUsernameError) {\n return false;\n }\n\n return Boolean(photo) || isProfileFieldsTouched || isUsernameAvailable === true;\n }, [photo, isProfileFieldsTouched, isUsernameError, isUsernameAvailable]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadCurrentUser();\n });\n }, [loadCurrentUser]);\n\n useEffect(() => {\n setPhoto(undefined);\n }, [currentAvatarBlobUrl]);\n\n useEffect(() => {\n setFirstName(currentFirstName || '');\n setLastName(currentLastName || '');\n setBio(currentBio || '');\n }, [currentFirstName, currentLastName, currentBio]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [currentUsername]);\n\n useEffect(() => {\n if (progress === ProfileEditProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setIsUsernameTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handlePhotoChange = useCallback((newPhoto: File) => {\n setPhoto(newPhoto);\n }, []);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleBioChange = useCallback((e: ChangeEvent) => {\n setBio(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUsernameChange = useCallback((value: string | false) => {\n setUsername(value);\n setIsUsernameTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n const trimmedBio = bio.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n return;\n }\n\n if (trimmedBio.length > MAX_BIO_LENGTH) {\n setError(ERROR_BIO_TOO_LONG);\n return;\n }\n\n updateProfile({\n photo,\n ...(isProfileFieldsTouched && {\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n bio: trimmedBio,\n }),\n ...(isUsernameTouched && {\n username,\n }),\n });\n }, [\n photo,\n firstName, lastName, bio, isProfileFieldsTouched,\n username, isUsernameTouched,\n updateProfile,\n ]);\n\n const lang = useLang();\n\n return (\n
\n
\n
\n \n \n \n \n\n

\n {renderText(lang('lng_settings_about_bio'), ['br', 'simple_markdown'])}\n

\n
\n\n
\n

{lang('Username')}

\n\n \n\n

\n {renderText(lang('UsernameHelp'), ['br', 'simple_markdown'])}\n

\n {username && (\n

\n {lang('lng_username_link')}
\n https://t.me/{username}\n

\n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n const { progress, isUsernameAvailable } = global.profileEdit || {};\n const currentUser = currentUserId ? selectUser(global, currentUserId) : undefined;\n\n if (!currentUser) {\n return {\n progress,\n isUsernameAvailable,\n };\n }\n\n const {\n firstName: currentFirstName,\n lastName: currentLastName,\n username: currentUsername,\n fullInfo,\n } = currentUser;\n const { bio: currentBio } = fullInfo || {};\n const currentAvatarHash = getChatAvatarHash(currentUser);\n\n return {\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadCurrentUser',\n 'updateProfile',\n 'checkUsername',\n ]),\n)(SettingsEditProfile));\n","import React, {\n FC, memo, useMemo, useCallback, useState, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChatFolder, ApiChat, ApiUser } from '../../../../api/types';\nimport { NotifyException, NotifySettings } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../../modules/selectors';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport Button from '../../../ui/Button';\nimport Loading from '../../../ui/Loading';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\n\ntype OwnProps = {\n onCreateFolder: () => void;\n onEditFolder: (folder: ApiChatFolder) => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n orderedFolderIds?: number[];\n foldersById: Record;\n recommendedChatFolders?: ApiChatFolder[];\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true);\n\nconst MAX_ALLOWED_FOLDERS = 10;\n\nconst SettingsFoldersMain: FC = ({\n onCreateFolder,\n onEditFolder,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n loadRecommendedChatFolders,\n addChatFolder,\n showError,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersAll').then(setAnimationData);\n }\n }, [animationData]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottledForLoadRecommended(() => {\n loadRecommendedChatFolders();\n });\n }, [loadRecommendedChatFolders]);\n\n const handleCreateFolder = useCallback(() => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showError, onCreateFolder]);\n\n const lang = useLang();\n\n const userFolders = useMemo(() => {\n if (!orderedFolderIds) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n\n return orderedFolderIds.map((id) => {\n const folder = foldersById[id];\n\n return {\n id: folder.id,\n title: folder.title,\n subtitle: getFolderDescriptionText(\n lang, chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions,\n ),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, notifySettings, notifyExceptions, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showError({\n error: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showError]);\n\n return (\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n

\n {lang('CreateNewFilterInfo')}\n

\n\n \n \n {lang('CreateNewFilter')}\n \n
\n\n
\n

{lang('Filters')}

\n\n {userFolders && userFolders.length ? userFolders.map((folder) => (\n onEditFolder(foldersById[folder.id])}\n >\n {folder.title}\n {folder.subtitle}\n \n )) : userFolders && !userFolders.length ? (\n

\n You have no folders yet.\n

\n ) : }\n
\n\n {(recommendedChatFolders && !!recommendedChatFolders.length) && (\n
\n

\n {lang('FilterRecommended')}\n

\n\n {recommendedChatFolders.map((folder) => (\n handleCreateFolderFromRecommended(folder)}\n >\n
\n
\n {folder.title}\n {folder.description}\n
\n\n \n {lang('Add')}\n \n
\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n } = global;\n\n const {\n orderedIds: orderedFolderIds,\n byId: foldersById,\n recommended: recommendedChatFolders,\n } = global.chatFolders;\n\n return {\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showError']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\n\nimport './ShowMoreButton.scss';\n\ntype OwnProps = {\n count: number;\n itemName: string;\n itemPluralName?: string;\n isLoading?: boolean;\n onClick: () => void;\n};\n\nconst ShowMoreButton: FC = ({\n count,\n itemName,\n itemPluralName,\n isLoading,\n onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n \n Show {count} more {count > 1 ? itemPluralName || `${itemName}s` : itemName}\n \n );\n};\n\nexport default ShowMoreButton;\n","import React, {\n FC, memo, useCallback, useState, useEffect, useMemo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick, findIntersectionWithSet } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n FoldersState,\n FolderEditDispatch,\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\nimport InputText from '../../../ui/InputText';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport FloatingActionButton from '../../../ui/FloatingActionButton';\nimport Spinner from '../../../ui/Spinner';\nimport ShowMoreButton from '../../../ui/ShowMoreButton';\n\ntype OwnProps = {\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onAddIncludedChats: () => void;\n onAddExcludedChats: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: number[];\n loadedArchivedChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SUBMIT_TIMEOUT = 500;\n\nconst INITIAL_CHATS_LIMIT = 5;\n\nconst ERROR_NO_TITLE = 'Please provide a title for this folder.';\nconst ERROR_NO_CHATS = 'Please select at least one chat for this folder.';\n\nconst SettingsFoldersEdit: FC = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n onReset,\n loadedActiveChatIds,\n loadedArchivedChatIds,\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n const [isIncludedChatsListExpanded, setIsIncludedChatsListExpanded] = useState(false);\n const [isExcludedChatsListExpanded, setIsExcludedChatsListExpanded] = useState(false);\n\n const {\n selectedChatIds: includedChatIds,\n selectedChatTypes: includedChatTypes,\n } = selectChatFilters(state, 'included');\n const {\n selectedChatIds: excludedChatIds,\n selectedChatTypes: excludedChatTypes,\n } = selectChatFilters(state, 'excluded');\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersNew').then(setAnimationData);\n }\n }, [animationData]);\n\n useEffect(() => {\n setIsIncludedChatsListExpanded(false);\n setIsExcludedChatsListExpanded(false);\n }, [state.folderId]);\n\n const [visibleIncludedChatIds, visibleExcludedChatIds] = useMemo(() => {\n const allLoadedChatsSet = new Set([\n ...loadedActiveChatIds || [],\n ...loadedArchivedChatIds || [],\n ]);\n\n const loadedIncludedChatIds = findIntersectionWithSet(includedChatIds, allLoadedChatsSet);\n const loadedExcludedChatIds = findIntersectionWithSet(excludedChatIds, allLoadedChatsSet);\n\n return [\n isIncludedChatsListExpanded\n ? loadedIncludedChatIds\n : loadedIncludedChatIds.slice(0, INITIAL_CHATS_LIMIT - includedChatTypes.length),\n isExcludedChatsListExpanded\n ? loadedExcludedChatIds\n : loadedExcludedChatIds.slice(0, INITIAL_CHATS_LIMIT - excludedChatTypes.length),\n ];\n }, [\n excludedChatIds, includedChatIds, includedChatTypes, excludedChatTypes,\n isExcludedChatsListExpanded, isIncludedChatsListExpanded,\n loadedActiveChatIds, loadedArchivedChatIds,\n ]);\n\n useEffect(() => {\n if (\n visibleIncludedChatIds.length < includedChatIds.length\n || visibleExcludedChatIds.length < excludedChatIds.length\n ) {\n loadMoreChats({ listType: 'active' });\n }\n }, [\n loadMoreChats,\n excludedChatIds.length,\n includedChatIds.length,\n visibleExcludedChatIds.length,\n visibleIncludedChatIds.length,\n ]);\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n dispatch({ type: 'setTitle', payload: currentTarget.value.trim() });\n }\n\n function handleSubmit() {\n const { title } = state.folder;\n\n if (!title) {\n dispatch({ type: 'setError', payload: ERROR_NO_TITLE });\n return;\n }\n\n if (!includedChatIds.length && !Object.keys(includedChatTypes).length) {\n dispatch({ type: 'setError', payload: ERROR_NO_CHATS });\n return;\n }\n\n dispatch({ type: 'setIsLoading', payload: true });\n if (state.mode === 'edit') {\n editChatFolder({ id: state.folderId, folderUpdate: state.folder });\n } else {\n addChatFolder({ folder: state.folder });\n }\n\n setTimeout(() => {\n onReset();\n }, SUBMIT_TIMEOUT);\n }\n\n function renderChatType(key: string, mode: 'included' | 'excluded') {\n const chatType = mode === 'included'\n ? INCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key)\n : EXCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key);\n\n if (!chatType) {\n return undefined;\n }\n\n return (\n \n {lang(chatType.title)}\n \n );\n }\n\n function renderChats(mode: 'included' | 'excluded') {\n const selectedChatTypes = mode === 'included' ? includedChatTypes : excludedChatTypes;\n const visibleChatIds = mode === 'included' ? visibleIncludedChatIds : visibleExcludedChatIds;\n\n const isExpanded = mode === 'included' ? isIncludedChatsListExpanded : isExcludedChatsListExpanded;\n const allChatIds = mode === 'included' ? includedChatIds : excludedChatIds;\n const leftChatsCount = allChatIds.length - selectedChatTypes.length - visibleChatIds.length;\n const clickHandler = mode === 'included'\n ? () => setIsIncludedChatsListExpanded(true)\n : () => setIsExcludedChatsListExpanded(true);\n\n return (\n <>\n {selectedChatTypes.map((key) => renderChatType(key, mode))}\n {visibleChatIds.map((id) => (\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n {(!isExpanded && leftChatsCount > 0) && (\n \n )}\n \n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n {state.mode === 'create' && (\n

\n {lang('FilterIncludeInfo')}\n

\n )}\n\n \n
\n\n
\n {state.error && state.error === ERROR_NO_CHATS && (\n

\n {state.error}\n

\n )}\n\n

{lang('FilterInclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('included')}\n
\n\n
\n

{lang('FilterExclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('excluded')}\n
\n
\n\n \n {state.isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { listIds } = global.chats;\n\n return {\n loadedActiveChatIds: listIds.active,\n loadedArchivedChatIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolder', 'addChatFolder', 'loadMoreChats']),\n)(SettingsFoldersEdit));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport {\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n FolderChatType,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useInfiniteScroll from '../../../../hooks/useInfiniteScroll';\nimport useLang from '../../../../hooks/useLang';\n\nimport Checkbox from '../../../ui/Checkbox';\nimport InputText from '../../../ui/InputText';\nimport ListItem from '../../../ui/ListItem';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport PickerSelectedItem from '../../../common/PickerSelectedItem';\nimport InfiniteScroll from '../../../ui/InfiniteScroll';\nimport Loading from '../../../ui/Loading';\n\nimport '../../../common/Picker.scss';\nimport './SettingsFoldersChatsPicker.scss';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n chatIds: number[];\n selectedIds: number[];\n selectedChatTypes: string[];\n filterValue?: string;\n onSelectedIdsChange: (ids: number[]) => void;\n onSelectedChatTypesChange: (types: string[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_CHATS = 100;\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst SettingsFoldersChatsPicker: FC = ({\n mode,\n chatIds,\n selectedIds,\n selectedChatTypes,\n filterValue,\n onSelectedIdsChange,\n onSelectedChatTypesChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const chatTypes = mode === 'included' ? INCLUDED_CHAT_TYPES : EXCLUDED_CHAT_TYPES;\n const shouldMinimize = selectedIds.length + selectedChatTypes.length > MAX_FULL_ITEMS;\n const hasMaxChats = selectedIds.length >= MAX_CHATS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n }, [selectedIds, onSelectedIdsChange]);\n\n const handleChatTypeClick = useCallback((key: FolderChatType['key']) => {\n const newSelectedChatTypes = [...selectedChatTypes];\n if (newSelectedChatTypes.includes(key)) {\n newSelectedChatTypes.splice(newSelectedChatTypes.indexOf(key), 1);\n } else {\n newSelectedChatTypes.push(key);\n }\n onSelectedChatTypesChange(newSelectedChatTypes);\n }, [selectedChatTypes, onSelectedChatTypesChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const lang = useLang();\n\n function renderSelectedChatType(key: string) {\n const selectedType = chatTypes.find(({ key: typeKey }) => key === typeKey);\n if (!selectedType) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n function renderChatType(type: FolderChatType) {\n return (\n handleChatTypeClick(type.key)}\n ripple\n >\n \n

{lang(type.title)}

\n \n \n );\n }\n\n function renderItem(id: number) {\n const isSelected = selectedIds.includes(id);\n\n return (\n handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n \n );\n }\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, chatIds, Boolean(filterValue));\n\n return (\n
\n
\n {selectedChatTypes.map(renderSelectedChatType)}\n {selectedIds.map((id, i) => (\n \n ))}\n {!hasMaxChats ? (\n \n ) : (\n

\n {`Sorry, you can't add more than ${MAX_CHATS} chats.`}\n

\n )}\n
\n \n {(!viewportIds || !viewportIds.length || viewportIds.includes(chatIds[0])) && (\n <>\n

\n {lang('FilterChatTypes')}\n

\n {chatTypes.map(renderChatType)}\n
\n

\n {lang('FilterChats')}\n

\n \n )}\n\n {viewportIds && viewportIds.length ? (\n viewportIds.map(renderItem)\n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(SettingsFoldersChatsPicker);\n","import React, {\n FC, memo, useMemo, useCallback,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChat } from '../../../../api/types';\n\nimport useLang from '../../../../hooks/useLang';\nimport { pick } from '../../../../util/iteratees';\nimport searchWords from '../../../../util/searchWords';\nimport { prepareChatList, getChatTitle } from '../../../../modules/helpers';\nimport {\n FoldersState,\n FolderEditDispatch,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersChatsPicker from './SettingsFoldersChatsPicker';\n\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n state: FoldersState;\n dispatch: FolderEditDispatch;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsFoldersChatFilters: FC = ({\n mode,\n state,\n dispatch,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n loadMoreChats,\n}) => {\n const { chatFilter } = state;\n const { selectedChatIds, selectedChatTypes } = selectChatFilters(state, mode, true);\n\n const lang = useLang();\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [...activeChatArrays.pinnedChats, ...activeChatArrays.otherChats]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n !chatFilter\n || searchWords(getChatTitle(lang, chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, lang, selectedChatIds]);\n\n const handleFilterChange = useCallback((newFilter: string) => {\n dispatch({\n type: 'setChatFilter',\n payload: newFilter,\n });\n }, [dispatch]);\n\n const handleSelectedIdsChange = useCallback((ids: number[]) => {\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: { ...state.includeFilters, includedChatIds: ids },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: { ...state.excludeFilters, excludedChatIds: ids },\n });\n }\n }, [mode, state, dispatch]);\n\n const handleSelectedChatTypesChange = useCallback((keys: string[]) => {\n const newFilters: Record = {};\n keys.forEach((key) => {\n newFilters[key] = true;\n });\n\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: {\n includedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: {\n excludedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n }\n }, [mode, selectedChatIds, dispatch]);\n\n if (!displayedIds) {\n return ;\n }\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n } = global;\n\n return {\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats']),\n)(SettingsFoldersChatFilters));\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiChatFolder } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { FoldersState, FolderEditDispatch } from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersMain from './SettingsFoldersMain';\nimport SettingsFoldersEdit from './SettingsFoldersEdit';\nimport SettingsFoldersChatFilters from './SettingsFoldersChatFilters';\n\nimport './SettingsFolders.scss';\n\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n state,\n dispatch,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n dispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (state.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n state.mode, dispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleCreateFolder = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n }, [onScreenSelect, dispatch]);\n\n const handleEditFolder = useCallback((folder: ApiChatFolder) => {\n dispatch({ type: 'editFolder', payload: folder });\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }, [dispatch, onScreenSelect]);\n\n const handleAddIncludedChats = useCallback(() => {\n dispatch({ type: 'editIncludeFilters' });\n onScreenSelect(SettingsScreens.FoldersIncludedChats);\n }, [dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(SettingsScreens.FoldersExcludedChats);\n }, [dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n \n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n return (\n \n );\n case SettingsScreens.FoldersIncludedChats:\n return (\n \n );\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(SettingsFolders);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n range?: { min: number; max: number; step?: number };\n label?: string;\n value: number;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC = ({\n options,\n range,\n label,\n value,\n disabled,\n onChange,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent) => {\n onChange(Number(event.currentTarget.value));\n }, [onChange]);\n\n const className = buildClassName(\n 'RangeSlider',\n disabled && 'disabled',\n );\n\n const trackWidth = useMemo(() => {\n if (options) {\n return (value / (options.length - 1)) * 100;\n } else if (range) {\n const possibleValuesLength = (range.max - range.min) / (range.step || 1);\n return ((value - range.min) / possibleValuesLength) * 100;\n }\n return 0;\n }, [value, options, range]);\n\n const [min, max, step] = useMemo(() => {\n if (options) {\n return [0, options.length - 1, 1];\n } else if (range) {\n return [range.min, range.max, range.step || 1];\n }\n\n return [0, 0, 0];\n }, [range, options]);\n\n return (\n
\n {label && (\n
\n {label}\n {range && (\n {value}\n )}\n
\n )}\n
\n \n \n {options && (\n
\n {options.map((option, index) => (\n onChange(index)}\n >\n {option}\n
\n ))}\n
\n )}\n
\n
\n );\n};\n\nexport default memo(RangeSlider);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\ntype OwnProps = {\n size?: number;\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCoverAnimated: FC = ({\n size = STICKER_SIZE_PICKER_HEADER,\n stickerSet,\n observeIntersection,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaHash = `stickerSet${stickerSet.id}`;\n const lottieData = useMedia(mediaHash, !isIntersecting, ApiMediaFormat.Lottie);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(lottieData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && lottieData && (\n \n )}\n
\n );\n};\n\nexport default memo(StickerSetCoverAnimated);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiStickerSet } from '../../../api/types';\n\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\ntype OwnProps = {\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCover: FC = ({ stickerSet, observeIntersection }) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaData = useMedia(stickerSet.hasThumbnail && `stickerSet${stickerSet.id}`, !isIntersecting);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && (\n \"\"\n )}\n
\n );\n};\n\nexport default memo(StickerSetCover);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\n\nimport AnimatedSticker from './AnimatedSticker';\nimport Button from '../ui/Button';\n\nimport './StickerButton.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n size: number;\n observeIntersection: ObserveFn;\n noAnimate?: boolean;\n title?: string;\n className?: string;\n onClick?: (arg: any) => void;\n clickArg?: any;\n onUnfaveClick?: (sticker: ApiSticker) => void;\n};\n\nconst StickerButton: FC = ({\n sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const localMediaHash = `sticker${sticker.id}`;\n const stickerSelector = `sticker-button-${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl);\n\n const shouldPlay = isIntersecting && !noAnimate;\n const lottieData = useMedia(sticker.isAnimated && localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const {\n shouldRenderThumb,\n shouldRenderFullMedia: shouldRenderPreview,\n transitionClassNames: previewTransitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || canAnimatedPlay, 'slow');\n\n // To avoid flickering\n useEffect(() => {\n if (!shouldPlay) {\n unmarkLoaded();\n }\n }, [unmarkLoaded, shouldPlay]);\n\n function handleClick() {\n if (onClick) {\n onClick(clickArg);\n }\n }\n\n function handleUnfaveClick(e: ReactMouseEvent) {\n e.stopPropagation();\n e.preventDefault();\n\n onUnfaveClick!(sticker);\n }\n\n const fullClassName = buildClassName(\n 'StickerButton',\n sticker.isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = shouldRenderThumb && thumbDataUri ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {shouldRenderPreview && !canAnimatedPlay && (\n // eslint-disable-next-line jsx-a11y/alt-text\n \n )}\n {shouldPlay && lottieData && (\n \n )}\n {onUnfaveClick && (\n \n \n \n )}\n \n );\n};\n\nexport default memo(StickerButton);\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_GENERAL_SETTINGS } from '../../../config';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Button from '../../ui/Button';\nimport StickerSetCoverAnimated from '../../middle/composer/StickerSetCoverAnimated';\nimport StickerSetCover from '../../middle/composer/StickerSetCover';\nimport StickerButton from '../../common/StickerButton';\n\nimport './SettingsStickerSet.scss';\n\ntype OwnProps = {\n stickerSet?: ApiStickerSet;\n observeIntersection: ObserveFn;\n onClick: (value: ApiSticker) => void;\n};\n\nconst SettingsStickerSet: FC = ({\n stickerSet,\n observeIntersection,\n onClick,\n}) => {\n const lang = useLang();\n\n if (!stickerSet || !stickerSet.stickers) {\n return undefined;\n }\n\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n\n if (stickerSet.hasThumbnail || !firstSticker) {\n return (\n firstSticker && onClick(firstSticker)}\n >\n \n {stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n } else {\n return (\n onClick(firstSticker)}\n >\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n }\n};\n\nexport default memo(SettingsStickerSet);\n","import React, {\n FC, useCallback, memo, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ISettings } from '../../../types';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\n\nimport ListItem from '../../ui/ListItem';\nimport RangeSlider from '../../ui/RangeSlider';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\nimport SettingsStickerSet from './SettingsStickerSet';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = ISettings['byKey'] & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst SettingsGeneral: FC = ({\n onScreenSelect,\n stickerSetIds,\n stickerSetsById,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayGifs,\n shouldAutoPlayVideos,\n shouldSuggestStickers,\n shouldLoopStickers,\n setSettingOption,\n loadStickerSets,\n loadAddedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const stickerSettingsRef = useRef(null);\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: stickerSettingsRef });\n const [isModalOpen, openModal, closeModal] = useFlag();\n const [sticker, setSticker] = useState();\n\n const lang = useLang();\n\n const KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: lang('lng_settings_send_enter'), subLabel: 'New line by Shift + Enter' },\n {\n value: 'ctrl-enter',\n label: lang(IS_MAC_OS ? 'lng_settings_send_cmdenter' : 'lng_settings_send_ctrlenter'),\n subLabel: 'New line by Enter',\n },\n ] : undefined;\n\n useEffect(() => {\n loadStickerSets();\n }, [loadStickerSets]);\n\n useEffect(() => {\n if (stickerSetIds && stickerSetIds.length) {\n loadAddedStickers();\n }\n }, [stickerSetIds, loadAddedStickers]);\n\n const handleAnimationLevelChange = useCallback((newLevel: number) => {\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [setSettingOption]);\n\n const handleMessageTextSizeChange = useCallback((newSize: number) => {\n document.documentElement.style.setProperty('--message-text-size', `${newSize}px`);\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById && stickerSetsById[id] && stickerSetsById[id].installedDate ? stickerSetsById[id] : false;\n }).filter(Boolean);\n\n return (\n
\n
\n

{lang('SETTINGS')}

\n\n \n\n onScreenSelect(SettingsScreens.GeneralChatBackground)}\n >\n {lang('ChatBackground')}\n \n
\n\n
\n

\n Animation Level\n

\n

\n Choose the desired animations amount.\n

\n\n \n
\n\n {KEYBOARD_SEND_OPTIONS && (\n
\n

{lang('Keyboard')}

\n\n setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\n
\n )}\n\n
\n

{lang('AutoDownloadMedia')}

\n\n setSettingOption({ shouldAutoDownloadMediaFromContacts: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInPrivateChats: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInGroups: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInChannels: isChecked })}\n />\n
\n\n
\n

{lang('AutoplayMedia')}

\n\n setSettingOption({ shouldAutoPlayGifs: isChecked })}\n />\n setSettingOption({ shouldAutoPlayVideos: isChecked })}\n />\n
\n\n
\n

{lang('AccDescrStickers')}

\n\n setSettingOption({ shouldSuggestStickers: isChecked })}\n />\n setSettingOption({ shouldLoopStickers: isChecked })}\n />\n\n
\n {stickerSets && stickerSets.map((stickerSet: ApiStickerSet) => (\n \n ))}\n
\n {sticker && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n ...pick(global.settings.byKey,\n [\n 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldAutoDownloadMediaFromContacts',\n 'shouldAutoDownloadMediaInPrivateChats',\n 'shouldAutoDownloadMediaInGroups',\n 'shouldAutoDownloadMediaInChannels',\n 'shouldAutoPlayGifs',\n 'shouldAutoPlayVideos',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\n ]),\n stickerSetIds: global.stickers.added.setIds,\n stickerSetsById: global.stickers.setsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadStickerSets', 'loadAddedStickers',\n ]),\n)(SettingsGeneral));\n","let fileSelector: HTMLInputElement;\n\nexport function openSystemFilesDialog(accept = '*', callback: (e: Event) => void, noMultiple = false) {\n if (!fileSelector) {\n fileSelector = document.createElement('input');\n fileSelector.setAttribute('type', 'file');\n }\n\n fileSelector.setAttribute('accept', accept);\n\n if (noMultiple) {\n fileSelector.removeAttribute('multiple');\n } else {\n fileSelector.setAttribute('multiple', 'multiple');\n }\n\n // eslint-disable-next-line no-null/no-null\n fileSelector.onchange = null;\n fileSelector.value = '';\n fileSelector.onchange = callback;\n\n fileSelector.click();\n}\n","/* eslint-disable eqeqeq */\n/* eslint-disable prefer-template */\n/* eslint-disable prefer-const */\n/* eslint-disable prefer-destructuring */\n/* eslint-disable one-var */\n/* eslint-disable one-var-declaration-per-line */\n\nimport { preloadImage } from './files';\n\n/**\n * HEX > RGB\n * input: 'xxxxxx' (ex. 'ed15fa') case-insensitive\n * output: [r, g, b] ([0-255, 0-255, 0-255])\n */\nexport function hex2rgb(param: string): [number, number, number] {\n return [\n parseInt(param.substring(0, 2), 16),\n parseInt(param.substring(2, 4), 16),\n parseInt(param.substring(4, 6), 16),\n ];\n}\n\n/**\n * RGB > HEX\n * input: [r, g, b] ([0-255, 0-255, 0-255])\n * output: 'xxxxxx' (ex. 'ff0000')\n */\nexport function rgb2hex(param: [number, number, number]) {\n const p0 = param[0].toString(16);\n const p1 = param[1].toString(16);\n const p2 = param[2].toString(16);\n return (p0.length == 1 ? '0' + p0 : p0) + (p1.length == 1 ? '0' + p1 : p1) + (p2.length == 1 ? '0' + p2 : p2);\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\nexport function rgb2hsb([r, g, b]: [number, number, number]): [number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n let max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h!: number, s: number, v: number = max;\n\n let d = max - min;\n s = max == 0 ? 0 : d / max;\n\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return [h, s, v];\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsb2rgb([h, s, v]: [number, number, number]): [number, number, number] {\n let r!: number, g!: number, b!: number;\n\n let i = Math.floor(h * 6);\n let f = h * 6 - i;\n let p = v * (1 - s);\n let q = v * (1 - f * s);\n let t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n ];\n}\n\nexport async function getAverageColor(url: string): Promise<[number, number, number]> {\n // Only visit every 5 pixels\n const blockSize = 5;\n const defaultRGB: [number, number, number] = [0, 0, 0];\n let data;\n let width;\n let height;\n let i = -4;\n let length;\n let rgb: [number, number, number] = [0, 0, 0];\n let count = 0;\n\n const canvas = document.createElement('canvas');\n const context = canvas.getContext && canvas.getContext('2d');\n if (!context) {\n return defaultRGB;\n }\n\n const image = await preloadImage(url);\n height = image.naturalHeight || image.offsetHeight || image.height;\n width = image.naturalWidth || image.offsetWidth || image.width;\n canvas.height = height;\n canvas.width = width;\n\n context.drawImage(image, 0, 0);\n\n try {\n data = context.getImageData(0, 0, width, height);\n } catch (e) {\n return defaultRGB;\n }\n\n length = data.data.length;\n\n // eslint-disable-next-line no-cond-assign\n while ((i += blockSize * 4) < length) {\n ++count;\n rgb[0] += data.data[i];\n rgb[1] += data.data[i + 1];\n rgb[2] += data.data[i + 2];\n }\n\n rgb[0] = Math.floor(rgb[0] / count);\n rgb[1] = Math.floor(rgb[1] / count);\n rgb[2] = Math.floor(rgb[2] / count);\n\n return rgb;\n}\n\n// eslint-disable-next-line max-len\n// Function was adapted from https://github.com/telegramdesktop/tdesktop/blob/35ff621b5b52f7e3553fb0f990ea13ade7101b8e/Telegram/SourceFiles/data/data_wall_paper.cpp#L518\nexport function getPatternColor(rgbColor: [number, number, number]) {\n let [hue, saturation, value] = rgb2hsb(rgbColor);\n\n saturation = Math.min(1, saturation + 0.05 + 0.1 * (1 - saturation));\n value = value > 0.5\n ? Math.max(0, value * 0.65)\n : Math.max(0, Math.min(1, 1 - value * 0.65));\n\n return `hsla(${hue * 360}, ${saturation * 100}%, ${value * 100}%, .4)`;\n}\n","import React, {\n FC, memo, useCallback, useEffect, useState, useRef,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../../../config';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { fetchBlob } from '../../../util/files';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useCanvasBlur from '../../../hooks/useCanvasBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n theme: ThemeKey;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst WallpaperTile: FC = ({\n wallpaper,\n theme,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbRef = useCanvasBlur(\n document.thumbnail && document.thumbnail.dataUri,\n Boolean(previewBlobUrl),\n true,\n );\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || localBlobUrl, 'slow');\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData: fullMedia, downloadProgress,\n } = useMediaWithDownloadProgress(localMediaHash, !isDownloadAllowed);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition(\n (isDownloadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG,\n undefined,\n wasDownloadDisabled,\n 'slow',\n );\n // To prevent triggering of the effect for useCallback\n const cacheKeyRef = useRef();\n cacheKeyRef.current = theme;\n\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, cacheKeyRef.current!, blob);\n onClick(slug);\n })();\n }, [fullMedia, onClick, slug]);\n\n useEffect(() => {\n if (fullMedia) {\n handleSelect();\n }\n }, [fullMedia, handleSelect]);\n\n const handleClick = useCallback(() => {\n if (fullMedia) {\n handleSelect();\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [fullMedia, handleSelect]);\n\n const className = buildClassName(\n 'WallpaperTile',\n isSelected && 'selected',\n );\n\n return (\n
\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n
\n
\n );\n};\n\nexport default memo(WallpaperTile);\n","import React, {\n FC, memo, useEffect, useCallback, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DARK_THEME_PATTERN_COLOR, DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor, rgb2hex } from '../../../util/colors';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Loading from '../../ui/Loading';\nimport WallpaperTile from './WallpaperTile';\n\nimport './SettingsGeneralBackground.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n background?: string;\n isBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC = ({\n onScreenSelect,\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n loadWallpapers,\n uploadWallpaper,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadWallpapers();\n });\n }, [loadWallpapers]);\n\n const handleFileSelect = useCallback((e: Event) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n uploadWallpaper(files[0]);\n }\n }, [uploadWallpaper]);\n\n const handleUploadWallpaper = useCallback(() => {\n openSystemFilesDialog(SUPPORTED_TYPES, handleFileSelect, true);\n }, [handleFileSelect]);\n\n const handleSetColor = useCallback(() => {\n onScreenSelect(SettingsScreens.GeneralChatBackgroundColor);\n }, [onScreenSelect]);\n\n const handleResetToDefault = useCallback(() => {\n setThemeSettings({\n theme,\n background: undefined,\n backgroundColor: undefined,\n isBlurred: true,\n patternColor: theme === 'dark' ? DARK_THEME_PATTERN_COLOR : DEFAULT_PATTERN_COLOR,\n });\n }, [setThemeSettings, theme]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setThemeSettings({ theme: themeRef.current, background: slug });\n const currentWallpaper = loadedWallpapers && loadedWallpapers.find((wallpaper) => wallpaper.slug === slug);\n if (currentWallpaper && currentWallpaper.document.thumbnail) {\n getAverageColor(currentWallpaper.document.thumbnail.dataUri)\n .then((color) => {\n const patternColor = getPatternColor(color);\n const rgbColor = `#${rgb2hex(color)}`;\n setThemeSettings({ theme: themeRef.current, backgroundColor: rgbColor, patternColor });\n });\n }\n }, [loadedWallpapers, setThemeSettings]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => {\n setThemeSettings({ theme: themeRef.current, isBlurred: e.target.checked });\n }, [setThemeSettings]);\n\n const lang = useLang();\n\n const isUploading = loadedWallpapers && loadedWallpapers[0] && loadedWallpapers[0].slug === UPLOADING_WALLPAPER_SLUG;\n\n return (\n
\n
\n \n {lang('UploadImage')}\n \n\n \n {lang('SetColor')}\n \n\n \n {lang('ThemeResetToDefaults')}\n \n\n \n
\n\n {loadedWallpapers ? (\n
\n {loadedWallpapers.map((wallpaper) => (\n \n ))}\n
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { theme } = global.settings.byKey;\n const { background, isBlurred } = global.settings.themes[theme] || {};\n const { loadedWallpapers } = global.settings;\n\n return {\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWallpapers', 'uploadWallpaper', 'setThemeSettings',\n ]),\n)(SettingsGeneralBackground));\n","import { ChangeEvent, MutableRefObject, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n getPatternColor, hex2rgb, hsb2rgb, rgb2hex, rgb2hsb,\n} from '../../../util/colors';\nimport { captureEvents, RealTouchEvent } from '../../../util/captureEvents';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n backgroundColor?: string;\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\ninterface CanvasRects {\n colorRect: {\n offsetLeft: number;\n top: number;\n width: number;\n height: number;\n };\n hueRect: {\n offsetLeft: number;\n width: number;\n };\n}\n\nconst DEFAULT_HSB = rgb2hsb(hex2rgb('e6ebee'));\nconst PREDEFINED_COLORS = [\n '#e6ebee', '#b2cee1', '#008dd0', '#c6e7cb', '#c4e1a6', '#60b16e',\n '#ccd0af', '#a6a997', '#7a7072', '#fdd7af', '#fdb76e', '#dd8851',\n];\n\nconst SettingsGeneralBackground: FC = ({\n theme,\n backgroundColor,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const colorPickerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const huePickerRef = useRef(null);\n const isFirstRunRef = useRef(true);\n\n const [hsb, setHsb] = useState(getInitialHsb(backgroundColor));\n // Cache for drag handlers\n const hsbRef = useRef(hsb);\n useEffect(() => {\n hsbRef.current = hsb;\n }, [hsb]);\n\n const [isDragging, markIsDragging, unmarkIsDragging] = useFlag();\n const [rgbInput, setRgbInput] = useState('');\n const [hexInput, setHexInput] = useState('');\n\n const rectsRef = useRef();\n const colorCtxRef = useRef();\n\n // Setup: cache rects, subscribe for drag events\n useEffect(() => {\n // We use `offsetLeft` instead of `left` to support screen transition\n const colorRect = {\n offsetLeft: colorPickerRef.current!.offsetLeft,\n ...pick(colorPickerRef.current!.getBoundingClientRect(), ['top', 'width', 'height']),\n };\n const hueRect = {\n offsetLeft: huePickerRef.current!.offsetLeft,\n ...pick(huePickerRef.current!.getBoundingClientRect(), ['width']),\n };\n\n rectsRef.current = { colorRect, hueRect };\n\n function handleColorDrag(e: MouseEvent | RealTouchEvent) {\n const colorPosition = [\n Math.min(Math.max(0, e.pageX! - colorRect.offsetLeft), colorRect.width - 1),\n Math.min(Math.max(0, e.pageY! - colorRect.top + containerRef.current!.scrollTop), colorRect.height - 1),\n ];\n\n const { huePosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(colorPickerRef.current!, {\n onCapture: handleColorDrag,\n onDrag: handleColorDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n\n function handleHueDrag(e: MouseEvent | RealTouchEvent) {\n const { colorPosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n const huePosition = Math.min(Math.max(0, e.pageX! - hueRect.offsetLeft), hueRect.width - 1);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(huePickerRef.current!, {\n onCapture: handleHueDrag,\n onDrag: handleHueDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n }, [markIsDragging, unmarkIsDragging]);\n\n const { colorPosition = [0, 0], huePosition = 0 } = rectsRef.current ? hsb2positions(hsb, rectsRef.current) : {};\n const hex = rgb2hex(hsb2rgb(hsb));\n const hue = hsb[0];\n const hueHex = rgb2hex(hsb2rgb([hue, 1, 1]));\n\n // Save value and update inputs when HSL changes\n useEffect(() => {\n const rgb = hsb2rgb(hsb);\n const color = `#${rgb2hex(rgb)}`;\n\n setRgbInput(rgb.join(', '));\n setHexInput(color);\n\n if (!isFirstRunRef.current) {\n const patternColor = getPatternColor(rgb);\n setThemeSettings({\n theme: themeRef.current,\n background: undefined,\n backgroundColor: color,\n patternColor,\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setThemeSettings]);\n\n // Redraw color picker when hue changes\n useEffect(() => {\n drawColor(colorPickerRef.current!.firstChild as HTMLCanvasElement, hue, colorCtxRef, rectsRef);\n }, [hue]);\n\n // Initially draw hue picker\n useEffect(() => {\n drawHue(huePickerRef.current!.firstChild as HTMLCanvasElement);\n }, []);\n\n const handleRgbChange = useCallback((e: ChangeEvent) => {\n const rgbValue = e.currentTarget.value.replace(/[^\\d, ]/g, '').slice(0, 13);\n\n if (rgbValue.match(/^\\d{1,3},\\s?\\d{1,3},\\s?\\d{1,3}$/)) {\n const rgb = rgbValue.split(',').map((channel) => Number(channel.trim())) as [number, number, number];\n setHsb(rgb2hsb(rgb));\n }\n\n e.currentTarget.value = rgbValue;\n }, []);\n\n const handleHexChange = useCallback((e: ChangeEvent) => {\n const hexValue = e.currentTarget.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6);\n\n if (hexValue.match(/^#?[0-9a-fA-F]{6}$/)) {\n setHsb(rgb2hsb(hex2rgb(hexValue.replace('#', ''))));\n }\n\n e.currentTarget.value = hexValue;\n }, []);\n\n const handlePredefinedColorClick = useCallback((e: React.MouseEvent) => {\n setHsb(rgb2hsb(hex2rgb(e.currentTarget.dataset.color!.replace('#', ''))));\n }, []);\n\n const className = buildClassName(\n 'SettingsGeneralBackgroundColor settings-content custom-scroll',\n isDragging && 'is-dragging',\n );\n\n return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n {PREDEFINED_COLORS.map((color) => (\n \n ))}\n
\n
\n );\n};\n\nfunction getInitialHsb(backgroundColor?: string) {\n return backgroundColor && backgroundColor.startsWith('#')\n ? rgb2hsb(hex2rgb(backgroundColor.replace('#', '')))\n : DEFAULT_HSB;\n}\n\nfunction hsb2positions(hsb: [number, number, number], rects: CanvasRects) {\n return {\n colorPosition: [\n Math.round((hsb[1]) * (rects.colorRect.width - 1)),\n Math.round((1 - hsb[2]) * (rects.colorRect.height - 1)),\n ],\n huePosition: Math.round(hsb[0] * (rects.hueRect.width - 1)),\n };\n}\n\nfunction positions2hsb(\n { colorPosition, huePosition }: { colorPosition: number[]; huePosition: number },\n rects: CanvasRects,\n): [number, number, number] {\n return [\n huePosition / (rects.hueRect.width - 1),\n colorPosition[0] / (rects.colorRect.width - 1),\n 1 - colorPosition[1] / (rects.colorRect.height - 1),\n ];\n}\n\nfunction drawColor(\n canvas: HTMLCanvasElement,\n hue: number,\n colorCtxRef: MutableRefObject,\n rectsRef: RefObject,\n) {\n let w: number;\n let h: number;\n let ctx: CanvasRenderingContext2D;\n\n if (!colorCtxRef.current || !rectsRef.current) {\n // First run\n w = canvas.offsetWidth;\n h = canvas.offsetHeight;\n ctx = canvas.getContext('2d')!;\n\n canvas.width = w;\n canvas.height = h;\n\n colorCtxRef.current = ctx;\n } else {\n w = rectsRef.current.colorRect.width;\n h = rectsRef.current.colorRect.height;\n ctx = colorCtxRef.current;\n }\n\n const imgData = ctx!.createImageData(w, h);\n const pixels = imgData.data;\n const col = hsb2rgb([hue, 1, 1]);\n\n let index = 0;\n\n for (let y = 0; y < h; y++) {\n const perY = 1 - y / (h - 1);\n const st = [255 * perY, 255 * perY, 255 * perY];\n const ed = [col[0] * perY, col[1] * perY, col[2] * perY];\n for (let x = 0; x < w; x++) {\n const perX = x / (w - 1);\n pixels[index++] = st[0] + (ed[0] - st[0]) * perX;\n pixels[index++] = st[1] + (ed[1] - st[1]) * perX;\n pixels[index++] = st[2] + (ed[2] - st[2]) * perX;\n pixels[index++] = 255;\n }\n }\n\n ctx!.putImageData(imgData, 0, 0);\n}\n\nfunction drawHue(canvas: HTMLCanvasElement) {\n const w = canvas.offsetWidth;\n const h = 1;\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d')!;\n\n const imgData = ctx.createImageData(w, h);\n const pixels = imgData.data;\n\n let index = 0;\n\n for (let x = 0; x < w; x++) {\n const hue = x / (w - 1);\n const rgb = hsb2rgb([hue, 1, 1]);\n /* eslint-disable prefer-destructuring */\n pixels[index++] = rgb[0];\n pixels[index++] = rgb[1];\n pixels[index++] = rgb[2];\n /* eslint-enable prefer-destructuring */\n pixels[index++] = 255;\n }\n\n ctx.putImageData(imgData, 0, 0);\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { theme } = global.settings.byKey;\n const { backgroundColor } = global.settings.themes[theme] || {};\n return {\n backgroundColor,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setThemeSettings']),\n)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport Checkbox from '../../ui/Checkbox';\n\ntype StateProps = {\n hasPrivateChatsNotifications: boolean;\n hasPrivateChatsMessagePreview: boolean;\n hasGroupNotifications: boolean;\n hasGroupMessagePreview: boolean;\n hasBroadcastNotifications: boolean;\n hasBroadcastMessagePreview: boolean;\n hasContactJoinedNotifications: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsNotifications: FC = ({\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n loadNotificationSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationSettings();\n }, [loadNotificationSettings]);\n\n const handleSettingsChange = useCallback((\n e: ChangeEvent,\n peerType: 'contact' | 'group' | 'broadcast',\n setting: 'silent' | 'showPreviews',\n ) => {\n const currentIsSilent = peerType === 'contact'\n ? !hasPrivateChatsNotifications\n : !(peerType === 'group' ? hasGroupNotifications : hasBroadcastNotifications);\n const currentShouldShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, shouldShowPreviews: currentShouldShowPreviews }),\n ...(setting === 'showPreviews' && { shouldShowPreviews: e.target.checked, isSilent: currentIsSilent }),\n });\n }, [\n hasBroadcastMessagePreview, hasBroadcastNotifications,\n hasGroupMessagePreview, hasGroupNotifications,\n hasPrivateChatsMessagePreview, hasPrivateChatsNotifications,\n updateNotificationSettings,\n ]);\n\n const handleContactNotificationChange = useCallback((e: ChangeEvent) => {\n updateContactSignUpNotification({\n isSilent: !e.target.checked,\n });\n }, [updateContactSignUpNotification]);\n\n const lang = useLang();\n\n return (\n
\n
\n

\n {lang('AutodownloadPrivateChats')}\n

\n\n { handleSettingsChange(e, 'contact', 'silent'); }}\n />\n { handleSettingsChange(e, 'contact', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterGroups')}

\n\n { handleSettingsChange(e, 'group', 'silent'); }}\n />\n { handleSettingsChange(e, 'group', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterChannels')}

\n\n { handleSettingsChange(e, 'broadcast', 'silent'); }}\n />\n { handleSettingsChange(e, 'broadcast', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('PhoneOther')}

\n\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global): StateProps => {\n return {\n hasPrivateChatsNotifications: Boolean(global.settings.byKey.hasPrivateChatsNotifications),\n hasPrivateChatsMessagePreview: Boolean(global.settings.byKey.hasPrivateChatsMessagePreview),\n hasGroupNotifications: Boolean(global.settings.byKey.hasGroupNotifications),\n hasGroupMessagePreview: Boolean(global.settings.byKey.hasGroupMessagePreview),\n hasBroadcastNotifications: Boolean(global.settings.byKey.hasBroadcastNotifications),\n hasBroadcastMessagePreview: Boolean(global.settings.byKey.hasBroadcastMessagePreview),\n hasContactJoinedNotifications: Boolean(global.settings.byKey.hasContactJoinedNotifications),\n };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\n]))(SettingsNotifications));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { PrivacyVisibility, SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n visibilityPrivacyPhoneNumber?: PrivacyVisibility;\n visibilityPrivacyLastSeen?: PrivacyVisibility;\n visibilityPrivacyProfilePhoto?: PrivacyVisibility;\n visibilityPrivacyForwarding?: PrivacyVisibility;\n visibilityPrivacyGroupChats?: PrivacyVisibility;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacy: FC = ({\n onScreenSelect,\n hasPassword,\n blockedCount,\n sessionsCount,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings]);\n\n const lang = useLang();\n\n function getVisibilityValue(visibility?: PrivacyVisibility) {\n switch (visibility) {\n case 'everybody':\n return lang('P2PEverybody');\n\n case 'contacts':\n return lang('P2PContacts');\n\n case 'nobody':\n return lang('P2PNobody');\n }\n\n return undefined;\n }\n\n return (\n
\n
\n onScreenSelect(SettingsScreens.PrivacyBlockedUsers)}\n >\n
\n {lang('BlockedUsers')}\n {blockedCount > 0 && (\n \n {lang('Users', blockedCount)}\n \n )}\n
\n \n onScreenSelect(\n hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled,\n )}\n >\n
\n {lang('TwoStepVerification')}\n \n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyActiveSessions)}\n >\n
\n {lang('SessionsTitle')}\n {sessionsCount > 0 && (\n \n {sessionsCount === 1 ? '1 session' : `${sessionsCount} sessions`}\n \n )}\n
\n \n
\n\n
\n

{lang('PrivacyTitle')}

\n\n onScreenSelect(SettingsScreens.PrivacyPhoneNumber)}\n >\n
\n {lang('PrivacyPhoneTitle')}\n \n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n
\n {lang('LastSeenTitle')}\n \n {getVisibilityValue(visibilityPrivacyLastSeen)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n
\n {lang('PrivacyProfilePhotoTitle')}\n \n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n
\n {lang('PrivacyForwardsTitle')}\n \n {getVisibilityValue(visibilityPrivacyForwarding)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n
\n {lang('WhoCanAddMe')}\n \n {getVisibilityValue(visibilityPrivacyGroupChats)}\n \n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\n visibilityPrivacyPhoneNumber: privacy.phoneNumber && privacy.phoneNumber.visibility,\n visibilityPrivacyLastSeen: privacy.lastSeen && privacy.lastSeen.visibility,\n visibilityPrivacyProfilePhoto: privacy.profilePhoto && privacy.profilePhoto.visibility,\n visibilityPrivacyForwarding: privacy.forwards && privacy.forwards.visibility,\n visibilityPrivacyGroupChats: privacy.chatInvite && privacy.chatInvite.visibility,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings',\n ]),\n)(SettingsPrivacy));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ISettings } from '../../../types';\nimport { ApiLanguage } from '../../../api/types';\n\nimport { setLanguage } from '../../../util/langProvider';\nimport { pick } from '../../../util/iteratees';\n\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport useFlag from '../../../hooks/useFlag';\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\n languages,\n language,\n loadLanguages,\n setSettingOption,\n}) => {\n const [selectedLanguage, setSelectedLanguage] = useState(language);\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n // TODO Throttle\n useEffect(() => {\n loadLanguages();\n }, [loadLanguages]);\n\n const handleChange = useCallback((langCode: string) => {\n setSelectedLanguage(langCode);\n markIsLoading();\n\n setLanguage(langCode, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n return (\n
\n {options ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n const currentLangCode = (window.navigator.language || 'en').toLowerCase();\n const shortLangCode = currentLangCode.substr(0, 2);\n\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n })).sort((a) => {\n return currentLangCode && (a.value === currentLangCode || a.value === shortLangCode) ? -1 : 0;\n });\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n languages: global.settings.byKey.languages,\n language: global.settings.byKey.language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadLanguages', 'setSettingOption',\n ]),\n)(SettingsLanguage));\n","import { ApiPrivacyKey, SettingsScreens } from '../../../../types';\n\nexport function getPrivacyKey(screen: SettingsScreens): ApiPrivacyKey | undefined {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return 'phoneNumber';\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return 'lastSeen';\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return 'profilePhoto';\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return 'forwards';\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return 'chatInvite';\n }\n\n return undefined;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n onScreenSelect,\n visibility,\n allowUserIds,\n allowChatIds,\n blockUserIds,\n blockChatIds,\n chatsById,\n setPrivacyVisibility,\n}) => {\n const lang = useLang();\n\n const visibilityOptions = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyGroupChats:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n ];\n\n default:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n { value: 'nobody', label: lang('P2PNobody') },\n ];\n }\n }, [lang, screen]);\n\n const exceptionLists = {\n shouldShowDenied: visibility !== 'nobody',\n shouldShowAllowed: visibility !== 'everybody',\n };\n\n const privacyKey = getPrivacyKey(screen);\n\n const headerText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return lang('PrivacyPhoneTitle');\n case SettingsScreens.PrivacyLastSeen:\n return lang('LastSeenTitle');\n case SettingsScreens.PrivacyProfilePhoto:\n return lang('PrivacyProfilePhotoTitle');\n case SettingsScreens.PrivacyForwarding:\n return lang('PrivacyForwardsTitle');\n case SettingsScreens.PrivacyGroupChats:\n return lang('WhoCanAddMe');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const descriptionText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyLastSeen:\n return lang('CustomHelp');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const allowedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberAllowedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenAllowedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoAllowedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingAllowedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsAllowedContacts;\n }\n })();\n\n const deniedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberDeniedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenDeniedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoDeniedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingDeniedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsDeniedContacts;\n }\n })();\n\n const allowedCount = useMemo(() => {\n if (!allowUserIds || !allowChatIds || !chatsById) {\n return 0;\n }\n\n return allowChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, allowUserIds.length);\n }, [allowChatIds, allowUserIds, chatsById]);\n\n const blockCount = useMemo(() => {\n if (!blockUserIds || !blockChatIds || !chatsById) {\n return 0;\n }\n\n return blockChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, blockUserIds.length);\n }, [blockChatIds, blockUserIds, chatsById]);\n\n const handleVisibilityChange = useCallback((value) => {\n setPrivacyVisibility({\n privacyKey,\n visibility: value,\n });\n }, [privacyKey, setPrivacyVisibility]);\n\n return (\n
\n
\n

{headerText}

\n\n \n\n {descriptionText && (\n

{descriptionText}

\n )}\n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n {exceptionLists.shouldShowAllowed && (\n { onScreenSelect(allowedContactsScreen); }}\n >\n
\n {allowedCount > 0 && +{allowedCount}}\n {lang('AlwaysShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n {exceptionLists.shouldShowDenied && (\n { onScreenSelect(deniedContactsScreen); }}\n >\n
\n {blockCount > 0 && −{blockCount}}\n {lang('NeverShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n let privacySettings: ApiPrivacySettings | undefined;\n\n const {\n chats: { byId: chatsById },\n settings: { privacy },\n } = global;\n\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n privacySettings = privacy.phoneNumber;\n break;\n\n case SettingsScreens.PrivacyLastSeen:\n privacySettings = privacy.lastSeen;\n break;\n\n case SettingsScreens.PrivacyProfilePhoto:\n privacySettings = privacy.profilePhoto;\n break;\n\n case SettingsScreens.PrivacyForwarding:\n privacySettings = privacy.forwards;\n break;\n\n case SettingsScreens.PrivacyGroupChats:\n privacySettings = privacy.chatInvite;\n break;\n }\n\n if (!privacySettings) {\n return {};\n }\n\n return {\n ...privacySettings,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacyVisibility']),\n)(SettingsPrivacyVisibility));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiSession } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\n activeSessions,\n loadAuthorizations,\n terminateAuthorization,\n terminateAllAuthorizations,\n}) => {\n const [isConfirmTerminateAllDialogOpen, openConfirmTerminateAllDialog, closeConfirmTerminateAllDialog] = useFlag();\n useEffect(() => {\n loadAuthorizations();\n }, [loadAuthorizations]);\n\n const handleTerminateSessionClick = useCallback((hash: string) => {\n terminateAuthorization({ hash });\n }, [terminateAuthorization]);\n\n const handleTerminateAllSessions = useCallback(() => {\n closeConfirmTerminateAllDialog();\n terminateAllAuthorizations();\n }, [closeConfirmTerminateAllDialog, terminateAllAuthorizations]);\n\n const currentSession = useMemo(() => {\n return activeSessions.find((session) => session.isCurrent);\n }, [activeSessions]);\n\n const otherSessions = useMemo(() => {\n return activeSessions.filter((session) => !session.isCurrent);\n }, [activeSessions]);\n\n const lang = useLang();\n\n function renderCurrentSession(session: ApiSession) {\n return (\n
\n

\n {lang('AuthSessions.CurrentSession')}\n

\n\n \n
\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n
\n\n \n {lang('TerminateAllSessions')}\n \n
\n );\n }\n\n function renderOtherSessions(sessions: ApiSession[]) {\n return (\n
\n

Other Sessions

\n\n {sessions.map(renderSession)}\n
\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n >\n
\n {formatPastTimeShort(lang, session.dateActive * 1000)}\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n \n );\n }\n\n return (\n
\n {currentSession && renderCurrentSession(currentSession)}\n\n {otherSessions && renderOtherSessions(otherSessions)}\n\n {otherSessions && (\n \n )};\n
\n );\n};\n\nfunction getLocation(session: ApiSession) {\n return [session.region, session.country].filter(Boolean).join(', ');\n}\n\nfunction getDeviceEnvironment(session: ApiSession) {\n return `${session.deviceModel}${session.deviceModel ? ', ' : ''} ${session.platform} ${session.systemVersion}`;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n activeSessions: global.activeSessions,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations',\n ]),\n)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport { pick } from '../../../util/iteratees';\nimport {\n getChatTitle, getUserFullName, isChatPrivate,\n} from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\n chatsByIds,\n usersByIds,\n blockedIds,\n unblockContact,\n}) => {\n const handleUnblockClick = useCallback((contactId: number) => {\n unblockContact({ contactId });\n }, [unblockContact]);\n\n const lang = useLang();\n\n function renderContact(contactId: number, i: number, viewportOffset: number) {\n const isPrivate = isChatPrivate(contactId);\n const user = isPrivate ? usersByIds[contactId] : undefined;\n const chat = !isPrivate ? chatsByIds[contactId] : undefined;\n\n const className = buildClassName(\n 'Chat chat-item-clickable blocked-list-item',\n isPrivate ? 'private' : 'group',\n );\n\n return (\n {\n handleUnblockClick(contactId);\n },\n }]}\n style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`}\n >\n \n
\n

{renderText((isPrivate ? getUserFullName(user) : getChatTitle(lang, chat!)) || '')}

\n {user && user.phoneNumber && (\n
{formatPhoneNumberWithCode(user.phoneNumber)}
\n )}\n {user && !user.phoneNumber && user.username && (\n
@{user.username}
\n )}\n
\n \n );\n }\n\n return (\n
\n
\n
\n

\n {lang('BlockedUsersInfo')}\n

\n
\n\n
\n {blockedIds && blockedIds.length ? (\n
\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n
\n ) : blockedIds && !blockedIds.length ? (\n
\n List is empty\n
\n ) : (\n \n )}\n
\n
\n\n {\n }}\n className=\"not-implemented\"\n ariaLabel=\"Add a blocked user\"\n >\n \n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsByIds,\n },\n users: {\n byId: usersByIds,\n },\n blocked: {\n ids,\n },\n } = global;\n\n return {\n chatsByIds,\n usersByIds,\n blockedIds: ids,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['unblockContact']),\n)(SettingsPrivacyBlockedUsers));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({ animatedEmoji, onScreenSelect }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n\n

\n {renderText(lang('EnabledPasswordText'), ['br'])}\n

\n
\n\n
\n onScreenSelect(SettingsScreens.TwoFaChangePasswordCurrent)}\n >\n {lang('ChangePassword')}\n \n onScreenSelect(SettingsScreens.TwoFaTurnOff)}\n >\n {lang('TurnPasswordOff')}\n \n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCurrentPassword)}\n >\n {lang('SetRecoveryEmail')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaEnabled));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../../lib/teact/teact';\n\nimport useLang from '../../../../hooks/useLang';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\n error?: string;\n isLoading?: boolean;\n expectedPassword?: string;\n placeholder?: string;\n hint?: string;\n submitLabel?: string;\n clearError?: NoneToVoidFunction;\n onSubmit: (password: string) => void;\n};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\n error,\n isLoading,\n expectedPassword,\n placeholder = 'Current Password',\n hint,\n submitLabel,\n clearError,\n onSubmit,\n}) => {\n const [validationError, setValidationError] = useState('');\n const [shouldShowPassword, setShouldShowPassword] = useState(false);\n\n const handleSubmit = useCallback((newPassword) => {\n if (expectedPassword && newPassword !== expectedPassword) {\n setValidationError(EQUAL_PASSWORD_ERROR);\n } else {\n onSubmit(newPassword);\n }\n }, [onSubmit, expectedPassword]);\n\n const handleClearError = useCallback(() => {\n if (clearError) {\n clearError();\n }\n setValidationError('');\n }, [clearError]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(SettingsTwoFaPassword);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({ animatedEmoji, onStart }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n\n

\n {lang('SetAdditionalPasswordInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaStart));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport Modal from '../../../ui/Modal';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n icon: 'hint' | 'email';\n type?: 'text' | 'email';\n isLoading?: boolean;\n error?: string;\n placeholder: string;\n shouldConfirm?: boolean;\n clearError?: NoneToVoidFunction;\n onSubmit: (value?: string) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n const [isConfirmShown, markIsConfirmShown, unmarkIsConfirmShown] = useFlag(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n setValue(e.target.value);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!inputRef.current) {\n return;\n }\n\n onSubmit(value);\n };\n\n const handleSkip = () => {\n onSubmit();\n };\n\n const handleSkipConfirm = () => {\n unmarkIsConfirmShown();\n onSubmit();\n };\n\n const lang = useLang();\n\n return (\n
\n
\n \n
\n\n
\n
\n \n\n {value ? (\n \n ) : (\n \n {lang('YourEmailSkip')}\n \n )}\n \n {shouldConfirm && (\n \n {renderText(lang('YourEmailSkipWarningText'), ['br', 'simple_markdown'])}\n
\n \n {lang('YourEmailSkip')}\n \n \n {lang('Cancel')}\n \n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal((global, { icon }) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, icon === 'email' ? '💌' : '💡'),\n };\n})(SettingsTwoFaSkippableForm));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({ animatedEmoji, onScreenSelect }) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n return (\n
\n
\n \n\n

\n {lang('TwoStepVerificationPasswordSetInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🥳'),\n };\n})(SettingsTwoFaCongratulations));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\n\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n isLoading?: boolean;\n error?: string;\n clearError: NoneToVoidFunction;\n onSubmit: (hint: string) => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const lang = useLang();\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n const newValue = e.target.value.slice(0, codeLength);\n\n if (newValue.length === codeLength) {\n onSubmit(newValue);\n }\n\n setValue(newValue);\n e.target.value = newValue;\n };\n\n return (\n
\n
\n \n
\n\n
\n \n {isLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '💌'),\n codeLength: global.twoFaSettings.waitingEmailCodeLength,\n };\n})(SettingsTwoFaEmailCode));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { pick } from '../../../../util/iteratees';\nimport { TwoFaDispatch, TwoFaState } from '../../../../hooks/reducers/useTwoFaReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport SettingsTwoFaEnabled from './SettingsTwoFaEnabled';\nimport SettingsTwoFaPassword from './SettingsTwoFaPassword';\nimport SettingsTwoFaStart from './SettingsTwoFaStart';\nimport SettingsTwoFaSkippableForm from './SettingsTwoFaSkippableForm';\nimport SettingsTwoFaCongratulations from './SettingsTwoFaCongratulations';\nimport SettingsTwoFaEmailCode from './SettingsTwoFaEmailCode';\n\nexport type OwnProps = {\n state: TwoFaState;\n currentScreen: SettingsScreens;\n dispatch: TwoFaDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n onScreenSelect,\n updatePassword,\n checkPassword,\n clearTwoFaError,\n updateRecoveryEmail,\n provideTwoFaEmailCode,\n clearPassword,\n}) => {\n useEffect(() => {\n if (waitingEmailCodeLength) {\n if (currentScreen === SettingsScreens.TwoFaNewPasswordEmail) {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmailCode);\n } else if (currentScreen === SettingsScreens.TwoFaRecoveryEmail) {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCode);\n }\n }\n }, [currentScreen, onScreenSelect, waitingEmailCodeLength]);\n\n const handleStartWizard = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.TwoFaNewPassword);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPassword = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordHint);\n }, [onScreenSelect]);\n\n const handleNewPasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmail);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updatePassword({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleChangePasswordCurrent = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordNew);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleChangePasswordNew = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaChangePasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleChangePasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordHint);\n }, [onScreenSelect]);\n\n const handleChangePasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n updatePassword({\n ...state,\n hint: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleTurnOff = useCallback((value: string) => {\n clearPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.Privacy);\n },\n });\n }, [clearPassword, onScreenSelect]);\n\n const handleRecoveryEmailCurrentPassword = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmail);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleRecoveryEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updateRecoveryEmail({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updateRecoveryEmail]);\n\n const handleEmailCode = useCallback((code: string) => {\n provideTwoFaEmailCode({ code });\n }, [provideTwoFaEmailCode]);\n\n const lang = useLang();\n\n switch (currentScreen) {\n case SettingsScreens.TwoFaDisabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n return (\n \n );\n\n case SettingsScreens.TwoFaCongratulations:\n return (\n \n );\n\n case SettingsScreens.TwoFaEnabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordCurrent:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordNew:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaTurnOff:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => ({ ...global.twoFaSettings }),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updatePassword', 'updateRecoveryEmail', 'clearPassword', 'provideTwoFaEmailCode',\n 'checkPassword', 'clearTwoFaError',\n ]),\n)(SettingsTwoFa));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../modules/helpers';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport GroupChatInfo from './GroupChatInfo';\nimport PickerSelectedItem from './PickerSelectedItem';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\n\nimport './Picker.scss';\n\ntype OwnProps = {\n itemIds: number[];\n selectedIds: number[];\n filterValue?: string;\n filterPlaceholder?: string;\n notFoundText?: string;\n searchInputId?: string;\n isLoading?: boolean;\n onSelectedIdsChange: (ids: number[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore?: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst Picker: FC = ({\n itemIds,\n selectedIds,\n filterValue,\n filterPlaceholder,\n notFoundText,\n searchInputId,\n isLoading,\n onSelectedIdsChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const shouldMinimize = selectedIds.length > MAX_FULL_ITEMS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n onFilterChange('');\n }, [selectedIds, onSelectedIdsChange, onFilterChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, itemIds, Boolean(filterValue));\n\n const lang = useLang();\n\n return (\n
\n
\n {selectedIds.map((id, i) => (\n \n ))}\n \n
\n\n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n handleItemClick(id)}\n ripple\n >\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : !isLoading && viewportIds && !viewportIds.length ? (\n

{notFoundText || 'Sorry, nothing found.'}

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(Picker);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport searchWords from '../../../util/searchWords';\nimport { getPrivacyKey } from './helper/privacy';\nimport {\n getChatTitle, isChatGroup, isChatPrivate, prepareChatList,\n} from '../../../modules/helpers';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n settings?: ApiPrivacySettings;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibilityExceptionList: FC = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n setPrivacySettings,\n onScreenSelect,\n}) => {\n const lang = useLang();\n\n const selectedContactIds = useMemo(() => {\n if (!settings) {\n return [];\n }\n\n if (isAllowList) {\n return [...settings.allowUserIds, ...settings.allowChatIds];\n } else {\n return [...settings.blockUserIds, ...settings.blockChatIds];\n }\n }, [isAllowList, settings]);\n const [searchQuery, setSearchQuery] = useState('');\n const [isSubmitShown, setIsSubmitShown] = useState(false);\n const [newSelectedContactIds, setNewSelectedContactIds] = useState(selectedContactIds);\n\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [\n ...activeChatArrays.pinnedChats,\n ...activeChatArrays.otherChats,\n ]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n ((isChatPrivate(chat.id) && chat.id !== currentUserId) || isChatGroup(chat))\n && (\n !searchQuery\n || searchWords(getChatTitle(lang, chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, lang, searchQuery, selectedContactIds]);\n\n const handleSelectedContactIdsChange = useCallback((value: number[]) => {\n setNewSelectedContactIds(value);\n setIsSubmitShown(true);\n }, []);\n\n const handleSubmit = useCallback(() => {\n setPrivacySettings({\n privacyKey: getPrivacyKey(screen),\n isAllowList: Boolean(isAllowList),\n contactsIds: newSelectedContactIds,\n });\n\n onScreenSelect(SettingsScreens.Privacy);\n }, [isAllowList, newSelectedContactIds, onScreenSelect, screen, setPrivacySettings]);\n\n return (\n
\n \n\n \n \n \n
\n );\n};\n\nfunction getCurrentPrivacySettings(global: GlobalState, screen: SettingsScreens) {\n const { privacy } = global.settings;\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return privacy.phoneNumber;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return privacy.lastSeen;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return privacy.profilePhoto;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return privacy.forwards;\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return privacy.chatInvite;\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n currentUserId,\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n settings: getCurrentPrivacySettings(global, screen),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacySettings']),\n)(SettingsPrivacyVisibilityExceptionList));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport useFoldersReducer from '../../../hooks/reducers/useFoldersReducer';\nimport useTwoFaReducer from '../../../hooks/reducers/useTwoFaReducer';\n\nimport Transition from '../../ui/Transition';\nimport SettingsHeader from './SettingsHeader';\nimport SettingsMain from './SettingsMain';\nimport SettingsEditProfile from './SettingsEditProfile';\nimport SettingsFolders from './folders/SettingsFolders';\nimport SettingsGeneral from './SettingsGeneral';\nimport SettingsGeneralBackground from './SettingsGeneralBackground';\nimport SettingsGeneralBackgroundColor from './SettingsGeneralBackgroundColor';\nimport SettingsNotifications from './SettingsNotifications';\nimport SettingsPrivacy from './SettingsPrivacy';\nimport SettingsLanguage from './SettingsLanguage';\nimport SettingsPrivacyVisibility from './SettingsPrivacyVisibility';\nimport SettingsPrivacyActiveSessions from './SettingsPrivacyActiveSessions';\nimport SettingsPrivacyBlockedUsers from './SettingsPrivacyBlockedUsers';\nimport SettingsTwoFa from './twoFa/SettingsTwoFa';\nimport SettingsPrivacyVisibilityExceptionList from './SettingsPrivacyVisibilityExceptionList';\n\nimport './Settings.scss';\n\nconst TRANSITION_RENDER_COUNT = Object.keys(SettingsScreens).length / 2;\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n currentScreen,\n onScreenSelect,\n onReset,\n}) => {\n const [foldersState, foldersDispatch] = useFoldersReducer();\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n foldersDispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (foldersState.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n foldersState.mode, foldersDispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleSaveFilter = useCallback(() => {\n foldersDispatch({ type: 'saveFilters' });\n handleReset();\n }, [foldersDispatch, handleReset]);\n\n function renderCurrentSectionContent() {\n switch (currentScreen) {\n case SettingsScreens.Main:\n return (\n \n );\n case SettingsScreens.EditProfile:\n return (\n \n );\n case SettingsScreens.General:\n return (\n \n );\n case SettingsScreens.Notifications:\n return (\n \n );\n case SettingsScreens.Privacy:\n return (\n \n );\n case SettingsScreens.Language:\n return (\n \n );\n case SettingsScreens.GeneralChatBackground:\n return (\n \n );\n case SettingsScreens.GeneralChatBackgroundColor:\n return (\n \n );\n case SettingsScreens.PrivacyActiveSessions:\n return (\n \n );\n case SettingsScreens.PrivacyBlockedUsers:\n return (\n \n );\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return (\n \n );\n\n case SettingsScreens.Folders:\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaNewPasswordConfirm:\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaCongratulations:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n case SettingsScreens.TwoFaChangePasswordHint:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n case SettingsScreens.TwoFaRecoveryEmail:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n }\n\n function renderCurrentSection() {\n return (\n <>\n \n {renderCurrentSectionContent()}\n \n );\n }\n\n return (\n \n {renderCurrentSection}\n \n );\n};\n\nexport default memo(Settings);\n","import React, {\n FC, useEffect, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport { getUserFullName, sortUserIds } from '../../../modules/helpers';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ListItem from '../../ui/ListItem';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n filter: string;\n};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n filter, usersById, contactIds, loadContactList, openChat,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\n },\n [openChat],\n );\n\n const listIds = useMemo(() => {\n if (!contactIds) {\n return undefined;\n }\n\n const resultIds = filter ? contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, filter);\n }) : contactIds;\n\n return sortUserIds(resultIds, usersById);\n }, [filter, usersById, contactIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n \n {viewportIds && viewportIds.length ? (\n viewportIds.map((id) => (\n handleClick(id)}\n ripple={!IS_MOBILE_SCREEN}\n >\n \n \n ))\n ) : viewportIds && !viewportIds.length ? (\n

\n {filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'}\n

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: contactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n\n return {\n usersById,\n contactIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'openChat']),\n)(ContactList));\n","import React, {\n FC, useCallback, useEffect, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { getUserFullName, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: boolean;\n selectedMemberIds: number[];\n onSelectedMemberIdsChange: (ids: number[]) => void;\n onNextStep: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n usersById: Record;\n chatsById: Record;\n localContactIds?: number[];\n searchQuery?: string;\n isSearching?: boolean;\n localUserIds?: number[];\n globalUserIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC = ({\n isChannel,\n selectedMemberIds,\n onSelectedMemberIdsChange,\n onNextStep,\n onReset,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\n loadContactList,\n setGlobalSearchQuery,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const handleFilterChange = useCallback((query: string) => {\n setGlobalSearchQuery({ query });\n }, [setGlobalSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds;\n }\n\n const foundContactIds = contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, searchQuery);\n });\n\n return sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, searchQuery, localUserIds, globalUserIds, usersById, chatsById, selectedMemberIds, currentUserId,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length || isChannel) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds.length, isChannel, setGlobalSearchQuery, onNextStep]);\n\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n

{lang('GroupAddMembers')}

\n
\n
\n \n\n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n const { currentUserId } = global;\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalResults,\n localResults,\n } = global.globalSearch;\n const { userIds: globalUserIds } = globalResults || {};\n const { userIds: localUserIds } = localResults || {};\n\n return {\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus && fetchingStatus.chats,\n globalUserIds,\n localUserIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setGlobalSearchQuery']),\n)(NewChatStep1));\n","import React, {\n FC, useState, useCallback, useEffect, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ChatCreationProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport InputText from '../../ui/InputText';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport Button from '../../ui/Button';\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nexport type OwnProps = {\n isChannel?: boolean;\n memberIds: number[];\n onReset: (forceReturnToChatList?: boolean) => void;\n};\n\ntype StateProps = {\n creationProgress?: ChatCreationProgress;\n creationError?: string;\n};\n\ntype DispatchProps = Pick;\n\n// TODO @implement\nconst MAX_USERS_FOR_LEGACY_CHAT = 199; // Accounting for current user\n\nconst NewChatStep2: FC = ({\n isChannel,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n const [title, setTitle] = useState('');\n const [about, setAbout] = useState('');\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n\n const chatTitleEmptyError = 'Chat title can\\'t be empty';\n const channelTitleEmptyError = 'Channel title can\\'t be empty';\n const chatTooManyUsersError = 'Sorry, creating supergroups is not yet supported';\n\n const isLoading = creationProgress === ChatCreationProgress.InProgress;\n\n const handleTitleChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n const newValue = value.replace(/^\\s+/, '');\n\n setTitle(newValue);\n\n if (newValue !== value) {\n e.currentTarget.value = newValue;\n }\n }, []);\n\n const handleDescriptionChange = useCallback((e: React.ChangeEvent) => {\n setAbout(e.currentTarget.value);\n }, []);\n\n const handleCreateGroup = useCallback(() => {\n if (!title.length) {\n setError(chatTitleEmptyError);\n return;\n }\n\n if (memberIds.length > MAX_USERS_FOR_LEGACY_CHAT) {\n setError(chatTooManyUsersError);\n return;\n }\n\n createGroupChat({\n title,\n photo,\n memberIds,\n });\n }, [title, memberIds, createGroupChat, photo, chatTitleEmptyError, chatTooManyUsersError]);\n\n const handleCreateChannel = useCallback(() => {\n if (!title.length) {\n setError(channelTitleEmptyError);\n return;\n }\n\n createChannel({\n title,\n about,\n photo,\n memberIds,\n });\n }, [title, createChannel, about, photo, memberIds, channelTitleEmptyError]);\n\n useEffect(() => {\n if (creationProgress === ChatCreationProgress.Complete) {\n onReset(true);\n }\n }, [creationProgress, onReset]);\n\n const renderedError = creationError || (\n error !== chatTitleEmptyError && error !== channelTitleEmptyError\n ? error\n : undefined\n );\n\n return (\n
\n
\n onReset()}\n ariaLabel=\"Return to member selection\"\n >\n \n \n

{lang(isChannel ? 'NewChannel' : 'NewGroup')}

\n
\n
\n \n \n {isChannel && (\n <>\n \n

{lang('DescriptionInfo')}

\n \n )}\n\n {renderedError && (\n

{renderedError}

\n )}\n\n {memberIds.length > 0 && (\n <>\n

{lang('GroupInfo.ParticipantCount', memberIds.length, 'i')}

\n\n
\n {memberIds.map((id) => (\n \n \n \n ))}\n
\n \n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n progress: creationProgress,\n error: creationError,\n } = global.chatCreation || {};\n\n return {\n creationProgress,\n creationError,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'createGroupChat', 'createChannel',\n ]),\n)(NewChatStep2));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport NewChatStep1 from './NewChatStep1';\nimport NewChatStep2 from './NewChatStep2';\n\nimport './NewChat.scss';\n\nexport type OwnProps = {\n isChannel?: boolean;\n content: LeftColumnContent;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\nconst RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\n\nconst NewChat: FC = ({\n isChannel = false,\n content,\n onContentChange,\n onReset,\n}) => {\n const [newChatMemberIds, setNewChatMemberIds] = useState([]);\n\n const handleNextStep = useCallback(() => {\n onContentChange(isChannel ? LeftColumnContent.NewChannelStep2 : LeftColumnContent.NewGroupStep2);\n }, [isChannel, onContentChange]);\n\n return (\n \n {() => {\n switch (content) {\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewGroupStep1:\n return (\n \n );\n case LeftColumnContent.NewChannelStep2:\n case LeftColumnContent.NewGroupStep2:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n );\n};\n\nexport default memo(NewChat);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n onReset: () => void;\n};\n\nconst ArchivedChats: FC = ({ isActive, onReset }) => {\n const lang = useLang();\n\n return (\n
\n
\n \n \n \n

{lang('ArchivedChats')}

\n
\n \n
\n );\n};\n\nexport default memo(ArchivedChats);\n","const IGNORED_KEYS: Record = {\n Down: true,\n ArrowDown: true,\n Up: true,\n ArrowUp: true,\n Left: true,\n ArrowLeft: true,\n Right: true,\n ArrowRight: true,\n ' ': true,\n PageUp: true,\n PageDown: true,\n End: true,\n Home: true,\n Tab: true,\n};\n\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key]) {\n preventDefault(e);\n }\n}\n\nexport function disableScrolling() {\n // Disable scrolling in Chrome\n document.addEventListener('wheel', preventDefault, { passive: false });\n window.ontouchmove = preventDefault; // mobile\n document.onkeydown = preventDefaultForScrollKeys;\n}\n\nexport function enableScrolling() {\n document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome\n // eslint-disable-next-line no-null/no-null\n window.ontouchmove = null;\n // eslint-disable-next-line no-null/no-null\n document.onkeydown = null;\n}\n","import { ApiMediaFormat, ApiMessage } from '../../../../api/types';\n\nimport * as mediaLoader from '../../../../util/mediaLoader';\nimport { getMessageMediaHash, getMessagePhoto, getMessageText } from '../../../../modules/helpers';\nimport { CLIPBOARD_ITEM_SUPPORTED, copyImageToClipboard, copyTextToClipboard } from '../../../../util/clipboard';\n\ntype ICopyOptions = {\n label: string;\n handler: () => void;\n}[];\n\nexport function getMessageCopyOptions(\n message: ApiMessage, afterEffect?: () => void, onCopyLink?: () => void,\n): ICopyOptions {\n const options: ICopyOptions = [];\n const text = getMessageText(message);\n const photo = getMessagePhoto(message);\n const mediaHash = getMessageMediaHash(message, 'inline')!;\n const canImageBeCopied = photo && mediaHash && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'lng_context_copy_image',\n handler: () => {\n mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl).then(copyImageToClipboard);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (text) {\n // Detect if the user has selection in the current message\n const hasSelection = Boolean((\n selection\n && selection.anchorNode\n && selection.anchorNode.parentNode\n && (selection.anchorNode.parentNode as HTMLElement).closest('.Message .content-inner')\n && selection.toString().replace(/(?:\\r\\n|\\r|\\n)/g, '') !== ''\n ));\n\n options.push({\n label: getCopyLabel(hasSelection, canImageBeCopied),\n handler: () => {\n const clipboardText = hasSelection && selection ? selection.toString() : text;\n copyTextToClipboard(clipboardText);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (onCopyLink) {\n options.push({\n label: 'lng_context_copy_message_link',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean, canImageBeCopied: boolean): string {\n if (hasSelection) {\n return 'lng_context_copy_selected';\n }\n\n if (canImageBeCopied) {\n return 'lng_context_copy_text';\n }\n\n return 'Copy';\n}\n","import React, { FC, useCallback, useEffect } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport { getMessageCopyOptions } from './helpers/copyOptions';\nimport useContextMenuPosition from '../../../hooks/useContextMenuPosition';\nimport { dispatchHeavyAnimationEvent } from '../../../hooks/useHeavyAnimationCheck';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './MessageContextMenu.scss';\n\ntype OwnProps = {\n isOpen: boolean;\n anchor: IAnchorPosition;\n message: ApiMessage;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n onReply: () => void;\n onEdit: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onForward: () => void;\n onDelete: () => void;\n onFaveSticker: () => void;\n onUnfaveSticker: () => void;\n onSelect: () => void;\n onSend: () => void;\n onReschedule: () => void;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onCopyLink?: () => void;\n};\n\nconst ANIMATION_DURATION = 200;\nconst SCROLLBAR_WIDTH = 10;\n\nconst MessageContextMenu: FC = ({\n isOpen,\n message,\n anchor,\n canSendNow,\n canReschedule,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n useEffect(() => {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }, [isOpen]);\n\n const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined);\n\n const getTriggerElement = useCallback(() => {\n return document.querySelector(`.active > .MessageList div[data-message-id=\"${message.id}\"]`);\n }, [message.id]);\n\n const getRootElement = useCallback(\n () => document.querySelector('.active > .MessageList'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => document.querySelector('.MessageContextMenu .bubble'),\n [],\n );\n\n const { positionX, positionY, style } = useContextMenuPosition(\n anchor,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n SCROLLBAR_WIDTH,\n (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight,\n );\n\n const lang = useLang();\n\n return (\n \n {canSendNow && {lang('MessageScheduleSend')}}\n {canReschedule && (\n {lang('MessageScheduleEditTime')}\n )}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && (\n {lang('AddToFavorites')}\n )}\n {canUnfaveSticker && (\n {lang('Stickers.RemoveFromFavorites')}\n )}\n {canCopy && copyOptions.map((options) => (\n {lang(options.label)}\n ))}\n {canPin && {lang('DialogPin')}}\n {canUnpin && {lang('DialogUnpin')}}\n {canForward && {lang('Forward')}}\n {canSelect && {lang('Common.Select')}}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum, IAnchorPosition } from '../../../types';\nimport { selectAllowedMessageActions, selectCurrentMessageList } from '../../../modules/selectors';\nimport { disableScrolling, enableScrolling } from '../../../util/scrollLock';\nimport { pick } from '../../../util/iteratees';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal';\nimport PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\n\nexport type OwnProps = {\n isOpen: boolean;\n message: ApiMessage;\n album?: IAlbum;\n anchor: IAnchorPosition;\n messageListType: MessageListType;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n noOptions?: boolean;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ContextMenuContainer: FC = ({\n isOpen,\n messageListType,\n message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n loadMessageLink,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isPinModalOpen, setIsPinModalOpen] = useState(false);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closePinModal = useCallback(() => {\n setIsPinModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n onClose();\n }, [closeCalendar, onClose]);\n\n const handleReply = useCallback(() => {\n setReplyingToId({ messageId: message.id });\n closeMenu();\n }, [setReplyingToId, message.id, closeMenu]);\n\n const handleEdit = useCallback(() => {\n setEditingId({ messageId: message.id });\n closeMenu();\n }, [setEditingId, message.id, closeMenu]);\n\n const handlePin = useCallback(() => {\n setIsMenuOpen(false);\n setIsPinModalOpen(true);\n }, []);\n\n const handleUnpin = useCallback(() => {\n pinMessage({ messageId: message.id, isUnpin: true });\n closeMenu();\n }, [pinMessage, message.id, closeMenu]);\n\n const handleForward = useCallback(() => {\n closeMenu();\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: message.chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: message.chatId, messageIds: [message.id] });\n }\n }, [openForwardMenu, message, closeMenu, album]);\n\n const handleFaveSticker = useCallback(() => {\n closeMenu();\n faveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, faveSticker]);\n\n const handleUnfaveSticker = useCallback(() => {\n closeMenu();\n unfaveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, unfaveSticker]);\n\n const handleSelectMessage = useCallback(() => {\n const params = album && album.messages\n ? {\n messageId: message.id,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: false,\n }\n : { messageId: message.id, withShift: false };\n\n toggleMessageSelection(params);\n closeMenu();\n }, [closeMenu, message.id, toggleMessageSelection, album]);\n\n const handleScheduledMessageSend = useCallback(() => {\n sendScheduledMessages({ chatId: message.chatId, id: message.id });\n closeMenu();\n }, [closeMenu, message.chatId, message.id, sendScheduledMessages]);\n\n const handleOpenCalendar = useCallback(() => {\n setIsMenuOpen(false);\n openCalendar();\n }, [openCalendar]);\n\n const handleRescheduleMessage = useCallback((date: Date) => {\n rescheduleMessage({\n chatId: message.chatId,\n messageId: message.id,\n scheduledAt: Math.round(date.getTime() / 1000),\n });\n }, [message.chatId, message.id, rescheduleMessage]);\n\n const handleCopyLink = useCallback(() => {\n loadMessageLink({\n messageId: message.id,\n chatId: message.chatId,\n });\n closeMenu();\n }, [closeMenu, loadMessageLink, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n if (noOptions) {\n closeMenu();\n\n return undefined;\n }\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n return (\n
\n \n \n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const isPinned = messageListType === 'pinned';\n const isScheduled = messageListType === 'scheduled';\n\n return {\n noOptions,\n canSendNow: isScheduled,\n canReschedule: isScheduled,\n canReply: !isPinned && !isScheduled && canReply,\n canPin: !isScheduled && canPin,\n canUnpin: !isScheduled && canUnpin,\n canDelete,\n canEdit: !isPinned && canEdit,\n canForward: !isScheduled && canForward,\n canFaveSticker: !isScheduled && canFaveSticker,\n canUnfaveSticker: !isScheduled && canUnfaveSticker,\n canCopy,\n canCopyLink: !isScheduled && canCopyLink,\n canSelect,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'pinMessage',\n 'openForwardMenu',\n 'faveSticker',\n 'unfaveSticker',\n 'toggleMessageSelection',\n 'sendScheduledMessages',\n 'rescheduleMessage',\n 'loadMessageLink',\n ]),\n)(ContextMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { STICKER_SIZE_MODAL } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectStickerSet } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Loading from '../ui/Loading';\nimport StickerButton from './StickerButton';\n\nimport './StickerSetModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n fromSticker: ApiSticker;\n onClose: () => void;\n};\n\ntype StateProps = {\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSet,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const lang = useLang();\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({ stickerSetId, stickerSetAccessHash });\n }\n }, [isOpen, fromSticker, loadStickers]);\n\n const handleSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n sendMessage({ sticker });\n onClose();\n }, [onClose, sendMessage]);\n\n const handleButtonClick = useCallback(() => {\n toggleStickerSet({ stickerSetId: fromSticker.stickerSetId });\n onClose();\n }, [fromSticker.stickerSetId, onClose, toggleStickerSet]);\n\n return (\n \n {stickerSet && stickerSet.stickers ? (\n <>\n
\n {stickerSet.stickers.map((sticker) => (\n \n ))}\n
\n
\n \n {lang(\n stickerSet.installedDate ? 'StickerPack.RemoveStickerCount' : 'StickerPack.AddStickerCount',\n stickerSet.count,\n 'i',\n )}\n \n
\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker }: OwnProps) => {\n return { stickerSet: selectStickerSet(global, fromSticker.stickerSetId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickers',\n 'toggleStickerSet',\n 'sendMessage',\n ]),\n)(StickerSetModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat } from '../../modules/helpers';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Portal from '../ui/Portal';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\nimport DeleteChatModal from '../common/DeleteChatModal';\n\nimport './HeaderMenuContainer.scss';\n\ntype DispatchProps = Pick;\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n isOpen: boolean;\n anchor: IAnchorPosition;\n isChannel?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n onSubscribeChannel: () => void;\n onSearchClick: () => void;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isPrivate?: boolean;\n isMuted?: boolean;\n canDeleteChat?: boolean;\n};\n\nconst HeaderMenuContainer: FC = ({\n chatId,\n isOpen,\n anchor,\n isChannel,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n chat,\n isPrivate,\n isMuted,\n canDeleteChat,\n onSubscribeChannel,\n onSearchClick,\n onClose,\n onCloseAnimationEnd,\n updateChatMutedState,\n enterMessageSelectMode,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const { x, y } = anchor;\n\n useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleToggleMuteClick = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n closeMenu();\n }, [chatId, closeMenu, isMuted, updateChatMutedState]);\n\n const handleSubscribe = useCallback(() => {\n onSubscribeChannel();\n closeMenu();\n }, [closeMenu, onSubscribeChannel]);\n\n const handleSearch = useCallback(() => {\n onSearchClick();\n closeMenu();\n }, [closeMenu, onSearchClick]);\n\n const handleSelectMessages = useCallback(() => {\n enterMessageSelectMode();\n closeMenu();\n }, [closeMenu, enterMessageSelectMode]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const lang = useLang();\n\n return (\n \n
\n \n {IS_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {IS_MOBILE_SCREEN && canSearch && (\n \n {lang('Search')}\n \n )}\n {canMute && (\n \n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n \n )}\n {canSelect && (\n \n {lang('ReportSelectMessages')}\n \n )}\n {canLeave && (\n \n {lang(isPrivate\n ? 'Delete'\n : (canDeleteChat ? 'GroupInfo.DeleteAndExit' : (isChannel ? 'LeaveChannel' : 'Group.LeaveGroup')))}\n \n )}\n \n {chat && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n return {\n chat,\n isMuted: chat.isMuted,\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\n ]),\n)(HeaderMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { debounce } from '../../util/schedulers';\nimport { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { getDayStartAt } from '../../util/dateFormat';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\n\nimport './MobileSearch.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n};\n\ntype StateProps = {\n isActive?: boolean;\n chat?: ApiChat;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n isHistoryCalendarOpen?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n // Fix for iOS keyboard\n useEffect(() => {\n const { visualViewport } = window as any;\n if (!visualViewport) {\n return undefined;\n }\n\n const mainEl = document.getElementById('Main') as HTMLDivElement;\n const handleResize = () => {\n const { activeElement } = document;\n if (activeElement && (activeElement === inputRef.current)) {\n const { pageTop, height } = visualViewport;\n mainEl.style.transform = `translateY(${pageTop}px)`;\n mainEl.style.height = `${height}px`;\n document.documentElement.scrollTop = pageTop;\n } else {\n mainEl.style.transform = '';\n mainEl.style.height = '';\n }\n };\n\n visualViewport.addEventListener('resize', handleResize);\n\n return () => {\n visualViewport.removeEventListener('resize', handleResize);\n };\n }, []);\n\n // Focus message\n useEffect(() => {\n if (chat && foundIds && foundIds.length) {\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1] });\n setFocusedIndex(0);\n } else {\n setFocusedIndex(-1);\n }\n }, [chat, focusMessage, foundIds]);\n\n // Disable native up/down buttons on iOS\n useEffect(() => {\n Array.from(document.querySelectorAll('input')).forEach((input) => {\n input.disabled = Boolean(isActive && input !== inputRef.current);\n });\n\n Array.from(document.querySelectorAll('div[contenteditable]')).forEach((div) => {\n div.contentEditable = isActive ? 'false' : 'true';\n });\n }, [isActive]);\n\n // Blur on exit\n useEffect(() => {\n if (!isActive) {\n inputRef.current!.blur();\n }\n }, [isActive]);\n\n useLayoutEffect(() => {\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.blur();\n }, [isHistoryCalendarOpen]);\n\n const handleMessageSearchQueryChange = useCallback((newQuery: string) => {\n setLocalTextSearchQuery({ query: newQuery });\n\n if (newQuery.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleUp = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex + 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n const handleDown = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex - 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n return (\n
\n
\n \n \n \n \n
\n
\n
\n {query ? (\n foundIds && foundIds.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n )}\n
\n \n \n \n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'openHistoryCalendar',\n ]),\n)(MobileSearchFooter));\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n isHorizontal = false,\n) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const allElements = typeof selectorOrElements === 'string'\n ? container.querySelectorAll(selectorOrElements)\n : selectorOrElements;\n const { length } = allElements;\n const visibleIndexes: number[] = [];\n let isFound = false;\n\n for (let i = 0; i < length; i++) {\n const element = allElements[i];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const isVisible = shouldContainBottom\n ? y2 >= viewportY1 - margin && y2 <= viewportY2 + margin\n : y1 <= viewportY2 + margin && y2 >= viewportY1 - margin;\n\n if (isVisible) {\n visibleIndexes.push(i);\n isFound = true;\n } else if (isFound && !isDense) {\n break;\n }\n }\n\n return { allElements, visibleIndexes };\n}\n","function isFullyVisible(container: HTMLElement, element: HTMLElement, isHorizontal = false) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import React, {\n FC, useCallback, useEffect, useState, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport cycleRestrict from '../../../util/cycleRestrict';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container || index < 0) {\n return;\n }\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.chat-item-clickable',\n VIEWPORT_MARGIN,\n true,\n true,\n );\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first]))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n fastSmoothScroll(container, allElements[index], position, SCROLL_MARGIN);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n filter: string;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredChatMembers?: ApiChatMember[];\n usersById?: Record;\n};\n\nconst MentionTooltip: FC = ({\n isOpen,\n filter,\n onClose,\n onInsertUserName,\n usersById,\n filteredChatMembers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!filteredChatMembers) {\n return -1;\n }\n const membersCount = filteredChatMembers!.length;\n return cycleRestrict(membersCount, newIndex);\n }, [filteredChatMembers]);\n\n const [selectedMentionIndex, setSelectedMentionIndex] = useState(-1);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedMentionIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedMentionIndex, getSelectedIndex]);\n\n const handleUserSelect = useCallback((userId: number, forceFocus = false) => {\n const user = usersById && usersById[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [usersById, onInsertUserName]);\n\n const handleSelectMention = useCallback((e: KeyboardEvent) => {\n if (filteredChatMembers && filteredChatMembers.length && selectedMentionIndex > -1) {\n const member = filteredChatMembers[selectedMentionIndex];\n if (member) {\n e.preventDefault();\n handleUserSelect(member.userId, true);\n }\n }\n }, [filteredChatMembers, selectedMentionIndex, handleUserSelect]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectMention,\n onTab: handleSelectMention,\n }) : undefined), [isOpen, onClose, handleArrowKey, handleSelectMention]);\n\n useEffect(() => {\n if (filteredChatMembers && !filteredChatMembers.length) {\n onClose();\n }\n }, [filteredChatMembers, onClose]);\n\n useEffect(() => {\n setSelectedMentionIndex(0);\n }, [filter]);\n\n useEffect(() => {\n setItemVisible(selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n const prevChatMembers = usePrevious(\n filteredChatMembers && filteredChatMembers.length\n ? filteredChatMembers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredChatMembers && !filteredChatMembers.length\n ? prevChatMembers\n : filteredChatMembers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedChatMembers && renderedChatMembers.map(({ userId }, index) => (\n handleUserSelect(userId)}\n focus={selectedMentionIndex === index}\n >\n \n \n ))}\n
\n );\n};\n\nexport default memo(MentionTooltip);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\nimport { LangCode } from '../../../types';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD, EDITABLE_INPUT_MODAL_ID } from '../../../config';\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionTooltip from './MentionTooltip';\nimport EmojiTooltip from './EmojiTooltip.async';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n canSuggestMembers?: boolean;\n canSuggestEmoji?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n recentEmojis: string[];\n language: LangCode;\n addRecentEmoji: AnyToVoidFunction;\n loadEmojiKeywords: AnyToVoidFunction;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onFileAppend: (files: File[], isQuick: boolean) => void;\n onClear: () => void;\n};\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst AttachmentModal: FC = ({\n attachments,\n caption,\n canSuggestMembers,\n groupChatMembers,\n currentUserId,\n usersById,\n recentEmojis,\n language,\n onCaptionUpdate,\n addRecentEmoji,\n loadEmojiKeywords,\n onSend,\n onFileAppend,\n onClear,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n const isQuick = renderingAttachments && renderingAttachments.every((a) => a.quick);\n const lang = useLang();\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredMembers,\n } = useMentionTooltip(\n canSuggestMembers && isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n currentUserId,\n usersById,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n isOpen,\n caption,\n recentEmojis,\n EDITABLE_INPUT_MODAL_ID,\n onCaptionUpdate,\n );\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n\n const sendAttachments = useCallback(() => {\n if (isOpen) {\n onSend();\n }\n }, [isOpen, onSend]);\n\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget, target: fromTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.drop-target') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(unmarkHovered, DROP_LEAVE_TIMEOUT_MS);\n }\n\n // Prevent DragLeave event from firing when the pointer moves inside the AttachmentModal drop target\n if (fromTarget && (fromTarget as HTMLElement).closest('.AttachmentModal.hovered')) {\n return;\n }\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n unmarkHovered();\n\n const { dataTransfer: { files } } = e;\n\n if (files && files.length) {\n const newFiles = isQuick\n ? Array.from(files).filter((file) => {\n return file.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.includes(file.type);\n })\n : Array.from(files);\n\n onFileAppend(newFiles, false);\n }\n }, [isQuick, onFileAppend, unmarkHovered]);\n\n function handleDragOver(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n }\n\n if (!renderingAttachments) {\n return undefined;\n }\n\n const areAllPhotos = renderingAttachments.every((a) => a.mimeType.startsWith('image/'));\n const areAllVideos = renderingAttachments.every((a) => a.mimeType.startsWith('video/'));\n\n let title = '';\n if (areAllPhotos) {\n title = lang('PreviewSender.SendPhoto', renderingAttachments.length, 'i');\n } else if (areAllVideos) {\n title = lang('PreviewSender.SendVideo', renderingAttachments.length, 'i');\n } else {\n title = lang('PreviewSender.SendFile', renderingAttachments.length, 'i');\n }\n\n function renderHeader() {\n if (!renderingAttachments) {\n return undefined;\n }\n\n return (\n
\n \n
{title}
\n \n {lang('Send')}\n \n
\n );\n }\n\n return (\n \n \n {isQuick ? (\n
\n {renderingAttachments.map((attachment) => (\n attachment.mimeType.startsWith('image/')\n ? \"\"\n :
\n ) : (\n
\n {renderingAttachments.map((attachment) => (\n \n ))}\n
\n )}\n\n
\n \n \n \n
\n \n \n );\n};\n\nexport default memo(AttachmentModal);\n","import { ChangeEvent, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiNewPoll } from '../../../api/types';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport InputText from '../../ui/InputText';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\n\nimport './PollModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSend: (pollSummary: ApiNewPoll) => void;\n onClear: () => void;\n};\n\nconst MAX_LIST_HEIGHT = 320;\nconst MAX_OPTIONS_COUNT = 10;\nconst MAX_OPTION_LENGTH = 100;\nconst MAX_QUESTION_LENGTH = 255;\nconst MAX_SOLUTION_LENGTH = 200;\n\nconst PollModal: FC = ({ isOpen, onSend, onClear }) => {\n // eslint-disable-next-line no-null/no-null\n const questionInputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const optionsListRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const solutionRef = useRef(null);\n\n const [question, setQuestion] = useState('');\n const [options, setOptions] = useState(['']);\n const [isAnonymous, setIsAnonymous] = useState(true);\n const [isMultipleAnswers, setIsMultipleAnswers] = useState(false);\n const [isQuizMode, setIsQuizMode] = useState(false);\n const [solution, setSolution] = useState();\n const [correctOption, setCorrectOption] = useState();\n const [hasErrors, setHasErrors] = useState(false);\n\n const lang = useLang();\n\n const focusInput = useCallback((ref: RefObject) => {\n if (isOpen && ref.current) {\n ref.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n useEffect(() => {\n if (!isOpen) {\n setQuestion('');\n setOptions(['']);\n setIsAnonymous(true);\n setIsMultipleAnswers(false);\n setIsQuizMode(false);\n setSolution('');\n setCorrectOption('');\n setHasErrors(false);\n }\n }, [isOpen]);\n\n useEffect(() => focusInput(questionInputRef), [focusInput, isOpen]);\n\n useLayoutEffect(() => {\n const solutionEl = solutionRef.current;\n\n if (solutionEl && solution !== solutionEl.innerHTML) {\n solutionEl.innerHTML = solution;\n }\n }, [solution]);\n\n const addNewOption = useCallback((newOptions: string[] = []) => {\n setOptions([...newOptions, '']);\n requestAnimationFrame(() => {\n const list = optionsListRef.current;\n if (!list) {\n return;\n }\n\n list.classList.toggle('overflown', list.scrollHeight > MAX_LIST_HEIGHT);\n list.scrollTo({ top: list.scrollHeight, behavior: 'smooth' });\n });\n }, []);\n\n const handleCreate = useCallback(() => {\n setHasErrors(false);\n if (!isOpen) {\n return;\n }\n\n const questionTrimmed = question.trim().substring(0, MAX_QUESTION_LENGTH);\n const optionsTrimmed = options.map((o) => o.trim().substring(0, MAX_OPTION_LENGTH)).filter((o) => o.length);\n\n if (!questionTrimmed || optionsTrimmed.length < 2) {\n setQuestion(questionTrimmed);\n if (optionsTrimmed.length) {\n if (optionsTrimmed.length < 2) {\n addNewOption(optionsTrimmed);\n } else {\n setOptions(optionsTrimmed);\n }\n } else {\n addNewOption();\n }\n setHasErrors(true);\n return;\n }\n\n if (isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)])) {\n setHasErrors(true);\n return;\n }\n\n const answers = optionsTrimmed\n .map((text, index) => ({\n text: text.trim(),\n option: String(index),\n ...(String(index) === correctOption && { correct: true }),\n }));\n\n const payload: ApiNewPoll = {\n summary: {\n question: questionTrimmed,\n answers,\n ...(!isAnonymous && { isPublic: true }),\n ...(isMultipleAnswers && { multipleChoice: true }),\n ...(isQuizMode && { quiz: true }),\n },\n };\n\n if (isQuizMode) {\n const { text, entities } = (solution && parseMessageInput(solution.substring(0, MAX_SOLUTION_LENGTH))) || {};\n\n payload.quiz = {\n correctAnswers: [correctOption],\n ...(text && { solution: text }),\n ...(entities && { solutionEntities: entities }),\n };\n }\n\n onSend(payload);\n }, [\n isOpen,\n question,\n options,\n isQuizMode,\n correctOption,\n isAnonymous,\n isMultipleAnswers,\n onSend,\n addNewOption,\n solution,\n ]);\n\n const updateOption = useCallback((index: number, text: string) => {\n const newOptions = [...options];\n newOptions[index] = text;\n if (newOptions[newOptions.length - 1].trim().length && newOptions.length < MAX_OPTIONS_COUNT) {\n addNewOption(newOptions);\n } else {\n setOptions(newOptions);\n }\n }, [options, addNewOption]);\n\n const removeOption = useCallback((index: number) => {\n const newOptions = [...options];\n newOptions.splice(index, 1);\n setOptions(newOptions);\n requestAnimationFrame(() => {\n if (!optionsListRef.current) {\n return;\n }\n\n optionsListRef.current.classList.toggle('overflown', optionsListRef.current.scrollHeight > MAX_LIST_HEIGHT);\n });\n }, [options]);\n\n const handleCorrectOptionChange = useCallback((newValue: string) => {\n setCorrectOption(newValue);\n }, [setCorrectOption]);\n\n const handleIsAnonymousChange = useCallback((e: ChangeEvent) => {\n setIsAnonymous(e.target.checked);\n }, []);\n\n const handleMultipleAnswersChange = useCallback((e: ChangeEvent) => {\n setIsMultipleAnswers(e.target.checked);\n }, []);\n\n const handleQuizModeChange = useCallback((e: ChangeEvent) => {\n setIsQuizMode(e.target.checked);\n }, []);\n\n const handleKeyPress = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode === 13) {\n handleCreate();\n }\n }, [handleCreate]);\n\n const getQuestionError = useCallback(() => {\n if (hasErrors && !question.trim().length) {\n return lang('lng_polls_choose_question');\n }\n\n return undefined;\n }, [hasErrors, lang, question]);\n\n const getOptionsError = useCallback((index: number) => {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n if (hasErrors && optionsTrimmed.length < 2 && !options[index].trim().length) {\n return lang('lng_polls_choose_answers');\n }\n return undefined;\n }, [hasErrors, lang, options]);\n\n function renderHeader() {\n return (\n
\n \n
{lang('NewPoll')}
\n \n {lang('Create')}\n \n
\n );\n }\n\n function renderOptions() {\n return options.map((option, index) => (\n
\n updateOption(index, e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n {index !== options.length - 1 && (\n removeOption(index)}\n >\n \n \n )}\n
\n ));\n }\n\n function renderRadioOptions() {\n return renderOptions()\n .map((label, index) => ({ value: String(index), label, hidden: index === options.length - 1 }));\n }\n\n function renderQuizNoOptionError() {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n\n return isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)]) && (\n

{lang('lng_polls_choose_correct')}

\n );\n }\n\n return (\n \n setQuestion(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n
\n\n
\n

Options

\n\n {hasErrors && renderQuizNoOptionError()}\n {isQuizMode ? (\n \n ) : (\n renderOptions()\n )}\n\n
\n\n
\n\n
\n \n \n \n {isQuizMode && (\n <>\n

Solution

\n setSolution(e.currentTarget.innerHTML)}\n />\n
{lang('CreatePoll.ExplanationInfo')}
\n \n )}\n
\n \n );\n};\n\nexport default memo(PollModal);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\n\nconst MENU_CLOSE_TIMEOUT = 250;\nlet closeTimeout: number | undefined;\n\nexport default function useMouseInside(\n isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT,\n) {\n const isMouseInside = useRef(false);\n\n useEffect(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n if (isOpen && !IS_TOUCH_ENV) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isOpen, menuCloseTimeout, onClose]);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout);\n }, [menuCloseTimeout, onClose]);\n\n return [handleMouseEnter, handleMouseLeave];\n}\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\n\nimport './EmojiButton.scss';\n\ntype OwnProps = {\n emoji: Emoji;\n focus?: boolean;\n onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC = ({ emoji, focus, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n // Preventing safari from losing focus on Composer MessageInput\n e.preventDefault();\n\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n \n {IS_EMOJI_SUPPORTED\n ? {emoji.native}\n : \"\"}\n
\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport EmojiButton from './EmojiButton';\n\nconst EMOJIS_PER_ROW_ON_DESKTOP = 9;\nconst EMOJI_MARGIN = 4;\nconst MOBILE_CONTAINER_PADDING = 8;\nconst EMOJI_SIZE = 40;\n\ntype OwnProps = {\n category: EmojiCategory;\n index: number;\n allEmojis: AllEmojis;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\nconst EmojiCategory: FC = ({\n category, index, allEmojis, observeIntersection, shouldRender, onEmojiSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const lang = useLang();\n\n const emojisPerRow = IS_MOBILE_SCREEN\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (EMOJI_SIZE + EMOJI_MARGIN))\n : EMOJIS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(category.emojis.length / emojisPerRow) * (EMOJI_SIZE + EMOJI_MARGIN);\n\n return (\n \n

\n {lang(category.id === 'recent' ? 'RecentStickers' : `Emoji${index}`)}\n

\n \n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\n // Some emojis have multiple skins and are represented as an Object with emojis for all skins.\n // For now, we select only the first emoji with 'neutral' skin.\n const displayedEmoji = 'id' in emoji ? emoji : emoji[1];\n\n return (\n \n );\n })}\n
\n \n );\n};\n\nexport default memo(EmojiCategory);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { MENU_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport {\n EmojiModule,\n EmojiRawData,\n EmojiData,\n uncompressEmoji,\n} from '../../../util/emoji';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Loading from '../../ui/Loading';\nimport EmojiCategory from './EmojiCategory';\n\nimport './EmojiPicker.scss';\n\ntype OwnProps = {\n className?: string;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\ntype StateProps = Pick;\ntype EmojiCategoryData = { id: string; name: string; emojis: string[] };\n\nconst ICONS_BY_CATEGORY: Record = {\n recent: 'icon-recent',\n people: 'icon-smile',\n nature: 'icon-animals',\n foods: 'icon-eats',\n activity: 'icon-sport',\n places: 'icon-car',\n objects: 'icon-lamp',\n symbols: 'icon-language',\n flags: 'icon-flag',\n};\n\nconst OPEN_ANIMATION_DELAY = 200;\n// Only a few categories are above this height.\nconst SMOOTH_SCROLL_DISTANCE = 800;\nconst FOCUS_MARGIN = 50;\nconst HEADER_BUTTON_WIDTH = 42; // px. Includes margins\nconst INTERSECTION_THROTTLE = 200;\n\nconst categoryIntersections: boolean[] = [];\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst EmojiPicker: FC = ({\n className, onEmojiSelect, recentEmojis,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n\n const [categories, setCategories] = useState();\n const [emojis, setEmojis] = useState();\n const [activeCategoryIndex, setActiveCategoryIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('emoji-category-')) {\n return;\n }\n\n const index = Number(id.replace('emoji-category-', ''));\n categoryIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = categoryIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveCategoryIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n\n useHorizontalScroll(headerRef.current, !IS_MOBILE_SCREEN);\n\n // Scroll header when active set updates\n useEffect(() => {\n if (!categories) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeCategoryIndex * HEADER_BUTTON_WIDTH - header.offsetWidth / 2 + HEADER_BUTTON_WIDTH / 2;\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [categories, activeCategoryIndex]);\n\n const lang = useLang();\n\n const allCategories = useMemo(() => {\n if (!categories) {\n return MEMO_EMPTY_ARRAY;\n }\n const themeCategories = [...categories];\n if (recentEmojis && recentEmojis.length) {\n themeCategories.unshift({\n id: 'recent',\n name: lang('RecentStickers'),\n emojis: recentEmojis,\n });\n }\n\n return themeCategories;\n }, [categories, lang, recentEmojis]);\n\n // Initialize data on first render.\n useEffect(() => {\n setTimeout(() => {\n const exec = () => {\n setCategories(emojiData.categories);\n\n setEmojis(emojiData.emojis as AllEmojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, OPEN_ANIMATION_DELAY);\n }, []);\n\n const selectCategory = useCallback((index: number) => {\n setActiveCategoryIndex(index);\n const categoryEl = document.getElementById(`emoji-category-${index}`)!;\n fastSmoothScroll(containerRef.current!, categoryEl, 'start', FOCUS_MARGIN, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n onEmojiSelect(emoji, name);\n }, [onEmojiSelect]);\n\n const canRenderContents = useAsyncRendering([], MENU_TRANSITION_DURATION);\n\n function renderCategoryButton(category: EmojiCategoryData, index: number) {\n const icon = ICONS_BY_CATEGORY[category.id];\n\n return icon && (\n selectCategory(index)}\n ariaLabel={category.name}\n >\n \n \n );\n }\n\n const containerClassName = buildClassName('EmojiPicker', className);\n\n if (!emojis || !canRenderContents) {\n return (\n
\n \n
\n );\n }\n\n return (\n
\n
\n {allCategories.map(renderCategoryButton)}\n
\n
\n {allCategories.map((category, i) => (\n = i - 1 && activeCategoryIndex <= i + 1}\n onEmojiSelect={handleEmojiSelect}\n />\n ))}\n
\n
\n );\n};\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['recentEmojis']),\n)(EmojiPicker));\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport StickerButton from '../../common/StickerButton';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n stickerSet: StickerSetOrRecent;\n loadAndPlay: boolean;\n index: number;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n onStickerUnfave: (sticker: ApiSticker) => void;\n};\n\nconst STICKERS_PER_ROW_ON_DESKTOP = 5;\nconst STICKER_MARGIN = IS_MOBILE_SCREEN ? 8 : 16;\nconst MOBILE_CONTAINER_PADDING = 8;\n\nconst StickerSet: FC = ({\n stickerSet,\n loadAndPlay,\n index,\n observeIntersection,\n shouldRender,\n onStickerSelect,\n onStickerUnfave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const stickersPerRow = IS_MOBILE_SCREEN\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (STICKER_SIZE_PICKER + STICKER_MARGIN))\n : STICKERS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(stickerSet.count / stickersPerRow) * (STICKER_SIZE_PICKER + STICKER_MARGIN);\n\n return (\n \n

{stickerSet.title}

\n \n {shouldRender && stickerSet.stickers && stickerSet.stickers.map((sticker) => (\n \n ))}\n \n \n );\n};\n\nexport default memo(StickerSet);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiStickerSet, ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION, STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Loading from '../../ui/Loading';\nimport Button from '../../ui/Button';\nimport StickerButton from '../../common/StickerButton';\nimport StickerSet from './StickerSet';\nimport StickerSetCover from './StickerSetCover';\nimport StickerSetCoverAnimated from './StickerSetCoverAnimated';\n\nimport './StickerPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendStickers: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n recentStickers: ApiSticker[];\n favoriteStickers: ApiSticker[];\n stickerSetsById: Record;\n addedSetIds?: string[];\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SMOOTH_SCROLL_DISTANCE = 500;\nconst HEADER_BUTTON_WIDTH = 52; // px (including margin)\nconst STICKER_INTERSECTION_THROTTLE = 200;\n\nconst stickerSetIntersections: boolean[] = [];\n\nconst StickerPicker: FC = ({\n className,\n loadAndPlay,\n canSendStickers,\n recentStickers,\n favoriteStickers,\n addedSetIds,\n stickerSetsById,\n shouldPlay,\n onStickerSelect,\n loadStickerSets,\n loadRecentStickers,\n loadFavoriteStickers,\n loadAddedStickers,\n addRecentSticker,\n unfaveSticker,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n const [activeSetIndex, setActiveSetIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: STICKER_INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('sticker-set-')) {\n return;\n }\n\n const index = Number(id.replace('sticker-set-', ''));\n stickerSetIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = stickerSetIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveSetIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: headerRef });\n\n const lang = useLang();\n\n const areAddedLoaded = Boolean(addedSetIds);\n\n const allSets = useMemo(() => {\n if (!addedSetIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return [\n {\n id: 'recent',\n title: lang('RecentStickers'),\n stickers: recentStickers,\n count: recentStickers.length,\n },\n {\n id: 'favorite',\n title: lang('FavoriteStickers'),\n stickers: favoriteStickers,\n count: favoriteStickers.length,\n },\n ...addedSetIds.map((id) => stickerSetsById[id]).filter(Boolean),\n ];\n }, [addedSetIds, lang, recentStickers, favoriteStickers, stickerSetsById]);\n\n const noPopulatedSets = useMemo(() => (\n areAddedLoaded\n && allSets.filter((set) => set.stickers && set.stickers.length).length === 0\n ), [allSets, areAddedLoaded]);\n\n useEffect(() => {\n if (loadAndPlay) {\n loadStickerSets();\n loadRecentStickers();\n loadFavoriteStickers();\n }\n }, [loadAndPlay, loadFavoriteStickers, loadRecentStickers, loadStickerSets]);\n\n useEffect(() => {\n if (addedSetIds && addedSetIds.length) {\n loadAddedStickers();\n }\n }, [addedSetIds, loadAddedStickers]);\n\n useHorizontalScroll(headerRef.current);\n\n // Scroll container and header when active set changes\n useEffect(() => {\n if (!areAddedLoaded) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeSetIndex * HEADER_BUTTON_WIDTH - (header.offsetWidth / 2 - HEADER_BUTTON_WIDTH / 2);\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [areAddedLoaded, activeSetIndex]);\n\n const selectStickerSet = useCallback((index: number) => {\n setActiveSetIndex(index);\n const stickerSetEl = document.getElementById(`sticker-set-${index}`)!;\n fastSmoothScroll(containerRef.current!, stickerSetEl, 'start', undefined, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker);\n addRecentSticker({ sticker });\n }, [addRecentSticker, onStickerSelect]);\n\n const handleStickerUnfave = useCallback((sticker: ApiSticker) => {\n unfaveSticker({ sticker });\n }, [unfaveSticker]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n function renderCover(stickerSet: StickerSetOrRecent, index: number) {\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n const buttonClassName = buildClassName(\n 'symbol-set-button sticker-set-button',\n index === activeSetIndex && 'activated',\n );\n\n if (stickerSet.id === 'recent' || stickerSet.id === 'favorite' || stickerSet.hasThumbnail || !firstSticker) {\n return (\n selectStickerSet(index)}\n >\n {stickerSet.id === 'recent' ? (\n \n ) : stickerSet.id === 'favorite' ? (\n \n ) : stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n );\n } else {\n return (\n \n );\n }\n }\n\n const fullClassName = buildClassName('StickerPicker', className);\n\n if (!areAddedLoaded || !canRenderContents || noPopulatedSets || !canSendStickers) {\n return (\n
\n {!canSendStickers ? (\n
Sending stickers is not allowed in this chat.
\n ) : noPopulatedSets ? (\n
You have no saved Stickers.
\n ) : (\n \n )}\n
\n );\n }\n\n return (\n
\n \n {allSets.map(renderCover)}\n
\n
\n {allSets.map((stickerSet, i) => (\n = i - 1 && activeSetIndex <= i + 1}\n onStickerSelect={handleStickerSelect}\n onStickerUnfave={handleStickerUnfave}\n />\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n setsById,\n added,\n recent,\n favorite,\n } = global.stickers;\n\n return {\n recentStickers: recent.stickers,\n favoriteStickers: favorite.stickers,\n stickerSetsById: setsById,\n addedSetIds: added.setIds,\n shouldPlay: global.settings.byKey.shouldLoopStickers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickerSets',\n 'loadRecentStickers',\n 'loadFavoriteStickers',\n 'loadAddedStickers',\n 'addRecentSticker',\n 'unfaveSticker',\n ]),\n)(StickerPicker));\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiVideo } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\nimport useCanvasBlur from '../../hooks/useCanvasBlur';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const hasThumbnail = gif.thumbnail && !!gif.thumbnail.dataUri;\n const localMediaHash = `gif${gif.id}`;\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const loadAndPlay = isIntersecting && !isDisabled;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const thumbRef = useCanvasBlur(gif.thumbnail && gif.thumbnail.dataUri, Boolean(previewBlobUrl));\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { transitionClassNames } = useTransitionForMedia(hasThumbnail || previewBlobUrl || videoData, 'slow');\n const { isBuffered, bufferingHandlers } = useBuffering(true);\n const shouldRenderSpinner = loadAndPlay && !isBuffered;\n\n useVideoCleanup(videoRef, [shouldRenderVideo]);\n\n const handleClick = useCallback(\n () => onClick({\n ...gif,\n blobUrl: videoData,\n }),\n [onClick, gif, videoData],\n );\n\n const className = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\n );\n\n return (\n \n {hasThumbnail && (\n \n )}\n {!hasThumbnail && previewBlobUrl && (\n \n )}\n {(shouldRenderVideo || previewBlobUrl) && (\n \n \n \n )}\n {shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(GifButton);\n","import React, {\n FC, useEffect, memo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiVideo } from '../../../api/types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport Loading from '../../ui/Loading';\nimport GifButton from '../../common/GifButton';\n\nimport './GifPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendGifs: boolean;\n onGifSelect: (gif: ApiVideo) => void;\n};\n\ntype StateProps = {\n savedGifs?: ApiVideo[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC = ({\n className,\n loadAndPlay,\n canSendGifs,\n savedGifs,\n onGifSelect,\n loadSavedGifs,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n useEffect(() => {\n if (loadAndPlay) {\n loadSavedGifs();\n }\n }, [loadAndPlay, loadSavedGifs]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n return (\n
\n {!canSendGifs ? (\n
Sending GIFs is not allowed in this chat.
\n ) : canRenderContents && savedGifs && savedGifs.length ? (\n savedGifs.map((gif) => (\n \n ))\n ) : canRenderContents && savedGifs ? (\n
No saved GIFs.
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n savedGifs: global.gifs.saved.gifs,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadSavedGifs']),\n)(GifPicker));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\ntype OwnProps = {\n activeTab: SymbolMenuTabs;\n onSwitchTab: (tab: SymbolMenuTabs) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n};\n\nexport enum SymbolMenuTabs {\n 'Emoji',\n 'Stickers',\n 'GIFs',\n}\n\n// Getting enum string values for display in Tabs.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings\nexport const SYMBOL_MENU_TAB_TITLES = Object.values(SymbolMenuTabs)\n .filter((value): value is string => typeof value === 'string');\n\nconst SYMBOL_MENU_TAB_ICONS = {\n [SymbolMenuTabs.Emoji]: 'icon-smile',\n [SymbolMenuTabs.Stickers]: 'icon-stickers',\n [SymbolMenuTabs.GIFs]: 'icon-gifs',\n};\n\nconst SymbolMenuFooter: FC = ({\n activeTab, onSwitchTab, onRemoveSymbol, onSearchOpen,\n}) => {\n const lang = useLang();\n\n function renderTabButton(tab: SymbolMenuTabs) {\n return (\n onSwitchTab(tab)}\n ariaLabel={SYMBOL_MENU_TAB_TITLES[tab]}\n round\n faded\n color=\"translucent\"\n >\n \n \n );\n }\n\n const handleSearchOpen = useCallback(() => {\n onSearchOpen(activeTab === SymbolMenuTabs.Stickers ? 'stickers' : 'gifs');\n }, [activeTab, onSearchOpen]);\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n return (\n
\n {activeTab !== SymbolMenuTabs.Emoji && (\n \n \n \n )}\n\n {renderTabButton(SymbolMenuTabs.Emoji)}\n {renderTabButton(SymbolMenuTabs.Stickers)}\n {renderTabButton(SymbolMenuTabs.GIFs)}\n\n {activeTab === SymbolMenuTabs.Emoji && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SymbolMenuFooter);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../util/environment';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Menu from '../../ui/Menu';\nimport Transition from '../../ui/Transition';\nimport EmojiPicker from './EmojiPicker';\nimport StickerPicker from './StickerPicker';\nimport GifPicker from './GifPicker';\nimport SymbolMenuFooter, { SYMBOL_MENU_TAB_TITLES, SymbolMenuTabs } from './SymbolMenuFooter';\nimport Portal from '../../ui/Portal';\n\nimport './SymbolMenu.scss';\n\nconst ANIMATION_DURATION = 350;\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onLoad: () => void;\n onClose: () => void;\n onEmojiSelect: (emoji: string) => void;\n onStickerSelect: (sticker: ApiSticker) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen, addRecentEmoji,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const [recentEmojis, setRecentEmojis] = useState([]);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onClose, false, false);\n\n if (!isActivated && isOpen) {\n isActivated = true;\n }\n\n useEffect(() => {\n onLoad();\n }, [onLoad]);\n\n useLayoutEffect(() => {\n if (!IS_MOBILE_SCREEN) {\n return undefined;\n }\n\n if (isOpen) {\n document.body.classList.add('enable-symbol-menu-transforms');\n document.body.classList.add('is-symbol-menu-open');\n }\n\n return () => {\n if (isOpen) {\n fastRaf(() => {\n document.body.classList.remove('is-symbol-menu-open');\n setTimeout(() => {\n document.body.classList.remove('enable-symbol-menu-transforms');\n }, ANIMATION_DURATION);\n });\n }\n };\n }, [isOpen]);\n\n const recentEmojisRef = useRef(recentEmojis);\n recentEmojisRef.current = recentEmojis;\n useEffect(() => {\n if (!recentEmojisRef.current.length) {\n return;\n }\n\n recentEmojisRef.current.forEach((name) => {\n addRecentEmoji({ emoji: name });\n });\n\n setRecentEmojis([]);\n }, [isOpen, activeTab, addRecentEmoji]);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n setRecentEmojis((emojis) => {\n return [...emojis, name];\n });\n\n onEmojiSelect(emoji);\n }, [onEmojiSelect]);\n\n const handleSearch = useCallback((type: 'stickers' | 'gifs') => {\n onClose();\n onSearchOpen(type);\n }, [onClose, onSearchOpen]);\n\n const lang = useLang();\n\n const { canSendStickers, canSendGifs } = allowedAttachmentOptions;\n\n function renderContent(isActive: boolean, isFrom: boolean) {\n switch (activeTab) {\n case SymbolMenuTabs.Emoji:\n return (\n \n );\n case SymbolMenuTabs.Stickers:\n return (\n \n );\n case SymbolMenuTabs.GIFs:\n return (\n \n );\n }\n\n return undefined;\n }\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n const content = (\n <>\n
\n {isActivated && (\n \n {renderContent}\n \n )}\n
\n {IS_MOBILE_SCREEN && (\n \n \n \n )}\n \n \n );\n\n if (IS_MOBILE_SCREEN) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n );\n\n return (\n \n
\n {content}\n
\n
\n );\n }\n\n return (\n \n {content}\n \n );\n};\n\nexport default memo(SymbolMenu);\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './AttachMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n onPollCreate: () => void;\n onClose: () => void;\n};\n\nconst AttachMenu: FC = ({\n isOpen, allowedAttachmentOptions, onFileSelect, onPollCreate, onClose,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const handleFileSelect = useCallback((e: Event, isQuick: boolean) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n onFileSelect(Array.from(files), isQuick);\n }\n }, [onFileSelect]);\n\n const handleQuickSelect = useCallback(() => {\n openSystemFilesDialog(\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n (e) => handleFileSelect(e, true),\n );\n }, [handleFileSelect]);\n\n const handleDocumentSelect = useCallback(() => {\n openSystemFilesDialog('*', (e) => handleFileSelect(e, false));\n }, [handleFileSelect]);\n\n const lang = useLang();\n\n const { canAttachMedia, canAttachPolls } = allowedAttachmentOptions;\n\n return (\n \n {/*\n ** Using ternary operator here causes some attributes from first clause\n ** transferring to the fragment content in the second clause\n */}\n {!canAttachMedia && (\n Posting media content is not allowed in this group.\n )}\n {canAttachMedia && (\n <>\n \n {lang('AttachmentMenu.PhotoOrVideo')}\n \n {lang('AttachDocument')}\n \n )}\n {canAttachPolls && (\n {lang('Poll')}\n )}\n \n );\n};\n\nexport default memo(AttachMenu);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport Loading from '../../ui/Loading';\nimport StickerButton from '../../common/StickerButton';\n\nimport './StickerTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n stickers?: ApiSticker[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerTooltip: FC = ({\n isOpen,\n onStickerSelect,\n stickers,\n clearStickersForEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const prevStickers = usePrevious(stickers, true);\n const displayedStickers = stickers || prevStickers;\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n useEffect(() => (isOpen ? captureEscKeyListener(clearStickersForEmoji) : undefined), [isOpen, clearStickersForEmoji]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'StickerTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n !(displayedStickers && displayedStickers.length) && 'hidden',\n );\n\n return (\n \n {shouldRender && displayedStickers ? (\n displayedStickers.map((sticker) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { stickers } = global.stickers.forEmoji;\n\n return { stickers };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['clearStickersForEmoji']),\n)(StickerTooltip));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport { selectChatMessage, selectCurrentMessageList } from '../../../modules/selectors';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport Button from '../../ui/Button';\n\nimport './BotKeyboardMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageId: number;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst BotKeyboardMenu: FC = ({\n isOpen, message, onClose, clickInlineButton,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n if (!message || !message.keyboardButtons) {\n return undefined;\n }\n\n return (\n \n
\n {message.keyboardButtons.map((row) => (\n
\n {row.map((button) => (\n clickInlineButton({ button })}\n >\n {button.text}\n \n ))}\n
\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { messageId }): StateProps => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return {};\n }\n\n return { message: selectChatMessage(global, chatId, messageId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'clickInlineButton',\n ]),\n)(BotKeyboardMenu));\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './CustomSendMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSilentSend?: NoneToVoidFunction;\n onScheduleSend?: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n onCloseAnimationEnd?: NoneToVoidFunction;\n};\n\nconst CustomSendMenu: FC = ({\n isOpen, onSilentSend, onScheduleSend, onClose, onCloseAnimationEnd,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const lang = useLang();\n\n return (\n \n {onSilentSend && {lang('SendWithoutSound')}}\n {onScheduleSend && {lang('ScheduleMessage')}}\n \n );\n};\n\nexport default memo(CustomSendMenu);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport cycleRestrict from '../../../util/cycleRestrict';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevDuringAnimation from '../../../hooks/usePrevDuringAnimation';\n\nimport Loading from '../../ui/Loading';\nimport EmojiButton from './EmojiButton';\n\nimport './EmojiTooltip.scss';\nimport { LangCode } from '../../../types';\n\nconst VIEWPORT_MARGIN = 8;\nconst EMOJI_BUTTON_WIDTH = 44;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container) {\n return;\n }\n\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.EmojiButton',\n VIEWPORT_MARGIN,\n true,\n true,\n true,\n );\n\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first], true))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n const newLeft = position === 'start' ? index * EMOJI_BUTTON_WIDTH : 0;\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n language: LangCode;\n onEmojiSelect: (text: string) => void;\n onClose: NoneToVoidFunction;\n addRecentEmoji: AnyToVoidFunction;\n loadEmojiKeywords: AnyToVoidFunction;\n emojis: Emoji[];\n};\n\nconst CLOSE_DURATION = 350;\n\nconst EmojiTooltip: FC = ({\n isOpen,\n language,\n emojis,\n onClose,\n onEmojiSelect,\n addRecentEmoji,\n loadEmojiKeywords,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const listEmojis: Emoji[] = usePrevDuringAnimation(emojis.length ? emojis : undefined, CLOSE_DURATION) || [];\n\n const [selectedIndex, setSelectedIndex] = useState(-1);\n\n useEffect(() => {\n loadEmojiKeywords({ language });\n }, [loadEmojiKeywords, language]);\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [emojis]);\n\n useEffect(() => {\n setItemVisible(selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!emojis.length) {\n return -1;\n }\n\n const emojisCount = emojis.length;\n return cycleRestrict(emojisCount, newIndex);\n }, [emojis]);\n\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedIndex, getSelectedIndex]);\n\n const handleSelectEmoji = useCallback((e: KeyboardEvent) => {\n if (emojis.length && selectedIndex > -1) {\n const emoji = emojis[selectedIndex];\n if (emoji) {\n e.preventDefault();\n onEmojiSelect(emoji.native);\n addRecentEmoji({ emoji: emoji.id });\n }\n }\n }, [addRecentEmoji, emojis, onEmojiSelect, selectedIndex]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onLeft: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onRight: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectEmoji,\n }) : undefined), [handleArrowKey, handleSelectEmoji, isOpen, onClose]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'EmojiTooltip composer-tooltip custom-scroll-x',\n transitionClassNames,\n );\n\n return (\n \n {shouldRender && listEmojis ? (\n listEmojis.map((emoji, index) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(EmojiTooltip);\n","import React, {\n FC, useMemo, memo, useRef,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectUser,\n selectChatMessages,\n selectChat,\n selectCurrentTextSearch,\n} from '../../modules/selectors';\nimport {\n getMessageSummaryText,\n getChatTitle,\n getUserFullName,\n isChatChannel,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport LastMessageMeta from '../common/LastMessageMeta';\nimport Avatar from '../common/Avatar';\n\nimport './RightSearch.scss';\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n messagesById?: Record;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\ninterface Result {\n message: ApiMessage;\n senderUser?: ApiUser;\n senderChat?: ApiChat;\n onClick: NoneToVoidFunction;\n}\n\nconst RightSearch: FC = ({\n chatId,\n threadId,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\n}) => {\n const lang = useLang();\n\n const foundResults = useMemo(() => {\n if (!query || !foundIds || !foundIds.length || !messagesById) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const results = foundIds.map((id) => {\n const message = messagesById[id];\n if (!message) {\n return undefined;\n }\n\n const senderUser = message.senderId ? selectUser(getGlobal(), message.senderId) : undefined;\n\n let senderChat;\n if (chat && isChatChannel(chat)) {\n senderChat = chat;\n } else if (message.forwardInfo) {\n const { isChannelPost, fromChatId } = message.forwardInfo;\n senderChat = isChannelPost && fromChatId ? selectChat(getGlobal(), fromChatId) : undefined;\n } else {\n senderChat = message.senderId ? selectChat(getGlobal(), message.senderId) : undefined;\n }\n\n return {\n message,\n senderUser,\n senderChat,\n onClick: () => focusMessage({ chatId, threadId, messageId: id }),\n };\n }).filter(Boolean) as Result[];\n\n return orderBy(results, ({ message }) => message.date, 'desc');\n }, [chatId, threadId, focusMessage, foundIds, chat, messagesById, query]);\n\n const renderSearchResult = ({\n message, senderUser, senderChat, onClick,\n }: Result) => {\n const title = senderChat ? getChatTitle(lang, senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(lang, message);\n\n return (\n \n \n
\n
\n

{title && renderText(title)}

\n \n
\n
\n {renderText(text, ['emoji', 'highlight'], { highlight: query })}\n
\n
\n \n );\n };\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, true, (index) => {\n if (foundResults && foundResults[index]) {\n foundResults[index].onClick();\n }\n }, '.ListItem-button', true);\n\n return (\n \n

\n {!query ? (\n lang('lng_dlg_search_for_messages')\n ) : (totalCount === 0 || !foundResults.length) ? (\n lang('lng_search_no_results')\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length))} messages found`\n )}\n

\n {foundResults.map(renderSearchResult)}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const messagesById = chat && selectChatMessages(global, chat.id);\n if (!chat || !messagesById) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n };\n },\n (global, actions): DispatchProps => pick(actions, ['searchTextMessagesLocal', 'focusMessage']),\n)(RightSearch));\n","import React, {\n FC, useEffect, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_SEARCH } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectShouldLoopStickers, selectStickerSet } from '../../modules/selectors';\nimport useFlag from '../../hooks/useFlag';\nimport useOnChange from '../../hooks/useOnChange';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport StickerButton from '../common/StickerButton';\nimport StickerSetModal from '../common/StickerSetModal.async';\nimport Spinner from '../ui/Spinner';\n\ntype OwnProps = {\n stickerSetId: string;\n observeIntersection: ObserveFn;\n isSomeModalOpen: boolean;\n onModalToggle: (isOpen: boolean) => void;\n};\n\ntype StateProps = {\n set?: ApiStickerSet;\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC = ({\n stickerSetId, observeIntersection, set, shouldPlay,\n loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\n const lang = useLang();\n const isAdded = set && Boolean(set.installedDate);\n const areStickersLoaded = Boolean(set && set.stickers);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n useOnChange(() => {\n onModalToggle(isModalOpen);\n }, [isModalOpen, onModalToggle]);\n\n const displayedStickers = useMemo(() => {\n if (!set) {\n return [];\n }\n\n const coverStickerIds = (set.covers || []).map(({ id }) => id);\n const otherStickers = set.stickers ? set.stickers.filter(({ id }) => !coverStickerIds.includes(id)) : [];\n\n return [...set.covers || [], ...otherStickers].slice(0, STICKERS_TO_DISPLAY);\n }, [set]);\n\n useEffect(() => {\n // Featured stickers are initialized with one sticker in collection (cover of SickerSet)\n if (!areStickersLoaded && displayedStickers.length < STICKERS_TO_DISPLAY) {\n loadStickers({ stickerSetId });\n }\n }, [areStickersLoaded, displayedStickers.length, loadStickers, stickerSetId]);\n\n const handleAddClick = useCallback(() => {\n toggleStickerSet({ stickerSetId });\n }, [toggleStickerSet, stickerSetId]);\n\n if (!set) {\n return undefined;\n }\n\n const canRenderStickers = displayedStickers.length > 0;\n\n return (\n
\n
\n
\n

{set.title}

\n

{lang('Stickers', set.count, 'i')}

\n
\n \n {lang(isAdded ? 'Stickers.Installed' : 'Stickers.Install')}\n \n
\n
\n {!canRenderStickers && }\n {canRenderStickers && displayedStickers.map((sticker) => (\n \n ))}\n
\n {canRenderStickers && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { stickerSetId }): StateProps => {\n return {\n set: selectStickerSet(global, stickerSetId),\n shouldPlay: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadStickers', 'toggleStickerSet']),\n)(StickerSetResult));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport { throttle } from '../../util/schedulers';\nimport { selectCurrentStickerSearch } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype StateProps = {\n query?: string;\n featuredIds?: string[];\n resultIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst StickerSearch: FC = ({\n query,\n featuredIds,\n resultIds,\n loadFeaturedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const lang = useLang();\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadFeaturedStickers();\n });\n });\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!query && featuredIds) {\n return featuredIds.map((id) => (\n \n ));\n }\n\n if (resultIds) {\n if (!resultIds.length) {\n return

Nothing found.

;\n }\n\n return resultIds.map((id) => (\n \n ));\n }\n\n return ;\n }\n\n return (\n
\n {renderContent()}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentStickerSearch(global);\n const { query, resultIds } = currentSearch || {};\n const { featured } = global.stickers;\n\n return {\n query,\n featuredIds: featured.setIds,\n resultIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFeaturedStickers']),\n)(StickerSearch));\n","import React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiVideo } from '../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n selectCurrentGifSearch,\n selectChat,\n selectIsChatWithBot,\n selectCurrentMessageList,\n} from '../../modules/selectors';\nimport { getAllowedAttachmentOptions } from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype StateProps = {\n query?: string;\n results?: ApiVideo[];\n chat?: ApiChat;\n isChatWithBot?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst PRELOAD_BACKWARDS = 96; // GIF Search bot results are multiplied by 24\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifSearch: FC = ({\n query,\n results,\n chat,\n isChatWithBot,\n searchMoreGifs,\n sendMessage,\n setGifSearchQuery,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n const { canSendGifs } = getAllowedAttachmentOptions(chat, isChatWithBot);\n\n const handleGifClick = useCallback((gif: ApiVideo) => {\n if (canSendGifs) {\n sendMessage({ gif });\n }\n\n if (IS_TOUCH_ENV) {\n setGifSearchQuery({ query: undefined });\n }\n }, [canSendGifs, sendMessage, setGifSearchQuery]);\n\n const lang = useLang();\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!results) {\n return (\n \n );\n }\n\n if (!results.length) {\n return (\n

{lang('NoGIFsFound')}

\n );\n }\n\n return results.map((gif) => (\n \n ));\n }\n\n const hasResults = Boolean(query !== undefined && results && results.length);\n\n return (\n
\n \n {renderContent()}\n \n\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentGifSearch(global);\n const { query, results } = currentSearch || {};\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n\n return {\n query,\n results,\n chat,\n isChatWithBot,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMoreGifs', 'sendMessage', 'setGifSearchQuery']),\n)(GifSearch));\n","import React, {\n FC, useCallback, useState, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat,\n ApiMessage,\n ApiPollAnswer,\n ApiPollResult,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { pick } from '../../util/iteratees';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport ShowMoreButton from '../ui/ShowMoreButton';\nimport Loading from '../ui/Loading';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\n\nimport './PollAnswerResults.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n message: ApiMessage;\n answer: ApiPollAnswer;\n answerVote: ApiPollResult;\n totalVoters: number;\n};\n\ntype StateProps = {\n voters?: number[];\n offset: string;\n};\n\ntype DispatchProps = Pick;\n\nconst INITIAL_LIMIT = 4;\nconst VIEW_MORE_LIMIT = 50;\n\nconst PollAnswerResults: FC = ({\n chat,\n message,\n answer,\n answerVote,\n totalVoters,\n voters,\n offset,\n loadPollOptionResults,\n openChat,\n closePollResults,\n}) => {\n const prevVotersCount = usePrevious(answerVote.votersCount);\n const [isLoading, setIsLoading] = useState(true);\n const areVotersLoaded = Boolean(voters);\n const { option, text } = answer;\n const lang = useLang();\n\n useEffect(() => {\n // For update when new votes arrive or when the user takes back his vote\n if (!areVotersLoaded || prevVotersCount !== answerVote.votersCount) {\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: INITIAL_LIMIT, shouldResetVoters: true,\n });\n }\n // eslint-disable-next-line\n }, [answerVote.votersCount, areVotersLoaded]);\n\n const handleViewMoreClick = useCallback(() => {\n setIsLoading(true);\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: VIEW_MORE_LIMIT,\n });\n }, [chat, loadPollOptionResults, message.id, offset, option]);\n\n useEffect(() => {\n setIsLoading(false);\n }, [voters]);\n\n const handleMemberClick = useCallback((id: number) => {\n openChat({ id });\n closePollResults();\n }, [closePollResults, openChat]);\n\n function renderViewMoreButton() {\n const leftVotersCount = answerVote.votersCount - voters!.length;\n\n return answerVote.votersCount > INITIAL_LIMIT && leftVotersCount > 0 && (\n \n );\n }\n\n return (\n
\n
\n {voters\n ? voters.map((id) => (\n handleMemberClick(id)}\n >\n \n \n ))\n : }\n {voters && renderViewMoreButton()}\n
\n
\n {text}\n \n {getPercentage(answerVote.votersCount, totalVoters)}%\n \n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default memo(withGlobal(\n (global, { answer }: OwnProps): StateProps => {\n const { voters, offsets } = global.pollResults;\n\n return {\n voters: voters && voters[answer.option],\n offset: (offsets && offsets[answer.option]) || '',\n };\n },\n (global, actions): DispatchProps => pick(actions, ['loadPollOptionResults', 'openChat', 'closePollResults']),\n)(PollAnswerResults));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiChat } from '../../api/types';\nimport { selectChat, selectChatMessage } from '../../modules/selectors';\nimport { buildCollectionByKey } from '../../util/iteratees';\nimport { getMessagePoll } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n chat,\n message,\n lastSyncTime,\n}) => {\n const lang = useLang();\n if (!message || !chat) {\n return ;\n }\n\n const { summary, results } = getMessagePoll(message)!;\n if (!results.results) {\n return undefined;\n }\n\n const resultsByOption = buildCollectionByKey(results.results, 'option');\n\n return (\n
\n

{summary.question}

\n
\n {lastSyncTime && summary.answers.map((answer) => (\n \n ))}\n {!lastSyncTime && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n pollResults: { chatId, messageId },\n lastSyncTime,\n } = global;\n\n if (!chatId || !messageId) {\n return {};\n }\n\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n chat,\n message,\n lastSyncTime,\n };\n },\n)(PollResults));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n userId: number;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n};\n\ntype DispatchProps = Pick;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC = ({\n userId,\n user,\n chat,\n progress,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n const currentIsMuted = chat ? chat.isMuted : undefined;\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!currentIsMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!currentIsMuted);\n }, [currentIsMuted]);\n\n useEffect(() => {\n setIsProfileFieldsTouched(false);\n closeDeleteDialog();\n }, [closeDeleteDialog, userId]);\n\n useEffect(() => {\n setFirstName(currentFirstName);\n setLastName(currentLastName);\n }, [currentFirstName, currentLastName, user]);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n closeDeleteDialog();\n }\n }, [closeDeleteDialog, progress]);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleNotificationChange = useCallback((e: ChangeEvent) => {\n setIsNotificationsEnabled(e.target.checked);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n }\n\n updateContact({\n userId,\n isMuted: !isNotificationsEnabled,\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n });\n }, [firstName, lastName, updateContact, userId, isNotificationsEnabled]);\n\n const handleDeleteContact = useCallback(() => {\n deleteHistory({\n chatId: chat.id,\n shouldDeleteForAll: false,\n });\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, closeDeleteDialog, closeManagement, deleteHistory, deleteUser, openChat, userId]);\n\n if (!user) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n {lang('DeleteContact')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId)!;\n const { progress } = global.management;\n\n return {\n user, chat, progress,\n };\n },\n (global, actions): DispatchProps => pick(actions, [\n 'updateContact', 'deleteUser', 'closeManagement', 'openChat', 'deleteHistory',\n ]),\n)(ManageUser));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { getChatAvatarHash, getHasAdminRight, isChatBasicGroup } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { selectChat } from '../../../modules/selectors';\nimport { formatInteger } from '../../../util/textFormat';\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isBasicGroup: boolean;\n hasLinkedChannel: boolean;\n canChangeInfo?: boolean;\n canBanUsers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst GROUP_TITLE_EMPTY = 'Group title can\\'t be empty';\n\n// Some checkboxes control multiple rights, and some rights are not controlled from Permissions screen,\n// so we need to define the amount manually\nconst TOTAL_PERMISSIONS_COUNT = 8;\n\nconst ManageGroup: FC = ({\n chatId,\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo,\n canBanUsers,\n onScreenSelect,\n togglePreHistoryHidden,\n updateChat,\n deleteHistory,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const currentTitle = chat.title;\n const currentAbout = chat.fullInfo ? (chat.fullInfo.about || '') : '';\n\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickPermissions = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateGroup = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(GROUP_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleClickMembers = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupMembers);\n }, [onScreenSelect]);\n\n const handleTogglePreHistory = useCallback(() => {\n if (!chat.fullInfo) {\n return;\n }\n\n const { isPreHistoryHidden } = chat.fullInfo;\n\n togglePreHistoryHidden({ chatId: chat.id, isEnabled: !isPreHistoryHidden });\n }, [chat, togglePreHistoryHidden]);\n\n const enabledPermissionsCount = useMemo(() => {\n if (!chat.defaultBannedRights) {\n return 0;\n }\n\n let totalCount = [\n 'sendMessages',\n 'sendMedia',\n 'embedLinks',\n 'sendPolls',\n 'changeInfo',\n 'inviteUsers',\n 'pinMessages',\n ].filter(\n (key) => !chat.defaultBannedRights![key as keyof ApiChatBannedRights],\n ).length;\n\n const { sendStickers, sendGifs } = chat.defaultBannedRights;\n\n // These two rights are controlled with a single checkbox\n if (!sendStickers && !sendGifs) {\n totalCount += 1;\n }\n\n return totalCount;\n }, [chat]);\n\n const adminsCount = (chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleDeleteGroup = useCallback(() => {\n if (isBasicGroup) {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if (!chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else {\n deleteChannel({ chatId: chat.id });\n }\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [\n isBasicGroup, chat.isCreator, chat.id,\n closeDeleteDialog, closeManagement, deleteHistory, leaveChannel, deleteChannel, openChat,\n ]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('GroupType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n {hasLinkedChannel && (\n \n {lang('LinkedChannel')}\n {lang('DiscussionUnlink')}\n \n )}\n \n {lang('ChannelPermissions')}\n \n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n \n \n \n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n \n
\n
\n \n {lang('GroupMembers')}\n {formatInteger(chat.membersCount!)}\n \n\n {chat.fullInfo && (\n
\n \n
\n )}\n
\n
\n \n {lang('DeleteMega')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const hasLinkedChannel = Boolean(chat.fullInfo && chat.fullInfo.linkedChatId);\n\n return {\n chat,\n progress,\n isBasicGroup: isChatBasicGroup(chat),\n hasLinkedChannel,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'deleteHistory', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageGroup));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FLOATING_BUTTON_ANIMATION_TIMEOUT_MS = 250;\n\nfunction getLangKeyForBannedRightKey(key: string) {\n switch (key) {\n case 'sendMessages':\n return 'UserRestrictionsNoSend';\n case 'sendMedia':\n return 'UserRestrictionsNoSendMedia';\n case 'sendStickers':\n return 'UserRestrictionsNoSendStickers';\n case 'embedLinks':\n return 'UserRestrictionsNoEmbedLinks';\n case 'sendPolls':\n return 'UserRestrictionsNoSendPolls';\n case 'changeInfo':\n return 'UserRestrictionsNoChangeInfo';\n case 'inviteUsers':\n return 'UserRestrictionsInviteUsers';\n case 'pinMessages':\n return 'UserRestrictionsPinMessages';\n default:\n return undefined;\n }\n}\n\nconst ManageGroupPermissions: FC = ({\n onScreenSelect,\n onChatMemberSelect,\n chat,\n currentUserId,\n updateChatDefaultBannedRights,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n const handleRemovedUsersClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupRemovedUsers);\n }, [onScreenSelect]);\n\n const handleAddExceptionClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupUserPermissionsCreate);\n }, [onScreenSelect]);\n\n const handleExceptionMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n useEffect(() => {\n setPermissions((chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setTimeout(() => {\n setIsLoading(false);\n }, FLOATING_BUTTON_ANIMATION_TIMEOUT_MS);\n }, [chat]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat) {\n return;\n }\n\n setIsLoading(true);\n updateChatDefaultBannedRights({ chatId: chat.id, bannedRights: permissions });\n }, [chat, permissions, updateChatDefaultBannedRights]);\n\n const removedUsersCount = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return 0;\n }\n\n return chat.fullInfo.kickedMembers.length;\n }, [chat]);\n\n const exceptionMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return [];\n }\n\n return chat.fullInfo.members.filter(({ bannedRights }) => !!bannedRights);\n }, [chat]);\n\n const getMemberExceptions = useCallback((member: ApiChatMember) => {\n const { bannedRights } = member;\n if (!bannedRights || !chat) {\n return undefined;\n }\n\n const { defaultBannedRights } = chat;\n\n return Object.keys(bannedRights).reduce((result, key) => {\n if (\n !bannedRights[key as keyof ApiChatBannedRights]\n || (defaultBannedRights && defaultBannedRights[key as keyof ApiChatBannedRights])\n || key === 'sendInline' || key === 'viewMessages' || key === 'sendGames'\n ) {\n return result;\n }\n\n const langKey = getLangKeyForBannedRightKey(key);\n\n if (!langKey) {\n return result;\n }\n\n const translatedString = lang(langKey);\n\n return `${result}${!result.length ? translatedString : `, ${translatedString}`}`;\n }, '');\n }, [chat, lang]);\n\n return (\n
\n
\n
\n

{lang('ChannelPermissionsHeader')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n {lang('ChannelBlockedUsers')}\n {removedUsersCount}\n \n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n \n {lang('ChannelAddException')}\n \n\n {exceptionMembers.map((member) => (\n handleExceptionMemberClick(member)}\n >\n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat, currentUserId: global.currentUserId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatDefaultBannedRights']),\n)(ManageGroupPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n updateChatMemberBannedRights,\n}) => {\n const lang = useLang();\n\n const removedMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return [];\n }\n\n return chat.fullInfo.kickedMembers;\n }, [chat]);\n\n const getRemovedBy = useCallback((member: ApiChatMember) => {\n if (!member.kickedByUserId) {\n return undefined;\n }\n\n const kickedByUser = usersById[member.kickedByUserId];\n if (!kickedByUser) {\n return undefined;\n }\n\n return lang('UserRemovedBy', getUserFullName(kickedByUser));\n }, [lang, usersById]);\n\n const getContextActions = useCallback((member: ApiChatMember) => {\n if (!chat) {\n return undefined;\n }\n\n return [{\n title: lang('Unblock'),\n icon: 'delete',\n destructive: true,\n handler: () => updateChatMemberBannedRights({\n chatId: chat.id,\n userId: member.userId,\n bannedRights: {},\n }),\n }];\n }, [lang, chat, updateChatMemberBannedRights]);\n\n return (\n
\n
\n
\n

{lang('NoBlockedGroup2')}

\n\n {removedMembers.map((member) => (\n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n\n return { chat, usersById };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupRemovedUsers));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiMediaFormat } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CHANNEL_TITLE_EMPTY = 'Channel title can\\'t be empty';\n\nconst ManageChannel: FC = ({\n chatId,\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo,\n onScreenSelect,\n updateChat,\n toggleSignatures,\n closeManagement,\n leaveChannel,\n deleteChannel,\n openChat,\n}) => {\n const currentTitle = chat ? (chat.title || '') : '';\n const currentAbout = chat && chat.fullInfo ? (chat.fullInfo.about || '') : '';\n const hasLinkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId;\n\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = chat && getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const adminsCount = (chat && chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateChannel = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(CHANNEL_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleToggleSignatures = useCallback(() => {\n toggleSignatures({ chatId, isEnabled: !isSignaturesShown });\n }, [chatId, isSignaturesShown, toggleSignatures]);\n\n const handleClickSubscribers = useCallback(() => {\n onScreenSelect(ManagementScreens.ChannelSubscribers);\n }, [onScreenSelect]);\n\n\n const handleDeleteChannel = useCallback(() => {\n if (chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n } else {\n leaveChannel({ chatId: chat.id });\n }\n\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.isCreator, chat.id, closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, openChat]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('ChannelType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n \n {lang('Discussion')}\n {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}\n \n \n {lang('ChannelAdministrators')}\n {adminsCount}\n \n
\n \n
\n
\n
\n \n {lang('ChannelSubscribers')}\n {lang('Subscribers', chat.membersCount!, 'i')}\n \n
\n
\n \n {chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const isSignaturesShown = Boolean(chat && chat.isSignaturesShown);\n\n return {\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageChannel));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { selectChat, selectManagement } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport { isChatChannel } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport SafeLink from '../../common/SafeLink';\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport UsernameInput from '../../common/UsernameInput';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype PrivacyType = 'private' | 'public';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat: ApiChat;\n isChannel: boolean;\n progress?: ManagementProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageChatPrivacyType: FC = ({\n chat,\n isChannel,\n progress,\n isUsernameAvailable,\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n}) => {\n const isPublic = Boolean(chat.username);\n const privateLink = chat.fullInfo && chat.fullInfo.inviteLink;\n\n const [privacyType, setPrivacyType] = useState(isPublic ? 'public' : 'private');\n const [username, setUsername] = useState();\n const [isRevokeConfirmDialogOpen, openRevokeConfirmDialog, closeRevokeConfirmDialog] = useFlag();\n\n const canUpdate = (\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic)\n );\n\n useEffect(() => {\n if (privacyType && !privateLink) {\n updatePrivateLink();\n }\n }, [privacyType, privateLink, updatePrivateLink]);\n\n const handleOptionChange = useCallback((value: string) => {\n setPrivacyType(value as PrivacyType);\n }, []);\n\n const handleSave = useCallback(() => {\n updatePublicLink({ username: privacyType === 'public' ? username : '' });\n }, [privacyType, updatePublicLink, username]);\n\n const handleRevokePrivateLink = useCallback(() => {\n closeRevokeConfirmDialog();\n updatePrivateLink();\n }, [closeRevokeConfirmDialog, updatePrivateLink]);\n\n const lang = useLang();\n const langPrefix1 = isChannel ? 'Channel' : 'Mega';\n const langPrefix2 = isChannel ? 'Channel' : 'Group';\n\n const options = [\n { value: 'private', label: lang(`${langPrefix1}Private`), subLabel: lang(`${langPrefix1}PrivateInfo`) },\n { value: 'public', label: lang(`${langPrefix1}Public`), subLabel: lang(`${langPrefix1}PublicInfo`) },\n ];\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n

{lang(`${langPrefix2}Type`)}

\n \n
\n {privacyType === 'private' ? (\n
\n {privateLink ? (\n <>\n \n

\n {lang(`${langPrefix1}PrivateLinkHelp`)}\n

\n\n \n {lang('RevokeLink')}\n \n \n \n ) : (\n \n )}\n
\n ) : (\n
\n \n

\n {lang(`${langPrefix2}.Username.CreatePublicLinkHelp`)}\n

\n
\n )}\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { isUsernameAvailable } = selectManagement(global, chatId)!;\n\n return {\n chat,\n isChannel: isChatChannel(chat),\n progress: global.management.progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'checkPublicLink', 'updatePublicLink', 'updatePrivateLink',\n ]),\n)(ManageChatPrivacyType));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport getAnimationData from '../../common/helpers/animatedAssets';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport renderText from '../../common/helpers/renderText';\nimport Avatar from '../../common/Avatar';\nimport { isChatChannel } from '../../../modules/helpers';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record;\n linkedChat?: ApiChat;\n forDiscussionIds?: number[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageDiscussion: FC = ({\n chat,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n}) => {\n const [linkedGroupId, setLinkedGroupId] = useState();\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n const [isConfirmUnlinkGroupDialogOpen, openConfirmUnlinkGroupDialog, closeConfirmUnlinkGroupDialog] = useFlag();\n const [isConfirmLinkGroupDialogOpen, openConfirmLinkGroupDialog, closeConfirmLinkGroupDialog] = useFlag();\n const lang = useLang();\n const linkedChatId = linkedChat && linkedChat.id;\n\n useEffect(() => {\n loadGroupsForDiscussion();\n }, [loadGroupsForDiscussion]);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('DiscussionGroups').then(setAnimationData);\n }\n }, [animationData]);\n\n const handleUnlinkGroupSessions = useCallback(() => {\n closeConfirmUnlinkGroupDialog();\n unlinkDiscussionGroup({ channelId: isChannel ? chatId : linkedChatId });\n if (!isChannel) {\n onScreenSelect(ManagementScreens.Initial);\n }\n }, [closeConfirmUnlinkGroupDialog, unlinkDiscussionGroup, isChannel, chatId, linkedChatId, onScreenSelect]);\n\n const handleLinkGroupSessions = useCallback(() => {\n closeConfirmLinkGroupDialog();\n linkDiscussionGroup({ channelId: chatId, chatId: linkedGroupId });\n }, [closeConfirmLinkGroupDialog, linkDiscussionGroup, chatId, linkedGroupId]);\n\n const onDiscussionClick = (groupId: number) => {\n setLinkedGroupId(groupId);\n openConfirmLinkGroupDialog();\n };\n\n function renderUnlinkGroupHeader() {\n return (\n
\n \n
\n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n
\n
\n );\n }\n function renderLinkGroupHeader() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n return (\n
\n \n
\n {lang('Channel.DiscussionGroup.LinkGroup')}\n
\n
\n );\n }\n\n function renderLinkGroupConfirmText() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n if (linkedGroup.hasPrivateLink) {\n return renderText(\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPublicAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n return renderText(\n // eslint-disable-next-line max-len\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?\\n\\nAnyone from the channel will be able to see messages in this group.`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPrivateAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n function renderLinkedGroup() {\n return (\n
\n \n \n \n \n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n \n \n
\n );\n }\n\n function renderDiscussionGroups() {\n return (\n
\n

{lang('DiscussionChannelHelp')}

\n\n
\n \n {lang('DiscussionCreateGroup')}\n \n {forDiscussionIds ? (\n forDiscussionIds.map((id, i) => (\n { onDiscussionClick(id); }}\n >\n \n \n ))\n ) : (\n \n )}\n
\n

{lang('DiscussionChannelHelp2')}

\n \n
\n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n {linkedChat && renderLinkedGroup()}\n {!linkedChat && renderDiscussionGroups()}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { forDiscussionIds, byId: chatsByIds } = global.chats;\n const linkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId\n ? selectChat(global, chat.fullInfo.linkedChatId)\n : undefined;\n\n return {\n chat,\n chatsByIds,\n forDiscussionIds,\n linkedChat,\n isChannel: chat && isChatChannel(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGroupsForDiscussion', 'linkDiscussionGroup', 'unlinkDiscussionGroup',\n ]),\n)(ManageDiscussion));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatBannedRights } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isFormFullyDisabled?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupUserPermissions: FC = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n updateChatMemberBannedRights,\n isFormFullyDisabled,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag();\n const lang = useLang();\n\n const selectedChatMember = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n return chat.fullInfo.members.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.bannedRights) || (chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setIsLoading(false);\n }, [chat, selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: permissions,\n });\n }, [chat, selectedChatMemberId, permissions, updateChatMemberBannedRights]);\n\n const handleBanFromGroup = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: {\n viewMessages: true,\n },\n });\n }, [chat, selectedChatMemberId, updateChatMemberBannedRights]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatBannedRights) => {\n if (isFormFullyDisabled) {\n return true;\n }\n\n if (!chat || !chat.defaultBannedRights) {\n return false;\n }\n\n return chat.defaultBannedRights[key];\n }, [chat, isFormFullyDisabled]);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('UserRestrictionsCanDo')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n {!isFormFullyDisabled && (\n
\n \n {lang('UserRestrictionsBlock')}\n \n
\n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return { chat, isFormFullyDisabled };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupUserPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\n\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: number;\n isChannel: boolean;\n usersById: Record;\n};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const lang = useLang();\n\n function handleRecentActionsClick() {\n onScreenSelect(ManagementScreens.GroupRecentActions);\n }\n\n const adminMembers = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const handleAdminMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.ChatAdminRights);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = member.promotedByUserId ? usersById[member.promotedByUserId] : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [lang, usersById]);\n\n return (\n
\n
\n
\n \n {lang('EventLog')}\n {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}\n \n
\n\n
\n

\n {isChannel\n ? 'You can add administrators to help you manage your channel.'\n : 'You can add administrators to help you manage your group.'}\n

\n\n {adminMembers.map((member) => (\n handleAdminMemberClick(member)}\n >\n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n\n return {\n chat,\n currentUserId: global.currentUserId,\n isChannel: isChatChannel(chat),\n usersById,\n };\n },\n // (setGlobal, actions): DispatchProps => pick(actions, ['togglePreHistoryHidden', 'updateChat']),\n)(ManageChatAdministrators));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember } from '../../../api/types';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat }) => {\n const lang = useLang();\n\n const adminMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n return lang('ChannelAdmin');\n }, [lang]);\n\n return (\n
\n
\n
\n

Actions

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n

{lang('Channel.Management.Title')}

\n\n
\n \n
\n\n {adminMembers.map((member) => (\n \n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat };\n },\n)(ManageGroupRecentActions));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName, isChatBasicGroup, isChatChannel } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport InputText from '../../ui/InputText';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record;\n currentUserId?: number;\n isChannel: boolean;\n isFormFullyDisabled: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC = ({\n selectedChatMemberId,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n updateChatAdmin,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [isTouched, setIsTouched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isDismissConfirmationDialogOpen, openDismissConfirmationDialog, closeDismissConfirmationDialog] = useFlag();\n const [customTitle, setCustomTitle] = useState('');\n const lang = useLang();\n\n const selectedChatMember = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return undefined;\n }\n\n return chat.fullInfo.adminMembers.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.adminRights) || {});\n setCustomTitle(((selectedChatMember && selectedChatMember.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH));\n setIsTouched(false);\n setIsLoading(false);\n }, [selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatAdminRights]),\n }));\n setIsTouched(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: permissions,\n customTitle,\n });\n }, [chat, selectedChatMemberId, permissions, customTitle, updateChatAdmin]);\n\n const handleDismissAdmin = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: {},\n });\n closeDismissConfirmationDialog();\n }, [chat.id, closeDismissConfirmationDialog, selectedChatMemberId, updateChatAdmin]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatAdminRights) => {\n if (isChatBasicGroup(chat)) {\n return false;\n }\n\n if (isFormFullyDisabled || !chat.adminRights) {\n return true;\n }\n\n return !chat.adminRights![key];\n }, [chat, isFormFullyDisabled]);\n\n const memberStatus = useMemo(() => {\n if (!selectedChatMember) {\n return undefined;\n }\n\n if (selectedChatMember.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = selectedChatMember.promotedByUserId\n ? usersById[selectedChatMember.promotedByUserId]\n : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [selectedChatMember, usersById, lang]);\n\n const handleCustomTitleChange = useCallback((e) => {\n const { value } = e.target;\n setCustomTitle(value);\n setIsTouched(true);\n }, []);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('EditAdminWhatCanDo')}

\n\n
\n \n
\n {isChannel && (\n
\n \n
\n )}\n {isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n\n {isFormFullyDisabled && (\n

\n {lang('Channel.EditAdmin.CannotEdit')}\n

\n )}\n\n {!isChannel && (\n \n )}\n\n {currentUserId !== selectedChatMemberId && !isFormFullyDisabled && (\n \n {lang('EditAdminRemoveAdmin')}\n \n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n const { currentUserId } = global;\n const isChannel = isChatChannel(chat);\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return {\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatAdmin']),\n)(ManageGroupAdminRights));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(ManageGroupMembers));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number) => void;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.filter((member) => !member.isOwner).map(({ userId }) => userId), usersById);\n }, [members, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: number) => {\n onChatMemberSelect(memberId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [onChatMemberSelect, onScreenSelect]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleExceptionMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n };\n },\n)(ManageGroupUserPermissionsCreate));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementType } from '../../../types';\n\nimport { selectCurrentManagementType } from '../../../modules/selectors';\n\nimport ManageUser from './ManageUser';\nimport ManageGroup from './ManageGroup';\nimport ManageGroupPermissions from './ManageGroupPermissions';\nimport ManageGroupRemovedUsers from './ManageGroupRemovedUsers';\nimport ManageChannel from './ManageChannel';\nimport ManageChatPrivacyType from './ManageChatPrivacyType';\nimport ManageDiscussion from './ManageDiscussion';\nimport ManageGroupUserPermissions from './ManageGroupUserPermissions';\nimport ManageChatAdministrators from './ManageChatAdministrators';\nimport ManageGroupRecentActions from './ManageGroupRecentActions';\nimport ManageGroupAdminRights from './ManageGroupAdminRights';\nimport ManageGroupMembers from './ManageGroupMembers';\nimport ManageGroupUserPermissionsCreate from './ManageGroupUserPermissionsCreate';\n\nexport type OwnProps = {\n chatId: number;\n currentScreen: ManagementScreens;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return ;\n case 'group':\n return ;\n case 'channel':\n return ;\n }\n\n break;\n }\n\n case ManagementScreens.ChatPrivacyType:\n return (\n \n );\n\n case ManagementScreens.Discussion:\n return (\n \n );\n\n case ManagementScreens.GroupPermissions:\n return (\n \n );\n\n case ManagementScreens.GroupRemovedUsers:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissionsCreate:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissions:\n return (\n \n );\n\n case ManagementScreens.ChatAdministrators:\n return (\n \n );\n\n case ManagementScreens.GroupRecentActions:\n return (\n \n );\n\n case ManagementScreens.ChatAdminRights:\n return (\n \n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n \n );\n }\n\n return undefined; // Never reached\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const managementType = selectCurrentManagementType(global);\n\n return {\n managementType,\n };\n },\n)(Management));\n","const CURRENCIES: Record = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n RUB: '₽',\n UAH: '₴',\n INR: '₹',\n AED: 'د.إ',\n};\n\nexport function getCurrencySign(currency: string | undefined): string {\n if (!currency) {\n return '';\n }\n return CURRENCIES[currency] || '';\n}\n","const VISA = /^4[0-9]{12}(?:[0-9]{1,3})?$/;\nconst MASTERCARD1 = /^5[1-5][0-9]{11,14}$/;\nconst MASTERCARD2 = /^2[2-7][0-9]{11,14}$/;\n\nexport enum CardType {\n Default,\n Visa,\n Mastercard,\n}\n\nconst cards: Record = {\n [CardType.Default]: '',\n [CardType.Visa]: 'visa',\n [CardType.Mastercard]: 'mastercard',\n};\n\nexport function detectCardType(cardNumber: string): number {\n cardNumber = cardNumber.replace(/\\s/g, '');\n if (VISA.test(cardNumber)) {\n return CardType.Visa;\n }\n if (MASTERCARD1.test(cardNumber) || MASTERCARD2.test(cardNumber)) {\n return CardType.Mastercard;\n }\n return CardType.Default;\n}\n\nexport function detectCardTypeText(cardNumber: string): string {\n const cardType = detectCardType(cardNumber);\n return cards[cardType as number] || '';\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { countryList } from '../../util/phoneNumber';\n\nexport type FormState = {\n streetLine1: string;\n streetLine2: string;\n city: string;\n state: string;\n countryIso2: string;\n postCode: string;\n fullName: string;\n email: string;\n phone: string;\n shipping: string;\n cardNumber: string;\n cardholder: string;\n expiry: string;\n cvv: string;\n billingCountry: string;\n billingZip: string;\n saveInfo: boolean;\n saveCredentials: boolean;\n formErrors: Record;\n};\n\nexport type FormActions = (\n 'changeAddress1' | 'changeAddress2' | 'changeCity' | 'changeState' | 'changeCountry' |\n 'changePostCode' | 'changeFullName' | 'changeEmail' | 'changePhone' | 'changeShipping' | 'updateUserInfo' |\n 'changeCardNumber' | 'changeCardholder' | 'changeExpiryDate' | 'changeCvvCode' | 'changeBillingCountry' |\n 'changeBillingZip' | 'changeSaveInfo' | 'changeSaveCredentials' | 'setFormErrors'\n);\nexport type FormEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FormState = {\n streetLine1: '',\n streetLine2: '',\n city: '',\n state: '',\n countryIso2: '',\n postCode: '',\n fullName: '',\n email: '',\n phone: '',\n shipping: '',\n cardNumber: '',\n cardholder: '',\n expiry: '',\n cvv: '',\n billingCountry: '',\n billingZip: '',\n saveInfo: true,\n saveCredentials: false,\n formErrors: {},\n};\n\nconst reducer: StateReducer = (state, action) => {\n switch (action.type) {\n case 'changeAddress1':\n return {\n ...state,\n streetLine1: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine1: undefined,\n },\n };\n case 'changeAddress2':\n return {\n ...state,\n streetLine2: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine2: undefined,\n },\n };\n case 'changeCity':\n return {\n ...state,\n city: action.payload,\n formErrors: {\n ...state.formErrors,\n city: undefined,\n },\n };\n case 'changeState':\n return {\n ...state,\n state: action.payload,\n formErrors: {\n ...state.formErrors,\n state: undefined,\n },\n };\n case 'changeCountry':\n return {\n ...state,\n countryIso2: action.payload,\n billingCountry: getBillingCountry(action.payload),\n formErrors: {\n ...state.formErrors,\n countryIso2: undefined,\n },\n };\n case 'changePostCode':\n return {\n ...state,\n postCode: action.payload,\n formErrors: {\n ...state.formErrors,\n postCode: undefined,\n },\n };\n case 'changeFullName':\n return {\n ...state,\n fullName: action.payload,\n formErrors: {\n ...state.formErrors,\n fullName: undefined,\n },\n };\n case 'changeEmail':\n return {\n ...state,\n email: action.payload,\n formErrors: {\n ...state.formErrors,\n email: undefined,\n },\n };\n case 'changePhone':\n return {\n ...state,\n phone: action.payload,\n formErrors: {\n ...state.formErrors,\n phone: undefined,\n },\n };\n case 'changeShipping':\n return { ...state, shipping: action.payload };\n case 'changeCardNumber':\n return {\n ...state,\n cardNumber: action.payload,\n formErrors: {\n ...state.formErrors,\n cardNumber: undefined,\n },\n };\n case 'changeCardholder':\n return {\n ...state,\n cardholder: action.payload,\n formErrors: {\n ...state.formErrors,\n cardholder: undefined,\n },\n };\n case 'changeExpiryDate':\n return {\n ...state,\n expiry: action.payload,\n formErrors: {\n ...state.formErrors,\n expiry: undefined,\n },\n };\n case 'changeCvvCode':\n return {\n ...state,\n cvv: action.payload,\n formErrors: {\n ...state.formErrors,\n cvv: undefined,\n },\n };\n case 'changeBillingCountry':\n return {\n ...state,\n billingCountry: action.payload,\n formErrors: {\n ...state.formErrors,\n billingCountry: undefined,\n },\n };\n case 'changeBillingZip':\n return {\n ...state,\n billingZip: action.payload,\n formErrors: {\n ...state.formErrors,\n billingZip: undefined,\n },\n };\n case 'changeSaveInfo':\n return { ...state, saveInfo: action.payload };\n case 'changeSaveCredentials':\n return { ...state, saveCredentials: action.payload };\n case 'updateUserInfo':\n if (action.payload.countryIso2) {\n return {\n ...state,\n ...action.payload,\n billingCountry: getBillingCountry(action.payload.countryIso2),\n };\n }\n return { ...state, ...action.payload };\n case 'setFormErrors':\n return {\n ...state,\n formErrors: {\n ...state.formErrors,\n ...action.payload,\n },\n };\n default:\n return state;\n }\n};\n\nfunction getBillingCountry(countryCode: string) {\n const country = countryList.find(({ id }) => id === countryCode);\n return country ? country.name : '';\n}\n\nexport default () => {\n return useReducer(reducer, INITIAL_STATE);\n};\n","import { RefObject } from 'react';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\nimport { fastRaf } from '../util/schedulers';\nimport { useEffect } from '../lib/teact/teact';\n\nconst DEFAULT_DURATION = 400;\n\nexport default function useFocusAfterAnimation(\n ref: RefObject, animationDuration = DEFAULT_DURATION,\n) {\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n if (ref.current) {\n ref.current.focus();\n }\n });\n }, animationDuration);\n }, [ref, animationDuration]);\n}\n","import { ChangeEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n id?: string;\n value?: string;\n label?: string;\n error?: string;\n ref?: RefObject;\n hasArrow?: boolean;\n placeholder?: string;\n onChange?: (e: ChangeEvent) => void;\n children: any;\n};\n\nconst Select: FC = (props) => {\n const {\n id,\n value,\n label,\n hasArrow,\n error,\n ref,\n placeholder,\n onChange,\n children,\n } = props;\n const labelText = error || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error && 'error',\n labelText && 'with-label',\n hasArrow && 'with-arrow',\n 'input-group',\n );\n\n return (\n
\n \n {children}\n \n {labelText && id && (\n \n )}\n
\n );\n};\n\nexport default memo(Select);\n","import React, {\n FC, useRef, useCallback, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Select from '../ui/Select';\nimport Checkbox from '../ui/Checkbox';\n\nimport './ShippingInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n needEmail: boolean;\n needPhone: boolean;\n needName: boolean;\n needAddress: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst ShippingInfo: FC = ({\n state,\n needEmail,\n needPhone,\n needName,\n needAddress,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const phoneRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.countryIso2) {\n selectCountryRef.current.value = state.countryIso2;\n }\n }, [state.countryIso2]);\n\n const lang = useLang();\n\n useFocusAfterAnimation(inputRef);\n\n const handleAddress1Change = useCallback((e) => {\n dispatch({ type: 'changeAddress1', payload: e.target.value });\n }, [dispatch]);\n\n const handleAddress2Change = useCallback((e) => {\n dispatch({ type: 'changeAddress2', payload: e.target.value });\n }, [dispatch]);\n\n const handleCityChange = useCallback((e) => {\n dispatch({ type: 'changeCity', payload: e.target.value });\n }, [dispatch]);\n\n const handleStateChange = useCallback((e) => {\n dispatch({ type: 'changeState', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handlePostCodeChange = useCallback((e) => {\n dispatch({ type: 'changePostCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleFullNameChange = useCallback((e) => {\n dispatch({ type: 'changeFullName', payload: e.target.value });\n }, [dispatch]);\n\n const handleEmailChange = useCallback((e) => {\n dispatch({ type: 'changeEmail', payload: e.target.value });\n }, [dispatch]);\n\n const handlePhoneChange = useCallback((e) => {\n let { value } = e.target;\n value = `+${value.replace(/\\D/g, '')}`;\n if (phoneRef.current) {\n phoneRef.current.value = value;\n }\n dispatch({ type: 'changePhone', payload: value });\n }, [dispatch]);\n\n const handleSaveInfoChange = useCallback((e) => {\n dispatch({ type: 'changeSaveInfo', payload: e.target.value });\n }, [dispatch]);\n\n const { formErrors } = state;\n return (\n
\n
\n {needAddress ? (\n
\n
{lang('PaymentShippingAddress')}
\n \n \n \n \n \n {countryList.map(({ name, id }) => (\n \n {name}\n \n ))}\n \n\n \n
\n ) : undefined}\n { needName || needEmail || needPhone ? (\n
{lang('PaymentShippingReceiver')}
\n ) : undefined }\n { needName && (\n \n ) }\n { needEmail && (\n \n ) }\n { needPhone && (\n \n ) }\n \n \n
\n );\n};\n\nexport default memo(ShippingInfo);\n","import React, {\n FC, useCallback, memo, useMemo, useEffect,\n} from '../../lib/teact/teact';\n\nimport { ShippingOption } from '../../types/index';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\n\nimport RadioGroup from '../ui/RadioGroup';\n\nimport './Shipping.scss';\n\nexport type OwnProps = {\n state: FormState;\n shippingOptions: ShippingOption[];\n currency: string;\n dispatch: FormEditDispatch;\n};\n\nconst Shipping: FC = ({\n state,\n shippingOptions,\n currency,\n dispatch,\n}) => {\n useEffect(() => {\n if (!shippingOptions || state.shipping) {\n return;\n }\n dispatch({ type: 'changeShipping', payload: shippingOptions[0].id });\n }, [shippingOptions, state.shipping, dispatch]);\n\n const handleShippingSelect = useCallback((value) => {\n dispatch({ type: 'changeShipping', payload: value });\n }, [dispatch]);\n\n const options = useMemo(() => (shippingOptions.map(({ id: value, title: label, amount }) => ({\n label,\n subLabel: `${currency} ${String(amount / 100)}`,\n value,\n }))), [shippingOptions, currency]);\n\n return (\n
\n
\n

Select shipping method

\n \n \n
\n );\n};\n\nexport default memo(Shipping);\n","import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { Price } from '../../types';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: string;\n description?: string;\n text?: string;\n photoUrl?: string;\n };\n checkoutInfo?: {\n paymentMethod?: string;\n paymentProvider?: string;\n shippingAddress?: string;\n name?: string;\n phone?: string;\n shippingMethod?: string;\n };\n prices?: Price[];\n totalPrice?: number;\n shippingPrices?: Price[];\n currency?: string;\n};\n\nconst Checkout: FC = ({\n invoiceContent,\n prices,\n shippingPrices,\n checkoutInfo,\n currency,\n totalPrice,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const { photoUrl, title, text } = (invoiceContent || {});\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n return (\n
\n
\n { photoUrl && (\n \"\"\n )}\n
\n
{ title }
\n

{ text }

\n
\n
\n
\n { prices && prices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem('Total', totalPrice, currency, true)\n ) }\n
\n
\n {paymentMethod && renderCheckoutItem('icon-card', paymentMethod, 'Payment method')}\n {paymentProvider && renderCheckoutItem('stripe-provider', paymentProvider, 'Payment provider')}\n {shippingAddress && renderCheckoutItem('icon-location', shippingAddress, 'Shipping address')}\n {name && renderCheckoutItem('icon-user', name, 'Name')}\n {phone && renderCheckoutItem('icon-phone', phone, 'Phone number')}\n {shippingMethod && renderCheckoutItem('icon-truck', shippingMethod, 'Shipping method')}\n
\n
\n );\n};\n\nfunction renderPaymentItem(title: string, value: number, currency?: string, main = false) {\n return (\n
\n
\n { title }\n
\n
\n { `${currency || ''} ${(value / 100).toFixed(2)}` }\n
\n
\n );\n}\n\nfunction renderCheckoutItem(icon: string, title: string, data: string) {\n return (\n
\n \n
\n
\n { title }\n
\n

\n { data }\n

\n
\n
\n );\n}\n\nexport default memo(Checkout);\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { formatCardExpiry } from '../middle/helpers/inputFormatters';\n\nimport InputText from '../ui/InputText';\n\nconst MAX_FIELD_LENGTH = 5;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst ExpiryInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const expiryInputRef = useRef(null);\n\n const handleKeyDown = useCallback((e) => {\n if (e.key === 'Backspace' && value.charAt(value.length - 1) === '/') {\n const newValue = value.slice(0, value.length - 1);\n if (expiryInputRef.current) {\n expiryInputRef.current.value = newValue;\n }\n }\n }, [value]);\n\n const handleChange = useCallback((e) => {\n onChange(formatCardExpiry(e.target.value));\n }, [onChange]);\n\n return (\n \n );\n};\n\nexport default memo(ExpiryInput);\n","export function formatCardExpiry(input: string) {\n input = input.replace(/[^\\d]/g, '').slice(0, 4);\n const parts = input.match(/.{1,2}/g);\n if (parts && parts[0] && Number(parts[0]) > 12) {\n parts[0] = '12';\n }\n if (parts && parts[0] && parts[0].length === 2 && !parts[1]) {\n parts[1] = '';\n }\n return parts ? parts.join('/') : '';\n}\n\nexport function formatCardNumber(input: string) {\n input = input.replace(/[^\\d]/g, '');\n const parts = input.match(/.{1,4}/g);\n return parts ? parts.join(' ') : '';\n}\n","export default __webpack_public_path__ + \"mastercard.4216118edafe23cc2dec7b8807ba4622.svg\";","export default __webpack_public_path__ + \"visa.e5a7c336e1deb4b92a636e2e053878c4.svg\";","import React, {\n FC, memo, useCallback, useState, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport { formatCardNumber } from '../middle/helpers/inputFormatters';\nimport { detectCardType, CardType } from '../common/helpers/detectCardType';\n\nimport InputText from '../ui/InputText';\n\nimport './CardInput.scss';\n\n// @ts-ignore\nimport mastercardIconPath from '../../assets/mastercard.svg';\n// @ts-ignore\nimport visaIconPath from '../../assets/visa.svg';\n\nconst CARD_NUMBER_MAX_LENGTH = 23;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst CardInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const cardNumberRef = useRef(null);\n\n useFocusAfterAnimation(cardNumberRef);\n\n const [cardType, setCardType] = useState(CardType.Default);\n useEffect(() => {\n const newCardType = detectCardType(value);\n setCardType(newCardType);\n // eslint-disable-next-line\n }, []);\n\n const handleChange = useCallback((e) => {\n const newValue = formatCardNumber(e.target.value);\n const newCardType = detectCardType(e.target.value);\n setCardType(newCardType);\n onChange(newValue);\n if (cardNumberRef.current) {\n cardNumberRef.current.value = newValue;\n }\n }, [onChange, cardNumberRef]);\n\n const cardIcon = getCardIcon(cardType);\n\n return (\n
\n {cardIcon}\n \n
\n );\n};\n\nexport default memo(CardInput);\n\nfunction getCardIcon(cardType: CardType) {\n switch (cardType) {\n case CardType.Mastercard:\n return \"\";\n case CardType.Visa:\n return \"\";\n default:\n return undefined;\n }\n}\n","import React, {\n FC, useCallback, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Checkbox from '../ui/Checkbox';\nimport Select from '../ui/Select';\nimport ExpiryInput from './ExpiryInput';\nimport CardInput from './CardInput';\n\nimport './PaymentInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n canSaveCredentials: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst PaymentInfo: FC = ({\n state,\n canSaveCredentials,\n needCardholderName,\n needCountry,\n needZip,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.billingCountry) {\n selectCountryRef.current.value = state.billingCountry;\n }\n }, [state.billingCountry]);\n\n const handleCardNumberChange = useCallback((value) => {\n dispatch({ type: 'changeCardNumber', payload: value });\n }, [dispatch]);\n\n const handleCardholderChange = useCallback((e) => {\n dispatch({ type: 'changeCardholder', payload: e.target.value.toUpperCase() });\n }, [dispatch]);\n\n const handleExpiryChange = useCallback((value) => {\n dispatch({ type: 'changeExpiryDate', payload: value });\n }, [dispatch]);\n\n const handleCvvChange = useCallback((e) => {\n dispatch({ type: 'changeCvvCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeBillingCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handleBillingPostCodeChange = useCallback((e) => {\n dispatch({ type: 'changeBillingZip', payload: e.target.value });\n }, [dispatch]);\n\n const handleChangeSaveCredentials = useCallback((e) => {\n dispatch({ type: 'changeSaveCredentials', payload: e.target.value });\n }, [dispatch]);\n\n const lang = useLang();\n\n const { formErrors = {} } = state;\n\n return (\n
\n
\n
{lang('PaymentCardTitle')}
\n \n { needCardholderName && (\n \n )}\n
\n \n \n
\n { needCountry || needZip ? (\n
{lang('PaymentBillingAddress')}
\n ) : undefined }\n { needCountry && (\n \n {\n countryList.map(({ name }) => (\n \n {name}\n \n ))\n }\n \n ) }\n { needZip && (\n \n )}\n { canSaveCredentials && (\n \n ) }\n \n
\n );\n};\n\nexport default memo(PaymentInfo);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { PaymentStep, ShippingOption, Price } from '../../types';\nimport { ApiError } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport { getShippingError } from '../../modules/helpers/payments';\nimport usePaymentReducer, { FormState } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\n\nimport ShippingInfo from './ShippingInfo';\nimport Shipping from './Shipping';\nimport Checkout from './Checkout';\nimport PaymentInfo from './PaymentInfo';\nimport Button from '../ui/Button';\nimport Modal from '../ui/Modal';\nimport Transition from '../ui/Transition';\nimport Spinner from '../ui/Spinner';\n\nimport './PaymentModal.scss';\n\nconst DEFAULT_PROVIDER = 'stripe';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n nameRequested?: boolean;\n shippingAddressRequested?: boolean;\n phoneRequested?: boolean;\n emailRequested?: boolean;\n flexible?: boolean;\n phoneToProvider?: boolean;\n emailToProvider?: boolean;\n currency?: string;\n prices?: Price[];\n isProviderError: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n globalErrors?: ApiError[];\n};\n\ntype GlobalStateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst Invoice: FC = ({\n isOpen,\n onClose,\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n phoneToProvider,\n emailToProvider,\n currency,\n passwordMissing,\n isProviderError,\n invoiceContent,\n nativeProvider,\n prices,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalErrors,\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const currencySign = getCurrencySign(currency);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error || globalErrors) {\n setIsLoading(false);\n }\n }, [step, error, globalErrors]);\n\n useEffect(() => {\n if (error && error.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.fieldError,\n },\n });\n return;\n }\n if (globalErrors && globalErrors.length) {\n const errors = getShippingError(globalErrors);\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n ...errors,\n },\n });\n }\n }, [error, globalErrors, paymentDispatch]);\n\n useEffect(() => {\n if (savedInfo) {\n const {\n name: fullName, phone, email, shippingAddress,\n } = savedInfo;\n paymentDispatch({\n type: 'updateUserInfo',\n payload: {\n fullName,\n phone: phone && phone.charAt(0) !== '+'\n ? `+${phone}`\n : phone,\n email,\n ...(shippingAddress || {}),\n },\n });\n }\n }, [savedInfo, paymentDispatch]);\n\n const handleErrorModalClose = useCallback(() => {\n clearPaymentError();\n }, [clearPaymentError]);\n\n const totalPrice = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return 0;\n }\n\n return getTotalPrice(prices, shippingOptions, paymentState.shipping);\n }, [step, paymentState.shipping, prices, shippingOptions]);\n\n const checkoutInfo = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return undefined;\n }\n return getCheckoutInfo(paymentState, shippingOptions, nativeProvider || '');\n }, [step, paymentState, shippingOptions, nativeProvider]);\n\n function renderError() {\n if (!error) {\n return undefined;\n }\n return (\n \n

{error.description || 'Error'}

\n

{error.description || 'Error'}

\n \n {lang('OK')}\n \n
\n );\n }\n\n function renderModalContent(cuurentStep: PaymentStep) {\n switch (cuurentStep) {\n case PaymentStep.ShippingInfo:\n return (\n \n );\n case PaymentStep.Shipping:\n return (\n \n );\n case PaymentStep.PaymentInfo:\n return (\n \n );\n case PaymentStep.Checkout:\n return (\n \n );\n default:\n return undefined;\n }\n }\n\n const validateRequest = useCallback(() => {\n const { saveInfo } = paymentState;\n const requestInfo = getRequestInfo(paymentState);\n validateRequestedInfo({ requestInfo, saveInfo });\n }, [validateRequestedInfo, paymentState]);\n\n const sendCredentials = useCallback(() => {\n const credentials = getCredentials(paymentState);\n sendCredentialsInfo({\n credentials,\n });\n }, [sendCredentialsInfo, paymentState]);\n\n const sendForm = useCallback(() => {\n sendPaymentForm({\n shippingOptionId: paymentState.shipping,\n saveCredentials: paymentState.saveCredentials,\n });\n }, [sendPaymentForm, paymentState]);\n\n const setStep = useCallback((nextStep) => {\n setPaymentStep({ step: nextStep });\n }, [setPaymentStep]);\n\n const handleButtonClick = useCallback(() => {\n setIsLoading(true);\n switch (step) {\n case PaymentStep.ShippingInfo:\n return validateRequest();\n case PaymentStep.Shipping:\n return setStep(PaymentStep.PaymentInfo);\n case PaymentStep.PaymentInfo:\n return sendCredentials();\n case PaymentStep.Checkout:\n return sendForm();\n default:\n return () => {};\n }\n }, [step, validateRequest, setStep, sendCredentials, sendForm]);\n\n const modalHeader = useMemo(() => {\n switch (step) {\n case PaymentStep.ShippingInfo:\n return lang('PaymentShippingInfo');\n case PaymentStep.Shipping:\n return lang('PaymentShippingMethod');\n case PaymentStep.PaymentInfo:\n return lang('PaymentCardInfo');\n case PaymentStep.Checkout:\n return lang('PaymentCheckout');\n default:\n return '';\n }\n }, [step, lang]);\n\n const buttonText = useMemo(() => {\n switch (step) {\n case PaymentStep.Checkout:\n return lang('Checkout.PayPrice', `${currencySign}${(totalPrice / 100).toFixed(2)}`);\n default:\n return lang('Next');\n }\n }, [step, lang, currencySign, totalPrice]);\n\n if (isProviderError) {\n return (\n \n

\n Sorry, Telegram T doesn't support payments with this provider yet.
\n Please use one of our mobile apps to do this.\n

\n \n {lang('OK')}\n \n \n );\n }\n\n return (\n \n
\n \n \n \n

{modalHeader}

\n
\n {step !== undefined ? (\n \n {() => (\n
\n {renderModalContent(step)}\n
\n )}\n
\n ) : (\n
\n \n
\n )}\n
\n \n {buttonText}\n \n
\n {error && !error.field && renderError()}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps & GlobalStateProps => {\n const {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n invoice,\n invoiceContent,\n nativeProvider,\n nativeParams,\n passwordMissing,\n error,\n } = global.payment;\n\n const isProviderError = Boolean(invoice && (!nativeProvider || nativeProvider !== DEFAULT_PROVIDER));\n const { needCardholderName, needCountry, needZip } = (nativeParams || {});\n const {\n nameRequested,\n phoneRequested,\n emailRequested,\n shippingAddressRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n } = (invoice || {});\n\n return {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nativeProvider,\n passwordMissing,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n isProviderError,\n invoiceContent,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalErrors: global.errors,\n };\n },\n (setGlobal, actions): DispatchProps => {\n return pick(actions, [\n 'validateRequestedInfo',\n 'sendPaymentForm',\n 'setPaymentStep',\n 'sendCredentialsInfo',\n 'clearPaymentError',\n ]);\n },\n)(Invoice));\n\nfunction findShippingOption(shippingOptions: ShippingOption[], optionId: string) {\n return shippingOptions.find(({ id }) => id === optionId);\n}\n\nfunction getShippingPrices(shippingOptions: ShippingOption[], shippingOption: string) {\n const option = findShippingOption(shippingOptions, shippingOption);\n return option ? option.prices : undefined;\n}\n\nfunction getTotalPrice(prices: Price[] = [], shippingOptions: ShippingOption[] | undefined, shippingOption: string) {\n const shippingPrices = shippingOptions\n ? getShippingPrices(shippingOptions, shippingOption)\n : [];\n let total = 0;\n const totalPrices = prices.concat(shippingPrices || []);\n total = totalPrices.reduce((acc, cur) => {\n return acc + cur.amount;\n }, total);\n return total;\n}\n\nfunction getCheckoutInfo(state: FormState, shippingOptions: ShippingOption[] | undefined, paymentProvider: string) {\n const cardTypeText = detectCardTypeText(state.cardNumber);\n const paymentMethod = `${cardTypeText} *${state.cardNumber.slice(-4)}`;\n const shippingAddress = state.streetLine1\n ? `${state.streetLine1}, ${state.city}, ${state.countryIso2}`\n : undefined;\n const { phone, fullName: name } = state;\n const shippingOption = shippingOptions ? findShippingOption(shippingOptions, state.shipping) : undefined;\n const shippingMethod = shippingOption ? shippingOption.title : undefined;\n return {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n\nfunction getRequestInfo(paymentState: FormState) {\n const {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n fullName: name,\n phone,\n email,\n } = paymentState;\n\n const shippingAddress = {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n };\n\n return {\n name,\n phone,\n email,\n shippingAddress,\n };\n}\n\nfunction getCredentials(paymentState: FormState) {\n const {\n cardNumber, cardholder, expiry, cvv, billingCountry, billingZip,\n } = paymentState;\n const [expiryMonth, expiryYear] = expiry.split('/');\n const data = {\n cardNumber,\n cardholder,\n expiryMonth,\n expiryYear,\n cvv,\n country: billingCountry,\n zip: billingZip,\n };\n\n return {\n data,\n };\n}\n","import React, {\n FC, memo, useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { Price } from '../../types';\nimport { ApiShippingAddress } from '../../api/types/payments';\n\nimport useLang from '../../hooks/useLang';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\n\nimport Checkout from './Checkout';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './PaymentModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n prices?: Price[];\n shippingPrices: any;\n totalAmount?: number;\n currency?: string;\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n photoUrl?: string;\n text?: string;\n title?: string;\n credentialsTitle?: string;\n shippingMethod?: string;\n};\n\nconst ReceiptModal: FC = ({\n isOpen,\n onClose,\n prices,\n shippingPrices,\n totalAmount,\n currency,\n info,\n photoUrl,\n text,\n title,\n credentialsTitle,\n shippingMethod,\n}) => {\n const lang = useLang();\n const currencySign = getCurrencySign(currency);\n const checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n return (\n \n
\n
\n \n \n \n

{lang('PaymentReceipt')}

\n
\n
\n \n
\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { receipt } = global.payment;\n const {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n } = (receipt || {});\n\n return {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n };\n },\n)(ReceiptModal));\n\nfunction getCheckoutInfo(paymentMethod?: string,\n info?:\n { phone?: string;\n name?: string;\n shippingAddress?: ApiShippingAddress;\n },\n shippingMethod?: string) {\n if (!info) {\n return { paymentMethod };\n }\n const { shippingAddress } = info;\n const fullAddress = shippingAddress && shippingAddress.streetLine1\n ? `${shippingAddress.streetLine1}, ${shippingAddress.city}, ${shippingAddress.countryIso2}`\n : undefined;\n const { phone, name } = info;\n return {\n paymentMethod,\n paymentProvider: 'Stripe',\n shippingAddress: fullAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const lang = useLang();\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n \n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/30698ade0df9ca0b7d51.worker.js b/dist/35d6878a15bb47505e36.worker.js similarity index 98% rename from dist/30698ade0df9ca0b7d51.worker.js rename to dist/35d6878a15bb47505e36.worker.js index 6752bcf18..cc5704c42 100644 --- a/dist/30698ade0df9ca0b7d51.worker.js +++ b/dist/35d6878a15bb47505e36.worker.js @@ -1,2 +1,2 @@ !function(e){var r={};function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)t.d(n,o,function(r){return e[r]}.bind(null,o));return n},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=0)}([function(e,r,t){"use strict";t.r(r);new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),"undefined"!=typeof window&&window.innerHeight;self.onerror=e=>{console.error(e),o({type:"unhandledError",error:{message:e.error.message||"Uncaught exception in worker"}})},self.addEventListener("unhandledrejection",e=>{console.error(e),o({type:"unhandledError",error:{message:e.reason.message||"Uncaught rejection in worker"}})});const n=new Map;function o(e,r){r?postMessage(e,r):postMessage(e)}let s;self.importScripts("rlottie-wasm.js");const a=new Promise(e=>{Module.onRuntimeInitialized=()=>{s={init:Module.cwrap("lottie_init","",[]),destroy:Module.cwrap("lottie_destroy","",["number"]),resize:Module.cwrap("lottie_resize","",["number","number","number"]),buffer:Module.cwrap("lottie_buffer","number",["number"]),render:Module.cwrap("lottie_render","",["number","number"]),loadFromData:Module.cwrap("lottie_load_from_data","number",["number","number"])},e()}}),i=new Map;var c;c={init:async function(e,r,t,n,o,c){s||await a;const u=JSON.stringify(r),d=allocate(intArrayFromString(u),"i8",0),l=s.init(),f=s.loadFromData(l,d);s.resize(l,t,t),i.set(e,{imgSize:t,reduceFactor:o,handle:l}),c(Math.ceil(f/o))},renderFrames:async function(e,r,t,n){s||await a;const{imgSize:o,reduceFactor:c,handle:u}=i.get(e);for(let e=r;e<=t;e++){const r=e*c;s.render(u,r);const t=s.buffer(u),a=Module.HEAPU8.subarray(t,t+o*o*4);n(e,new Uint8ClampedArray(a).buffer)}},destroy:function(e){const r=i.get(e);s.destroy(r.handle),i.delete(e)}},onmessage=async e=>{const{data:r}=e;switch(r.type){case"callMethod":{const{messageId:e,name:t,args:s}=r;try{if(e){const r=(...r)=>{const t=r[r.length-1];o({type:"methodCallback",messageId:e,callbackArgs:r},t instanceof ArrayBuffer?[t]:void 0)};n.set(e,r),s.push(r)}const[r,a]=await c[t](...s)||[];e&&o({type:"methodResponse",messageId:e,response:r},a)}catch(r){e&&o({type:"methodResponse",messageId:e,error:{message:r.message}})}e&&n.delete(e);break}case"cancelProgress":{const e=n.get(r.messageId);e&&(e.isCanceled=!0);break}}}}]); -//# sourceMappingURL=30698ade0df9ca0b7d51.worker.js.map \ No newline at end of file +//# sourceMappingURL=35d6878a15bb47505e36.worker.js.map \ No newline at end of file diff --git a/dist/30698ade0df9ca0b7d51.worker.js.map b/dist/35d6878a15bb47505e36.worker.js.map similarity index 99% rename from dist/30698ade0df9ca0b7d51.worker.js.map rename to dist/35d6878a15bb47505e36.worker.js.map index 187ff18fd..ac05e4fa0 100644 --- a/dist/30698ade0df9ca0b7d51.worker.js.map +++ b/dist/35d6878a15bb47505e36.worker.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/config.ts","webpack:///./src/util/createWorkerInterface.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Set","window","innerHeight","self","onerror","e","console","error","sendToOrigin","type","message","addEventListener","reason","callbackState","Map","data","arrayBuffers","postMessage","rLottieApi","importScripts","rLottieApiPromise","Promise","resolve","Module","onRuntimeInitialized","init","cwrap","destroy","resize","buffer","render","loadFromData","renderers","api","async","animationData","imgSize","isLowPriority","reduceFactor","onInit","json","JSON","stringify","stringOnWasmHeap","allocate","intArrayFromString","handle","framesCount","set","Math","ceil","renderFrames","fromIndex","toIndex","onProgress","realIndex","bufferPointer","HEAPU8","subarray","Uint8ClampedArray","renderer","delete","onmessage","messageId","args","callback","callbackArgs","lastArg","length","ArrayBuffer","undefined","push","response","isCanceled"],"mappings":"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","file":"30698ade0df9ca0b7d51.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\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\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\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v4';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 500;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'];\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","import { CancellableCallback, OriginMessageEvent, WorkerMessageData } from './WorkerConnector';\nimport { DEBUG } from '../config';\n\ndeclare const self: WorkerGlobalScope;\n\nhandleErrors();\n\nconst callbackState = new Map();\n\nexport default function createInterface(api: Record) {\n onmessage = async (message: OriginMessageEvent) => {\n const { data } = message;\n\n switch (data.type) {\n case 'callMethod': {\n const { messageId, name, args } = data;\n try {\n if (messageId) {\n const callback = (...callbackArgs: any[]) => {\n const lastArg = callbackArgs[callbackArgs.length - 1];\n\n sendToOrigin({\n type: 'methodCallback',\n messageId,\n callbackArgs,\n }, lastArg instanceof ArrayBuffer ? [lastArg] : undefined);\n };\n\n callbackState.set(messageId, callback);\n\n args.push(callback as never);\n }\n\n const [response, arrayBuffers] = (await api[name](...args)) || [];\n\n if (messageId) {\n sendToOrigin(\n {\n type: 'methodResponse',\n messageId,\n response,\n },\n arrayBuffers,\n );\n }\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n\n if (messageId) {\n sendToOrigin({\n type: 'methodResponse',\n messageId,\n error: { message: error.message },\n });\n }\n }\n\n if (messageId) {\n callbackState.delete(messageId);\n }\n\n break;\n }\n case 'cancelProgress': {\n const callback = callbackState.get(data.messageId);\n if (callback) {\n callback.isCanceled = true;\n }\n\n break;\n }\n }\n };\n}\n\nfunction handleErrors() {\n self.onerror = (e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n sendToOrigin({ type: 'unhandledError', error: { message: e.error.message || 'Uncaught exception in worker' } });\n };\n\n self.addEventListener('unhandledrejection', (e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n sendToOrigin({ type: 'unhandledError', error: { message: e.reason.message || 'Uncaught rejection in worker' } });\n });\n}\n\nfunction sendToOrigin(data: WorkerMessageData, arrayBuffers?: ArrayBuffer[]) {\n if (arrayBuffers) {\n postMessage(data, arrayBuffers);\n } else {\n postMessage(data);\n }\n}\n","import createWorkerInterface from '../../util/createWorkerInterface';\nimport { CancellableCallback } from '../../util/WorkerConnector';\n\ndeclare const Module: any;\n\ndeclare function allocate(...args: any[]): string;\n\ndeclare function intArrayFromString(str: String): string;\n\ndeclare const self: WorkerGlobalScope;\n\nself.importScripts('rlottie-wasm.js');\n\nlet rLottieApi: Record;\nconst rLottieApiPromise = new Promise((resolve) => {\n Module.onRuntimeInitialized = () => {\n rLottieApi = {\n init: Module.cwrap('lottie_init', '', []),\n destroy: Module.cwrap('lottie_destroy', '', ['number']),\n resize: Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\n buffer: Module.cwrap('lottie_buffer', 'number', ['number']),\n render: Module.cwrap('lottie_render', '', ['number', 'number']),\n loadFromData: Module.cwrap('lottie_load_from_data', 'number', ['number', 'number']),\n };\n\n resolve();\n };\n});\n\nconst renderers = new Map();\n\nasync function init(\n key: string,\n animationData: AnyLiteral,\n imgSize: number,\n isLowPriority: boolean,\n reduceFactor: number,\n onInit: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const json = JSON.stringify(animationData);\n const stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n const handle = rLottieApi.init();\n const framesCount = rLottieApi.loadFromData(handle, stringOnWasmHeap);\n rLottieApi.resize(handle, imgSize, imgSize);\n\n renderers.set(key, { imgSize, reduceFactor, handle });\n\n onInit(Math.ceil(framesCount / reduceFactor));\n}\n\nasync function renderFrames(\n key: string, fromIndex: number, toIndex: number, onProgress: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const { imgSize, reduceFactor, handle } = renderers.get(key)!;\n\n for (let i = fromIndex; i <= toIndex; i++) {\n const realIndex = i * reduceFactor;\n\n rLottieApi.render(handle, realIndex);\n const bufferPointer = rLottieApi.buffer(handle);\n const data = Module.HEAPU8.subarray(bufferPointer, bufferPointer + (imgSize * imgSize * 4));\n const arrayBuffer = new Uint8ClampedArray(data).buffer;\n onProgress(i, arrayBuffer);\n }\n}\n\nfunction destroy(key: string) {\n const renderer = renderers.get(key)!;\n\n rLottieApi.destroy(renderer.handle);\n\n renderers.delete(key);\n}\n\ncreateWorkerInterface({\n init,\n renderFrames,\n destroy,\n});\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/config.ts","webpack:///./src/util/createWorkerInterface.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Set","window","innerHeight","self","onerror","e","console","error","sendToOrigin","type","message","addEventListener","reason","callbackState","Map","data","arrayBuffers","postMessage","rLottieApi","importScripts","rLottieApiPromise","Promise","resolve","Module","onRuntimeInitialized","init","cwrap","destroy","resize","buffer","render","loadFromData","renderers","api","async","animationData","imgSize","isLowPriority","reduceFactor","onInit","json","JSON","stringify","stringOnWasmHeap","allocate","intArrayFromString","handle","framesCount","set","Math","ceil","renderFrames","fromIndex","toIndex","onProgress","realIndex","bufferPointer","HEAPU8","subarray","Uint8ClampedArray","renderer","delete","onmessage","messageId","args","callback","callbackArgs","lastArg","length","ArrayBuffer","undefined","push","response","isCanceled"],"mappings":"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","file":"35d6878a15bb47505e36.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\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\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\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v4';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 500;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'];\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","import { CancellableCallback, OriginMessageEvent, WorkerMessageData } from './WorkerConnector';\nimport { DEBUG } from '../config';\n\ndeclare const self: WorkerGlobalScope;\n\nhandleErrors();\n\nconst callbackState = new Map();\n\nexport default function createInterface(api: Record) {\n onmessage = async (message: OriginMessageEvent) => {\n const { data } = message;\n\n switch (data.type) {\n case 'callMethod': {\n const { messageId, name, args } = data;\n try {\n if (messageId) {\n const callback = (...callbackArgs: any[]) => {\n const lastArg = callbackArgs[callbackArgs.length - 1];\n\n sendToOrigin({\n type: 'methodCallback',\n messageId,\n callbackArgs,\n }, lastArg instanceof ArrayBuffer ? [lastArg] : undefined);\n };\n\n callbackState.set(messageId, callback);\n\n args.push(callback as never);\n }\n\n const [response, arrayBuffers] = (await api[name](...args)) || [];\n\n if (messageId) {\n sendToOrigin(\n {\n type: 'methodResponse',\n messageId,\n response,\n },\n arrayBuffers,\n );\n }\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n\n if (messageId) {\n sendToOrigin({\n type: 'methodResponse',\n messageId,\n error: { message: error.message },\n });\n }\n }\n\n if (messageId) {\n callbackState.delete(messageId);\n }\n\n break;\n }\n case 'cancelProgress': {\n const callback = callbackState.get(data.messageId);\n if (callback) {\n callback.isCanceled = true;\n }\n\n break;\n }\n }\n };\n}\n\nfunction handleErrors() {\n self.onerror = (e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n sendToOrigin({ type: 'unhandledError', error: { message: e.error.message || 'Uncaught exception in worker' } });\n };\n\n self.addEventListener('unhandledrejection', (e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n sendToOrigin({ type: 'unhandledError', error: { message: e.reason.message || 'Uncaught rejection in worker' } });\n });\n}\n\nfunction sendToOrigin(data: WorkerMessageData, arrayBuffers?: ArrayBuffer[]) {\n if (arrayBuffers) {\n postMessage(data, arrayBuffers);\n } else {\n postMessage(data);\n }\n}\n","import createWorkerInterface from '../../util/createWorkerInterface';\nimport { CancellableCallback } from '../../util/WorkerConnector';\n\ndeclare const Module: any;\n\ndeclare function allocate(...args: any[]): string;\n\ndeclare function intArrayFromString(str: String): string;\n\ndeclare const self: WorkerGlobalScope;\n\nself.importScripts('rlottie-wasm.js');\n\nlet rLottieApi: Record;\nconst rLottieApiPromise = new Promise((resolve) => {\n Module.onRuntimeInitialized = () => {\n rLottieApi = {\n init: Module.cwrap('lottie_init', '', []),\n destroy: Module.cwrap('lottie_destroy', '', ['number']),\n resize: Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\n buffer: Module.cwrap('lottie_buffer', 'number', ['number']),\n render: Module.cwrap('lottie_render', '', ['number', 'number']),\n loadFromData: Module.cwrap('lottie_load_from_data', 'number', ['number', 'number']),\n };\n\n resolve();\n };\n});\n\nconst renderers = new Map();\n\nasync function init(\n key: string,\n animationData: AnyLiteral,\n imgSize: number,\n isLowPriority: boolean,\n reduceFactor: number,\n onInit: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const json = JSON.stringify(animationData);\n const stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n const handle = rLottieApi.init();\n const framesCount = rLottieApi.loadFromData(handle, stringOnWasmHeap);\n rLottieApi.resize(handle, imgSize, imgSize);\n\n renderers.set(key, { imgSize, reduceFactor, handle });\n\n onInit(Math.ceil(framesCount / reduceFactor));\n}\n\nasync function renderFrames(\n key: string, fromIndex: number, toIndex: number, onProgress: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const { imgSize, reduceFactor, handle } = renderers.get(key)!;\n\n for (let i = fromIndex; i <= toIndex; i++) {\n const realIndex = i * reduceFactor;\n\n rLottieApi.render(handle, realIndex);\n const bufferPointer = rLottieApi.buffer(handle);\n const data = Module.HEAPU8.subarray(bufferPointer, bufferPointer + (imgSize * imgSize * 4));\n const arrayBuffer = new Uint8ClampedArray(data).buffer;\n onProgress(i, arrayBuffer);\n }\n}\n\nfunction destroy(key: string) {\n const renderer = renderers.get(key)!;\n\n rLottieApi.destroy(renderer.handle);\n\n renderers.delete(key);\n}\n\ncreateWorkerInterface({\n init,\n renderFrames,\n destroy,\n});\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/4.7d611cd5e39f10293bca.css b/dist/4.456420358e011b532a42.css similarity index 100% rename from dist/4.7d611cd5e39f10293bca.css rename to dist/4.456420358e011b532a42.css diff --git a/dist/4.7d611cd5e39f10293bca.js b/dist/4.456420358e011b532a42.js similarity index 82% rename from dist/4.7d611cd5e39f10293bca.js rename to dist/4.456420358e011b532a42.js index aa26a8566..b8d2e3985 100644 --- a/dist/4.7d611cd5e39f10293bca.js +++ b/dist/4.456420358e011b532a42.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{104:function(e,t,a){"use strict";a.r(t),a.d(t,"Main",(function(){return Tn}));var s=a(2),n=a(1),c=a(0),r=(a(84),a(37)),o=a(6);window.addEventListener("popstate",e=>{if(!e.state)return;const{chatId:t,threadId:a,messageListType:n}=e.state;Object(s.d)().openChat({id:t,threadId:a,type:n,noPushState:!0})}),Object(s.b)("openChat",(e,t,a)=>{const{id:n,threadId:c=-1,type:i="thread",noPushState:l}=a,d=Object(o.y)(e);return d&&d.chatId===n&&d.threadId===c&&d.type===i||(e=Object(r.n)(e),e={...e,messages:{...e.messages,contentToBeScheduled:void 0},...n!==e.forwardMessages.toChatId&&{forwardMessages:{}}},Object(s.g)(e),l||window.history.pushState({chatId:n,threadId:c,messageListType:i},"")),Object(r.N)(e,n,c,i)}),Object(s.b)("openChatWithInfo",(e,t,a)=>{Object(s.g)({...e,isChatInfoShown:!0}),t.openChat(a)}),Object(s.b)("resetChatCreation",e=>({...e,chatCreation:void 0}));var i=a(5),l=a(20),d=a(3);let b;Object(s.b)("setScrollOffset",(e,t,a)=>{const{chatId:s,threadId:n,scrollOffset:c}=a;return Object(r.x)(e,s,n,"scrollOffset",c)}),Object(s.b)("setReplyingToId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i}=n;return Object(r.x)(e,c,i,"replyingToId",s)}),Object(s.b)("setEditingId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i,type:l}=n,d="scheduled"===l?"editingScheduledId":"editingId";return Object(r.x)(e,c,i,d,s)}),Object(s.b)("editLastMessage",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(!t||!a)return;const s=Object(o.m)(e,t),n=Object(o.Hb)(e,t,a);if(!s||!n)return;const c=Object(d.g)(n,t=>Boolean(s[t]&&Object(o.b)(e,s[t],a).canEdit));return c?Object(r.x)(e,t,a,"editingId",c):void 0}),Object(s.b)("replyToNextMessage",(e,t,a)=>{const{targetIndexDelta:s}=a,{chatId:n,threadId:c}=Object(o.y)(e)||{};if(!n||!c)return;const r=Object(o.m)(e,n),l=Object(o.Hb)(e,n,c);if(!r||!l)return;const d=Object(o.mb)(e,n,c);let b;if(Object(o.X)(e,n,c)&&d){const e=Object.keys(r),t=e.indexOf(d.toString())+s;b=t<=e.length+1&&t>=0?Number(e[t]):void 0}else if(c===i.MAIN_THREAD_ID){const t=Object(o.f)(e,n);b=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.Cb)(e,n,c);b=t?t.lastMessageId:void 0}t.setReplyingToId({messageId:b}),t.focusMessage({chatId:n,threadId:c,messageId:b})}),Object(s.b)("openMediaViewer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c,avatarOwnerId:r,profilePhotoIndex:o,origin:i}=a;return{...e,mediaViewer:{chatId:s,threadId:n,messageId:c,avatarOwnerId:r,profilePhotoIndex:o,origin:i},forwardMessages:{}}}),Object(s.b)("closeMediaViewer",e=>({...e,mediaViewer:{}})),Object(s.b)("openAudioPlayer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c}=a;return{...e,audioPlayer:{chatId:s,threadId:n,messageId:c}}}),Object(s.b)("closeAudioPlayer",e=>({...e,audioPlayer:{}})),Object(s.b)("openPollResults",(e,t,a)=>{const{chatId:n,messageId:c}=a;Object(o.W)(e)?n===e.pollResults.chatId&&c===e.pollResults.messageId||Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}}):window.setTimeout(()=>{const e=Object(s.e)();Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}})},450)}),Object(s.b)("closePollResults",e=>{Object(s.g)({...e,pollResults:{}})}),Object(s.b)("focusLastMessage",(e,t)=>{const a=Object(o.y)(e);if(!a)return;const{chatId:s,threadId:n}=a;let c;if(n===i.MAIN_THREAD_ID){const t=Object(o.f)(e,s);c=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.Cb)(e,s,n);c=t?t.lastMessageId:void 0}c&&t.focusMessage({chatId:s,threadId:n,messageId:c,noHighlight:!0})}),Object(s.b)("focusMessage",(e,t,a)=>{const{chatId:n,threadId:c=i.MAIN_THREAD_ID,messageListType:d="thread",noHighlight:u,groupedId:m,groupedChatId:h}=a;let{messageId:O}=a;if(void 0!==m){const t=Object(o.J)(e,h,m);t&&t.length&&([O]=t)}const j=Object(o.y)(e),g=!j||n!==j.chatId||c!==j.threadId||d!==j.type;b&&(clearTimeout(b),b=void 0),b=window.setTimeout(()=>{let e=Object(s.e)();e=Object(r.P)(e),e=Object(r.O)(e),Object(s.g)(e)},2e3),e=Object(r.P)(e,n,O,u),e=Object(r.O)(e,void 0),g&&(e=Object(r.O)(e,l.b.Static));const f=Object(o.Hb)(e,n,c);if(f&&f.includes(O))return Object(s.g)(e),void t.openChat({id:n,threadId:c});if(g&&(e=Object(r.x)(e,n,c,"viewportIds",void 0)),e=Object(r.x)(e,n,c,"outlyingIds",void 0),f&&!g){const t=O>f[0]?l.b.Down:l.b.Up;e=Object(r.O)(e,t)}Object(s.g)(e),t.openChat({id:n,threadId:c}),t.loadViewportMessages()}),Object(s.b)("openForwardMenu",(e,t,a)=>{const{fromChatId:s,messageIds:n,groupedId:c}=a;let r;return c&&(r=Object(o.ab)(e,s,c)),{...e,forwardMessages:{fromChatId:s,messageIds:r||n,isModalShown:!0}}}),Object(s.b)("exitForwardMode",e=>{Object(s.g)({...e,forwardMessages:{}})}),Object(s.b)("setForwardChatId",(e,t,a)=>{const{id:n}=a;Object(s.g)({...e,forwardMessages:{...e.forwardMessages,toChatId:n,isModalShown:!1}}),t.openChat({id:n}),t.closeMediaViewer(),t.exitMessageSelectMode()}),Object(s.b)("openForwardMenuForSelectedMessages",(e,t)=>{if(!e.selectedMessages)return;const{chatId:a,messageIds:s}=e.selectedMessages;t.openForwardMenu({fromChatId:a,messageIds:s})}),Object(s.b)("enterMessageSelectMode",(e,t,a)=>{const{messageId:s}=a||{},n=Object(o.r)(e);return n?Object(r.m)(e,n.id,s):e}),Object(s.b)("toggleMessageSelection",(e,t,a)=>{const{messageId:s,groupedId:n,childMessageIds:c,withShift:i}=a,l=Object(o.y)(e);if(!l)return;const{chatId:d,threadId:b,type:u}=l;return Object(r.G)(e,d,b,u,s,n,c,i)}),Object(s.b)("exitMessageSelectMode",r.n),Object(s.b)("openPollModal",e=>({...e,isPollModalOpen:!0})),Object(s.b)("closePollModal",e=>({...e,isPollModalOpen:!1}));Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{query:s}=a,{chatId:n}=e.globalSearch;return Object(r.R)(e,{globalResults:{},localResults:{},resultsByType:void 0,...s?{fetchingStatus:{chats:!n,messages:!0}}:{fetchingStatus:void 0},query:s})}),Object(s.b)("addRecentlyFoundChatId",(e,t,a)=>{const{id:s}=a,{recentlyFoundChatIds:n}=e.globalSearch;if(!n)return Object(r.R)(e,{recentlyFoundChatIds:[s]});const c=n.filter(e=>e!==s);return c.unshift(s),c.length>10&&c.pop(),Object(r.R)(e,{recentlyFoundChatIds:c})}),Object(s.b)("clearRecentlyFoundChats",e=>Object(r.R)(e,{recentlyFoundChatIds:void 0})),Object(s.b)("setGlobalSearchContent",(e,t,a)=>{const{content:s}=a;return Object(r.S)(e,s)}),Object(s.b)("setGlobalSearchChatId",(e,t,a)=>{const{id:s}=a;return Object(r.R)(e,{chatId:s,query:void 0,resultsByType:void 0})});var u=a(50),m=a(4);Object(s.b)("openLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return Object(r.Y)(e,t,a,!0)}),Object(s.b)("closeLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return e=Object(r.Y)(e,t,a,!1),e=Object(r.t)(e,t,a,void 0)}),Object(s.b)("setLocalTextSearchQuery",(e,t,a)=>{const{chatId:s,threadId:n}=Object(o.y)(e)||{};if(!s||!n)return;const{query:c}=a,i=Object(m.a)(s,n),{query:l}=e.localTextSearch.byChatThreadKey[i]||{};return c!==l&&(e=Object(r.t)(e,s,n,u.a)),e=Object(r.Y)(e,s,n,!0,c)}),Object(s.b)("setLocalMediaSearchType",(e,t,a)=>{const{chatId:s}=Object(o.y)(e)||{};if(!s)return;const{mediaType:n}=a;return Object(r.X)(e,s,n)}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,stickers:{...e.stickers,search:{query:s,resultIds:void 0}}}}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,gifs:{...e.gifs,search:{query:s,offsetId:void 0,results:void 0}}}}),Object(s.b)("openUserInfo",(e,t,a)=>{const{id:s}=a;t.openChat({id:s})});Object(s.b)("openChat",e=>Object(r.fb)(e,void 0)),Object(s.b)("setSettingOption",(e,t,a)=>Object(r.v)(e,a)),Object(s.b)("setThemeSettings",(e,t,a)=>{const{theme:s,...n}=a;return Object(r.w)(e,s,n)});var h=a(7),O=a(169);Object(s.b)("toggleChatInfo",e=>({...e,isChatInfoShown:!e.isChatInfoShown})),Object(s.b)("toggleManagement",e=>{const{chatId:t}=Object(o.y)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!(e.management.byChatId[t]||{}).isActive}}}}}),Object(s.b)("closeManagement",e=>{const{chatId:t}=Object(o.y)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!1}}}}}),Object(s.b)("openChat",(e,t,a)=>{if(!h.g)return;const{id:s}=a;return{...e,isLeftColumnShown:void 0===s}}),Object(s.b)("toggleLeftColumn",e=>({...e,isLeftColumnShown:!e.isLeftColumnShown})),Object(s.b)("addRecentEmoji",(e,t,a)=>{const{emoji:s}=a,{recentEmojis:n}=e;if(!n)return{...e,recentEmojis:[s]};const c=n.filter(e=>e!==s);return c.unshift(s),c.length>18&&c.pop(),{...e,recentEmojis:c}}),Object(s.b)("addRecentSticker",(e,t,a)=>{const{sticker:s}=a,{recent:n}=e.stickers;if(!n)return{...e,stickers:{...e.stickers,recent:{hash:0,stickers:[s]}}};const c=n.stickers.filter(e=>e.id!==s.id);return c.unshift(s),{...e,stickers:{...e.stickers,recent:{...n,stickers:c}}}}),Object(s.b)("showNotification",(e,t,a)=>{const s=a,n=[...e.notifications],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,notifications:n}}),Object(s.b)("dismissNotification",e=>{const t=[...e.notifications];return t.pop(),{...e,notifications:t}}),Object(s.b)("showError",(e,t,a)=>{const{error:s}=a;if(!Object(O.a)(s))return e;const n=[...e.errors],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,errors:n}}),Object(s.b)("dismissError",e=>{const t=[...e.errors];return t.pop(),{...e,errors:t}}),Object(s.b)("toggleSafeLinkModal",(e,t,a)=>{const{url:s}=a;return{...e,safeLinkModalUrl:s}}),Object(s.b)("openHistoryCalendar",(e,t,a)=>{const{selectedAt:s}=a;return{...e,historyCalendarSelectedAt:s}}),Object(s.b)("closeHistoryCalendar",e=>({...e,historyCalendarSelectedAt:void 0})),Object(s.b)("openPaymentModal",(e,t,a)=>{const{messageId:s}=a;return{...e,payment:{...e.payment,messageId:s,isPaymentModalOpen:!0}}}),Object(s.b)("closePaymentModal",e=>{const t=Object(r.h)(e);return Object(r.i)(t)});a(85);var j=a(10),g=a(9);const f=Object(g.g)(e=>e(),1e3,!0),p=Object(g.g)(e=>e(),3e3,!0),I=Object(g.a)(e=>e(),500,!1,!0);async function v(e,t,a){const c=await Object(j.a)("fetchChats",{limit:n.j,offsetDate:a,archived:"archived"===e,withPinned:void 0===Object(s.e)().chats.orderedPinnedIds[e]});if(!c)return;const{chatIds:o}=c;o.length>0&&o[0]===t&&o.shift();let l=Object(s.e)();l=Object(r.f)(l,Object(d.c)(c.users,"id")),l=Object(r.M)(l,Object(d.c)(c.chats,"id")),l=Object(r.I)(l,e,o),l=Object(r.J)(l,e,c),Object.keys(c.draftsById).map(Number).forEach(e=>{l=Object(r.x)(l,e,i.MAIN_THREAD_ID,"draft",c.draftsById[e])}),Object.keys(c.replyingToById).map(Number).forEach(e=>{l=Object(r.x)(l,e,i.MAIN_THREAD_ID,"replyingToId",c.replyingToById[e])}),0!==o.length||l.chats.isFullyLoaded[e]||(l={...l,chats:{...l.chats,isFullyLoaded:{...l.chats.isFullyLoaded,[e]:!0}}}),Object(s.g)(l)}async function y(e){const t=await Object(j.a)("fetchFullChat",e);if(!t)return;const{users:a,fullInfo:n}=t;let c=Object(s.e)();a&&(c=Object(r.f)(c,Object(d.c)(a,"id"))),c=Object(r.H)(c,e.id,{fullInfo:n}),Object(s.g)(c)}async function C(e,t,a){const n=Object(s.e)(),c=Object(o.h)(n,t);if(c&&!c.isMin)return void(a?e.focusMessage({chatId:c.id,messageId:a}):e.openChat({id:c.id}));const i=Object(o.r)(n);e.openChat({id:-1});const l=await Object(j.a)("getChatByUsername",t);if(!l)return i&&e.openChat({id:i.id}),void e.showNotification({message:"User does not exist"});Object(s.g)(Object(r.H)(Object(s.e)(),l.id,l)),a?e.focusMessage({chatId:l.id,messageId:a}):e.openChat({id:l.id})}Object(s.b)("preloadTopChatMessages",(e,t)=>{(async()=>{const a=[];for(let c=0;ce!==l&&!a.includes(e));if(!u)return;a.push(u.id),t.loadViewportMessages({chatId:u.id,threadId:i.MAIN_THREAD_ID})}})()}),Object(s.b)("openChat",(e,t,a)=>{const{id:s,threadId:n}=a,{currentUserId:c}=e,r=Object(o.f)(e,s);if(r&&r.hasUnreadMark&&t.toggleChatUnread({id:s}),r)Object(m.mb)(r)&&!r.isMin&&t.requestChatUpdate({chatId:s});else if(s===c)Object(j.a)("fetchChat",{type:"self"});else{const t=Object(o.Gb)(e,s);t&&Object(j.a)("fetchChat",{type:"user",user:t})}if(n!==i.MAIN_THREAD_ID){Object(o.Eb)(e,s,n)||t.requestThreadInfoUpdate({chatId:s,threadId:n})}}),Object(s.b)("openSupportChat",(e,t)=>{const a=Object(o.Ab)(e);t.openChat({id:a?a.id:-1}),a||(async()=>{const e=await Object(j.a)("fetchChat",{type:"support"});e&&t.openChat({id:e.chatId})})()}),Object(s.b)("openTipsChat",(e,t)=>{t.openChatByUsername({username:n.Cb})}),Object(s.b)("loadMoreChats",(e,t,a)=>{const{listType:s="active"}=a,n=e.chats.listIds[s];if(e.chats.isFullyLoaded[s])return;const c=n?n.map(t=>e.chats.byId[t]).filter(t=>Boolean(t&&t.lastMessage)&&!Object(o.N)(e,t.id)).sort((e,t)=>e.lastMessage.date-t.lastMessage.date)[0]:void 0;f(c?()=>v(s,c.id,c.lastMessage.date):()=>v(s))}),Object(s.b)("loadFullChat",(e,t,a)=>{const{chatId:s,force:n}=a,c=Object(o.f)(e,s);c&&(n?y(c):I(()=>y(c)))}),Object(s.b)("loadTopChats",()=>{p(()=>v("active"))}),Object(s.b)("requestChatUpdate",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);n&&Object(j.a)("requestChatUpdate",n)}),Object(s.b)("updateChatMutedState",(e,t,a)=>{const{chatId:s,isMuted:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("updateChatMutedState",{chat:c,isMuted:n})}),Object(s.b)("createChannel",(e,t,a)=>{const{title:n,about:c,photo:i,memberIds:d}=a;!async function(e,t,a,n){Object(s.g)({...Object(s.e)(),chatCreation:{progress:l.a.InProgress}});const c=await Object(j.a)("createChannel",{title:e,about:a,users:t});if(!c)return;const{id:o,accessHash:i}=c;let d=Object(s.e)();d=Object(r.H)(d,o,c),d={...d,chatCreation:{...d.chatCreation,progress:c?l.a.Complete:l.a.Error}},Object(s.g)(d),Object(s.d)().openChat({id:o}),o&&i&&n&&await Object(j.a)("editChatPhoto",{chatId:o,accessHash:i,photo:n})}(n,d.map(t=>Object(o.Gb)(e,t)).filter(Boolean),c,i)}),Object(s.b)("joinChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("joinChannel",{channelId:c,accessHash:r})}),Object(s.b)("leaveChannel",(e,t,a)=>{(async()=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&await Object(j.a)("leaveChannel",{channelId:c,accessHash:r}),t.openChat({id:void 0})})()}),Object(s.b)("deleteChannel",(e,t,a)=>{(async()=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&await Object(j.a)("deleteChannel",{channelId:c,accessHash:r}),t.openChat({id:void 0})})()}),Object(s.b)("createGroupChat",(e,t,a)=>{const{title:n,memberIds:c,photo:i}=a;!async function(e,t,a){Object(s.g)({...Object(s.e)(),chatCreation:{progress:l.a.InProgress}});const n=await Object(j.a)("createGroupChat",{title:e,users:t});if(!n)return;const{id:c}=n;let o=Object(s.e)();o=Object(r.H)(o,c,n),o={...o,chatCreation:{...o.chatCreation,progress:n?l.a.Complete:l.a.Error}},Object(s.g)(o),Object(s.d)().openChat({id:c}),c&&a&&await Object(j.a)("editChatPhoto",{chatId:c,photo:a})}(n,c.map(t=>Object(o.Gb)(e,t)).filter(Boolean),i)}),Object(s.b)("toggleChatPinned",(e,t,a)=>{const{id:s,folderId:c}=a,r=Object(o.f)(e,s);if(r)if(c){const t=Object(o.i)(e,c);if(t){const a=!Object(o.N)(e,s,c),{pinnedChatIds:n,includedChatIds:r}=t,i=a?[s,...n||[]]:(n||[]).filter(e=>e!==s),l=[s,...r];Object(j.a)("editChatFolder",{id:c,folderUpdate:{...t,pinnedChatIds:i,includedChatIds:l}})}}else{const t=Object(o.j)(e,s),a=Object(o.N)(e,s,"archived"===t?n.h:void 0);Object(j.a)("toggleChatPinned",{chat:r,shouldBePinned:!a})}}),Object(s.b)("toggleChatArchived",(e,t,a)=>{const{id:s}=a,c=Object(o.f)(e,s);c&&Object(j.a)("toggleChatArchived",{chat:c,folderId:Object(m.hb)(c)?0:n.h})}),Object(s.b)("loadChatFolders",()=>{!async function(){const e=await Object(j.a)("fetchChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,...e}})}}()}),Object(s.b)("loadRecommendedChatFolders",()=>{!async function(){const e=await Object(j.a)("fetchRecommendedChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,recommended:e}})}}()}),Object(s.b)("editChatFolder",(e,t,a)=>{const{id:s,folderUpdate:n}=a,c=Object(o.i)(e,s);c&&Object(j.a)("editChatFolder",{id:s,folderUpdate:{id:s,emoticon:c.emoticon,pinnedChatIds:c.pinnedChatIds,...n}})}),Object(s.b)("addChatFolder",(e,t,a)=>{const{folder:c}=a,{orderedIds:r}=e.chatFolders;!async function(e,t){const{id:a,description:n,...c}=e;if(await Object(j.a)("editChatFolder",{id:t+1,folderUpdate:{id:t+1,...c}}),!n)return;const r=Object(s.e)(),{recommended:o}=r.chatFolders;o&&Object(s.g)({...r,chatFolders:{...r.chatFolders,recommended:o.filter(({id:e})=>e!==a)}})}(c,r&&r.length?Math.max.apply(Math.max,r):n.h)}),Object(s.b)("deleteChatFolder",(e,t,a)=>{const{id:s}=a;Object(o.i)(e,s)&&async function(e){await Object(j.a)("deleteChatFolder",e)}(s)}),Object(s.b)("toggleChatUnread",(e,t,a)=>{const{id:s}=a,n=Object(o.f)(e,s);n&&(n.unreadCount?Object(j.a)("markMessageListRead",{chat:n,threadId:i.MAIN_THREAD_ID}):Object(j.a)("toggleDialogUnread",{chat:n,hasUnreadMark:!n.hasUnreadMark}))}),Object(s.b)("openTelegramLink",(e,t,a)=>{const{url:s}=a;let c=n.hb.exec(s);if(c){const e=c[1];(async()=>{const a=await Object(j.a)("openChatByInvite",e);a&&t.openChat({id:a.id})})()}else{c=n.ib.exec(s);const e=c[1],a=c[2]?Number(c[2]):void 0;C(t,e,a)}}),Object(s.b)("openChatByUsername",(e,t,a)=>{const{username:s}=a;C(t,s)}),Object(s.b)("togglePreHistoryHidden",(e,t,a)=>{const{chatId:s,isEnabled:n}=a;let c=Object(o.f)(e,s);c&&(async()=>{if(Object(m.ib)(c)){if(c=await Object(j.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}Object(j.a)("togglePreHistoryHidden",{chat:c,isEnabled:n})})()}),Object(s.b)("updateChatDefaultBannedRights",(e,t,a)=>{const{chatId:s,bannedRights:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("updateChatDefaultBannedRights",{chat:c,bannedRights:n})}),Object(s.b)("updateChatMemberBannedRights",(e,t,a)=>{const{chatId:n,userId:c,bannedRights:i}=a;let l=Object(o.f)(e,n);const d=Object(o.Gb)(e,c);l&&d&&(async()=>{if(Object(m.ib)(l)){if(l=await Object(j.a)("migrateChat",l),!l)return;t.openChat({id:l.id})}await Object(j.a)("updateChatMemberBannedRights",{chat:l,user:d,bannedRights:i});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{members:b,kickedMembers:u}=a.fullInfo,h=!!i.viewMessages,O=!Object.keys(i).length;Object(s.g)(Object(r.H)(e,n,{fullInfo:{...a.fullInfo,...b&&h&&{members:b.filter(e=>e.userId!==c)},...b&&!h&&{members:b.map(e=>e.userId===c?{...e,bannedRights:i}:e)},...O&&u&&{kickedMembers:u.filter(e=>e.userId!==c)}}}))})()}),Object(s.b)("updateChatAdmin",(e,t,a)=>{const{chatId:n,userId:c,adminRights:i,customTitle:l}=a;let d=Object(o.f)(e,n);const b=Object(o.Gb)(e,c);d&&b&&(async()=>{if(Object(m.ib)(d)){if(d=await Object(j.a)("migrateChat",d),!d)return;t.openChat({id:d.id})}await Object(j.a)("updateChatAdmin",{chat:d,user:b,adminRights:i,customTitle:l});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{adminMembers:u}=a.fullInfo,h=!Object.keys(i).length;Object(s.g)(Object(r.H)(e,n,{fullInfo:{...a.fullInfo,...u&&h&&{adminMembers:u.filter(e=>e.userId!==c)},...u&&!h&&{adminMembers:u.map(e=>e.userId===c?{...e,adminRights:i,customTitle:l}:e)}}}))})()}),Object(s.b)("updateChat",(e,t,a)=>{const{chatId:n,title:c,about:i,photo:d}=a,b=Object(o.f)(e,n);b&&(async()=>{Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.InProgress)),await Promise.all([b.title!==c?Object(j.a)("updateChatTitle",b,c):void 0,b.fullInfo&&b.fullInfo.about!==i?Object(j.a)("updateChatAbout",b,i):void 0,d?Object(j.a)("editChatPhoto",{chatId:n,accessHash:b.accessHash,photo:d}):void 0]),Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.Complete))})()}),Object(s.b)("toggleSignatures",(e,t,a)=>{const{chatId:s,isEnabled:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("toggleSignatures",{chat:c,isEnabled:n})}),Object(s.b)("loadGroupsForDiscussion",()=>{(async()=>{const e=await Object(j.a)("fetchGroupsForDiscussion");if(!e)return;const t=e.reduce((e,t)=>(t&&(e[t.id]=t),e),{}),a=Object(r.c)(Object(s.e)(),t);Object(s.g)({...a,chats:{...a.chats,forDiscussionIds:Object.keys(t).map(Number)}})})()}),Object(s.b)("linkDiscussionGroup",(e,t,a)=>{const{channelId:s,chatId:n}=a,c=Object(o.f)(e,s);let r=Object(o.f)(e,n);c&&r&&(async()=>{if(Object(m.ib)(r)){if(r=await Object(j.a)("migrateChat",r),!r)return;t.openChat({id:r.id})}let{fullInfo:e}=r;if(!e){const t=await Object(j.a)("fetchFullChat",r);if(!t)return;e=t.fullInfo}e.isPreHistoryHidden&&await Object(j.a)("togglePreHistoryHidden",{chat:r,isEnabled:!1}),Object(j.a)("setDiscussionGroup",{channel:c,chat:r})})()}),Object(s.b)("unlinkDiscussionGroup",(e,t,a)=>{const{channelId:s}=a,n=Object(o.f)(e,s);if(!n)return;let c;n.fullInfo&&n.fullInfo.linkedChatId&&(c=Object(o.f)(e,n.fullInfo.linkedChatId)),(async()=>{await Object(j.a)("setDiscussionGroup",{channel:n}),c&&y(c)})()}),Object(s.b)("setActiveChatFolder",(e,t,a)=>({...e,chatFolders:{...e.chatFolders,activeChatFolder:a}})),Object(s.b)("loadMoreMembers",e=>{(async()=>{const{chatId:t}=Object(o.y)(e)||{},a=t?Object(o.f)(e,t):void 0;if(!a||Object(m.ib)(a))return;const n=a.fullInfo&&a.fullInfo.members&&a.fullInfo.members.length||void 0,c=await Object(j.a)("fetchMembers",a.id,a.accessHash,"recent",n);if(!c)return;const{members:i,users:l}=c;i&&i.length&&(e=Object(s.e)(),e=Object(r.f)(e,Object(d.c)(l,"id")),e=Object(r.H)(e,a.id,{fullInfo:{...a.fullInfo,members:[...(a.fullInfo||{}).members||[],...i||[]]}}),Object(s.g)(e))})()});var E=a(153);const w=new Map,M=Object(g.g)(e=>e(),1e3,!0);async function S(e,t,a,c,i=!1,b=!1){const u=e.id;let m;switch(c){case l.e.Backwards:m=void 0;break;case l.e.Around:m=-(Math.round(n.V/2)+1);break;case l.e.Forwards:m=-(n.V+1)}const h=await Object(j.a)("fetchMessages",{chat:Object(o.Db)(Object(s.e)(),u,t),offsetId:a,addOffset:m,limit:n.V,threadId:t});if(!h)return;const{messages:O,users:g,chats:f,threadInfos:p}=h,I=Object(d.c)(O,"id"),v=Object.keys(I).map(Number);let y=Object(s.e)();y=Object(r.b)(y,u,I),y=i?Object(r.db)(y,u,t,v):Object(r.V)(y,u,t,v),y=Object(r.f)(y,Object(d.c)(g,"id")),y=Object(r.c)(y,Object(d.c)(f,"id")),y=Object(r.lb)(y,u,p);let C=Object(o.Y)(y,u,t);const E=Object(o.gb)(y,u,t);if(i&&C&&E&&Object(d.b)(C,E)&&(y=Object(r.V)(y,u,t,E),C=Object(o.Y)(y,u,t),y=Object(r.x)(y,u,t,"outlyingIds",void 0),i=!1),!b){const e=i?E:C,{newViewportIds:s}=k(e,a,c);y=Object(r.z)(y,u,t,s)}Object(s.g)(y)}function k(e,t,a){const{length:s}=e,c=t?function(e,t){return te[e.length-1]?e.length-1:e.findIndex((a,s)=>a===t||at)}(e,t):-1,r=a===l.e.Backwards?c:c+1||s,o=r-n.V,i=r+n.V-1,d=e.slice(Math.max(0,o),i+1);let b,u;switch(a){case l.e.Backwards:b=r>0,u=o>=0;break;case l.e.Forwards:b=r0,u=d.length===n.V}return{newViewportIds:d,areSomeLocal:b,areAllLocal:u}}async function N(e){let t;const a=e.attachment?(e,n)=>{w.has(n)||(t=n,w.set(n,a));const c=Object(s.e)();Object(s.g)({...c,fileUploads:{byMessageLocalId:{...c.fileUploads.byMessageLocalId,[n]:{progress:e}}}})}:void 0;e.replyingTo&&await Object(g.f)();const n=Object(s.e)(),c=Object(o.y)(n);if(!c)return;const{threadId:r}=c;e.replyingTo||r===i.MAIN_THREAD_ID||(e.replyingTo=Object(o.Eb)(n,e.chat.id,r)),await Object(j.a)("sendMessage",e,a),a&&t&&w.delete(t)}Object(s.b)("loadViewportMessages",(e,t,a)=>{const{direction:s=l.e.Around,isBudgetPreload:c=!1}=a||{};let{chatId:i,threadId:d}=a||{};if(!i){const t=Object(o.y)(e);if(!t)return;i=t.chatId,d=t.threadId}const b=Object(o.f)(e,i);if(!b||b.isRestricted)return;const u=Object(o.Hb)(e,i,d),m=Object(o.Y)(e,i,d),h=Object(o.gb)(e,i,d);if(u&&u.length&&s!==l.e.Around){const a=s===l.e.Backwards?u[0]:u[u.length-1],n=Boolean(h),o=n?h:m,{newViewportIds:O,areSomeLocal:j,areAllLocal:g}=k(o,a,s);if(j&&(e=Object(r.z)(e,i,d,O)),async function(e,t,a,s,n,c,r,o){t||await S(n,c,o,r,a,s);s||(await Promise.resolve(),e.loadViewportMessages({chatId:n.id,threadId:c,direction:r,isBudgetPreload:!0}))}(t,g,n,c,b,d,s,a),c)return}else{const t=Object(o.I)(e,i)||Object(o.lb)(e,i,d),a=Boolean(t&&m&&!m.includes(t)),s=(a?h:m)||[],{newViewportIds:u,areSomeLocal:O,areAllLocal:j}=k(s,t,l.e.Around);O&&u.length>=n.V&&(e=Object(r.z)(e,i,d,u)),j||S(b,d,t,l.e.Around,a,c)}return e}),Object(s.b)("loadMessage",(e,t,a)=>{const{chatId:n,messageId:c,replyOriginForId:l}=a,b=Object(o.f)(e,n);b&&async function(e,t,a){const n=await Object(j.a)("fetchMessage",{chat:e,messageId:t});if(!n)return;if(n===i.MESSAGE_DELETED){if(a){let t=Object(s.e)();const n=Object(o.k)(t,e.id,a);t=Object(r.L)(t,e.id,a,{...n,replyToMessageId:void 0}),Object(s.g)(t)}return}let c=Object(s.e)();c=Object(r.L)(c,e.id,t,n.message),c=Object(r.f)(c,Object(d.c)(n.users,"id")),Object(s.g)(c)}(b,c,l)}),Object(s.b)("sendMessage",(e,t,a)=>{const s=Object(o.y)(e);if(!s)return;const{chatId:c,threadId:r,type:i}=s;if("scheduled"===i&&!a.scheduledAt)return{...e,messages:{...e.messages,contentToBeScheduled:a}};const l=Object(o.f)(e,c);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:c,threadId:r,value:!1});const b={...a,chat:l,replyingTo:Object(o.mb)(e,c,r),noWebPage:Object(o.cb)(e,c,r)},u=!a.attachments||a.attachments.length<=1,m=!u&&a.attachments&&a.attachments.length>1;if(u){const{attachments:e,...t}=b;N({...t,attachment:e?e[0]:void 0})}else if(m){const{text:e,entities:t,attachments:a,...s}=b,c=Object(d.n)(a,n.L);for(let a=0;a0?o:void 0}),r.forEach(e=>{N({...s,attachment:e,groupedId:o})})}}else{const{text:e,entities:t,attachments:a,replyingTo:s,...n}=b;e&&N({...n,text:e,entities:t,replyingTo:s}),a.forEach(e=>{N({...n,attachment:e})})}}),Object(s.b)("editMessage",(e,t,a)=>{const{text:s,entities:n}=a,c=Object(o.y)(e);if(!c)return;const{chatId:r,threadId:i,type:l}=c,d=Object(o.f)(e,r),b=Object(o.D)(e,r,i,l);d&&b&&(Object(j.a)("editMessage",{chat:d,message:b,text:s,entities:n,noWebPage:Object(o.cb)(e,r,i)}),t.setEditingId({messageId:void 0}))}),Object(s.b)("cancelSendingMessage",(e,t,a)=>{const{chatId:s,messageId:n}=a,c=Object(o.k)(e,s,n),r=c&&w.get(c.previousLocalId||c.id);r&&Object(j.b)(r),t.apiUpdate({"@type":"deleteMessages",ids:[n],chatId:s})}),Object(s.b)("saveDraft",(e,t,a)=>{const{chatId:s,threadId:n,draft:c}=a;if(!c)return;const{text:l,entities:d}=c,b=Object(o.f)(e,s);return n===i.MAIN_THREAD_ID&&Object(j.a)("saveDraft",{chat:b,text:l,entities:d,replyToMsgId:Object(o.mb)(e,s,n)}),Object(r.x)(e,s,n,"draft",c)}),Object(s.b)("clearDraft",(e,t,a)=>{const{chatId:s,threadId:n,localOnly:c}=a;if(!Object(o.B)(e,s,n))return;const l=Object(o.f)(e,s);return c||n!==i.MAIN_THREAD_ID||Object(j.a)("clearDraft",l),Object(r.x)(e,s,n,"draft",void 0)}),Object(s.b)("toggleMessageWebPage",(e,t,a)=>{const{chatId:s,threadId:n,noWebPage:c}=a;return Object(r.x)(e,s,n,"noWebPage",c)}),Object(s.b)("pinMessage",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageId:n,isUnpin:c,isOneSide:r,isSilent:i}=a;Object(j.a)("pinMessage",{chat:s,messageId:n,isUnpin:c,isOneSide:r,isSilent:i})}),Object(s.b)("unpinAllMessages",(e,t,a)=>{const n=Object(o.f)(e,a.chatId);n&&async function(e){await Object(j.a)("unpinAllMessages",{chat:e});let t=Object(s.e)();t=Object(r.x)(t,e.id,i.MAIN_THREAD_ID,"pinnedIds",[]),Object(s.g)(t)}(n)}),Object(s.b)("deleteMessages",(e,t,a)=>{const{messageIds:s,shouldDeleteForAll:n}=a,c=Object(o.y)(e);if(!c)return;const{chatId:r,threadId:i}=c,l=Object(o.f)(e,r);Object(j.a)("deleteMessages",{chat:l,messageIds:s,shouldDeleteForAll:n});const d=Object(o.C)(e,r,i);s.includes(d)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteScheduledMessages",(e,t,a)=>{const{messageIds:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c}=n,r=Object(o.f)(e,c);Object(j.a)("deleteScheduledMessages",{chat:r,messageIds:s});const i=Object(o.E)(e,c);s.includes(i)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteHistory",(e,t,a)=>{(async()=>{const{chatId:s,shouldDeleteForAll:n}=a,c=Object(o.f)(e,s);if(!c)return;const r=c.lastMessage&&c.lastMessage.id;await Object(j.a)("deleteHistory",{chat:c,shouldDeleteForAll:n,maxId:r}),t.openChat({id:void 0})})()}),Object(s.b)("markMessageListRead",(e,t,a)=>{const s=Object(o.y)(e);if(!s)return;const{chatId:n,threadId:c}=s,r=Object(o.Db)(e,n,c);if(!r)return;const{maxId:i}=a;M(()=>{Object(j.a)("markMessageListRead",{chat:r,threadId:c,maxId:i})})}),Object(s.b)("markMessagesRead",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageIds:n}=a;Object(j.a)("markMessagesRead",{chat:s,messageIds:n})}),Object(s.b)("loadWebPagePreview",(e,t,a)=>{const{text:n}=a;!async function(e){const t=await Object(j.a)("fetchWebPagePreview",{message:e});Object(s.g)({...Object(s.e)(),webPagePreview:t})}(n)}),Object(s.b)("clearWebPagePreview",e=>{if(e.webPagePreview)return{...e,webPagePreview:void 0}}),Object(s.b)("sendPollVote",(e,t,a)=>{const{chatId:s,messageId:n,options:c}=a,r=Object(o.f)(e,s);r&&Object(j.a)("sendPollVote",{chat:r,messageId:n,options:c})}),Object(s.b)("loadPollOptionResults",(e,t,a)=>{const{chat:n,messageId:c,option:o,offset:i,limit:l,shouldResetVoters:b}=a;!async function(e,t,a,n,c,o){const i=await Object(j.a)("loadPollOptionResults",{chat:e,messageId:t,option:a,offset:n,limit:c});if(!i)return;let l=Object(s.e)();l=Object(r.f)(l,Object(d.c)(i.users,"id"));const{voters:b}=l.pollResults;Object(s.g)({...l,pollResults:{...l.pollResults,voters:{...b,[a]:[...!o&&b&&b[a]?b[a]:[],...i&&i.users.map(e=>e.id)].filter((e,t,a)=>a.indexOf(e)===t)},offsets:{...l.pollResults.offsets?l.pollResults.offsets:{},[a]:i.nextOffset||""}}})}(n,c,o,i,l,b)}),Object(s.b)("forwardMessages",e=>{const{fromChatId:t,messageIds:a,toChatId:n}=e.forwardMessages,c=t?Object(o.f)(e,t):void 0,r=n?Object(o.f)(e,n):void 0,i=t&&a?a.sort((e,t)=>e-t).map(a=>Object(o.k)(e,t,a)).filter(Boolean):void 0;c&&r&&i&&i.length&&function(e,t,a){Object(j.a)("forwardMessages",{fromChat:e,toChat:t,messages:a}),Object(s.g)({...Object(s.e)(),forwardMessages:{}})}(c,r,i)}),Object(s.b)("loadScheduledHistory",e=>{const t=Object(o.r)(e);if(!t)return;const{hash:a}=e.scheduledMessages.byChatId[t.id]||{};!async function(e,t){const a=await Object(j.a)("fetchScheduledHistory",{chat:e,hash:t});if(!a)return;const{hash:n,messages:c}=a,o=Object(d.c)(c,"id"),l=Object.keys(o).map(Number).sort((e,t)=>t-e);let b=Object(s.e)();b=Object(r.u)(b,e.id,o,n),b=Object(r.x)(b,e.id,i.MAIN_THREAD_ID,"scheduledIds",l),Object(s.g)(b)}(t,a)}),Object(s.b)("sendScheduledMessages",(e,t,a)=>{const{chatId:s,id:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("sendScheduledMessages",{chat:c,ids:[n]})}),Object(s.b)("rescheduleMessage",(e,t,a)=>{const{chatId:s,messageId:n,scheduledAt:c}=a,r=Object(o.f)(e,s),i=r&&Object(o.pb)(e,r.id,n);r&&i&&Object(j.a)("rescheduleMessage",{chat:r,message:i,scheduledAt:c})}),Object(s.b)("requestThreadInfoUpdate",(e,t,a)=>{const{chatId:s,threadId:n}=a,c=Object(o.Db)(e,s,n);c&&Object(j.a)("requestThreadInfoUpdate",{chat:c,threadId:n})}),Object(s.b)("loadPinnedMessages",(e,t,a)=>{const{chatId:n}=a,c=Object(o.f)(e,n);c&&async function(e){const t=await Object(j.a)("fetchPinnedMessages",{chat:e});if(!t)return;const{messages:a,chats:n,users:c}=t,o=Object(d.c)(a,"id"),l=Object.keys(o).map(Number).sort((e,t)=>t-e);let b=Object(s.e)();b=Object(r.b)(b,e.id,o),b=Object(r.x)(b,e.id,i.MAIN_THREAD_ID,"pinnedIds",l),b=Object(r.f)(b,Object(d.c)(c,"id")),b=Object(r.c)(b,Object(d.c)(n,"id")),Object(s.g)(b)}(c)}),Object(s.b)("loadMessageLink",(e,t,a)=>{const{messageId:s,chatId:n}=a,c=Object(o.f)(e,n),r=Object(o.k)(e,n,s);c&&r&&(async()=>{const e=await Object(j.a)("fetchMessageLink",{chat:c,message:r});e&&Object(E.c)(e.link)})()});var P=a(52);const T=Object(g.g)(e=>e(),500,!1);async function A(e,t){const a=await Object(j.a)("searchGifs",{query:e,offset:t});a&&Object(s.g)(Object(r.Q)(Object(s.e)(),!t,a.gifs,a.nextOffset))}Object(s.b)("loadStickerSets",e=>{const{hash:t}=e.stickers.added||{};!async function(e=0){const t=await Object(j.a)("fetchStickerSets",{hash:e});if(!t)return;Object(s.g)(Object(r.ib)(Object(s.e)(),"added",t.hash,t.sets))}(t)}),Object(s.b)("loadAddedStickers",(e,t)=>{const{setIds:a}=e.stickers.added;a&&a.length&&(async()=>{for(let e=0;e0&&await Object(g.e)(500)})()}),Object(s.b)("loadRecentStickers",e=>{const{hash:t}=e.stickers.recent||{};!async function(e=0){const t=await Object(j.a)("fetchRecentStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,recent:t}})}(t)}),Object(s.b)("loadFavoriteStickers",e=>{const{hash:t}=e.stickers.favorite||{};!async function(e=0){const t=await Object(j.a)("fetchFavoriteStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,favorite:t}})}(t)}),Object(s.b)("loadFeaturedStickers",e=>{const{hash:t}=e.stickers.featured||{};!async function(e=0){const t=await Object(j.a)("fetchFeaturedStickers",{hash:e});if(!t)return;Object(s.g)(Object(r.ib)(Object(s.e)(),"featured",t.hash,t.sets))}(t)}),Object(s.b)("loadStickers",(e,t,a)=>{const{stickerSetId:n}=a;let{stickerSetAccessHash:c}=a;if(!c){const t=Object(o.xb)(e,n);if(!t)return;c=t.accessHash}!async function(e,t){const a=await Object(j.a)("fetchStickers",{stickerSetId:e,accessHash:t});if(!a)return;const{set:n,stickers:c,packs:o}=a;let i=Object(s.e)();i=Object(r.hb)(i,n.id,{...n,stickers:c,packs:o});const l=i.stickers.forEmoji.emoji;l&&o[l]&&(i=Object(r.o)(i));Object(s.g)(i)}(n,c)}),Object(s.b)("loadAnimatedEmojis",()=>{!async function(){const e=await Object(j.a)("fetchAnimatedEmojis");if(!e)return;const{set:t,stickers:a}=e;Object(s.g)(Object(r.q)(Object(s.e)(),{...t,stickers:a}))}()}),Object(s.b)("loadSavedGifs",e=>{const{hash:t}=e.gifs.saved;!async function(e=0){const t=await Object(j.a)("fetchSavedGifs",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,gifs:{...a.gifs,saved:t}})}(t)}),Object(s.b)("faveSticker",(e,t,a)=>{const{sticker:s}=a;s&&Object(j.a)("faveSticker",{sticker:s})}),Object(s.b)("unfaveSticker",(e,t,a)=>{const{sticker:n}=a;n&&function(e){const t=Object(s.e)();Object(s.g)({...t,stickers:{...t.stickers,favorite:{...t.stickers.favorite,stickers:t.stickers.favorite.stickers.filter(({id:t})=>t!==e.id)}}}),Object(j.a)("faveSticker",{sticker:e,unfave:!0})}(n)}),Object(s.b)("toggleStickerSet",(e,t,a)=>{const{stickerSetId:s}=a,n=Object(o.xb)(e,s);if(!n)return;const{accessHash:c,installedDate:r}=n;Object(j.a)(r?"uninstallStickerSet":"installStickerSet",{stickerSetId:s,accessHash:c})}),Object(s.b)("loadEmojiKeywords",(e,t,a)=>{const{language:n}=a;let c=Object(o.F)(e,n);c&&c.isLoading||(Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{...c,isLoading:!0}}}),(async()=>{const t=await Object(j.a)("fetchEmojiKeywords",{language:n,fromVersion:c?c.version:0});e=Object(s.e)(),c=Object(o.F)(e,n),t?Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{isLoading:!1,version:t.version,keywords:{...c&&c.keywords,...t.keywords}}}}):Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{...c,isLoading:!1}}})})())}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:n}=a;n&&T(()=>{!async function(e,t=0){const a=await Object(j.a)("searchStickers",{query:e,hash:t});if(!a)return;const n=Object(s.e)(),{setsById:c,added:o}=n.stickers,i=a.sets.map(({id:e})=>e);o.setIds&&o.setIds.forEach(t=>{if(!i.includes(t)){const{title:a}=c[t]||{};a&&Object(P.a)(a,e)&&i.unshift(t)}});Object(s.g)(Object(r.ib)(n,"search",a.hash,a.sets,i))}(n)})}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;"string"==typeof s&&T(()=>{A(s)})}),Object(s.b)("searchMoreGifs",e=>{const{query:t,offset:a}=e.gifs.search;"string"==typeof t&&T(()=>{A(t,a)})}),Object(s.b)("loadStickersForEmoji",(e,t,a)=>{const{emoji:n}=a,{hash:c}=e.stickers.forEmoji;T(()=>{!async function(e,t=0){let a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,forEmoji:{...a.stickers.forEmoji,emoji:e}}});const n=await Object(j.a)("fetchStickersForEmoji",{emoji:e,hash:t});if(a=Object(s.e)(),!n||a.stickers.forEmoji.emoji!==e)return;a=Object(r.jb)(a,e,n.stickers,n.hash),Object(s.g)(a)}(n,c)})}),Object(s.b)("clearStickersForEmoji",e=>({...e,stickers:{...e.stickers,forEmoji:{}}}));var x=a(36);const R=Object(g.g)(e=>e(),500,!1);async function L(e="",t,a,c,i,l){let b;if(c){const s=await Object(j.a)("searchMessagesLocal",{chatOrUser:c,query:e,type:t,limit:n.y,offsetId:a,minDate:l,maxDate:i});if(s){const{messages:e,users:t,totalCount:a,nextOffsetId:n}=s;b={messages:e,users:t,chats:[],totalCount:a,nextRate:n}}}else b=await Object(j.a)("searchMessagesGlobal",{query:e,offsetRate:a,limit:n.y,type:t,maxDate:i,minDate:l});let u=Object(s.e)();const m=Object(o.t)(u);if(!b||""!==e&&e!==m)return void Object(s.g)(Object(r.T)(u,{messages:!1}));const{messages:h,users:O,chats:g,totalCount:f,nextRate:p}=b;g.length&&(u=Object(r.c)(u,Object(d.c)(g,"id"))),O.length&&(u=Object(r.f)(u,Object(d.c)(O,"id"))),h.length&&(u=Object(r.d)(u,h)),u=Object(r.U)(u,h,f,t,p),Object(s.g)(u)}async function F(){const e=await Object(j.a)("fetchChats",{limit:n.j,archived:!0,withPinned:!0});if(!e)return;let t=Object(s.e)();t=Object(r.ob)(t,Object(d.c)(e.users,"id")),t=Object(r.M)(t,Object(d.c)(e.chats,"id")),t=Object(r.r)(t,"archived",e.chatIds),t=Object(r.J)(t,"archived",e),Object(s.g)(t)}async function D(){let e=Object(s.e)();const{recentlyFoundChatIds:t}=e.globalSearch,{userIds:a}=e.contactList||{};if(!(a&&a.length||t&&t.length))return;const n=[...t||[],...a||[]].map(t=>Object(o.Gb)(e,t)).filter(Boolean),c=await Object(j.a)("fetchUsers",{users:n});c&&(e=Object(s.e)(),e=Object(r.ob)(e,Object(d.c)(c,"id")),Object(s.g)(e))}Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{chatId:n}=e.globalSearch,{query:c}=a;c&&!n&&R(()=>{!async function(e){const t=await Object(j.a)("searchChats",{query:e});let a=Object(s.e)();const n=Object(o.t)(a);if(!t||!n||e!==n)return void Object(s.g)(Object(r.T)(a,{chats:!1}));const{localChats:c,localUsers:i,globalChats:l,globalUsers:b}=t;(c.length||l.length)&&(a=Object(r.c)(a,Object(d.c)([...c,...l],"id")));(i.length||b.length)&&(a=Object(r.f)(a,Object(d.c)([...i,...b],"id")));a=Object(r.T)(a,{chats:!1}),a=Object(r.R)(a,{localResults:{chatIds:c.map(({id:e})=>e),userIds:i.map(({id:e})=>e)},globalResults:{...a.globalSearch.globalResults,chatIds:b.map(({id:e})=>e),userIds:l.map(({id:e})=>e)}}),Object(s.g)(a)}(c)})}),Object(s.b)("setGlobalSearchDate",(e,t,a)=>{const{date:n}=a,c=n?Object(x.m)(n):n,i=Object(r.R)(e,{date:n,query:"",resultsByType:{...e.globalSearch.resultsByType,text:{totalCount:void 0,foundIds:[],nextOffsetId:0}}});Object(s.g)(i);const{chatId:l}=e.globalSearch;L("","text",void 0,l?Object(o.f)(e,l):void 0,c,n)}),Object(s.b)("searchMessagesGlobal",(e,t,a)=>{const{query:s,resultsByType:n,chatId:c,date:r}=e.globalSearch,i=r?Object(x.m)(r):r,{type:l}=a,{nextOffsetId:d}=n&&n[l]||{};L(s,l,d,c?Object(o.f)(e,c):void 0,i,r)}),Object(s.b)("searchTextMessagesLocal",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},c=t?Object(o.f)(e,t):void 0,l=Object(o.A)(e);if(!c||!l||!a)return;const{query:b,results:u}=l,m=u?u.nextOffsetId:void 0;let h;if(a!==i.MAIN_THREAD_ID){const s=Object(o.Cb)(e,t,a);h=s?s.topMessageId:void 0}!async function(e,t,a,c,i){const l=await Object(j.a)("searchMessagesLocal",{chatOrUser:e,type:"text",query:c,topMessageId:a,limit:n.X,offsetId:i});if(!l)return;const{messages:b,users:u,totalCount:m,nextOffsetId:h}=l,O=Object(d.c)(b,"id"),g=Object.keys(O).map(Number);let f=Object(s.e)();const p=Object(o.A)(f);if(!p||c&&c!==p.query)return;f=Object(r.b)(f,e.id,O),f=Object(r.f)(f,Object(d.c)(u,"id")),f=Object(r.Z)(f,e.id,t,g,m,h),Object(s.g)(f)}(c,a,h,b,m)}),Object(s.b)("searchMediaMessagesLocal",e=>{const t=Object(o.w)(e),a=t?e.users.byId[t]||e.chats.byId[t]:void 0,c=Object(o.v)(e);if(!a||!c)return;const{currentType:i,resultsByType:l}=c,b=i&&l&&l[i],u=b?b.nextOffsetId:void 0;i&&async function(e,t,a){const c=await Object(j.a)("searchMessagesLocal",{chatOrUser:e,type:t,limit:n.ob,offsetId:a});if(!c)return;const{messages:i,users:l,totalCount:b,nextOffsetId:u}=c,m=Object(d.c)(i,"id"),h=Object.keys(m).map(Number);let O=Object(s.e)();if(!Object(o.v)(O))return;O=Object(r.b)(O,e.id,m),O=Object(r.f)(O,Object(d.c)(l,"id")),O=Object(r.W)(O,e.id,t,h,b,u),Object(s.g)(O)}(a,i,u)}),Object(s.b)("searchMessagesByDate",(e,t,a)=>{const{timestamp:n}=a,{chatId:c}=Object(o.y)(e)||{};if(!c)return;const r=Object(o.f)(e,c);r&&async function(e,t){const a=await Object(j.a)("findFirstMessageIdAfterDate",{chat:e,timestamp:t});if(!a)return;Object(s.d)().focusMessage({chatId:e.id,messageId:a})}(r,n)}),Object(s.b)("checkPublicLink",(e,t,a)=>{const{chatId:n}=Object(o.y)(e)||{};if(!n)return;if(e.management.progress===l.f.InProgress)return;const{username:c}=a;(async()=>{e=Object(r.bb)(e,l.f.InProgress),e=Object(r.ab)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e);const t=await Object(j.a)("checkChatUsername",{username:c});e=Object(s.e)(),e=Object(r.bb)(e,t?l.f.Complete:l.f.Error),e=Object(r.ab)(e,n,{isUsernameAvailable:t}),Object(s.g)(e)})()}),Object(s.b)("updatePublicLink",(e,t,a)=>{const{chatId:n}=Object(o.y)(e)||{};let c=n&&Object(o.f)(e,n);if(!n||!c)return;const{username:i}=a;(async()=>{if(e=Object(r.bb)(e,l.f.InProgress),Object(s.g)(e),Object(m.ib)(c)){if(c=await Object(j.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}const a=await Object(j.a)("setChatUsername",{chat:c,username:i});e=Object(s.e)(),e=Object(r.bb)(e,a?l.f.Complete:l.f.Error),e=Object(r.ab)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e)})()}),Object(s.b)("updatePrivateLink",e=>{const{chatId:t}=Object(o.y)(e)||{},a=t&&Object(o.f)(e,t);t&&a&&Object(j.a)("updatePrivateLink",{chat:a})}),Object(s.b)("sync",(e,t)=>{!async function(e){n.p&&console.log(">>> START SYNC");await Object(j.a)("fetchCurrentUser");const t=await async function(){const e=await Object(j.a)("fetchChats",{limit:n.j,withPinned:!0});if(!e)return;let t=Object(s.e)();const{recentlyFoundChatIds:a}=t.globalSearch,{userIds:c}=t.contactList||{},{currentUserId:l}=t,b=[...a||[],...c||[],...l?[l]:[]],u=b.map(e=>Object(o.Gb)(t,e)).filter(Boolean),h=b.map(e=>Object(o.f)(t,e)).filter(Boolean),{chatId:O}=Object(o.y)(t)||{};if(O){const e=Object(o.f)(t,O);if(e&&!b.includes(O)&&h.push(e),Object(m.lb)(O)){const e=Object(o.Gb)(t,O);e&&!b.includes(O)&&u.push(e)}}u.push(...e.users),h.push(...e.chats),t=Object(r.s)(t,Object(d.c)(h,"id")),t=Object(r.r)(t,"active",e.chatIds),t={...t,chats:{...t.chats}},t=Object(r.J)(t,"active",e),Object.keys(e.draftsById).map(Number).forEach(a=>{t=Object(r.x)(t,a,i.MAIN_THREAD_ID,"draft",e.draftsById[a])}),Object.keys(e.replyingToById).map(Number).forEach(a=>{t=Object(r.x)(t,a,i.MAIN_THREAD_ID,"replyingToId",e.replyingToById[a])}),Object(s.g)(t),O&&!t.chats.byId[O]&&Object(s.d)().openChat({id:void 0});return u}();await async function(e){let t=!1,a=e||[],c=Object(s.e)();const{chatId:l}=Object(o.y)(c)||{},b=Object.keys(c.messages.byChatId).map(Number).reduce((e,t)=>{const a=Object(o.B)(c,t,i.MAIN_THREAD_ID);return a?{...e,[t]:a}:e},{});if(l){const e=await(u=c.chats.byId[l],Object(j.a)("fetchMessages",{chat:u,threadId:i.MAIN_THREAD_ID,offsetId:u.lastReadInboxMessageId,addOffset:-(Math.round(n.V/2)+1),limit:n.V}));c=Object(s.e)();const{chatId:b}=Object(o.y)(c)||{};if(e&&b===l){const s=c.messages.byChatId[l],n=Object(d.c)(e.messages,"id"),o=Object.keys(n).map(Number);c={...c,messages:{...c.messages,byChatId:{[l]:{byId:n,threadsById:{[i.MAIN_THREAD_ID]:{...s&&s.threadsById[i.MAIN_THREAD_ID],listedIds:o,viewportIds:o,outlyingIds:void 0}}}}}},c=Object(r.M)(c,Object(d.c)(e.chats,"id")),c=Object(r.lb)(c,l,e.threadInfos),t=!0,a=Array.prototype.concat(a,e.users)}}var u;t||(c={...c,messages:{...c.messages,byChatId:{}}});Object.keys(b).map(Number).forEach(e=>{c=Object(r.x)(c,e,i.MAIN_THREAD_ID,"draft",b[e])}),e?c=Object(r.y)(c,Object(d.c)(a,"id")):a&&(c=Object(r.ob)(c,Object(d.c)(a,"id")));Object(s.g)(c);const{chatId:m,messageId:h}=c.audioPlayer;m&&h&&!Object(o.k)(c,m,h)&&Object(s.d)().closeAudioPlayer()}(t),Object(s.g)({...Object(s.e)(),lastSyncTime:Date.now()}),n.p&&console.log(">>> FINISH SYNC");e()}(t.afterSync)}),Object(s.b)("afterSync",(e,t)=>{!async function(e){n.p&&console.log(">>> START AFTER-SYNC");e.loadFavoriteStickers(),await Promise.all([D(),F()]),await Object(j.a)("fetchCurrentUser"),n.p&&console.log(">>> FINISH AFTER-SYNC")}(t)});const B=Object(g.a)(e=>e(),500,!1,!0);function U(e,{visibility:t,allowedIds:a,deniedIds:s}){const{users:{byId:n},chats:{byId:c}}=e,r={visibility:t};let o,i;const l=e=>{if(!Object(m.lb)(e))return;const{id:t,accessHash:a}=n[e]||{};return t?{id:t,accessHash:a}:void 0},d=e=>{if(Object(m.lb)(e))return;const t=c[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(o=a.map(l).filter(Boolean),i=a.map(d).filter(Boolean),o.length>0&&(r.allowedUsers=o),i.length>0&&(r.allowedChats=i)),"everybody"!==t&&"contacts"!==t||(o=s.map(l).filter(Boolean),i=s.map(d).filter(Boolean),o.length>0&&(r.blockedUsers=o),i.length>0&&(r.blockedChats=i)),r}Object(s.b)("loadFullUser",(e,t,a)=>{const{userId:s}=a,n=Object(o.Gb)(e,s);if(!n)return;const{id:c,accessHash:r}=n;B(()=>Object(j.a)("fetchFullUser",{id:c,accessHash:r}))}),Object(s.b)("loadUser",(e,t,a)=>{const{userId:n}=a,c=Object(o.Gb)(e,n);c&&(async()=>{const t=await Object(j.a)("fetchUsers",{users:[c]});t&&(e=Object(s.e)(),e=Object(r.ob)(e,Object(d.c)(t,"id")),Object(s.g)(e))})()}),Object(s.b)("loadTopUsers",e=>{const{hash:t,lastRequestedAt:a}=e.topPeers;(!a||Date.now()-a>6e4)&&async function(e){const t=await Object(j.a)("fetchTopUsers",{hash:e});if(!t)return;const{hash:a,ids:n,users:c}=t;let o=Object(s.e)();o=Object(r.f)(o,Object(d.c)(c,"id")),o={...o,topPeers:{...o.topPeers,hash:a,userIds:n,lastRequestedAt:Date.now()}},Object(s.g)(o)}(t)}),Object(s.b)("loadContactList",e=>{const{hash:t}=e.contactList||{};!async function(e){const t=await Object(j.a)("fetchContactList",{hash:e});if(!t)return;let a=Object(r.f)(Object(s.e)(),Object(d.c)(t.users,"id"));a=Object(r.c)(a,Object(d.c)(t.chats,"id"));const n=e=>e.lastName||e.firstName||"",c=new Intl.Collator("en-US"),o=t.users.sort((e,t)=>c.compare(n(e),n(t))).filter(e=>!e.isSelf);Object(s.g)({...a,contactList:{hash:t.hash,userIds:o.map(e=>e.id)}})}(t)}),Object(s.b)("loadCurrentUser",()=>{Object(j.a)("fetchCurrentUser")}),Object(s.b)("updateContact",(e,t,a)=>{const{userId:n,isMuted:c,firstName:i,lastName:d}=a;!async function(e,t,a,n){const c=Object(s.e)(),i=Object(o.Gb)(c,e);if(!i)return;Object(s.d)().updateChatMutedState({chatId:e,isMuted:t}),Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.InProgress));await Object(j.a)("updateContact",{phone:i.phoneNumber,firstName:a,lastName:n})&&Object(s.g)(Object(r.nb)(Object(s.e)(),i.id,{firstName:a,lastName:n}));Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.Complete))}(n,c,i,d)}),Object(s.b)("deleteUser",(e,t,a)=>{const{userId:n}=a;!async function(e){const t=Object(s.e)(),a=Object(o.Gb)(t,e);if(!a)return;const{id:n,accessHash:c}=a;await Object(j.a)("deleteUser",{id:n,accessHash:c})}(n)}),Object(s.b)("loadProfilePhotos",(e,t,a)=>{const{profileId:n}=a,c=Object(m.lb)(n),i=c?Object(o.Gb)(e,n):void 0,l=c?void 0:Object(o.f)(e,n);(async()=>{const e=await Object(j.a)("fetchProfilePhotos",i,l);if(!e||!e.photos)return;let t=Object(s.e)();c?t=Object(r.nb)(t,n,{photos:e.photos}):(t=Object(r.f)(t,Object(d.c)(e.users,"id")),t=Object(r.H)(t,n,{photos:e.photos})),Object(s.g)(t)})()}),Object(s.b)("clickInlineButton",(e,t,a)=>{const{button:c}=a;switch(c.type){case"command":t.sendBotCommand({command:c.value});break;case"url":c.value.match(n.hb)||c.value.match(n.ib)?t.openTelegramLink({url:c.value}):t.toggleSafeLinkModal({url:c.value});break;case"callback":{const t=Object(o.r)(e);if(!t)return;!async function(e,t,a){const n=await Object(j.a)("answerCallbackButton",{chatId:e.id,accessHash:e.accessHash,messageId:t,data:a});if(!n||!n.message)return;const{message:c,alert:r}=n;r?Object(s.d)().showError({error:{message:c}}):Object(s.d)().showNotification({message:c})}(t,c.messageId,c.value);break}case"requestPoll":t.openPollModal();break;case"buy":{const a=Object(o.r)(e),{messageId:s,value:n}=c;if(!a)return;n?t.getReceipt({receiptMessageId:n,chatId:a.id,messageId:s}):(t.getPaymentForm({messageId:s}),t.setInvoiceMessageInfo(Object(o.k)(e,a.id,s)),t.openPaymentModal({messageId:s}));break}}}),Object(s.b)("sendBotCommand",(e,t,a)=>{const{command:s}=a,{currentUserId:n}=e,c=Object(o.r)(e);n&&c&&async function(e,t,a){await Object(j.a)("sendMessage",{chat:e,text:a})}(c,0,s)}),Object(s.b)("updateProfile",(e,t,a)=>{const{photo:n,firstName:c,lastName:i,bio:d,username:b}=a;(async()=>{const{currentUserId:t}=e;if(t){if(Object(s.g)({...Object(s.e)(),profileEdit:{progress:l.j.InProgress}}),n&&await Object(j.a)("updateProfilePhoto",n),c||i||d){if(await Object(j.a)("updateProfile",{firstName:c,lastName:i,about:d})){e=Object(s.e)();const a=t&&Object(o.Gb)(e,t);a&&Object(s.g)(Object(r.nb)(e,a.id,{firstName:c,lastName:i,fullInfo:{...a.fullInfo,bio:d}}))}}if(b){await Object(j.a)("updateUsername",b)&&t&&Object(s.g)(Object(r.nb)(Object(s.e)(),t,{username:b}))}Object(s.g)({...Object(s.e)(),profileEdit:{progress:l.j.Complete}})}})()}),Object(s.b)("checkUsername",(e,t,a)=>{const{username:n}=a;(async()=>{if(e.profileEdit&&e.profileEdit.progress===l.j.InProgress)return;Object(s.g)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:l.j.Idle,isUsernameAvailable:void 0}});const t=await Object(j.a)("checkUsername",n);e=Object(s.e)(),Object(s.g)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()}),Object(s.b)("loadWallpapers",()=>{(async()=>{const e=await Object(j.a)("fetchWallpapers",0);if(!e)return;const t=Object(s.e)();Object(s.g)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()}),Object(s.b)("uploadWallpaper",(e,t,a)=>{const n=a,c=URL.createObjectURL(n);Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[{slug:l.n,document:{fileName:"",size:n.size,mimeType:n.type,previewBlobUrl:c}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await Object(j.a)("uploadWallpaper",n);if(!t)return;const{wallpaper:a}=t;if(!(e=Object(s.e)()).settings.loadedWallpapers)return;const r=e.settings.loadedWallpapers[0];if(!r||r.slug!==l.n)return;const o={...a,document:{...a.document,previewBlobUrl:c}};Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[o,...e.settings.loadedWallpapers.slice(1)]}})})()}),Object(s.b)("loadBlockedContacts",()=>{(async()=>{const e=await Object(j.a)("fetchBlockedContacts");if(!e)return;let t=Object(s.e)();e.users&&e.users.length&&(t=Object(r.f)(t,Object(d.c)(e.users,"id"))),e.chats&&e.chats.length&&(t=Object(r.M)(t,Object(d.c)(e.chats,"id"))),t={...t,blocked:{...t.blocked,ids:[...t.blocked.ids||[],...e.blockedIds],totalCount:e.totalCount}},Object(s.g)(t)})()}),Object(s.b)("blockContact",(e,t,a)=>{const{contactId:n}=a;(async()=>{if(!await Object(j.a)("blockContact",n))return;const e=Object(s.e)();Object(s.g)(Object(r.a)(e,n))})()}),Object(s.b)("unblockContact",(e,t,a)=>{const{contactId:n}=a;let c;if(Object(m.lb)(n)){const t=Object(o.Gb)(e,n);if(!t)return;c=t.accessHash}(async()=>{if(!await Object(j.a)("unblockContact",n,c))return;const e=Object(s.e)();Object(s.g)(Object(r.p)(e,n))})()}),Object(s.b)("loadAuthorizations",()=>{(async()=>{const e=await Object(j.a)("fetchAuthorizations");e&&Object(s.g)({...Object(s.e)(),activeSessions:e})})()}),Object(s.b)("terminateAuthorization",(e,t,a)=>{const{hash:n}=a;(async()=>{if(!await Object(j.a)("terminateAuthorization",n))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.hash!==n)})})()}),Object(s.b)("terminateAllAuthorizations",()=>{(async()=>{if(!await Object(j.a)("terminateAllAuthorizations"))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.isCurrent)})})()}),Object(s.b)("loadNotificationExceptions",()=>{Object(j.a)("fetchNotificationExceptions")}),Object(s.b)("loadNotificationSettings",()=>{(async()=>{const e=await Object(j.a)("fetchNotificationSettings");e&&Object(s.g)(Object(r.v)(Object(s.e)(),e))})()}),Object(s.b)("updateNotificationSettings",(e,t,a)=>{const{peerType:n,isSilent:c,shouldShowPreviews:o}=a;(async()=>{await Object(j.a)("updateNotificationSettings",n,{isSilent:c,shouldShowPreviews:o})&&Object(s.g)(Object(r.cb)(Object(s.e)(),n,c,o))})()}),Object(s.b)("updateContactSignUpNotification",(e,t,a)=>{const{isSilent:n}=a;(async()=>{await Object(j.a)("updateContactSignUpNotification",n)&&Object(s.g)(Object(r.v)(Object(s.e)(),{hasContactJoinedNotifications:!n}))})()}),Object(s.b)("loadLanguages",()=>{(async()=>{const e=await Object(j.a)("fetchLanguages");e&&Object(s.g)(Object(r.v)(Object(s.e)(),{languages:e}))})()}),Object(s.b)("loadPrivacySettings",()=>{(async()=>{const[e,t,a,n,c]=await Promise.all([Object(j.a)("fetchPrivacySettings","phoneNumber"),Object(j.a)("fetchPrivacySettings","lastSeen"),Object(j.a)("fetchPrivacySettings","profilePhoto"),Object(j.a)("fetchPrivacySettings","forwards"),Object(j.a)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&a&&n&&c))return;const r=Object(s.e)();r.settings.privacy.phoneNumber=e,r.settings.privacy.lastSeen=t,r.settings.privacy.profilePhoto=a,r.settings.privacy.forwards=n,r.settings.privacy.chatInvite=c,Object(s.g)(r)})()}),Object(s.b)("setPrivacyVisibility",(e,t,a)=>{const{privacyKey:n,visibility:c}=a,{privacy:{[n]:r}}=e.settings;if(!r)return;const o=U(e,{visibility:c,allowedIds:[...r.allowUserIds,...r.allowChatIds],deniedIds:[...r.blockUserIds,...r.blockChatIds]});(async()=>{const e=await Object(j.a)("setPrivacySettings",n,o);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("setPrivacySettings",(e,t,a)=>{const{privacyKey:n,isAllowList:c,contactsIds:r}=a,{privacy:{[n]:o}}=e.settings;if(!o)return;const i=U(e,{visibility:o.visibility,allowedIds:c?r:[...o.allowUserIds,...o.allowChatIds],deniedIds:c?[...o.blockUserIds,...o.blockChatIds]:r});(async()=>{const e=await Object(j.a)("setPrivacySettings",n,i);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("loadPasswordInfo",()=>{(async()=>{const e=await Object(j.a)("getPasswordInfo");if(!e)return;let t=Object(s.e)();t=Object(r.v)(t,{hasPassword:e.hasPassword}),t=Object(r.mb)(t,{hint:e.hint}),Object(s.g)(t)})()}),Object(s.b)("checkPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(r.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("checkPassword",n);Object(s.g)(Object(r.mb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("clearPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(r.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("clearPassword",n);Object(s.g)(Object(r.mb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("updatePassword",(e,t,a)=>{const{currentPassword:n,password:c,hint:o,email:i,onSuccess:l}=a;Object(s.g)(Object(r.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("updatePassword",n,c,o,i);Object(s.g)(Object(r.mb)(Object(s.e)(),{isLoading:!1})),e&&l()})()}),Object(s.b)("updateRecoveryEmail",(e,t,a)=>{const{currentPassword:n,email:c,onSuccess:o}=a;Object(s.g)(Object(r.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("updateRecoveryEmail",n,c);Object(s.g)(Object(r.mb)(Object(s.e)(),{isLoading:!1,waitingEmailCodeLength:void 0})),e&&o()})()}),Object(s.b)("provideTwoFaEmailCode",(e,t,a)=>{const{code:s}=a;Object(j.a)("provideRecoveryEmailCode",s)}),Object(s.b)("clearTwoFaError",e=>Object(r.mb)(e,{error:void 0}));var H=a(60);Object(s.b)("validateRequestedInfo",(e,t,a)=>{const{requestInfo:n,saveInfo:c}=a,i=Object(o.hb)(e);i&&async function(e,t,a){const n=await Object(j.a)("validateRequestedInfo",{messageId:e,requestInfo:t,shouldSave:a});if(!n)return;const{id:c,shippingOptions:o}=n;if(!c)return;let i=Object(r.E)(Object(s.e)(),c);o?(i=Object(r.gb)(i,o),i=Object(r.C)(i,l.i.Shipping)):i=Object(r.C)(i,l.i.PaymentInfo);Object(s.g)(i)}(i,n,c)}),Object(s.b)("getPaymentForm",(e,t,a)=>{const{messageId:n}=a;n&&async function(e){const t=await Object(j.a)("getPaymentForm",{messageId:e});if(!t)return;let a=Object(r.B)(Object(s.e)(),t),n=l.i.PaymentInfo;a.payment.invoice&&(a.payment.invoice.shippingAddressRequested||a.payment.invoice.nameRequested||a.payment.invoice.phoneRequested||a.payment.invoice.emailRequested)&&(n=l.i.ShippingInfo);a=Object(r.C)(a,n),Object(s.g)(a)}(n)}),Object(s.b)("getReceipt",(e,t,a)=>{const{receiptMessageId:n,chatId:c,messageId:i}=a;i&&n&&c&&async function(e,t,a){const n=await Object(j.a)("getReceipt",t);if(!n)return;let c=Object(s.e)();const i=Object(o.k)(c,a,e);c=Object(r.D)(c,n,i),Object(s.g)(c)}(i,n,c)}),Object(s.b)("clearPaymentError",e=>{Object(s.g)({...e,payment:{...e.payment,error:void 0}})}),Object(s.b)("clearReceipt",e=>{Object(s.g)({...e,payment:{...e.payment,receipt:void 0}})}),Object(s.b)("sendCredentialsInfo",(e,t,a)=>{const n=Object(o.kb)(e);if(!n)return;const{credentials:c}=a,{data:i}=c;!async function(e,t){const a=function(e){const t=Object.keys(e).map(t=>`${t}=${e[t]}`).join("&");return t.length>0?"?"+t:""}({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvv,"card[address_zip]":e.zip,"card[address_country]":e.country}),n=await fetch("https://api.stripe.com/v1/tokens"+a,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:"Bearer "+t}}),c=await n.json();if(c.error){const e=Object(H.b)(c.error),t=Object(s.e)();return void Object(s.g)({...t,payment:{...t.payment,error:{...e}}})}let o=Object(r.F)(Object(s.e)(),{type:c.type,id:c.id});o=Object(r.C)(o,l.i.Checkout),Object(s.g)(o)}(i,n)}),Object(s.b)("sendPaymentForm",(e,t,a)=>{const{shippingOptionId:n,saveCredentials:c}=a,i=Object(o.hb)(e),l=Object(o.ib)(e),d=Object(o.kb)(e),b=Object(o.zb)(e);i&&d&&async function(e,t,a,n){if(await Object(j.a)("sendPaymentForm",{messageId:e,credentials:t,requestedInfoId:a,shippingOptionId:n})){const e=Object(r.h)(Object(s.e)());Object(s.g)(Object(r.i)(e))}}(i,{save:c,data:b},l,n)}),Object(s.b)("setPaymentStep",(e,t,a={})=>Object(r.C)(e,a.step||l.i.ShippingInfo)),Object(s.b)("setInvoiceMessageInfo",(e,t,a)=>Object(r.A)(e,a));a(87);var G=a(29),q=a(78);const _=Object(g.g)(e=>e(),1e3,!0);Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateChat":{a.noTopChatsRequest||Object(o.M)(e,a.id)||t.loadTopChats();const n=Object(r.H)(e,a.id,a.chat,a.newProfilePhoto);Object(s.g)(n);const c=Object(o.q)(n);_(()=>Object(q.a)(c));break}case"updateChatJoin":{const n=Object(o.j)(e,a.id);if(!n)break;e=Object(r.I)(e,n,[a.id]),e=Object(r.H)(e,a.id,{isNotJoined:!1}),Object(s.g)(e);const c=Object(o.f)(e,a.id);c&&t.requestChatUpdate({chatId:c.id});break}case"updateChatLeave":{const t=Object(o.j)(e,a.id);if(!t)break;const{[t]:n}=e.chats.listIds;n&&(e=Object(r.r)(e,t,n.filter(e=>e!==a.id))),e=Object(r.H)(e,a.id,{isNotJoined:!0}),Object(s.g)(e);break}case"updateChatInbox":Object(s.g)(Object(r.H)(e,a.id,a.chat));break;case"updateChatTypingStatus":{const{id:t,typingStatus:n}=a;Object(s.g)(Object(r.H)(e,t,{typingStatus:n})),setTimeout(()=>{const e=Object(s.e)(),a=Object(o.f)(e,t);a&&n&&a.typingStatus&&a.typingStatus.timestamp===n.timestamp&&Object(s.g)(Object(r.H)(e,t,{typingStatus:void 0}))},6e3);break}case"newMessage":{const{message:n}=a,{chatId:c,threadId:l,type:d}=Object(o.y)(e)||{};if(n.senderId===e.currentUserId&&!n.isFromScheduled)return;const b=Object(o.f)(e,a.chatId);if(!b)return;const u="thread"===d&&l===i.MAIN_THREAD_ID&&a.chatId===c;u?setTimeout(()=>{t.requestChatUpdate({chatId:a.chatId})},1e3):Object(s.g)(Object(r.H)(e,a.chatId,{unreadCount:b.unreadCount?b.unreadCount+1:1,...a.message.hasUnreadMention&&{unreadMentionsCount:b.unreadMentionsCount?b.unreadMentionsCount+1:1}}));const m=Object(o.q)(Object(s.e)());Object(q.a)(m),Object(G.b)({chat:b,message:n,isActiveChat:u});break}case"updateCommonBoxMessages":case"updateChannelMessages":{const{ids:t,messageUpdate:n}=a;if(!1!==n.hasUnreadMention)return;t.forEach(t=>{const s="channelId"in a?a.channelId:Object(o.p)(e,t),n=Object(o.f)(e,s);n&&n.unreadMentionsCount&&(e=Object(r.H)(e,s,{unreadMentionsCount:n.unreadMentionsCount-1}))}),Object(s.g)(e);break}case"updateChatFullInfo":{const{fullInfo:t}=a,n=e.chats.byId[a.id];if(!n)return;Object(s.g)(Object(r.H)(e,a.id,{fullInfo:{...n.fullInfo,...t}}));break}case"updatePinnedChatIds":{const{ids:t,folderId:c}=a,r=c===n.h?"archived":"active";e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:t.length?t:void 0}}},Object(s.g)(e);break}case"updateChatPinned":{const{id:t,isPinned:c}=a,r=Object(o.j)(e,t);if(r){const{[r]:a}=e.chats.orderedPinnedIds;let s=a||[];if(c){if(!s.includes(t)){if("active"===r&&s.length>=n.K){const t=e.chats.listIds.active;s=s.filter(e=>t&&t.includes(e))}s=[t,...s]}}else s=s.filter(e=>e!==t);e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:s.length?s:void 0}}}}Object(s.g)(e);break}case"updateChatListType":{const{id:t,folderId:n}=a;Object(s.g)(Object(r.K)(e,t,n));break}case"updateChatFolder":{const{id:t,folder:n}=a,{byId:c,orderedIds:r}=e.chatFolders,o=n?{...c,[t]:n}:Object(d.l)(c,Object.keys(c).map(Number).filter(e=>e!==t)),i=n?r&&r.includes(t)?r:[...r||[],t]:r?r.filter(e=>e!==t):void 0;Object(s.g)({...e,chatFolders:{...e.chatFolders,byId:o,orderedIds:i}});break}case"updateChatFoldersOrder":{const{orderedIds:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,orderedIds:t}});break}case"updateRecommendedChatFolders":{const{folders:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,recommended:t}});break}case"updateChatMembers":{const t=e.chats.byId[a.id],{replacedMembers:n,addedMember:c,deletedMemberId:o}=a;if(!t)return;let i=!1,l=t.fullInfo&&t.fullInfo.members?[...t.fullInfo.members]:[];if(n)l=n,i=!0;else if(c)l.length&&l.some(e=>e.userId===c.userId)||(l.push(c),i=!0);else if(l.length&&o){const e=l.findIndex(e=>e.userId===o);e>-1&&(l.slice(e,1),i=!0)}if(i){const n=l.filter(({isOwner:e,isAdmin:t})=>e||t);Object(s.g)(Object(r.H)(e,a.id,{membersCount:l.length,fullInfo:{...t.fullInfo,members:l,adminMembers:n}}))}break}case"deleteProfilePhotos":{const{chatId:t,ids:n}=a,c=e.chats.byId[t];c&&c.photos&&Object(s.g)(Object(r.H)(e,t,{photos:c.photos.filter(e=>!n.includes(e.id))}));break}case"draftMessage":{const{chatId:t,formattedText:n,replyingToId:c}=a;e.chats.byId[t]&&(e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"draft",n),e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"replyingToId",c),Object(s.g)(e))}}});function V(e,t,a,s,n=!1){const c=n?Object(o.pb)(e,t,a):Object(o.k)(e,t,a);if(c&&s.content){const{photo:e,video:t,sticker:a,document:n}=Object(m.v)(c);e&&s.content.photo?(s.content.photo.blobUrl=e.blobUrl,s.content.photo.thumbnail=e.thumbnail):t&&s.content.video?s.content.video.blobUrl=t.blobUrl:a&&s.content.sticker?s.content.sticker.isPreloadedGlobally=a.isPreloadedGlobally:n&&s.content.document&&(s.content.document.previewBlobUrl=n.previewBlobUrl)}return n?Object(r.eb)(e,t,a,s):Object(r.L)(e,t,a,s)}function $(e,t){const{id:a,chatId:s}=t,n=Object(o.f)(e,s);if(n&&n.unreadCount&&!Object(o.Y)(e,s,i.MAIN_THREAD_ID))return e;if(e=Object(r.V)(e,s,i.MAIN_THREAD_ID,[a]),Object(o.X)(e,s,i.MAIN_THREAD_ID)){const t=Object(o.H)(e,s,i.MAIN_THREAD_ID),n=Object(r.g)(e,s,i.MAIN_THREAD_ID,a),c=Object(o.Hb)(n,s,i.MAIN_THREAD_ID);t&&!c.includes(t)||(e=n)}const{threadInfo:c,firstMessageId:l}=Object(o.Bb)(e,s,t)||{};return!l&&Object(m.sb)(t)||c&&(e=Object(r.V)(e,s,c.threadId,[a]),Object(o.X)(e,s,c.threadId)&&(e=Object(r.g)(e,s,c.threadId,a),l||(e=Object(r.x)(e,s,c.threadId,"firstMessageId",t.id)),c.lastMessageId||(e=Object(r.x)(e,s,c.threadId,"threadInfo",{...c,lastMessageId:t.id})))),e}function z(e,t,a,s=!1){const{chats:n}=e,c=n.byId[t]&&n.byId[t].lastMessage;if(c&&!s){if(!(c.id===a.id||c.id===a.previousLocalId||a.id>c.id))return e}return Object(r.H)(e,t,{lastMessage:a})}function W(e,t){const a=Object(o.m)(e,t),s=Object(o.Y)(e,t,i.MAIN_THREAD_ID);if(!a||!s)return;let n=s.length;for(;n--;){const e=a[s[n]];if(!e.isDeleting)return e}}function K(e,t,a,n){if(e){t.forEach(t=>{const a=W(n=Object(r.L)(n,e,t,{isDeleting:!0}),e);a&&(n=z(n,e,a,!0))}),Object(s.g)(n),a.requestChatUpdate({chatId:e});const c=[];return t.forEach(t=>{const a=Object(o.k)(n,e,t);if(!a)return;const{threadInfo:s}=Object(o.Bb)(n,e,a)||{};s&&c.push(s.threadId)}),Object(d.o)(c).forEach(t=>{a.requestThreadInfoUpdate({chatId:e,threadId:t})}),void setTimeout(()=>{Object(s.g)(Object(r.j)(Object(s.e)(),e,t))},350)}const c=[];t.forEach(e=>{const t=Object(o.p)(n,e);if(t){c.push(t);const a=W(n=Object(r.L)(n,t,e,{isDeleting:!0}),t);a&&(n=z(n,t,a,!0)),setTimeout(()=>{Object(s.g)(Object(r.j)(Object(s.e)(),t,[e]))},350)}}),Object(s.g)(n),Object(d.o)(c).forEach(e=>{a.requestChatUpdate({chatId:e})})}Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"newMessage":{const{chatId:n,id:c,message:i}=a;e=$(e=V(e,n,c,i),i),i.threadInfo&&(e=Object(r.kb)(e,i.threadInfo.chatId,i.threadInfo.threadId,i.threadInfo)),Object(s.g)(e);const l=Object(o.k)(e,n,c);if(Object(o.a)(e,n,i)){if(i.isOutgoing&&(!i.content||!i.content.action)){const a=Object(o.y)(e);a&&t.focusMessage({chatId:n,threadId:a.threadId,messageId:i.id,noHighlight:!0})}const{threadInfo:a}=Object(o.Bb)(e,n,i)||{};a&&t.requestThreadInfoUpdate({chatId:n,threadId:a.threadId}),Object(m.sb)(i)||setTimeout(()=>{Object(s.g)(z(Object(s.e)(),n,l))},350)}else Object(s.g)(z(Object(s.e)(),n,l));Object(o.M)(e,n)||t.loadTopChats();break}case"newScheduledMessage":{const{chatId:t,id:n,message:c}=a;e=V(e,t,n,c,!0);const l=Object(o.ob)(e,t)||[];e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"scheduledIds",Object(d.o)([...l,n])),Object(s.g)(e);break}case"updateMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.k)(e,t,n))return;e=V(e,t,n,c);const i=Object(o.k)(e,t,n);c.threadInfo&&(e=Object(r.kb)(e,c.threadInfo.chatId,c.threadInfo.threadId,c.threadInfo)),e=z(e,t,i),Object(s.g)(e);break}case"updateScheduledMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.pb)(e,t,n))return;e=V(e,t,n,c,!0);const l=Object.keys(Object(o.qb)(e,t)||{}).map(Number).sort((e,t)=>t-e);e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"scheduledIds",l),Object(s.g)(e);break}case"updateMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a;e=$(e,c);const i=Object(o.k)(e,t,n);e=Object(r.j)(e,t,[n]),c.isScheduled&&(e=Object(r.k)(e,t,[n])),e=Object(r.L)(e,t,c.id,{...i,...c,previousLocalId:n});const l=Object(o.k)(e,t,c.id);e=z(e,t,l),Object(s.g)(e);break}case"updateScheduledMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a,l=Object(o.ob)(e,t)||[];e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"scheduledIds",[...l,c.id]);const d=Object(o.pb)(e,t,n);e=Object(r.k)(e,t,[n]),e=Object(r.eb)(e,t,c.id,{...d,...c,previousLocalId:n}),Object(s.g)(e);break}case"updatePinnedIds":{const{chatId:t,isPinned:n,messageIds:c}=a,l=Object(o.jb)(e,t)||[],d=n?[...l,...c].sort((e,t)=>t-e):l.filter(e=>!c.includes(e));Object(s.g)(Object(r.x)(e,t,i.MAIN_THREAD_ID,"pinnedIds",d));break}case"updateThreadInfo":{const{chatId:t,threadId:n,threadInfo:c,firstMessageId:i}=a,l={...Object(o.Cb)(e,t,n),...c};if(!l.threadId)return;e=Object(r.kb)(e,t,n,l),i&&(e=Object(r.x)(e,t,n,"firstMessageId",i)),Object(s.g)(e);break}case"resetMessages":{const{id:n}=a,c=Object(o.m)(e,n);c&&!Object(m.lb)(n)&&(e=Object(r.j)(e,n,Object.keys(c).map(Number)),Object(s.g)(e),t.loadFullChat({chatId:n,force:!0}));break}case"deleteMessages":{const{ids:s,chatId:n}=a;K(n,s,t,e);break}case"deleteScheduledMessages":{const{ids:t,chatId:n}=a;!function(e,t,a,n){if(!e)return;t.forEach(t=>{n=Object(r.eb)(n,e,t,{isDeleting:!0})}),Object(s.g)(n),setTimeout(()=>{n=Object(r.k)(Object(s.e)(),e,t);const a=Object(o.qb)(n,e);n=Object(r.x)(n,e,i.MAIN_THREAD_ID,"scheduledIds",Object.keys(a||{}).map(Number)),Object(s.g)(n)},350)}(n,t,0,e);break}case"deleteHistory":{const{chatId:s}=a;K(s,Object.keys(e.messages.byChatId[s].byId).map(Number),t,e);break}case"updateCommonBoxMessages":{const{ids:t,messageUpdate:n}=a;t.forEach(t=>{const a=Object(o.p)(e,t);a&&(e=Object(r.L)(e,a,t,n))}),Object(s.g)(e);break}case"updateChannelMessages":{const{channelId:t,ids:n,messageUpdate:c}=a;n.forEach(a=>{e=Object(r.L)(e,t,a,c)}),Object(s.g)(e);break}case"updateMessagePoll":{const{pollId:t,pollUpdate:n}=a,c=Object(o.l)(e,t);if(c&&c.content.poll){const t={...c.content.poll,...n},{results:a}=t.results||{};if(a&&!a.some(e=>e.isChosen)){const{results:e}=c.content.poll.results,s=e&&e.filter(e=>e.isChosen);s&&s.forEach(e=>{const s=a.findIndex(t=>t.option===e.option);s>=0&&(t.results.results[s].isChosen=!0)})}Object(s.g)(Object(r.L)(e,c.chatId,c.id,{content:{...c.content,poll:t}}))}break}case"updateMessagePollVote":{const{pollId:t,userId:n,options:c}=a,i=Object(o.l)(e,t);if(!i||!i.content.poll||!i.content.poll.results)break;const{poll:l}=i.content,{recentVoterIds:d,totalVoters:b,results:u}=l.results,m=d?[...d]:[],h=b?b+1:1,O=u?[...u]:[];m.push(n),c.forEach(t=>{const a=O.find(e=>e.option===t),s=O.findIndex(e=>e.option===t),c=a?{...a}:{option:t,votersCount:0};c.votersCount+=1,n===e.currentUserId&&(c.isChosen=!0),s?O[s]=c:O.push(c)}),Object(s.g)(Object(r.L)(e,i.chatId,i.id,{content:{...i.content,poll:{...l,results:{...l.results,recentVoterIds:m,totalVoters:h,results:O}}}}));break}}});const Q=Object(g.g)((function(){let e=Object(s.e)();Y.forEach(([t,a])=>{e=Object(r.nb)(e,t,{status:a})}),Object(s.g)(e),Y=[]}),3e3,!0);let Y=[];Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"deleteUser":return Object(r.l)(e,a.id);case"updateUser":return Object(r.nb)(e,a.id,a.user);case"updateUserStatus":return s=a.userId,n=a.status,Y.push([s,n]),void Q();case"updateUserFullInfo":{const{id:t,fullInfo:s}=a,n=e.users.byId[t];if(!n)return;return Object(r.nb)(e,t,{fullInfo:{...n.fullInfo,...s}})}}var s,n}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateStickerSet":return Object(r.hb)(e,a.id,a.stickerSet)}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updatePeerBlocked":return a.isBlocked?Object(r.a)(Object(s.e)(),a.id):Object(r.p)(Object(s.e)(),a.id);case"updateResetContactList":Object(s.g)({...Object(s.e)(),contactList:{hash:0,userIds:[]}});break;case"updateFavoriteStickers":t.loadFavoriteStickers();break;case"updatePrivacy":e.settings.privacy[a.key]=a.rules}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateNotifySettings":return Object(r.cb)(e,a.peerType,a.isSilent,a.shouldShowPreviews);case"updateNotifyExceptions":{const{id:t,isMuted:n,isSilent:c,shouldShowPreviews:o}=a;e.chats.byId[t]&&(e=Object(r.H)(e,t,{isMuted:n})),Object(s.g)(Object(r.e)(e,t,{isMuted:n,isSilent:c,shouldShowPreviews:o}));break}}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateTwoFaStateWaitCode":return{...e,twoFaSettings:{...e.twoFaSettings,isLoading:!1,waitingEmailCodeLength:a.length}};case"updateTwoFaError":return{...e,twoFaSettings:{...e.twoFaSettings,error:a.message}}}});var X=a(48),J=a(8),Z=a(35),ee=a(131),te=a(47),ae=a(111),se=a(77),ne=a(25),ce=a(62),re=a(42),oe=a(32),ie=a(154),le=a(141);a(197);var de=Object(c.h)(({id:e,name:t,value:a,label:s,checked:n=!1,disabled:r,inactive:o,noAnimation:i,onChange:l,onCheck:d})=>{const b=Object(c.m)(e=>{l&&l(e),d&&d(e.currentTarget.checked)},[l,d]),u=Object(J.a)("Switcher",r&&"disabled",o&&"inactive",i&&"no-animation");return c.a.createElement("label",{className:u,title:s},c.a.createElement("input",{type:"checkbox",id:e,name:t,value:a,checked:n,disabled:r,onChange:b}),c.a.createElement("span",{className:"widget"}))});a(198);const be=[0,1,2];var ue=Object(c.h)(Object(s.h)(e=>{const{query:t,fetchingStatus:a,chatId:s,date:n}=e.globalSearch,{currentUserId:c}=e,{byId:r}=e.chats,{theme:o,animationLevel:i}=e.settings.byKey;return{searchQuery:t,isLoading:!!a&&Boolean(a.chats||a.messages),currentUserId:c,chatsById:r,globalSearchChatId:s,searchDate:n,theme:o,animationLevel:i}},(e,t)=>Object(d.l)(t,["openChat","openTipsChat","setGlobalSearchDate","setGlobalSearchChatId","setSettingOption"]))(({content:e,contactsFilter:t,onSearchQuery:a,onSelectSettings:s,onSelectContacts:r,onSelectArchived:o,setGlobalSearchChatId:i,onReset:d,searchQuery:b,isLoading:u,currentUserId:O,globalSearchChatId:j,searchDate:g,theme:f,animationLevel:p,chatsById:I,openChat:v,openTipsChat:y,setGlobalSearchDate:C,setSettingOption:E})=>{const w=Object(ne.a)(),M=e===l.d.ChatList,S={date:void 0},k={id:void 0},N=Object(c.p)(()=>g?Object(x.a)(new Date(1e3*g)):void 0,[g]),P=Object(c.p)(()=>M&&I?Object.values(I).reduce((e,t)=>Object(m.hb)(t)&&t.unreadCount?e+1:e,0):0,[M,I]),T=Object(c.p)(()=>({onTrigger:e,isOpen:t})=>c.a.createElement(oe.a,{round:!0,ripple:M&&!h.g,size:"smaller",color:"translucent",className:t?"active":"",onClick:M?e:()=>d(),ariaLabel:M?w("AccDescrOpenMenu2"):"Return to chat list"},c.a.createElement("div",{className:Object(J.a)("animated-menu-icon",!M&&"state-back")})),[M,w,d]),A=Object(c.m)(()=>{b||a("")},[b,a]),R=Object(c.m)(()=>{v({id:O})},[O,v]),L=Object(c.m)(e=>{e.stopPropagation();const t="light"===f?"dark":"light";E({theme:t}),Object(se.a)(t,p>0)},[p,E,f]),F=Object(c.m)(e=>{e.stopPropagation();const t=0===p?2:0;be.forEach((e,a)=>{document.body.classList.toggle("animation-level-"+a,t===a)}),E({animationLevel:t})},[p,E]),D=Boolean(j)||e===l.d.GlobalSearch||e===l.d.Contacts,B=e===l.d.Contacts?w("SearchFriends"):w("Search");return c.a.createElement("div",{className:"LeftMainHeader"},c.a.createElement("div",{id:"LeftMainHeader",className:"left-header"},c.a.createElement(ce.a,{trigger:T,footer:`${n.f} alpha ${n.g}`},c.a.createElement(re.a,{icon:"saved-messages",onClick:R},w("SavedMessages")),c.a.createElement(re.a,{icon:"archive",onClick:o},c.a.createElement("span",{className:"menu-item-name"},w("ArchivedChats")),P>0&&c.a.createElement("div",{className:"archived-badge"},P)),c.a.createElement(re.a,{icon:"user",onClick:r},w("Contacts")),c.a.createElement(re.a,{icon:"settings",onClick:s},w("Settings")),c.a.createElement(re.a,{icon:"darkmode",onClick:L},c.a.createElement("span",{className:"menu-item-name"},w("lng_menu_night_mode")),c.a.createElement(de,{id:"darkmode",label:w("dark"===f?"lng_settings_disable_night_theme":"lng_settings_enable_night_theme"),checked:"dark"===f,noAnimation:!0})),c.a.createElement(re.a,{icon:"animations",onClick:F},c.a.createElement("span",{className:"menu-item-name capitalize"},w("Appearance.Animations").toLowerCase()),c.a.createElement(de,{id:"animations",label:"Toggle Animations",checked:p>0})),c.a.createElement(re.a,{icon:"help",onClick:y},w("TelegramFeatures")),c.a.createElement(re.a,{icon:"bug",href:n.x},"Report Bug"),c.a.createElement(re.a,{icon:"char-K",href:"https://web.telegram.org/k/",onClick:()=>{localStorage.setItem("kz_version",JSON.stringify("K"))}},"Switch to K Version"),c.a.createElement(re.a,{icon:"char-W",href:"https://web.telegram.org/?legacy=1"},"Switch to Old Version")),c.a.createElement(ie.a,{inputId:"telegram-search-input",parentContainerClassName:"LeftSearch",className:j||g?"with-picker-item":"",value:t||b,focused:D,isLoading:u,placeholder:B,autoComplete:"off",canClose:Boolean(j||g),onChange:a,onReset:d,onFocus:A},N&&c.a.createElement(le.a,{icon:"calendar",title:N,canClose:!0,isMinimized:Boolean(j),className:"search-date",onClick:C,clickArg:S}),j&&c.a.createElement(le.a,{chatOrUserId:j,onClick:i,canClose:!0,clickArg:k}))))})),me=a(21);a(199);var he=Object(s.h)(e=>Object(d.l)(e,["connectionState"]))(({connectionState:e})=>{const t=Object(ne.a)();return"connectionStateConnecting"===e&&c.a.createElement("div",{id:"ConnectionState",dir:t.isRtl?"rtl":void 0},c.a.createElement(me.a,{color:"black"}),c.a.createElement("div",{className:"state-text"},t("WaitingForNetwork")))}),Oe=a(132),je=a(51),ge=a(26),fe=(e,t,a)=>{const s=Object(c.q)(),n=(e=>Object(c.p)(()=>Object(g.g)(e=>e(),e),[e]))(t),r=Object(ge.a)();return Object(je.a)(()=>{let t=!0;n(()=>{s.current=e(),t||r()}),t=!1},a),s.current},pe=a(168),Ie=a(189);var ve=Object(c.h)(Object(s.h)(e=>{const{chats:{byId:t},users:{byId:a},chatFolders:{byId:s,orderedIds:n,activeChatFolder:c},currentUserId:r,lastSyncTime:i}=e;return{chatsById:t,usersById:a,chatFoldersById:s,orderedFolderIds:n,lastSyncTime:i,notifySettings:Object(o.eb)(e),notifyExceptions:Object(o.db)(e),activeChatFolder:c,currentUserId:r}},(e,t)=>Object(d.l)(t,["loadChatFolders","setActiveChatFolder","openChat"]))(({chatsById:e,usersById:t,chatFoldersById:a,notifySettings:s,notifyExceptions:n,orderedFolderIds:r,activeChatFolder:o,currentUserId:i,lastSyncTime:l,loadChatFolders:b,setActiveChatFolder:u,openChat:O})=>{const j=Object(c.q)(null),g=Object(ne.a)();Object(c.n)(()=>{l&&b()},[l,b]);const f=Object(c.p)(()=>r?r.map(e=>a[e]||{}).filter(Boolean):void 0,[a,r]),p=fe(()=>{if(!f||!f.length)return;const a=Object.keys(e).map(Number),c=f.map(c=>{const{unreadDialogsCount:r,hasActiveDialogs:o}=Object(m.p)(e,t,c,a,s,n)||{};return{id:c.id,badgeCount:r,isBadgeActive:o}});return Object(d.c)(c,"id")},3e3,[f,e,t,s,n]),I=Object(c.p)(()=>{if(f&&f.length)return[{title:g("FilterAllChats")},...f.map(e=>({title:e.title,...p&&p[e.id]}))]},[f,p,g]),v=Object(c.m)(e=>{u(e)},[u]);Object(c.n)(()=>{I&&I.length&&o>=I.length&&u(0)},[o,I,u]),Object(c.n)(()=>{if(j.current&&h.l&&I&&I.length)return Object(Oe.b)(j.current,{onSwipe:(e,t)=>{t===Oe.a.Left?u(Math.min(o+1,I.length-1)):t===Oe.a.Right&&u(Math.max(0,o-1))}})},[o,I,u]);const y=Object(c.q)();y.current=0!==o,Object(c.n)(()=>y.current?Object(te.a)(()=>{y.current&&u(0)}):void 0,[o,u]),Object(c.n)(()=>{const e=e=>{if(e.metaKey&&e.code.startsWith("Digit")&&I){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;if("0"===t)return void O({id:i});const a=Number(t)-1;if(a>I.length-1)return;u(a),e.preventDefault()}};return document.addEventListener("keydown",e,!0),()=>{document.removeEventListener("keydown",e,!0)}});const{shouldRender:C,transitionClassNames:E}=Object(Z.a)(!r,void 0,!0);function w(e){const t=Object.values(a).find(({title:e})=>e===I[o].title);return t&&0!==o?c.a.createElement(Ie.a,{folderType:"folder",folderId:t.id,noChatsText:g("FilterNoChatsToDisplay"),isActive:e}):c.a.createElement(Ie.a,{folderType:"all",isActive:e})}return c.a.createElement("div",{className:"ChatFolders"},I&&I.length?c.a.createElement(pe.a,{tabs:I,activeTab:o,onSwitchTab:v}):C?c.a.createElement("div",{className:Object(J.a)("tabs-placeholder",E)}):void 0,c.a.createElement(ae.a,{ref:j,name:g.isRtl?"slide-reversed":"slide",activeKey:o,renderCount:I?I.length:void 0},w))})),ye=a(11),Ce=a(17),Ee=a(16);var we=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"LeftSearch");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});var Me=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"ContactList");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)}),Se=a(53);a(210);let ke;var Ne=Object(c.h)(({isShown:e,onNewPrivateChat:t,onNewChannel:a,onNewGroup:s})=>{const[n,r]=Object(c.r)(!1);Object(c.n)(()=>{e||r(!1)},[e]);const o=Object(ne.a)(),i=Object(J.a)("NewChatButton",e&&"revealed",n&&"menu-is-open"),l=Object(c.m)(()=>{ke&&(clearTimeout(ke),ke=void 0)},[]),d=Object(c.m)(()=>{ke&&(clearTimeout(ke),ke=void 0),ke=window.setTimeout(()=>{r(!1)},750)},[]);return c.a.createElement("div",{className:i,onMouseEnter:l,onMouseLeave:d},c.a.createElement(oe.a,{round:!0,color:"primary",className:n?"active":"",onClick:()=>{r(!n)},ariaLabel:o(n?"Close":"NewMessageTitle"),tabIndex:-1},c.a.createElement("i",{className:"icon-new-chat-filled"}),c.a.createElement("i",{className:"icon-close"})),c.a.createElement(Se.a,{isOpen:n,positionX:"right",positionY:"bottom",autoClose:!0,onClose:()=>{r(!1)}},c.a.createElement(re.a,{icon:"channel",onClick:a},o("NewChannel")),c.a.createElement(re.a,{icon:"group",onClick:s},o("NewGroup")),c.a.createElement(re.a,{icon:"user",onClick:t},o("NewMessageTitle"))))});a(211);const Pe=Object.keys(l.d).length/2;let Te;var Ae=Object(c.h)(({content:e,searchQuery:t,searchDate:a,contactsFilter:s,onSearchQuery:n,onContentChange:r,onReset:o})=>{const[i,d]=Object(c.r)(h.l),b=Object(c.q)(!1),u=Object(c.m)(()=>{r(l.d.Settings)},[r]),m=Object(c.m)(()=>{r(l.d.Contacts)},[r]),O=Object(c.m)(()=>{r(l.d.NewChannelStep1)},[r]),j=Object(c.m)(()=>{r(l.d.NewGroupStep1)},[r]),g=Object(c.m)(()=>{r(l.d.Archived)},[r]),f=Object(c.m)(()=>{e===l.d.ChatList&&(b.current=!0,d(!0))},[e]),p=Object(c.m)(()=>{b.current=!1,Te&&(clearTimeout(Te),Te=void 0),Te=window.setTimeout(()=>{b.current||d(!1)},250)},[]);return Object(c.n)(()=>{let t;return e!==l.d.ChatList?t=window.setTimeout(()=>{d(!1)},250):(b.current||h.l)&&d(!0),()=>{t&&(clearTimeout(t),t=void 0)}},[e]),c.a.createElement("div",{id:"LeftColumn-main",onMouseEnter:h.l?void 0:f,onMouseLeave:h.l?void 0:p},c.a.createElement(ue,{content:e,contactsFilter:s,onSearchQuery:n,onSelectSettings:u,onSelectContacts:m,onSelectArchived:g,onReset:o}),c.a.createElement(he,null),c.a.createElement(ae.a,{name:"zoom-fade",renderCount:Pe,activeKey:e},n=>{switch(e){case l.d.ChatList:return c.a.createElement(ve,null);case l.d.GlobalSearch:return c.a.createElement(we,{searchQuery:t,searchDate:a,isActive:n,onReset:o});case l.d.Contacts:return c.a.createElement(Me,{filter:s});default:return}}),c.a.createElement(Ne,{isShown:i,onNewPrivateChat:m,onNewChannel:O,onNewGroup:j}))});var xe=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"Settings");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});var Re=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"NewChat");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});var Le,Fe=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"ArchivedChats");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});a(212);!function(e){e[e.Main=0]="Main",e[e.Settings=1]="Settings",e[e.Archived=2]="Archived",e[e.NewGroup=3]="NewGroup",e[e.NewChannel=4]="NewChannel"}(Le||(Le={}));const De=Object.keys(Le).length/2;var Be=Object(c.h)(Object(s.h)(e=>{const{globalSearch:{query:t,date:a},chatFolders:{activeChatFolder:s}}=e;return{searchQuery:t,searchDate:a,activeChatFolder:s}},(e,t)=>Object(d.l)(t,["setGlobalSearchQuery","setGlobalSearchChatId","resetChatCreation","setGlobalSearchDate","loadPasswordInfo","clearTwoFaError"]))(({searchQuery:e,searchDate:t,activeChatFolder:a,setGlobalSearchQuery:s,setGlobalSearchChatId:n,resetChatCreation:r,setGlobalSearchDate:o,loadPasswordInfo:i,clearTwoFaError:d})=>{const[b,u]=Object(c.r)(l.d.ChatList),[m,O]=Object(c.r)(l.m.Main),[j,g]=Object(c.r)(""),[f,p]=Object(c.r)(0);let I=Le.Main;switch(b){case l.d.Archived:I=Le.Archived;break;case l.d.Settings:I=Le.Settings;break;case l.d.NewChannelStep1:case l.d.NewChannelStep2:I=Le.NewChannel;break;case l.d.NewGroupStep1:case l.d.NewGroupStep2:I=Le.NewGroup}const v=Object(c.m)(e=>{if(b!==l.d.NewGroupStep2||e){if(b===l.d.NewGroupStep1){const e=document.getElementById("new-group-picker-search");e&&e.blur()}if(b===l.d.Settings)switch(m){case l.m.EditProfile:case l.m.Folders:case l.m.General:case l.m.Notifications:case l.m.Privacy:case l.m.Language:return void O(l.m.Main);case l.m.GeneralChatBackground:return void O(l.m.General);case l.m.GeneralChatBackgroundColor:return void O(l.m.GeneralChatBackground);case l.m.PrivacyPhoneNumber:case l.m.PrivacyLastSeen:case l.m.PrivacyProfilePhoto:case l.m.PrivacyForwarding:case l.m.PrivacyGroupChats:case l.m.PrivacyActiveSessions:case l.m.PrivacyBlockedUsers:case l.m.TwoFaDisabled:case l.m.TwoFaEnabled:case l.m.TwoFaCongratulations:return void O(l.m.Privacy);case l.m.PrivacyPhoneNumberAllowedContacts:case l.m.PrivacyPhoneNumberDeniedContacts:return void O(l.m.PrivacyPhoneNumber);case l.m.PrivacyLastSeenAllowedContacts:case l.m.PrivacyLastSeenDeniedContacts:return void O(l.m.PrivacyLastSeen);case l.m.PrivacyProfilePhotoAllowedContacts:case l.m.PrivacyProfilePhotoDeniedContacts:return void O(l.m.PrivacyProfilePhoto);case l.m.PrivacyForwardingAllowedContacts:case l.m.PrivacyForwardingDeniedContacts:return void O(l.m.PrivacyForwarding);case l.m.PrivacyGroupChatsAllowedContacts:case l.m.PrivacyGroupChatsDeniedContacts:return void O(l.m.PrivacyGroupChats);case l.m.TwoFaNewPassword:return void O(l.m.TwoFaDisabled);case l.m.TwoFaNewPasswordConfirm:return void O(l.m.TwoFaNewPassword);case l.m.TwoFaNewPasswordHint:return void O(l.m.TwoFaNewPasswordConfirm);case l.m.TwoFaNewPasswordEmail:return void O(l.m.TwoFaNewPasswordHint);case l.m.TwoFaNewPasswordEmailCode:return void O(l.m.TwoFaNewPasswordEmail);case l.m.TwoFaChangePasswordCurrent:case l.m.TwoFaTurnOff:case l.m.TwoFaRecoveryEmailCurrentPassword:return void O(l.m.TwoFaEnabled);case l.m.TwoFaChangePasswordNew:return void O(l.m.TwoFaChangePasswordCurrent);case l.m.TwoFaChangePasswordConfirm:return void O(l.m.TwoFaChangePasswordNew);case l.m.TwoFaChangePasswordHint:return void O(l.m.TwoFaChangePasswordConfirm);case l.m.TwoFaRecoveryEmail:return void O(l.m.TwoFaRecoveryEmailCurrentPassword);case l.m.TwoFaRecoveryEmailCode:return void O(l.m.TwoFaRecoveryEmail);case l.m.FoldersCreateFolder:case l.m.FoldersEditFolder:return void O(l.m.Folders)}b!==l.d.ChatList||0!==a?(u(l.d.ChatList),g(""),s({query:""}),o({date:void 0}),n({id:void 0}),r(),setTimeout(()=>{p(Date.now())},250)):u(l.d.GlobalSearch)}else u(l.d.NewGroupStep1)},[b,a,s,o,n,r,m]),y=Object(c.m)(t=>{b!==l.d.Contacts?(u(l.d.GlobalSearch),t!==e&&s({query:t})):g(t)},[b,s,e]);return Object(c.n)(()=>b!==l.d.ChatList||0===a?Object(te.a)(()=>v()):void 0,[a,b,v]),Object(c.n)(()=>{d(),m===l.m.Privacy&&i()},[d,i,m]),c.a.createElement(ae.a,{id:"LeftColumn",name:h.g?"slide-layers":"push-slide",renderCount:De,activeKey:I},a=>{switch(I){case Le.Archived:return c.a.createElement(Fe,{isActive:a,onReset:v});case Le.Settings:return c.a.createElement(xe,{currentScreen:m,onScreenSelect:O,onReset:v});case Le.NewChannel:return c.a.createElement(Re,{key:f,isChannel:!0,content:b,onContentChange:u,onReset:v});case Le.NewGroup:return c.a.createElement(Re,{key:f,content:b,onContentChange:u,onReset:v});default:return c.a.createElement(Ae,{content:b,searchQuery:e,searchDate:t,contactsFilter:j,onContentChange:u,onSearchQuery:y,onReset:v})}})})),Ue=a(139),He=a(12),Ge=a(13),qe=a(56);var _e=()=>{const[e,t]=Object(c.r)(qe.a.get());return Object(c.n)(()=>{const e=Object(g.g)(()=>{t(qe.a.get())},250,!1);return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}},[]),e},Ve=a(175);function $e(e,t){const a=e<=n.db?16:32,s=function(e){if(e>n.ab){const t=Math.min(Math.max(.25*e,288),424),a=Math.min(.25*e,424);return Math.min(e-t-a,728)}if(e>n.Z){const t=Math.min(Math.max(.4*e,288),424);return Math.min(e-t,728)}if(e>728)return 728;return e}(e),c=e<=n.db?54:64,r=t?s-a-c:s-a,o=e>n.db?Math.min(s-a,512):s-a,i=o/r,l=r/o;return{composerHiddenScale:i,toolbarHiddenScale:l,composerTranslateX:t?c/2*l:0,toolbarTranslateX:t?c/2*-1*i:0,unpinHiddenScale:o/258,toolbarForUnpinHiddenScale:258/o}}var ze=a(134),We=a(144),Ke=a(135),Qe=a(49),Ye=a(109),Xe=a(123);var Je=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"HeaderMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var Ze=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=Boolean(n&&Object(m.jb)(n));if(n&&n.isRestricted)return{noMenu:!0};const r=Object(o.P)(e,t),l="thread"===s&&a===i.MAIN_THREAD_ID,d="thread"===s&&a!==i.MAIN_THREAD_ID,b=Object(o.W)(e),u=Boolean(Object(o.L)(e,t)),O=Boolean(l&&n&&(c||Object(m.nb)(n))&&n.isNotJoined),j=l||d,g=l&&!r&&!O,f=!Object(o.S)(e),p=l&&!O;return{noMenu:!(h.g&&O||h.g&&j||g||f||p),isChannel:c,isRightColumnShown:b,canStartBot:u,canSubscribe:O,canSearch:j,canMute:g,canSelect:f,canLeave:p}},(e,t)=>Object(d.l)(t,["joinChannel","sendBotCommand","openLocalTextSearch"]))(({chatId:e,threadId:t,noMenu:a,isChannel:s,canStartBot:n,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,isRightColumnShown:b,joinChannel:u,sendBotCommand:m,openLocalTextSearch:O})=>{const j=Object(c.q)(null),[g,f]=Object(c.r)(!1),[p,I]=Object(c.r)(void 0),v=Object(c.m)(()=>{f(!0);const e=j.current.getBoundingClientRect();I({x:e.right,y:e.bottom})},[]),y=Object(c.m)(()=>{f(!1)},[]),C=Object(c.m)(()=>{I(void 0)},[]),E=Object(c.m)(()=>{u({chatId:e})},[u,e]),w=Object(c.m)(()=>{m({command:"/start"})},[m]),M=Object(c.m)(()=>{if(O(),h.g){document.querySelector("#MobileSearch input").focus()}else setTimeout(()=>{const e=document.querySelector(".RightHeader .SearchInput input");e&&e.focus()},400)},[O]),S=Object(ne.a)();return c.a.createElement("div",{className:"HeaderActions"},!h.g&&r&&c.a.createElement(oe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:E},S(s?"Subscribe":"Join Group")),!h.g&&n&&c.a.createElement(oe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:w},S("Start")),!h.g&&o&&c.a.createElement(oe.a,{round:!0,ripple:b,color:"translucent",size:"smaller",onClick:M,ariaLabel:"Search in this chat"},c.a.createElement("i",{className:"icon-search"})),(h.g||!r)&&c.a.createElement(oe.a,{ref:j,className:g?"active":"",round:!0,ripple:!h.g,size:"smaller",color:"translucent",disabled:a,ariaLabel:"More actions",onClick:v},c.a.createElement("i",{className:"icon-more"})),p&&c.a.createElement(Je,{chatId:e,threadId:t,isOpen:g,anchor:p,isChannel:s,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,onSubscribeChannel:E,onSearchClick:M,onClose:y,onCloseAnimationEnd:C}))})),et=a(115),tt=a(23),at=a(108),st=a(44);function nt(e){const t=e&&Object(m.E)(e),{sticker:a}=e&&e.content||{},s=t&&a&&!Object(h.p)()&&t.includes("image/webp"),[r,o]=Object(c.r)(st.a),i=e&&e.id;return Object(c.o)(()=>{s&&Object(st.c)("b64-"+i,t).then(o).catch(e=>{n.p&&console.error(e)})},[i,s,t]),s?r:t}var ct=a(117),rt=a(43),ot=a(34);function it(e,t,a,s,n){return`M${e},${t+n}a${n},${n},0,0,1,\n ${a},0v${s-2*n}a${n},${n},0,0,1,${-a},0Z`}var lt=Object(c.h)(({count:e,index:t})=>{const a=Object(c.q)(null),s=Object(c.p)(()=>function(e,t){const a=e-t-1,s=function(e){let t=8;1===e?t=36:2===e?t=17:3===e?t=11:(4===e||e>3)&&(t=7.5);return t}(e),n=function(e,t){let a=36;1===e?a=36:2===e?a=17:3===e?a=1===t?12:11:(4===e||e>3)&&(a=7.5);return a}(e,a),c=function(e,t){return e<=3?36:t*e+2*(e-1)}(e,s),r="clipPath"+e,o=function(e,t,a){let s="";if(3===a)s=it(0,0,2,t,1)+it(0,12,2,t+1,1)+it(0,25,2,t,1);else for(let e=0;e\n \n `}(r,s,e),i=function(e,t,a){if(1===a)return 0;if(2===a)return 0===e?0:t+2;return 3===a?0===e?0:1===e?12:25:(t+2)*e}(a,s,e),l=function(e,t,a,s){if(t<=4)return 0;if(e<=1)return 0;if(e>=t-2)return s-36;return(a+4)/2+(e-2)*(a+2)}(a,e,s,c);return{markHeight:n,clipPath:o,markTranslateY:i,trackTranslateY:l,trackHeight:c,clipPathId:r}}(e,t),[e,t]);if(Object(c.n)(()=>{if(!a.current)return;const{trackHeight:e,trackTranslateY:t,markHeight:n,markTranslateY:c,clipPathId:r,clipPath:o}=s,i=a.current.firstElementChild;if(a&&a.current){const s=a.current,{style:l}=s;l.height=e+"px",l.transform=`translateY(-${t}px)`,l.clipPath=`url("#${r}")`;const d=s.querySelector("svg"),b=s.querySelector("div"),u=s.querySelector("defs");d||i&&(i.innerHTML=` ${o} `),u&&(u.innerHTML=o),b&&(b.style.height=n+"px",b.style.transform=`translateY(${c}px)`)}},[s]),1===e)return c.a.createElement("div",{className:"pinned-message-border"},c.a.createElement("div",{className:"pinned-message-border-wrapper-1",ref:a}));const{trackHeight:n,trackTranslateY:r,markHeight:o,markTranslateY:i,clipPathId:l}=s;return c.a.createElement("div",{className:Object(J.a)("pinned-message-border",e>4&&"pinned-message-border-mask")},c.a.createElement("div",{className:"pinned-message-border-wrapper",ref:a,style:`clip-path: url("#${l}"); width: 2px;\n height: ${n}px; transform: translateY(-${r}px);`},c.a.createElement("span",null),c.a.createElement("div",{className:"pinned-message-border-mark",style:`height: ${o}px; transform: translateY(${i}px);`})))});var dt=Object(c.h)(({message:e,count:t,index:a,customTitle:s,className:n,onUnpinMessage:r,onClick:o,onAllPinnedClick:i})=>{const l=Object(ne.a)(),d=nt(e),b=Object(at.a)(Object(m.D)(e,"pictogram")),u=Object(m.N)(l,e,Boolean(d)),[h,O,j]=Object(ot.a)(),g=Object(c.m)(()=>{j(),r&&r(e.id)},[j,r,e.id]);return c.a.createElement("div",{className:Object(J.a)("HeaderPinnedMessage-wrapper",n)},t>1&&c.a.createElement(oe.a,{round:!0,size:"smaller",color:"translucent",className:"pin-list-button",ariaLabel:l("EventLogFilterPinnedMessages"),onClick:i},c.a.createElement("i",{className:"icon-pin-list"})),r&&c.a.createElement(oe.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:l("UnpinMessageAlertTitle"),className:"unpin-button",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(ct.a,{isOpen:h,onClose:j,text:"Would you like to unpin this message?",confirmLabel:"Unpin",confirmHandler:g}),c.a.createElement("div",{className:"HeaderPinnedMessage",onClick:o,dir:l.isRtl?"rtl":void 0},c.a.createElement(lt,{count:t,index:a}),d&&function(e,t){const{width:a,height:s}=Object(et.k)();return c.a.createElement("img",{src:t||e,width:a,height:s,alt:""})}(d,b),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"title",dir:"auto"},s||`${l("PinnedMessage")} ${a>0?"#"+(t-a):""}`),c.a.createElement("p",{dir:"auto"},Object(tt.a)(u))),c.a.createElement(rt.a,null)))}),bt=a(54),ut=a(176);a(215);var mt=Object(s.h)((e,{message:t})=>({sender:Object(o.tb)(e,t)}),(e,t)=>Object(d.l)(t,["focusMessage","closeAudioPlayer"]))(({message:e,className:t,noUi:a,sender:s,focusMessage:n,closeAudioPlayer:r})=>{const o=Object(ne.a)(),i=s?Object(m.V)(o,s):void 0,l=bt.c(Object(m.D)(e,"inline")),{playPause:d,isPlaying:b}=Object(ut.a)(Object(m.A)(e),Object(m.r)(e),l,void 0,void 0,!0),u=Object(c.m)(()=>{n({chatId:e.chatId,messageId:e.id})},[n,e.chatId,e.id]),O=Object(c.m)(()=>{b&&d(),r()},[r,b,d]);if(a)return;const j=Object(m.u)(e);return c.a.createElement("div",{className:Object(J.a)("AudioPlayer",t),dir:o.isRtl?"rtl":void 0},c.a.createElement(oe.a,{round:!0,ripple:!h.g,color:"translucent",size:"smaller",className:Object(J.a)("toggle-play",b?"pause":"play"),onClick:d,ariaLabel:b?"Pause audio":"Play audio"},c.a.createElement("i",{className:"icon-play"}),c.a.createElement("i",{className:"icon-pause"})),c.a.createElement("div",{className:"AudioPlayer-content",onClick:u},j?function(e){const{title:t,performer:a,fileName:s}=e;return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title",dir:"auto"},Object(tt.a)(t||s)),a&&c.a.createElement("div",{className:"subtitle",dir:"auto"},Object(tt.a)(a)))}(j):function(e,t){return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title",dir:"auto"},t&&Object(tt.a)(t)),c.a.createElement("div",{className:"subtitle",dir:"auto"},e))}(o("AttachAudio"),i),c.a.createElement(rt.a,null)),c.a.createElement(oe.a,{round:!0,className:"player-close",color:"translucent",size:"smaller",onClick:O,ariaLabel:"Close player"},c.a.createElement("i",{className:"icon-close"})))});a(216);var ht=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const{isLeftColumnShown:n,lastSyncTime:c}=e,{byId:r}=e.chats,l=Object(o.f)(e,t),{typingStatus:d}=l||{},{chatId:b,messageId:u}=e.audioPlayer,m=b&&u?Object(o.k)(e,b,u):void 0,h=Object(o.Db)(e,t,a);let O;if("pinned"===s){const a=Object(o.jb)(e,t);O=a&&a.length}else if("scheduled"===s){const a=Object(o.ob)(e,t);O=a&&a.length}else if("thread"===s&&a!==i.MAIN_THREAD_ID){const s=Object(o.Cb)(e,t,a);s&&(O=s.messagesCount)}const j={typingStatus:d,isLeftColumnShown:n,isRightColumnShown:Object(o.W)(e),isSelectModeActive:Object(o.S)(e),audioMessage:m,chat:l,chatsById:r,originChatId:h?h.id:t,messagesCount:O,isChatWithSelf:Object(o.P)(e,t),isChatWithBot:l&&Object(o.O)(e,l),lastSyncTime:c,notifySettings:Object(o.eb)(e),notifyExceptions:Object(o.db)(e)},g=Object(o.m)(e,t);if("thread"!==s||!g)return j;if(Object.assign(j,{messagesById:g}),a!==i.MAIN_THREAD_ID){const s=Object(o.Eb)(e,t,a),n=s?Object(o.k)(e,t,s):void 0,c=n?Object(o.K)(e,n):void 0;return{...j,pinnedMessageIds:s,canUnpin:!1,topMessageSender:c}}const f=Object(o.jb)(e,t);if(f&&f.length){const t=g[f[0]],{canUnpin:s}=t&&Object(o.b)(e,t,a)||{};return{...j,pinnedMessageIds:f,canUnpin:s}}return j},(e,t)=>Object(d.l)(t,["openChatWithInfo","pinMessage","focusMessage","openChat","loadPinnedMessages","toggleLeftColumn","exitMessageSelectMode"]))(({chatId:e,threadId:t,messageListType:a,pinnedMessageIds:s,messagesById:r,canUnpin:o,topMessageSender:l,typingStatus:d,isSelectModeActive:b,isLeftColumnShown:u,isRightColumnShown:O,audioMessage:j,chat:g,chatsById:f,originChatId:p,messagesCount:I,isChatWithSelf:v,isChatWithBot:y,lastSyncTime:C,notifySettings:E,notifyExceptions:w,openChatWithInfo:M,pinMessage:S,focusMessage:k,openChat:N,loadPinnedMessages:P,toggleLeftColumn:T,exitMessageSelectMode:A})=>{const x=Object(ne.a)(),[R,L]=Object(c.r)(0),F=Array.isArray(s)?s[R]:s,D=r&&F?r[F]:void 0,B=Array.isArray(s)?s.length:s?1:0,U=g&&Object(m.l)(x,g).length,H=l?Object(m.V)(x,l):void 0;Object(c.n)(()=>{t===i.MAIN_THREAD_ID&&C&&P({chatId:e})},[e,P,C,t]),Object(c.n)(()=>{L(0)},[s]),Object(We.a)(e,F,D);const{width:G}=_e(),q=G<=n.Z,_=G>=n.db&&u,V=Object(c.q)(null),$=Object(c.q)(!0),z=Object(c.m)(()=>{M({id:e})},[M,e]),W=Object(c.m)(t=>{S({chatId:e,messageId:t,isUnpin:!0})},[S,e]),K=Object(c.m)(()=>{if(D){k({chatId:D.chatId,threadId:t,messageId:D.id});const e=Object(ze.a)(B,R+1);L(e)}},[D,k,t,B,R]),Q=Object(c.m)(()=>{N({id:e,threadId:i.MAIN_THREAD_ID,type:"pinned"})},[N,e]),Y=Object(c.m)(()=>{if(h.g){const e=document.getElementById(n.v);e&&e.blur()}t!==i.MAIN_THREAD_ID||"thread"!==a?("scheduled"===a&&b&&A(),N({id:p,threadId:i.MAIN_THREAD_ID})):h.g?N({id:void 0}):T()},[N,p,t,a,T,b,A]),X=Object(c.p)(()=>{if(!q||!f)return;let e=!1;const t=Object.values(f).reduce((t,a)=>{if(Object(m.hb)(a))return t;const s=a.unreadCount||0;return!s||Object(m.Cb)(a,E,w)&&!a.unreadMentionsCount||(e=!0),t+s},0);return t?{isActive:e,totalCount:t}:void 0},[q,f,E,w]),ee=G>=n.Z&&Gn.db&&G30),te=ee||G>n.ab&&G{const e=V.current;if(e)return te&&ue?void(O||ee?($.current&&(e.classList.add("tools-stacked","animated"),$.current=!1),setTimeout(()=>{e.classList.remove("animated")},350)):(e.classList.remove("tools-stacked"),$.current=!0)):(e.classList.remove("tools-stacked","animated"),void($.current=!0))},[te,ue,ee,O]),c.a.createElement("div",{className:"MiddleHeader",ref:V},c.a.createElement(ae.a,{name:"slide-fade",activeKey:"thread"===a?t:1},me),c.a.createElement("div",{className:"header-tools"},ie&&de&&!se&&c.a.createElement(dt,{key:e,message:de,count:B,index:R,customTitle:be,className:le,onUnpinMessage:o?W:void 0,onClick:K,onAllPinnedClick:Q}),se&&re&&c.a.createElement(mt,{key:Object(m.A)(re),message:re,className:ce}),c.a.createElement(Ze,{chatId:e,threadId:t,messageListType:a})))})),Ot=a(159);function jt(e){return"albumId"in e}function gt(e,t){let a,s=[],n={originalDate:e[0].date,datetime:Number(Object(x.j)(1e3*e[0].date)),senderGroups:[s]};const c=[n];return e.forEach((r,o)=>{r.isInAlbum?a?(a.messages.push(r),r.content.text&&(a.mainMessage=r)):a={albumId:r.groupedId,messages:[r],mainMessage:r}:s.push(r);const i=e[o+1];if(!a||i&&i.groupedId&&i.groupedId===a.albumId||(s.push(a),a=void 0),i){const e=Number(Object(x.j)(1e3*i.date));n.datetime!==e?(n={originalDate:i.date,datetime:e,senderGroups:[]},c.push(n),s=[],n.senderGroups.push(s)):(i.id===t||r.senderId!==i.senderId||r.isOutgoing!==i.isOutgoing||Object(m.db)(r)||Object(m.db)(i)||r.forwardInfo&&i.forwardInfo&&(r.forwardInfo.senderUserId!==i.forwardInfo.senderUserId||r.forwardInfo.fromChatId!==i.forwardInfo.fromChatId||r.forwardInfo.hiddenUserName!==i.forwardInfo.hiddenUserName)||r.inlineButtons||i.inlineButtons)&&(s=[],n.senderGroups.push(s))}}),c}var ft=a(107);function pt(){const[e,t]=Object(ot.a)(!1),a=(s=1e3,n=!1,Object(c.p)(()=>Object(g.a)(e=>e(),s,n,r),[s,n,r]));var s,n,r;return{isScrolled:e,updateStickyDates:Object(c.m)((e,s)=>{t(),document.body.classList.contains("is-scrolling-messages")||Object(g.b)(()=>{document.body.classList.add("is-scrolling-messages")}),a(()=>{Object(g.b)(()=>{const t=document.querySelector(".stuck");t&&t.classList.remove("stuck");const a=function(e,t){const a=e.querySelectorAll(".sticky-date"),s=e.scrollTop;return Array.from(a).find(e=>{const{offsetTop:a,offsetHeight:n}=e,c=a-s;return-n<=c&&c<=(t?60:10)})}(e,s);a&&a.classList.add("stuck"),document.body.classList.remove("is-scrolling-messages")})})},[t,a])}}var It=a(155),vt=a(124);let yt=!1;var Ct=({containerRef:e,className:t,messageIds:a,focusingId:s,loadMoreForwards:r,loadMoreBackwards:o,isViewportNewest:i,firstUnreadId:l,onFabToggle:d,onNotchToggle:b,children:u})=>{const m=Object(c.q)(null),h=Object(c.q)(null),O=Object(c.q)(null),j=Object(c.m)(()=>{if(yt)return;if(!a||!a.length)return d(!1),void b(!1);if(!i)return d(!0),void b(!0);const{offsetHeight:t,scrollHeight:s,scrollTop:n}=e.current,c=s-n-t,r=c<=0;d(l?!r:!(c<=50)),b(!r)},[a,i,e,d,l,b]),{observe:g,freeze:f,unfreeze:p}=Object(ft.a)({rootRef:e,margin:n.U},t=>{if(!r||!o)return;const a=t.find(({isIntersecting:e})=>e);if(!a)return;const{target:s}=a;"backwards-trigger"===s.className?(Object(It.a)(e.current),o()):"forwards-trigger"===s.className&&(Object(It.a)(e.current),r())});Object(ft.c)(m,g),Object(ft.c)(h,g);const{observe:I,freeze:v,unfreeze:y}=Object(ft.a)({rootRef:e,margin:50},j);Object(ft.c)(O,I);const{observe:C}=Object(ft.a)({rootRef:e},j);return Object(ft.c)(O,C),Object(je.a)(()=>{s?(f(),v()):(y(),p())},[s]),Object(je.a)(()=>{yt=!0,setTimeout(()=>{yt=!1},100)},[a]),Object(c.n)(j,[l]),c.a.createElement("div",{className:t,teactFastList:!0},c.a.createElement("div",{ref:m,key:"backwards-trigger",className:"backwards-trigger"}),u,c.a.createElement("div",{ref:h,key:"forwards-trigger",className:"forwards-trigger"}),c.a.createElement("div",{ref:O,key:"fab-trigger",className:"fab-trigger"}))},Et=a(145),wt=a(146);function Mt(e){return"number"==typeof e}function St(e,t){return e?t?238:175:100}function kt(e){const t=Object(m.tb)(e),a=Object(m.qb)(e),s=Object(m.G)(e)||Object(m.R)(e),n=Object(m.P)(e),c=Boolean(Object(m.R)(e)),{width:r,height:o}=s?Object(et.f)(s,t,a,c):Object(et.h)(n,t,a),i=St(Boolean(Object(m.O)(e)));let l=1;re+t,t)}function Lt(e,t,a){return ea?a:e}function Ft(e){const t={width:0,height:0};return e.forEach(({dimensions:e,sides:a})=>{a&Tt&&(t.width=e.width+e.x),a&At&&(t.height=e.height+e.y)}),t}function Dt(e,t,a,s){const c=a.messages.map(e=>{const t=kt(e);return t.width/t.height});const r=function(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}(c),o=function(e){return e.reduce((e,t)=>t+e,1)/e.length}(c),i=c.length,l=c.some(e=>e>2),d=function(e,t,a){return a<=n.db?a/100*69-(t?1.625:0)*et.c:((e?30:29)-(t?1.625:0))*et.c}(e,t,s);let b;const u={ratios:c,proportions:r,averageRatio:o,maxWidth:d,minWidth:100,maxHeight:d,spacing:2};return b=i>=5||l?function({ratios:e,averageRatio:t,maxWidth:a,minWidth:s,spacing:n,maxHeight:c=4*a/3}){const r=function(e,t){return e.map(e=>t>1.1?Lt(e,1,2.75):Lt(e,.6667,1))}(e,t),o=e.length,i=new Array(o),l=[],d=e=>{const t=[];let s=0;e.forEach(e=>{t.push(((e,t)=>{const s=Rt(r.slice(e,e+t),0);return(a-(t-1)*n)/s})(s,e)),s+=e}),l.push({lineCounts:e,heights:t})};for(let e=1;e!==o;++e){const t=o-e;e<=3&&t<=3&&d([e,t])}for(let e=1;e!==o-1;++e)for(let a=1;a!==o-e;++a){const s=o-e-a;e<=3&&a<=(t<.85?4:3)&&s<=3&&d([e,a,s])}for(let e=1;e!==o-1;++e)for(let t=1;t!==o-e;++t)for(let a=1;a!==o-e-t;++a){const s=o-e-t-a;e<=3&&t<=3&&a<=3&&s<=4&&d([e,t,a,s])}let b,u=0;for(let e=0;e{for(let e=1;e!==r;++e)if(a[e-1]>a[e])return 1.5;return 1})(),m=Math.abs(o-c)*i*d;(!b||m1.4&&t[1]-t[0]<.2?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=Math.round(Math.min(a/t[0],Math.min(a/t[1],(n-s)/2)));return[{dimensions:{x:0,y:0,width:a,height:c},sides:xt|Pt|Tt},{dimensions:{x:0,y:c+s,width:a,height:c},sides:xt|At|Tt}]}(e):"ww"===a||"qq"===a?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=(a-s)/2,r=Math.round(Math.min(c/t[0],Math.min(c/t[1],n)));return[{dimensions:{x:0,y:0,width:c,height:r},sides:Pt|xt|At},{dimensions:{x:c+s,y:0,width:c,height:r},sides:Pt|Tt|At}]}(e):function(e){const{ratios:t,minWidth:a,maxWidth:s,spacing:n,maxHeight:c}=e,r=Math.round(1.5*a),o=Math.min(Math.round(Math.max(.4*(s-n),(s-n)/t[0]/(1/t[0]+1/t[1]))),s-n-r),i=s-o-n,l=Math.min(c,Math.round(Math.min(i/t[0],o/t[1])));return[{dimensions:{x:0,y:0,width:i,height:l},sides:Pt|xt|At},{dimensions:{x:i+n,y:0,width:o,height:l},sides:Pt|Tt|At}]}(e)}(u):3===i?function(e){const{proportions:t}=e;return"n"===t[0]?function(e){const{maxHeight:t,spacing:a,ratios:s,maxWidth:n,minWidth:c}=e,r=t,o=Math.round(Math.min((t-a)/2,s[1]*(n-a)/(s[2]+s[1]))),i=r-o-a,l=Math.max(c,Math.round(Math.min((n-a)/2,Math.min(o*s[2],i*s[1])))),d=Math.min(Math.round(r*s[0]),n-a-l);return[{dimensions:{x:0,y:0,width:d,height:r},sides:Pt|xt|At},{dimensions:{x:d+a,y:0,width:l,height:i},sides:Pt|Tt},{dimensions:{x:d+a,y:i+a,width:l,height:o},sides:At|Tt}]}(e):function(e){const{maxWidth:t,ratios:a,maxHeight:s,spacing:n}=e,c=t,r=Math.round(Math.min(c/a[0],.66*(s-n))),o=(t-n)/2,i=Math.min(s-r-n,Math.round(Math.min(o/a[1],o/a[2])));return[{dimensions:{x:0,y:0,width:c,height:r},sides:xt|Pt|Tt},{dimensions:{x:0,y:r+n,width:o,height:i},sides:At|xt},{dimensions:{x:o+n,y:r+n,width:c-o-n,height:i},sides:At|Tt}]}(e)}(u):function(e){const{proportions:t}=e;return"w"===t[0]?function({maxWidth:e,ratios:t,spacing:a,maxHeight:s,minWidth:n}){const c=e,r=Math.round(Math.min(c/t[0],.66*(s-a))),o=Math.round((e-2*a)/(t[1]+t[2]+t[3])),i=Math.max(n,Math.round(Math.min(.4*(e-2*a),o*t[1]))),l=Math.round(Math.max(Math.max(n,.33*(e-2*a)),o*t[3])),d=c-i-l-2*a,b=Math.min(s-r-a,o);return[{dimensions:{x:0,y:0,width:c,height:r},sides:xt|Pt|Tt},{dimensions:{x:0,y:r+a,width:i,height:b},sides:At|xt},{dimensions:{x:i+a,y:r+a,width:d,height:b},sides:At},{dimensions:{x:i+a+d+a,y:r+a,width:l,height:b},sides:Tt|At}]}(e):function({maxHeight:e,ratios:t,maxWidth:a,spacing:s,minWidth:n}){const c=e,r=Math.round(Math.min(c*t[0],.6*(a-s))),o=Math.round((e-2*s)/(1/t[1]+1/t[2]+1/t[3])),i=Math.round(o/t[1]),l=Math.round(o/t[2]),d=c-i-l-2*s,b=Math.max(n,Math.min(a-r-s,o));return[{dimensions:{x:0,y:0,width:r,height:c},sides:Pt|xt|At},{dimensions:{x:r+s,y:0,width:b,height:i},sides:Pt|Tt},{dimensions:{x:r+s,y:i+s,width:b,height:l},sides:Tt},{dimensions:{x:r+s,y:i+l+2*s,width:b,height:d},sides:At|Tt}]}(e)}(u),{layout:b,containerStyle:Ft(b)}}let Bt;function Ut(e){return Bt||(Bt=document.createElement("span"),Bt.style.font='400 12px Roboto, "Helvetica Neue", "Apple Color Emoji", sans-serif',Bt.style.whiteSpace="nowrap",Bt.style.position="absolute",Bt.style.left="-999px",Bt.style.opacity=".01",document.body.appendChild(Bt)),Bt.innerHTML=e,Bt.offsetWidth}function Ht(e,t,a,s,n){Object(c.o)(()=>{if(a&&e.current){const t=e.current.closest(".MessageList");Object(vt.a)(t,e.current,n?"end":"center",20,void 0===s?1500:1e3,s)}},[e,t,a,s,n])}var Gt=a(112),qt=a(67);var _t=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"ContextMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var Vt=Object(c.h)(Object(s.h)((e,{message:t})=>{const a=t.senderId,{targetUserId:s,targetChatId:n}=t.content.action||{},c=t.replyToMessageId,r=c?Object(o.k)(e,t.chatId,c):void 0,i=Object(o.U)(e,t),{direction:l,noHighlight:d}=i&&e.focusedMessage||{},b=Object(o.f)(e,t.chatId);return{sender:b&&(Object(m.jb)(b)||a===t.chatId)?b:a?Object(o.Gb)(e,a):void 0,...s&&{targetUser:Object(o.Gb)(e,s)},targetChatId:n,targetMessage:r,isFocused:i,...i&&{focusDirection:l,noFocusHighlight:d}}})(({message:e,observeIntersection:t,isEmbedded:a,appearanceOrder:s=0,isLastInList:n,sender:r,targetUser:o,targetMessage:i,targetChatId:l,isFocused:d,focusDirection:b,noFocusHighlight:u})=>{const m=Object(c.q)(null);Object(ft.c)(m,t),Object(We.a)(e.chatId,e.replyToMessageId,i),Ht(m,e.chatId,d,b,u);const h=Object(ne.a)(),O=s<=0,[j,g]=Object(ot.a)(O);Object(c.n)(()=>{O||setTimeout(g,10*s)},[s,g,O]);const{transitionClassNames:f}=Object(Z.a)(j,void 0,O,!1),p=Object(qt.a)(h,e,r,o,i,l,a?{isEmbedded:!0,asPlain:!0}:void 0),{isContextMenuOpen:I,contextMenuPosition:v,handleBeforeContextMenu:y,handleContextMenu:C,handleContextMenuClose:E,handleContextMenuHide:w}=Object(Et.a)(m),M=void 0!==v;if(a)return c.a.createElement("span",{className:"embedded-action-message"},Object(tt.a)(p));const S=Object(J.a)("ActionMessage message-list-item",d&&!u&&"focused",M&&"has-menu-open",n&&"last-in-list",f);return c.a.createElement("div",{ref:m,id:"message"+e.id,className:S,"data-message-id":e.id,onMouseDown:y,onContextMenu:C},c.a.createElement("span",null,p),v&&c.a.createElement(_t,{isOpen:I,anchor:v,message:e,messageListType:"thread",onClose:E,onCloseAnimationEnd:w}))}));a(217);var $t=({className:e,message:t,sender:a,title:s,customText:n,observeIntersection:r,onClick:o})=>{const i=Object(c.q)(null),l=Object(ft.b)(i,r),d=Object(at.a)(t&&Object(m.D)(t,"pictogram"),!l),b=t&&"sticker-reply-thumb"+t.id,u=nt(t),h=Boolean(t&&Object(m.I)(t)),O=Object(ne.a)(),j=a&&Object(m.V)(O,a);return c.a.createElement("div",{ref:i,className:Object(J.a)("EmbeddedMessage",e),onClick:t?o:void 0},u&&function(e,t,a,s){const{width:n,height:r}=Object(et.k)();return c.a.createElement("img",{id:e,src:a||t,width:n,height:r,alt:"",className:s?"round":""})}(b,u,d,h),c.a.createElement("div",{className:"message-text"},c.a.createElement("p",{dir:"auto"},t?Object(m.db)(t)?c.a.createElement(Vt,{message:t,isEmbedded:!0}):Object(tt.a)(Object(m.N)(O,t,Boolean(u))):n||" "),c.a.createElement("div",{className:"message-title",dir:"auto"},Object(tt.a)(j||s||" "))))},zt=a(160),Wt=a(167),Kt=a(172);a(221);var Qt=Object(c.h)(({message:e,outgoingStatus:t,signature:a,onClick:s})=>{const n=Object(ne.a)();return c.a.createElement("span",{className:"MessageMeta",dir:n.isRtl?"rtl":"ltr",onClick:s},Boolean(e.views)&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"message-views"},Object(Qe.b)(e.views)),c.a.createElement("i",{className:"icon-channelviews"})),a&&c.a.createElement("span",{className:"message-signature"},Object(tt.a)(a)),c.a.createElement("span",{className:"message-time"},e.isEdited&&n("EditedMessage")+" ",Object(x.h)(1e3*e.date)),t&&c.a.createElement(Kt.a,{status:t}))}),Yt=a(114),Xt=a(116),Jt=a(161);a(222);var Zt=({message:e,observeIntersection:t,observeIntersectionForPlaying:a,shouldLoop:s,lastSyncTime:r})=>{const o=Object(c.q)(null),[i,l,d]=Object(ot.a)(),b=e.content.sticker,{isAnimated:u,stickerSetId:h}=b,O=h===n.S,j=Object(ft.b)(o,t),g=Object(ft.b)(o,a),f=b.isPreloadedGlobally?"sticker"+b.id:Object(m.D)(e,"inline"),p=nt(e),I=Object(at.a)(f,!j,Object(m.C)(e,"inline",!0),r),v=Boolean(I),[y,C]=Object(ot.a)(v),E=u?y:v,{shouldRenderFullMedia:w,transitionClassNames:M}=Object(Yt.a)(E,"slow"),{width:S,height:k}=Object(et.l)(b),N=Object(J.a)("thumbnail",!p&&"empty"),P=Object(J.a)("Sticker media-inner",O&&"inactive");return c.a.createElement("div",{ref:o,className:P,onClick:O?void 0:l},!E&&c.a.createElement("img",{id:"sticker-thumb-"+e.id,src:p,width:S,height:k,alt:"",className:N}),!u&&w&&c.a.createElement("img",{id:"sticker-"+e.id,src:I,width:S,height:k,alt:"",className:Object(J.a)("full-media",M)}),u&&v&&c.a.createElement(Xt.a,{key:f,className:Object(J.a)("full-media",M),id:f,animationData:I,size:S,play:g,noLoop:!s,onLoad:C}),c.a.createElement(Jt.a,{isOpen:i,fromSticker:b,onClose:d}))},ea=a(128),ta=a(120),aa=a(162);function sa(e,t){return Object(aa.a)(Object(m.E)(e),Boolean(t),h.g&&!h.c)}var na=a(38);var ca=async(e,t,a,s)=>s?"rgba(255,255,255,1)":async function(e,t){const a=new Image;a.src=e,a.width||await new Promise(e=>{a.onload=e});const s=document.createElement("canvas"),n=s.getContext("2d");s.width=a.width,s.height=a.height,n.drawImage(a,0,0,a.width,a.height);const c=t?a.width-1:0,r=a.height-1;return`rgba(${Array.from(n.getImageData(c,r,1,1).data).join(",")})`}(e,t);var ra=a(121);var oa=({id:e,message:t,observeIntersection:a,shouldAutoLoad:s,isInSelectMode:n,isSelected:r,uploadProgress:o,size:i="inline",dimensions:l,nonInteractive:d,shouldAffectAppendix:b,onClick:u,onCancelUpload:h})=>{const O=Object(c.q)(null),j=(Object(m.G)(t)||Object(m.R)(t)).blobUrl,g=Object(ft.b)(O,a),[f,p]=Object(c.r)(s),I=f&&g,{mediaData:v,downloadProgress:y}=Object(ta.a)(Object(m.D)(t,i),!I),C=j||v,E=sa(t,C),{isUploading:w,isTransferring:M,transferProgress:S}=Object(m.s)(t,o||y,I&&!C),k=!1===Object(na.a)(f),{shouldRender:N,transitionClassNames:P}=Object(Z.a)(M,void 0,k,"slow"),{shouldRenderThumb:T,shouldRenderFullMedia:A,transitionClassNames:x}=Object(Yt.a)(C,"slow"),R=Object(c.m)(()=>{w?h&&h(t):C?u&&u(t.id):p(e=>!e)},[C,w,t,h,u]),L=Object(m.tb)(t);Object(c.o)(()=>{if(!b)return;const e=O.current.closest(".message-content");C?ca(C,L,0,r).then(t=>{e.style.setProperty("--appendix-bg",t),e.setAttribute("data-has-custom-appendix","")}):e.classList.add("has-appendix-thumb")},[C,L,b,n,r]);const{width:F,height:D,isSmall:B}=l||kt(t),U=Object(J.a)("media-inner",!w&&!d&&"interactive",B&&"small-image",F===D&&"square-image"),H=l?`width: ${F}px; height: ${D}px; left: ${l.x}px; top: ${l.y}px;`:"";return c.a.createElement("div",{id:e,ref:O,className:U,style:H,onClick:w?void 0:R},T&&c.a.createElement("canvas",{ref:E,className:"thumbnail",style:`width: ${F}px; height: ${D}px`}),A&&c.a.createElement("img",{src:C,className:"full-media "+x,width:F,height:D,alt:""}),N&&c.a.createElement("div",{className:"media-loading "+P},c.a.createElement(ra.a,{progress:S,onClick:w?R:void 0})),!C&&!f&&c.a.createElement("i",{className:"icon-download"}),M&&c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*S),"%"))},ia=a(137),la=a(136);function da(e,t){const a=Object(c.q)();a.current=t;const s=Object(c.m)(()=>{e.current&&e.current.pause()},[e]),n=Object(c.m)(()=>{e.current&&a.current&&Object(la.a)(e.current)},[e]);Object(X.a)(s,n)}var ba=a(147),ua=(e,t=!1)=>{const a=Object(c.q)(!1),s=Object(c.q)(!1),n=Object(c.m)(()=>{s.current=!0,t&&e.current&&(a.current||(a.current=!e.current.paused),e.current.pause())},[t,e]),r=Object(c.m)(()=>{t&&e.current&&a.current&&document.body.contains(e.current)&&Object(la.a)(e.current),a.current=!1,s.current=!1},[t,e]),o=Object(c.m)(()=>{Object(g.b)(r)},[r]);document.hasFocus()||n(),Object(ee.a)(n,o)};function ma(){return(ma=Object.assign||function(e){for(var t=1;t{const b=Object(c.q)(null),u=Object(c.q)(null),h=t.content.video,O=h.blobUrl,j=Boolean(O)||Object(m.b)(h),g=Object(ft.b)(b,a),[f,p]=Object(c.r)(s),I=Boolean(f&&g&&o),[v,y]=Object(c.r)(n),C=Object(at.a)(Object(m.D)(t,"pictogram"),!(g&&o),Object(m.C)(t,"pictogram"),o),E=sa(t),{mediaData:w,downloadProgress:M}=Object(ta.a)(Object(m.D)(t,"inline"),!I,Object(m.C)(t,"inline"),o),S=O||w,k=Boolean(j&&g&&S),{isBuffered:N,bufferingHandlers:P}=Object(ia.a)(!s),{isUploading:T,isTransferring:A,transferProgress:R}=Object(m.s)(t,r||M,I&&j&&!N),L=!1===Object(na.a)(f),{shouldRender:F,transitionClassNames:D}=Object(Z.a)(A,void 0,L),{shouldRenderThumb:B,transitionClassNames:U}=Object(Yt.a)(S,"slow"),[H,G]=Object(c.r)(0),q=Object(c.m)(e=>{G(Math.max(0,e.currentTarget.currentTime-1))},[]),_=Object(m.tb)(t),V=Object(m.qb)(t),{width:$,height:z}=i||Object(et.h)(h,_,V);da(u,Boolean(k&&n)),ua(u,v),Object(ba.a)(u,[k]);const W=Object(c.m)(()=>{T?d&&d(t):j&&!S?p(e=>!e):j&&S&&!v?(y(!0),u.current.play()):l&&l(t.id)},[T,j,S,v,l,d,t]),K=Object(J.a)("media-inner dark",!T&&"interactive"),Q=Object(J.a)("full-media",U),Y=i?`width: ${$}px; height: ${z}px; left: ${i.x}px; top: ${i.y}px;`:"",X=k,ee=!j&&w,te=!j||f&&!v&&!F,ae=j&&!f;return c.a.createElement("div",{ref:b,id:e,className:K,style:Y,onClick:T?void 0:W},(!k||B)&&c.a.createElement("canvas",{ref:E,className:"thumbnail",style:`width: ${$}px; height: ${z}px;`}),C&&c.a.createElement("img",{src:C,className:"thumbnail",style:`width: ${$}px; height: ${z}px;`,alt:""}),X&&c.a.createElement("video",ma({ref:u,className:Q,width:$,height:z,autoPlay:v,muted:!0,loop:!0,playsInline:!0},P,{onTimeUpdate:q}),c.a.createElement("source",{src:S})),ee&&c.a.createElement("img",{src:w,className:"full-media "+U,width:$,height:z,alt:""}),te&&c.a.createElement("i",{className:"icon-large-play"}),F&&c.a.createElement("div",{className:"media-loading "+D},c.a.createElement(ra.a,{progress:R,onClick:T?W:void 0})),ae&&c.a.createElement("i",{className:"icon-download"}),A&&!j?c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*R),"%"):A&&j?c.a.createElement("span",{className:"message-upload-progress"},"..."):c.a.createElement("div",{className:"message-media-duration"},h.isGif?"GIF":Object(x.e)(h.duration-H)))},Oa=a(18);a(224);var ja=Object(s.h)((e,{contact:t})=>({user:Object(o.Gb)(e,t.userId)}),(e,t)=>Object(d.l)(t,["openUserInfo"]))(({contact:e,user:t,openUserInfo:a})=>{const{firstName:s,lastName:n,phoneNumber:r,userId:o}=e,i=Object(c.m)(()=>{a({id:o})},[a,o]);return c.a.createElement("div",{className:Object(J.a)("Contact",Boolean(o)&&"interactive"),onClick:o?i:void 0},c.a.createElement(Gt.a,{size:"large",user:t,text:s||n}),c.a.createElement("div",{className:"contact-info"},c.a.createElement("div",{className:"contact-name"},s," ",n),c.a.createElement("div",{className:"contact-phone"},Object(Oa.c)(r))))}),ga=a(46);var fa=Object(c.h)(({id:e,options:t,selected:a=[],disabled:s,round:n,loadingOptions:r,onChange:o})=>{const[i,l]=Object(c.r)([]),d=Object(c.m)(e=>{const{value:t,checked:a}=e.currentTarget;let s;s=a?[...i,t]:i.filter(e=>e!==t),l(s),o(s)},[o,i]);return c.a.createElement("div",{id:e,className:"radio-group"},t.map(e=>c.a.createElement(ga.a,{label:e.label,subLabel:e.subLabel,value:e.value,checked:-1!==a.indexOf(e.value),disabled:s,round:n,isLoading:r?-1!==r.indexOf(e.value):void 0,onChange:d})))}),pa=a(126),Ia=a(180);a(227);function va(e,t){return t>0?(e/t*100).toFixed():0}var ya=({answer:e,voteResults:t,totalVoters:a,maxVotersCount:s,correctResults:n,shouldAnimate:r})=>{const o=t&&t.find(t=>t.option===e.option),i=0===n.length||-1!==n.indexOf(e.option),l=n.length>0&&i||o&&o.isChosen,d=o?va(o.votersCount,a||0):0,[b,u]=Object(c.r)(r?0:d),m=Object(c.q)(null),h=o?va(o.votersCount,s||0):0,O=b{r&&u(d)},[r,d]),Object(c.n)(()=>{const e=m.current;if(e&&r){const t=e.firstElementChild,a=O?"":"stroke-dasharray: 100% 200%; stroke-dashoffset: -44";t?t.setAttribute("style",a):e.innerHTML=`\n \n \n `}},[O,r]),!t||!o)return;const j=`width: ${h}%; transform:scaleX(${O?0:1})`;return c.a.createElement("div",{className:"PollOption",dir:"ltr"},c.a.createElement("div",{className:"poll-option-share "+("100"===d?"limit-width":"")},d,"%",l&&c.a.createElement("span",{className:Object(J.a)("poll-option-chosen",!i&&"wrong",r&&"animate")},c.a.createElement("i",{className:i?"icon-check":"icon-close"}))),c.a.createElement("div",{className:"poll-option-right"},c.a.createElement("div",{className:"poll-option-text",dir:"auto"},Object(tt.a)(e.text)),c.a.createElement("div",{className:Object(J.a)("poll-option-answer",l&&!i&&"wrong")},c.a.createElement("div",{className:"poll-option-corner",ref:m}),c.a.createElement("div",{className:"poll-option-line",style:j}))))};a(228);var Ca=Object(c.h)(Object(s.h)((e,{poll:t})=>{const{recentVoterIds:a}=t.results,{byId:s}=e.users;return a&&0!==a.length?{recentVoterIds:a,usersById:s}:{}},(e,t)=>Object(d.l)(t,["loadMessage","openPollResults"]))(({message:e,poll:t,recentVoterIds:a,usersById:s,loadMessage:n,onSendVote:r,openPollResults:o})=>{const{id:i,chatId:l}=e,{summary:d,results:b}=t,[u,m]=Object(c.r)(!1),[h,O]=Object(c.r)([]),[j,g]=Object(c.r)(!1),[f,p]=Object(c.r)(!1),[I,v]=Object(c.r)(!d.closed&&d.closeDate&&d.closeDate>0?Math.min(d.closeDate-Math.floor(Date.now()/1e3),d.closePeriod):0),y=Object(c.q)(null),{results:C,totalVoters:E}=b,w=C&&C.some(e=>e.isChosen),M=!d.closed&&!w,S=!M&&d.isPublic&&Number(b.totalVoters)>0,k=M&&d.multipleChoice,N=C?Math.max(...C.map(e=>e.votersCount)):E,P=C?C.reduce((e,t)=>(t.isCorrect&&e.push(t.option),e),[]):[],T=d.answers.map(e=>({label:e.text,value:e.option,hidden:Boolean(d.quiz&&d.closePeriod&&I<=0)}));Object(c.n)(()=>{u&&t.results.results&&t.results.results.some(e=>e.isChosen)&&m(!1)},[u,t.results.results]),Object(c.n)(()=>{I>0&&setTimeout(()=>v(I-1),1e3);const e=y.current;if(e){const t=12*Math.PI,a=e.lastElementChild,s=e.firstElementChild;if(I<=5&&e.classList.add("hurry-up"),a&&s){const e=(d.closePeriod-I)/d.closePeriod*t;s.textContent=Object(x.e)(I),a.firstElementChild.setAttribute("stroke-dashoffset","-"+e)}else e.innerHTML=`\n ${Object(x.e)(I)}\n \n \n `}},[I,d.closePeriod]),Object(c.n)(()=>{d.quiz&&(I<=0||w&&!d.closed)&&n({chatId:l,messageId:i})},[l,I,w,n,i,d.closed,d.quiz]),Object(c.n)(()=>{let e;return d.quiz&&!d.closed&&d.closePeriod&&d.closePeriod>0&&(e=window.setTimeout(()=>{n({chatId:l,messageId:i})},1e3*d.closePeriod)),()=>{e&&window.clearTimeout(e)}},[M,l,n,i,d.closePeriod,d.closed,d.quiz]);const A=Object(c.p)(()=>a?a.reduce((e,t)=>{const a=s[t];return a&&e.push(a),e},[]):[],[s,a]),R=Object(c.m)(e=>{O([e]),m(!0),p(!0),r([e])},[r]),L=Object(c.m)(e=>{O(e)},[]),F=Object(c.m)(()=>{m(!0),p(!0),r(h)},[r,h]),D=Object(c.m)(()=>{o({chatId:l,messageId:i})},[l,i,o]),B=Object(c.m)(()=>{g(!0)},[]),U=Object(c.m)(()=>{g(!1),p(!1)},[]);Object(c.n)(()=>{if(f&&w&&d.quiz&&b.results&&t.results.solution){b.results.find(e=>e.isChosen&&e.isCorrect)||g(!0)}},[w,f,b.results,d.quiz,t.results.solution]);const H=Object(ne.a)();return c.a.createElement("div",{className:"Poll",dir:H.isRtl?"auto":"ltr"},j&&t.results.solution&&c.a.createElement(Ia.a,{message:Object(wt.b)(t.results.solution,t.results.solutionEntities),duration:5e3,onDismiss:U,containerId:"#middle-column-portals"}),c.a.createElement("div",{className:"poll-question"},Object(tt.a)(d.question)),c.a.createElement("div",{className:"poll-type"},H(function(e){if(void 0===e.isPublic)return" ";if(e.quiz)return e.isPublic?"QuizPoll":"AnonymousQuizPoll";if(e.closed)return"FinalResults";return e.isPublic?"PublicPoll":"AnonymousPoll"}(d)),A.length>0&&c.a.createElement("div",{className:"poll-recent-voters"},A.map(e=>c.a.createElement(Gt.a,{size:"micro",user:e}))),I>0&&M&&c.a.createElement("div",{ref:y,className:"poll-countdown"}),d.quiz&&t.results.solution&&!M&&c.a.createElement(oe.a,{round:!0,size:"tiny",color:"translucent",className:"poll-quiz-help",disabled:j,onClick:B,ariaLabel:"Show Solution"},c.a.createElement("i",{className:"icon-lamp"}))),M&&c.a.createElement("div",{className:"poll-answers"},k?c.a.createElement(fa,{options:T,onChange:L,disabled:e.isScheduled||u,loadingOptions:u?h:void 0,round:!0}):c.a.createElement(pa.a,{name:"poll-"+i,options:T,onChange:R,disabled:e.isScheduled||u,loadingOption:u?h[0]:void 0})),!M&&c.a.createElement("div",{className:"poll-results"},d.answers.map((function(e){return c.a.createElement(ya,{key:e.option,shouldAnimate:f,answer:e,voteResults:C,totalVoters:E,maxVotersCount:N,correctResults:P})}))),!S&&!k&&c.a.createElement("div",{className:"poll-voters-count"},function(e,t,a){if(!a)return e(t?"Chat.Quiz.TotalVotesEmpty":"Chat.Poll.TotalVotesResultEmpty");return e(t?"Answer":"Vote",a,"i")}(H,d.quiz,b.totalVoters)),k&&c.a.createElement(oe.a,{isText:!0,disabled:0===h.length,size:"tiny",onClick:F},H("PollSubmitVotes")),S&&c.a.createElement(oe.a,{isText:!0,size:"tiny",onClick:D},H("PollViewResults")))})),Ea=a(39),wa=a(57);a(229);var Ma=Object(c.h)(({message:e,observeIntersection:t,shouldAutoLoad:a,inPreview:s,onMediaClick:n,onCancelMediaTransfer:r})=>{const o=Object(m.Q)(e);let i=!1;if(o&&o.photo){const{width:t,height:a}=kt(e);i=t===a}const l=Object(c.m)(()=>{n()},[n]);if(!o)return;const{siteName:d,url:b,displayUrl:u,title:h,description:O,photo:j}=o,g=j&&n&&!i&&!o.hasDocument,f=Object(Ea.a)(O,170),p=Object(J.a)("WebPage",j?i&&"with-square-photo":!s&&"without-photo");return c.a.createElement("div",{className:p,"data-initial":(d||u)[0],dir:"auto"},j&&c.a.createElement(oa,{message:e,observeIntersection:t,shouldAutoLoad:a,size:i?"pictogram":"inline",nonInteractive:!g,onClick:g?l:void 0,onCancelUpload:r}),c.a.createElement("div",{className:"WebPage-text"},c.a.createElement(wa.a,{className:"site-name",url:b,text:d||u}),!s&&h&&c.a.createElement("p",{className:"site-title"},Object(tt.a)(h)),f&&c.a.createElement("p",{className:"site-description"},Object(tt.a)(f,["emoji","br"]))))});a(230);var Sa=Object(c.h)(({message:e})=>{const t=Object(m.z)(e),{title:a,text:s,description:n,photoUrl:r}=t;return c.a.createElement("div",{className:"Invoice"},a&&c.a.createElement("p",{className:"title"},Object(tt.a)(a)),s&&c.a.createElement("p",null,Object(tt.a)(s,["emoji","br"])),c.a.createElement("div",{className:"description "+(r?"has-image":"")},r&&c.a.createElement("img",{className:"invoice-image",src:r,alt:""}),n&&c.a.createElement("p",{className:"description-text"},Object(tt.a)(n,["emoji","br"]))))});function ka(e){return Object(c.h)(Object(s.h)((e,t)=>{const{message:a}=t;return{isInSelectMode:Object(o.S)(e),isSelected:Object(o.V)(e,a.id)}},(e,t)=>Object(d.l)(t,["toggleMessageSelection"]))(t=>{const{isInSelectMode:a,isSelected:s,message:n,toggleMessageSelection:r,dimensions:o}=t,i=Object(c.m)(e=>{e.stopPropagation(),r({messageId:n.id,withShift:e&&e.shiftKey})},[r,n]),l=Object(c.p)(()=>({...t,isInSelectMode:a,isSelected:s,dimensions:{...t.dimensions,x:0,y:0},onClick:a?void 0:t.onClick}),[t,a,s]);return c.a.createElement("div",{className:Object(J.a)("album-item-select-wrapper",s&&"is-selected"),style:o?`left: ${o.x}px; top: ${o.y}px;`:"",onClick:a?i:void 0},a&&c.a.createElement("div",{className:"message-select-control"},s&&c.a.createElement("i",{className:"icon-select"})),c.a.createElement(e,l))}))}a(231);const Na=ka(oa),Pa=ka(ha);var Ta=Object(s.h)(e=>({uploadsById:e.fileUploads.byMessageLocalId}),(e,t)=>Object(d.l)(t,["cancelSendingMessage"]))(({album:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,hasCustomAppendix:n,lastSyncTime:r,isOwn:o,albumLayout:i,onMediaClick:l,uploadsById:d,cancelSendingMessage:b})=>{const u=e.messages.length,h=Object(c.m)(e=>{b({chatId:e.chatId,messageId:e.id})},[b]);const{width:O,height:j}=i.containerStyle;return c.a.createElement("div",{className:"Album",style:`width: ${O}px; height: ${j}px;`},e.messages.map((function(e,b){const{photo:O,video:j}=Object(m.v)(e),g=d[e.previousLocalId||e.id],f=g?g.progress:void 0,{dimensions:p,sides:I}=i.layout[b];if(O){const s=n&&(o?b===u-1:Boolean(I&xt&&I&At));return c.a.createElement(Na,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAffectAppendix:s,uploadProgress:f,dimensions:p,onClick:l,onCancelUpload:h})}if(j)return c.a.createElement(Pa,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,uploadProgress:f,lastSyncTime:r,dimensions:p,onClick:l,onCancelUpload:h})})))});a(232);function Aa(){return(Aa=Object.assign||function(e){for(var t=1;t{const r=Object(c.q)(null),o=Object(c.q)(null),i=Object(c.q)(null),l=e.content.video,d=Object(ft.b)(r,t),[b,u]=Object(c.r)(a&&s),h=Boolean(b&&d&&n),{mediaData:O,downloadProgress:j}=Object(ta.a)(Object(m.D)(e,"inline"),!h,Object(m.C)(e,"inline"),n),g=sa(e,O),{isBuffered:f,bufferingHandlers:p}=Object(ia.a)(),I=b&&!f,v=!1===Object(na.a)(b),{shouldRender:y,transitionClassNames:C}=Object(Z.a)(I||!f,void 0,v),{shouldRenderThumb:E,transitionClassNames:w}=Object(Yt.a)(O,"slow"),[M,S]=Object(c.r)(!1),[k,N]=Object(c.r)(0);Object(c.n)(()=>{if(!M)return;const e=188*Math.PI,t=e-k*e,a=i.current,s=o.current,n=s.firstElementChild;n?n.firstElementChild.setAttribute("stroke-dashoffset",t.toString()):s.innerHTML=`\n \n `,N(a.currentTime/a.duration)},[M,k]);const P=Boolean(O&&d),T=()=>{S(!1),N(0),Object(la.a)(i.current),requestAnimationFrame(()=>{o.current.innerHTML=""})},A=(R=T,()=>{xa&&xa(),xa=R});var R;Object(c.n)(()=>{i.current&&(P?Object(la.a)(i.current):i.current.pause())},[P]),da(i,P),ua(i,Boolean(O)),Object(ba.a)(i,[O]);const L=Object(c.m)(()=>{if(!O)return void u(e=>!e);const e=i.current;M?e.paused?Object(la.a)(e):e.pause():(A(),e.currentTime=0,S(!0))},[A,M,O]),F=Object(c.m)(e=>{const t=e.currentTarget;N(t.currentTime/t.duration)},[]),D=Object(J.a)("full-media",w);return c.a.createElement("div",{ref:r,className:"RoundVideo media-inner",onClick:L},E&&c.a.createElement("div",{className:"thumbnail-wrapper"},c.a.createElement("canvas",{ref:g,className:"thumbnail",style:`width: ${et.d}px; height: ${et.d}px`})),O&&c.a.createElement("div",{className:"video-wrapper"},c.a.createElement("video",Aa({ref:i,className:D,width:et.d,height:et.d,autoPlay:!0,muted:!M,loop:!M,playsInline:!0,onEnded:M?T:void 0},p,{onTimeUpdate:M?F:void 0}),c.a.createElement("source",{src:O}))),c.a.createElement("div",{className:"progress",ref:o}),y&&c.a.createElement("div",{className:"media-loading "+C},c.a.createElement(ra.a,{progress:j})),!O&&!b&&c.a.createElement("i",{className:"icon-large-play"}),c.a.createElement("div",{className:"message-media-duration"},M?Object(x.e)(i.current.currentTime):Object(x.e)(l.duration),(!M||i.current.paused)&&c.a.createElement("i",{className:"icon-muted-chat"})))};a(233);var La=({message:e,onClick:t})=>c.a.createElement("div",{className:"InlineButtons"},e.inlineButtons.map(e=>c.a.createElement("div",{className:"row"},e.map(e=>c.a.createElement(oe.a,{size:"tiny",ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>t({button:e})},e.text,"url"===e.type&&c.a.createElement("i",{className:"icon-arrow-right"}))))));a(234);var Fa=Object(c.h)(Object(s.h)((e,{message:t})=>{const{threadId:a,chatId:s}=t.threadInfo,n=Object(o.Cb)(e,s,a)||t.threadInfo,{byId:c}=e.users,{byId:r}=e.chats;return{threadInfo:n,usersById:c,chatsById:r}},(e,t)=>Object(d.l)(t,["openChat"]))(({disabled:e,threadInfo:t,usersById:a,chatsById:s,openChat:n})=>{const r=Object(ne.a)(),{threadId:o,chatId:i,messagesCount:l,lastMessageId:d,lastReadInboxMessageId:b,recentReplierIds:u}=t,h=Object(c.m)(()=>{n({id:i,threadId:o})},[n,i,o]);if(void 0===l)return;const O=u&&u.map(e=>Object(m.lb)(e)?a[e]:s[e]).filter(Boolean);const j=Boolean(b&&d&&b0&&c.a.createElement("div",{className:"recent-repliers",dir:r.isRtl?"rtl":"ltr"},O.map(e=>c.a.createElement(Gt.a,{key:e.id,size:"small",user:Object(m.lb)(e.id)?e:void 0,chat:Object(m.lb)(e.id)?void 0:e}))),c.a.createElement("div",{className:"label",dir:"auto"},l?r("Comments",l,"i"):r("LeaveAComment")),c.a.createElement("i",{className:"icon-next"}))}));a(235);function Da(e){const t=Ua(e.currentTarget);t&&t.setAttribute("data-is-document-group-hover","")}function Ba(e){const t=Ua(e.currentTarget);t&&t.removeAttribute("data-is-document-group-hover")}function Ua(e){let t=e;do{t=t.nextElementSibling}while(t&&!t.classList.contains("last-in-document-group"));return t}var Ha=Object(c.h)(Object(s.h)((e,t)=>{const{focusedMessage:a,forwardMessages:s,lastSyncTime:n}=e,{message:c,album:r,withSenderName:i,withAvatar:l,threadId:d,messageListType:b}=t,{id:u,chatId:h,viaBotId:O,replyToMessageId:j,isOutgoing:g}=c,f=Object(o.f)(e,h),p=Object(o.P)(e,h),I=f&&Object(m.jb)(f),v=!p&&Object(m.eb)(c),y=i||l||v?Object(o.tb)(e,c):void 0,C=Object(o.K)(e,c),E=O?Object(o.Gb)(e,O):void 0,w=d?Object(o.Eb)(e,h,d):void 0,M=c.id===w,S=j===w,k=j&&!S?Object(o.k)(e,h,j):void 0,N=k&&Object(o.tb)(e,k),P=Object(o.Fb)(e,c),T="thread"===b&&(r?r.messages.some(t=>Object(o.U)(e,t)):Object(o.U)(e,c)),{direction:A,noHighlight:x}=T&&a||{},R=s.messageIds&&s.messageIds.includes(u),{query:L}=Object(o.A)(e)||{},F=Object(m.L)(c);let D;return D=r&&r.messages?r.messages.every(({id:t})=>Object(o.V)(e,t)):Object(o.V)(e,u),{forceSenderName:v,sender:y,originSender:C,botSender:E,shouldHideReply:S,isThreadTop:M,replyMessage:k,replyMessageSender:N,...g&&{outgoingStatus:Object(o.fb)(e,c,"scheduled"===b)},..."number"==typeof P&&{uploadProgress:P},isFocused:T,...T&&{focusDirection:A,noFocusHighlight:x},isForwarding:R,isChatWithSelf:p,isChannel:I,lastSyncTime:n,highlight:L,isSingleEmoji:Boolean(F),animatedEmoji:F?Object(o.c)(e,F):void 0,isInSelectMode:Object(o.S)(e),isSelected:D,isGroupSelected:!!c.groupedId&&!c.isInAlbum&&Object(o.Q)(e,h,c.groupedId),threadId:d,isPinnedList:"pinned"===b,shouldAutoLoadMedia:f?Object(o.ub)(e,c,f,y):void 0,shouldAutoPlayMedia:Object(o.vb)(e,c),shouldLoopStickers:Object(o.wb)(e)}},(e,t)=>Object(d.l)(t,["focusMessage","openMediaViewer","openAudioPlayer","cancelSendingMessage","openUserInfo","openChat","markMessagesRead","sendPollVote","toggleMessageSelection","setReplyingToId","openForwardMenu","clickInlineButton"]))(({message:e,observeIntersectionForBottom:t,observeIntersectionForMedia:a,observeIntersectionForAnimatedStickers:s,album:n,withAvatar:r,withSenderName:o,noComments:d,appearanceOrder:b,isFirstInGroup:u,isLastInGroup:h,isFirstInDocumentGroup:O,isLastInDocumentGroup:j,isLastInList:g,forceSenderName:f,sender:p,originSender:I,botSender:v,isThreadTop:y,shouldHideReply:C,replyMessage:E,replyMessageSender:w,outgoingStatus:M,uploadProgress:S,isFocused:k,focusDirection:N,noFocusHighlight:P,isForwarding:T,isChatWithSelf:A,isChannel:x,lastSyncTime:R,highlight:L,animatedEmoji:F,isInSelectMode:D,isSelected:B,isGroupSelected:U,threadId:H,messageListType:G,isPinnedList:q,shouldAutoLoadMedia:_,shouldAutoPlayMedia:V,shouldLoopStickers:$,focusMessage:z,openMediaViewer:W,openAudioPlayer:K,openUserInfo:Q,openChat:Y,cancelSendingMessage:X,markMessagesRead:ee,sendPollVote:te,toggleMessageSelection:ae,setReplyingToId:se,openForwardMenu:ce,clickInlineButton:re})=>{const ie=Object(c.q)(null),le=Object(c.q)(null),de=Object(c.q)(null);Object(ft.c)(le,t);const{width:be}=_e(),{isContextMenuOpen:ue,contextMenuPosition:me,handleBeforeContextMenu:he,handleContextMenu:Oe,handleContextMenuClose:je,handleContextMenuHide:ge}=Object(Et.a)(ie,!1,!0),fe=b<=0,[pe,Ie]=Object(ot.a)(fe);Object(c.n)(()=>{fe||setTimeout(Ie,10*b)},[b,Ie,fe]);const{transitionClassNames:ve}=Object(Z.a)(pe,void 0,fe,!1),{chatId:ye,id:Ce,threadInfo:Ee}=e,we=Object(m.tb)(e),Me="scheduled"===G||e.isScheduled,Se=Object(m.ub)(e)&&!C,ke=Boolean(Ee)&&"thread"===G,{forwardInfo:Ne,viaBotId:Pe}=e,Te=Ne&&!A&&!Ne.isLinkedChannelPost,Ae=!!e.groupedId&&!e.isInAlbum,xe=Boolean(n)&&n.messages.length>1,{text:Re,photo:Le,video:Fe,audio:De,voice:Be,document:Ue,sticker:He,contact:Ge,poll:qe,webPage:Ve,invoice:$e}=Object(m.v)(e),ze=Object(m.x)(e),Ke=Object(wt.a)(e,L,Mt(ze)),Qe=void 0!==me,Ye=Object(J.a)("Message message-list-item",u&&"first-in-group",h&&"last-in-group",O&&"first-in-document-group",j&&"last-in-document-group",g&&"last-in-list",we&&"own",Boolean(e.views)&&"has-views",e.isEdited&&"was-edited",Se&&"has-reply",Qe&&"has-menu-open",k&&!P&&"focused",T&&"is-forwarding",e.isDeleting&&"is-deleting",Ae&&"is-in-document-group",xe&&"is-album",e.hasUnreadMention&&"has-unread-mention",B&&"is-selected",D&&"is-in-selection-mode",y&&"is-thread-top",Boolean(e.inlineButtons)&&"has-inline-buttons",ve),Xe=function(e,{hasReply:t,customShape:a,isLastInGroup:s,asForwarded:n,hasThread:c,forceSenderName:r,hasComments:o}={}){const{text:i,photo:l,video:d,audio:b,voice:u,document:h,poll:O,webPage:j,contact:g}=Object(m.v)(e),f=["message-content"],p=(l||d)&&!i,I=Boolean(e.viaBotId);return Mt(a)?f.push("emoji-only emoji-only-"+a):i&&f.push("text"),a&&(f.push("custom-shape"),d&&d.isRound&&f.push("round"),o&&f.push("has-comments")),l||d?f.push("media"):b?f.push("audio"):u?f.push("voice"):h?f.push("document"):g?f.push("contact"):O?f.push("poll"):j&&(f.push("web-page"),j.photo&&f.push("media")),n&&!a&&f.push("is-forwarded"),t&&f.push("is-reply"),c&&f.push("has-replies"),I&&f.push("is-via-bot"),r&&f.push("force-sender-name"),a||(f.push("has-shadow"),(t||n||!p||I||r)&&f.push("has-solid-background"),!s||!l&&p||f.push("has-appendix")),f.join(" ")}(e,{hasReply:Se,customShape:ze,isLastInGroup:h,asForwarded:Te,hasThread:ke,forceSenderName:f,hasComments:e.threadInfo&&e.threadInfo.messagesCount>0}),Je=!Ne||!A&&p?p:I,Ze=Ne?I:p,at=x&&e.adminTitle||Ne&&!Te&&Ne.adminTitle||void 0,st=e.threadInfo&&(!Ae||j)&&"thread"===G&&!d,nt=Xe.includes("has-appendix");Object(We.a)(ye,Se?e.replyToMessageId:void 0,E,e.id),Ht(ie,ye,k,N,P),Object(c.o)(()=>{de.current&&(de.current.innerHTML=we?'':'')},[we,nt]);const ct=Object(c.m)(t=>{t.stopPropagation(),ae({messageId:Ce,groupedId:e.groupedId})},[Ce,e.groupedId,ae]),rt=Object(c.m)(e=>{const t=xe&&n&&n.messages?{messageId:Ce,childMessageIds:n.messages.map(({id:e})=>e),withShift:e&&e.shiftKey}:{messageId:Ce,withShift:e&&e.shiftKey};ae(t)},[ae,Ce,xe,n]),it=Object(c.m)(()=>{se({messageId:Ce})},[se,Ce]),lt=Object(c.m)(e=>{e.stopPropagation()},[]),dt=Object(c.m)(()=>{Je&&(Object(m.lb)(Je.id)?Q({id:Je.id}):Y({id:Je.id}))},[Je,Q,Y]),bt=Object(c.m)(()=>{Ze&&(Object(m.lb)(Ze.id)?Q({id:Ze.id}):Y({id:Ze.id}))},[Ze,Q,Y]),ut=Object(c.m)(()=>{v&&Q({id:v.id})},[v,Q]),mt=Object(c.m)(()=>{z({chatId:ye,threadId:H,messageId:e.replyToMessageId})},[z,ye,H,e.replyToMessageId]),ht=Object(c.m)(()=>{W({chatId:ye,threadId:H,messageId:Ce,origin:Me?l.h.ScheduledInline:l.h.Inline})},[ye,H,Ce,W,Me]),Ot=Object(c.m)(()=>{K({chatId:ye,messageId:Ce})},[ye,Ce,K]),jt=Object(c.m)(e=>{W({chatId:ye,threadId:H,messageId:e,origin:Me?l.h.ScheduledAlbum:l.h.Album})},[ye,H,W,Me]),gt=Object(c.m)(()=>{ee({messageIds:[Ce]})},[Ce,ee]),pt=Object(c.m)(()=>{X({chatId:ye,messageId:Ce})},[X,ye,Ce]),It=Object(c.m)(e=>{te({chatId:ye,messageId:Ce,options:e})},[ye,Ce,te]),vt=Object(c.m)(()=>{ce({fromChatId:ye,groupedId:e.groupedId})},[ce,ye,e.groupedId]),yt=Object(c.m)(()=>{if(n&&n.messages){const e=n.messages.map(({id:e})=>e);ce({fromChatId:ye,messageIds:e})}else ce({fromChatId:ye,messageIds:[Ce]})},[n,ce,ye,Ce]),Ct=Object(c.m)(()=>{z({chatId:ye,threadId:i.MAIN_THREAD_ID,messageId:Ce})},[z,ye,Ce]),Nt=Object(c.m)(()=>{z(Ae?{chatId:Ne.fromChatId,groupedId:e.groupedId,groupedChatId:ye}:{chatId:Ne.fromChatId,messageId:Ne.fromMessageId})},[z,Ne,e,ye,Ae]),Pt=Object(ne.a)();let Tt,At="",xt=!1;const Rt=Object(c.p)(()=>xe?Dt(we,Boolean(Te),n,be):void 0,[xe,be,we,Te,n]),Lt=Te?28:0;if(xe||!Le&&!Fe)Rt&&(Tt=Math.max(St(Boolean(Re),st),Rt.containerStyle.width),Tt-Rt.containerStyle.width>18&&(xt=!0));else{let t;Le?t=kt(e).width:Fe&&(t=Fe.isRound?et.d:kt(e).width),t&&(Tt=Math.max(St(Boolean(Re),st),t),Tt-t>18&&(xt=!0))}Tt&&(At=`width: ${Tt+Lt}px`);const Ft=Object(c.p)(()=>at?Ut(at):void 0,[at]),Bt=!(Qe||D||T)&&(!Ae||j),qt=Bt&&x&&!Me,Vt=Bt&&(Ne&&(Ne.isChannelPost||A&&!we)&&Ne.fromMessageId||q);return c.a.createElement("div",{ref:ie,id:"message"+Ce,className:Ye,style:Ft?`--meta-safe-author-width: ${Ft}px`:void 0,"data-message-id":Ce,onClick:D?rt:void 0,onDoubleClick:D?void 0:it,onMouseDown:D?void 0:he,onContextMenu:D?void 0:Oe,onMouseEnter:Ae&&!j?Da:void 0,onMouseLeave:Ae&&!j?Ba:void 0},c.a.createElement("div",{ref:le,className:"bottom-marker","data-message-id":Ce,"data-last-message-id":n?n.messages[n.messages.length-1].id:void 0,"data-has-unread-mention":e.hasUnreadMention}),!Ae&&c.a.createElement("div",{className:"message-select-control"},B&&c.a.createElement("i",{className:"icon-select"})),j&&c.a.createElement("div",{className:Object(J.a)("message-select-control group-select",U&&"is-selected"),onClick:ct},U&&c.a.createElement("i",{className:"icon-select"})),r&&function(){const e=Je&&Object(m.lb)(Je.id),t=Je&&e?Je:void 0,a=Je&&!e?Je:void 0,s=!Je&&Ne?Ne.hiddenUserName:void 0;return c.a.createElement(Gt.a,{size:"small",user:t,chat:a,text:s,lastSyncTime:R,onClick:t||a?dt:void 0})}(),c.a.createElement("div",{className:"message-content-wrapper",onClick:D&&Ae?rt:void 0},c.a.createElement("div",{className:Xe,style:At,dir:"auto"},nt&&c.a.createElement("div",{className:"svg-appendix",ref:de}),Te&&!ze&&(!Ae||O)&&c.a.createElement("div",{className:"message-title"},Pt("ForwardedMessage")),function(){const t=Object(J.a)("content-inner",Te&&!ze&&"forwarded-message",Se&&"reply-message",xt&&"no-media-corners"),r=h&&!Ke&&!Te&&!ke,i=!Ve&&!F&&Ke;return c.a.createElement("div",{className:t,onDoubleClick:lt,dir:"auto"},function(){if(ze||!(o&&!Le&&!Fe||Te||Pe||f)||Ae&&!O)return;let t,a;Ze?(t=Object(m.V)(Pt,Ze),Te||(a="color-"+Object(m.X)(Ze))):Ne&&Ne.hiddenUserName&&(t=Ne.hiddenUserName);return c.a.createElement("div",{className:"message-title",dir:"ltr"},t?c.a.createElement("span",{className:Object(J.a)(Ze&&"interactive",a),onClick:Ze?bt:void 0,dir:"auto"},Object(tt.a)(t)):v?void 0:" ",v&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"via"},Pt("ViaBot")),c.a.createElement("span",{className:"interactive",onClick:ut},Object(tt.a)("@"+v.username))),Ne&&Ne.isLinkedChannelPost?c.a.createElement("span",{className:"admin-title",dir:"auto"},Pt("DiscussChannel")):e.adminTitle&&!x?c.a.createElement("span",{className:"admin-title",dir:"auto"},e.adminTitle):void 0)}(),Se&&c.a.createElement($t,{message:E,sender:w,observeIntersection:a,onClick:mt}),He&&c.a.createElement(Zt,{message:e,observeIntersection:a,observeIntersectionForPlaying:s,shouldLoop:$,lastSyncTime:R}),F&&c.a.createElement(ea.a,{isInline:!0,sticker:F,observeIntersection:a,lastSyncTime:R}),xe&&c.a.createElement(Ta,{album:n,albumLayout:Rt,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:V,isOwn:we,hasCustomAppendix:r,lastSyncTime:R,onMediaClick:jt}),!xe&&Le&&c.a.createElement(oa,{message:e,observeIntersection:a,shouldAutoLoad:_,uploadProgress:S,shouldAffectAppendix:r,onClick:ht,onCancelUpload:pt}),!xe&&Fe&&Fe.isRound&&c.a.createElement(Ra,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:V,lastSyncTime:R}),!xe&&Fe&&!Fe.isRound&&c.a.createElement(ha,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:V,uploadProgress:S,lastSyncTime:R,onClick:ht,onCancelUpload:pt}),(De||Be)&&c.a.createElement(Wt.a,{message:e,uploadProgress:S,lastSyncTime:R,isSelectable:Ae,isSelected:B,onPlay:Ot,onReadMedia:!Be||we&&!A?void 0:gt,onCancelUpload:pt}),Ue&&c.a.createElement(zt.a,{message:e,observeIntersection:a,uploadProgress:S,isSelectable:Ae,isSelected:B,onCancelUpload:pt}),Ge&&c.a.createElement(ja,{contact:Ge}),qe&&c.a.createElement(Ca,{message:e,poll:qe,onSendVote:It}),!F&&Ke&&c.a.createElement("p",{className:"text-content "+(i?"with-meta":""),dir:"auto"},Ke,i&&c.a.createElement(Qt,{message:e,outgoingStatus:M,signature:at,onClick:rt})),Ve&&c.a.createElement(Ma,{message:e,observeIntersection:a,shouldAutoLoad:_,onMediaClick:ht,onCancelMediaTransfer:pt}),$e&&c.a.createElement(Sa,{message:e}))}(),(!Ae||j)&&!(!Ve&&!F&&Ke)&&c.a.createElement(Qt,{message:e,outgoingStatus:M,signature:at,onClick:rt}),qt?c.a.createElement(oe.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:Pt("lng_context_forward_msg"),onClick:j?vt:yt},c.a.createElement("i",{className:"icon-share-filled"})):Vt?c.a.createElement(oe.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Focus message",onClick:q?Ct:Nt},c.a.createElement("i",{className:"icon-arrow-right"})):void 0,st&&c.a.createElement(Fa,{message:e,disabled:d}),Xe.includes("has-appendix")&&c.a.createElement("div",{className:"svg-appendix",ref:de})),e.inlineButtons&&c.a.createElement(La,{message:e,onClick:re})),me&&c.a.createElement(_t,{isOpen:ue,anchor:me,message:e,album:n,messageListType:G,onClose:je,onCloseAnimationEnd:ge}))}));a(236);const Ga=h.b?1e3:350,qa=h.g?300:500,_a=Object(g.a)(e=>e(),200,!1);var Va=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,type:s})=>{const n=Object(o.f)(e,t);if(!n)return{};const c=Object(o.x)(e,t,a,s),r="scheduled"===s?Object(o.qb)(e,t):Object(o.m)(e,t),l=Object(o.Eb)(e,t,a);if(a!==i.MAIN_THREAD_ID&&!(r&&l&&r[l]))return{};const{isRestricted:d,restrictionReason:b,lastMessage:u}=n,h=Object(o.I)(e,t),O=a===i.MAIN_THREAD_ID&&!c&&!n.unreadCount&&!h&&u&&!u.groupedId;let j;if(Object(o.L)(e,t)){const a=Object(o.g)(e,t);j=a.fullInfo?a.fullInfo.botDescription||"NoMessages":"Updating bot info..."}return{isChatLoaded:!0,isRestricted:d,restrictionReason:b,isChannelChat:Object(m.jb)(n),isChatWithSelf:Object(o.P)(e,t),messageIds:c,messagesById:r,firstUnreadId:Object(o.H)(e,t,a),isViewportNewest:"thread"!==s||Object(o.X)(e,t,a),threadFirstMessageId:Object(o.G)(e,t,a),focusingId:h,isSelectModeActive:Object(o.S)(e),animationLevel:e.settings.byKey.animationLevel,...O&&{lastMessage:u},botDescription:j,threadTopMessageId:l,hasLinkedChat:n.fullInfo&&"linkedChatId"in n.fullInfo?Boolean(n.fullInfo.linkedChatId):void 0}},(e,t)=>Object(d.l)(t,["loadViewportMessages","markMessageListRead","markMessagesRead","setScrollOffset","openHistoryCalendar"]))(({chatId:e,threadId:t,type:a,hasTools:r,onFabToggle:i,onNotchToggle:b,isChatLoaded:u,isChannelChat:h,canPost:O,isChatWithSelf:j,messageIds:f,messagesById:p,firstUnreadId:I,isViewportNewest:v,threadFirstMessageId:y,isRestricted:C,restrictionReason:E,focusingId:w,isSelectModeActive:M,animationLevel:S,loadViewportMessages:k,markMessageListRead:N,markMessagesRead:P,setScrollOffset:T,lastMessage:A,botDescription:R,threadTopMessageId:L,hasLinkedChat:F,openHistoryCalendar:D})=>{const B=Object(c.q)(null),U=Object(c.q)("thread"===a&&Object(o.rb)(Object(s.e)(),e,t)||0),H=Object(c.q)(),G=Object(c.q)(),q=Object(c.q)(),_=Object(c.q)(),V=Object(c.q)(),$=Object(c.q)(),z=Object(c.q)(!1),W=Object(c.q)(!f),[K,Q]=Object(c.r)(),[Y,Z]=Object(c.r)(Boolean(w)),ee=Boolean(f);Object(je.a)(()=>{ee&&Object(g.d)(()=>{W.current=!1})},[ee]),Object(je.a)(()=>{V.current=I,_.current||(_.current=I)},[I]);const{observe:te,freeze:ae,unfreeze:se}=Object(ft.a)({rootRef:B,throttleMs:Ga,margin:qa}),{observe:ce,freeze:re,unfreeze:oe}=Object(ft.a)({rootRef:B},e=>{if("thread"!==a)return;let t=0;const s=[];e.forEach(e=>{const{isIntersecting:a,target:n}=e;if(!a)return;const{dataset:c}=n,r=Number(c.lastMessageId||c.messageId);r>t&&(t=r),c.hasUnreadMention&&s.push(r)}),V.current&&t>=V.current&&N({maxId:t}),s.length&&P({messageIds:s})});Object(je.a)(()=>{$.current=w,w?(ae(),re()):(oe(),se())},[w]);const{observe:ie}=Object(ft.a)({rootRef:B,throttleMs:Ga});Object(c.n)(()=>{w?Z(!0):setTimeout(()=>{Z(!1)},200)},[w]);const le=Object(c.p)(()=>{if(!f||!p)return;const e=!L||f[0]&&y!==f[0]?f:[L,...f];if(!e.length)return;const t=e.map(e=>p[e]);return gt(Object(d.k)(t,["date","id"]),_.current)},[f,p,y,L]),[de,be,ue]=Object(c.p)(()=>"thread"===a?[Object(g.a)(()=>k({direction:l.e.Backwards}),1e3,!0,!1),Object(g.a)(()=>k({direction:l.e.Forwards}),1e3,!0,!1),Object(g.a)(()=>k({direction:l.e.Around}),1e3,!0,!1)]:[],[k,f]),{isScrolled:me,updateStickyDates:he}=pt(),Oe=Object(c.m)(()=>{if(z.current)return void(z.current=!1);const s=B.current;$.current||he(s,r),_a(()=>{Object(g.b)(()=>{s.parentElement&&(U.current=s.scrollHeight-s.scrollTop,"thread"===a&&T({chatId:e,threadId:t,scrollOffset:U.current}))})})},[he,r,a,T,e,t]);Object(c.n)(()=>{if(!("ResizeObserver"in window))return;const e=new ResizeObserver(([e])=>{e.target.offsetParent&&Q(e.contentRect.height)});return e.observe(B.current),()=>{e.disconnect()}},[]);const{height:ge}=_e();Object(c.n)(()=>{B.current.dataset.normalHeight=String(B.current.offsetHeight)},[ge]),Object(c.n)(()=>{if(!ue||!u||C||w)return;const e=B.current;(!f||f.length{if(!f||!q.current)return;const e=q.current.filter(e=>f.includes(Number(e.dataset.messageId))),t=e[1]||e[0];t&&(H.current=t.id,G.current=t.getBoundingClientRect().top)},[f,v,K,r]),Object(Ot.a)(([e,t,a])=>{const s=B.current;if(q.current=Array.from(s.querySelectorAll(".message-list-item")),!s.offsetParent)return;const c=v&&f&&f.length{s.parentElement&&s.parentElement.classList.remove("force-messages-scroll")},1e3));const{scrollTop:o,scrollHeight:i,offsetHeight:l}=s,d=U.current,b=q.current[q.current.length-1],u=b?b.offsetHeight:0,m=v&&t&&d-(a||l)-u<=100;let h;const O=f&&e&&f[0]!==e[0],j=f&&e&&f[f.length-1]!==e[e.length-1],p=f&&$.current===f[f.length-1];if(m&&j&&!O&&!p&&(b&&Object(g.b)(()=>{Object(vt.a)(s,b,"end",20,void 0,void 0,void 0,!0)}),h=i-l,U.current=Math.max(i-h,l),!c))return;const I=void 0!==a&&a!==K,y=H.current&&s.querySelector("#"+H.current),C=!y&&_.current&&s.querySelector(".unread-divider");if(m&&I){if(Object(vt.b)())return;h=i-l}else if(y){h=o+(y.getBoundingClientRect().top-(G.current||0))}else h=C?C.offsetTop-(r?60:10):i-d;Object(It.a)(s,h),$.current||(z.current=!0,Object(g.b)(()=>{z.current=!1})),U.current=Math.max(i-h,l)},[f,v,K,r]),Object(c.n)(()=>{(!S||S>0)&&Object(X.b)(200+n.c)},[S,M]);const fe=Object(ne.a)(),pe=Boolean(e&&Object(m.lb)(e)),Ie=Boolean(!pe&&!h||j),ve=Object(J.a)("MessageList custom-scroll",!Ie&&"no-avatars",h&&"no-avatars",!O&&"no-composer","pinned"===a&&"type-pinned",M&&"select-mode-active",Y&&"has-focusing",me&&"scrolled");return c.a.createElement("div",{ref:B,className:ve,onScroll:Oe},C?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,E?E.text:"This is a private "+(h?"channel":"chat"))):R?c.a.createElement("div",{className:"empty rich"},c.a.createElement("span",null,Object(tt.a)(fe(R),["br","emoji","links"]))):f&&!le?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,fe("NoMessages"))):f&&le||A?c.a.createElement(Ct,{containerRef:B,className:"messages-container",messageIds:f||[A.id],focusingId:w,loadMoreForwards:be,loadMoreBackwards:de,isViewportNewest:v,firstUnreadId:I,onFabToggle:i,onNotchToggle:b},function(e,t,a,s,r,o,i,l,b,u,h,O,j,g,f,p){const I=c.a.createElement("div",{className:Object(J.a)("unread-divider","local-action-message"),key:"unread-messages"},c.a.createElement("span",null,e("UnreadMessages"))),v=f?0:t.reduce((e,t)=>e+Object(d.h)(t.senderGroups).length,0);let y=0;const C=t.map((t,O,f)=>{const C=t.senderGroups.map((t,n,g)=>{if(1===t.length&&!jt(t[0])&&Object(m.db)(t[0])){const e=t[0],s=n===g.length-1&&O===f.length-1;return Object(d.e)([e.id===l.current&&I,c.a.createElement(Vt,{key:e.id,message:e,observeIntersection:a,appearanceOrder:v-++y,isLastInList:s})])}let p;return Object(d.h)(t.map((C,E)=>{const w=jt(C)?C.mainMessage:C,M=jt(C)?C:void 0,S=Object(m.tb)(w),k=jt(C),N=t[E+1];w.previousLocalId&&i.current==="message"+w.previousLocalId&&(i.current="message"+w.id);const P=!k&&w.groupedId?w.groupedId:void 0,T=N&&!jt(N)?N.groupedId:void 0,A={isFirstInGroup:0===E,isLastInGroup:E===t.length-1,isFirstInDocumentGroup:Boolean(P&&P!==p),isLastInDocumentGroup:Boolean(P&&P!==T),isLastInList:E===t.length-1&&n===g.length-1&&O===f.length-1};p=P;const x=Object(m.F)(w),R="scheduled"!==u?x:`${w.date}_${x}`;return Object(d.e)([w.id===l.current?I:void 0,c.a.createElement(Ha,{key:R,message:w,observeIntersectionForBottom:a,observeIntersectionForMedia:s,observeIntersectionForAnimatedStickers:r,album:M,withAvatar:A.isLastInGroup&&o&&!S&&!(w.id===h),withSenderName:A.isFirstInGroup&&o&&!S,threadId:b,messageListType:u,noComments:!1===j,appearanceOrder:v-++y,isFirstInGroup:A.isFirstInGroup,isLastInGroup:A.isLastInGroup,isFirstInDocumentGroup:A.isFirstInDocumentGroup,isLastInDocumentGroup:A.isLastInDocumentGroup,isLastInList:A.isLastInList}),w.id===h&&c.a.createElement("div",{className:"local-action-message",key:"discussion-started"},c.a.createElement("span",null,e("DiscussionStarted")))])}))});return c.a.createElement("div",{className:"message-date-group",key:t.datetime,teactFastList:!0},c.a.createElement("div",{className:Object(J.a)("sticky-date",!g&&"interactive"),key:"date-header",onClick:g?void 0:()=>p({selectedAt:t.datetime})},c.a.createElement("span",{dir:"auto"},g&&t.originalDate===n.lb&&e("MessageScheduledUntilOnline"),g&&t.originalDate!==n.lb&&e("MessageScheduledOn",Object(x.c)(e,t.datetime,void 0,!0)),!g&&Object(x.c)(e,t.datetime))),Object(d.h)(C))});return Object(d.h)(C)}(fe,le||gt([A]),ce,te,ie,Ie,H,_,t,a,L,0,F,!!le&&"scheduled"===a,!le||!W.current,D)):c.a.createElement(Ee.a,{color:"white"}))}));a(237);var $a=Object(c.h)(Object(s.h)(e=>{const t=Object(o.y)(e);if(!t)return{};const{chatId:a,threadId:s,type:n}=t,c=Object(o.f)(e,a);return{messageListType:n,unreadCount:c&&s===i.MAIN_THREAD_ID&&"thread"===n?c.unreadCount:void 0}},(e,t)=>Object(d.l)(t,["focusLastMessage"]))(({isShown:e,canPost:t,messageListType:a,unreadCount:s,focusLastMessage:n})=>{const r=Object(ne.a)(),o=Object(c.q)(null),i=Object(c.m)(()=>{if(e)if("thread"===a)n();else{const e=o.current.parentElement.querySelector(".MessageList"),t=e.querySelectorAll(".message-list-item"),a=t[t.length-1];if(!a)return;Object(vt.a)(e,a,"end",20)}},[e,a,n]),l=Object(J.a)("ScrollDownButton",e&&"revealed",!t&&"no-composer");return c.a.createElement("div",{ref:o,className:l},c.a.createElement("div",{className:"ScrollDownButton-inner"},c.a.createElement(oe.a,{color:"secondary",round:!0,onClick:i,ariaLabel:r("AccDescrPageDown")},c.a.createElement("i",{className:"icon-arrow-down"})),Boolean(s)&&c.a.createElement("div",{className:"unread-count"},Object(Qe.b)(s))))})),za=a(129),Wa=a(138);async function Ka(e,t,a,s){const n=URL.createObjectURL(t),{type:c,size:r}=t;let o,i;if(c.startsWith("image/"))if(a){const a=await Object(Ge.g)(n),{width:r,height:i}=a;if(r>1280||i>1280||"image/jpeg"!==c){const c=await function(e){return new Promise(t=>{const a=document.createElement("canvas"),s=a.getContext("2d");let{width:n,height:c}=e;(n>1280||c>1280)&&(n>=c?(c*=1280/n,n=1280):(n*=1280/c,c=1280)),a.width=n,a.height=c,s.drawImage(e,0,0,e.width,e.height,0,0,n,c),a.toBlob(t,"image/jpeg",100)})}(a);return c?(URL.revokeObjectURL(n),Ka(e,c,!0,s)):Ka(e,t,!1,s)}o={width:r,height:i}}else i=n;else if(c.startsWith("video/")){if(r<10485760){const{videoWidth:e,videoHeight:t,duration:a}=await Object(Ge.h)(n);o={width:e,height:t,duration:a}}i=await Object(Ge.c)(n)}return{blobUrl:n,filename:e,mimeType:c,size:r,quick:o,previewBlobUrl:i,...s}}var Qa=a(181),Ya=a.p+"8ccc0b555efcec3616377aea078dda16.js";const Xa={encoderPath:Ya,reuseWorker:!0},Ja={type:"audio/ogg"};let Za,es,ts;async function as(){return Za||(Za=a.e(9).then(a.t.bind(null,316,7)),es=(await Za).default,ts=new es(Xa)),Za}async function ss(e){await async function(){await as(),await ts.start()}();const t=Date.now();let a;const s=[],n=[];ts.ondataavailable=e=>{s.push(e)};const c=function(e,t){const a=e.sourceNode,s=a.context.createAnalyser();s.fftSize=64,a.connect(s);const n=s.frequencyBinCount,c=new Uint8Array(n);let r=!1;return function e(){if(r)return;s.getByteFrequencyData(c);const a=c.reduce((e,t)=>e+t,0),o=a/n/255;t(o<.1?0:o),requestAnimationFrame(e)}(),()=>{r=!0}}(ts,t=>{n.push(255*t),e(t)});return{stop:()=>new Promise((e,r)=>{ts.onstop=()=>{e({blob:new Blob(s,Ja),duration:Math.round(((a||Date.now())-t)/1e3),waveform:n})},ts.onerror=r;const o=Math.max(0,t+1e3-Date.now());setTimeout(()=>{ts.stop(),c()},o)}),pause:()=>{const e=Math.max(0,t+1e3-Date.now());setTimeout(()=>{ts.pause(),a=Date.now(),c()},e)}}}const ns=["image/png","image/jpeg","image/gif"];function cs(e){const{text:t,entities:a}=e||{};if(!t)return"";const s=Object(wt.b)(t,a,void 0,void 0,!0);return Array.isArray(s)?s.join(""):s}let rs,os;var is=a(64);var ls=a(182),ds=a(190);var bs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"DeleteMessageModal",!t);return a?c.a.createElement(a,e):void 0});function us(){return(us=Object.assign||function(e){for(var t=1;t{const a=Object(c.q)(!1),s=Object(c.m)(()=>{if(a.current=!0,hs)return hs=!1,void e();ms&&(clearTimeout(ms),ms=void 0),ms=window.setTimeout(()=>{a.current&&e()},200)},[e]),n=Object(c.m)(()=>{a.current=!1},[]);return c.a.createElement(oe.a,us({},t,{onMouseEnter:h.l?void 0:s,onMouseLeave:h.l?void 0:n,onClick:h.l?e:void 0}))});var js=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"AttachMenu",!t);return a?c.a.createElement(a,e):void 0});var gs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"SymbolMenu",!t);return a?c.a.createElement(a,e):void 0});var fs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"MentionTooltip",!t);return a?c.a.createElement(a,e):void 0});var ps=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"CustomSendMenu",!t);return a?c.a.createElement(a,e):void 0});var Is=e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"StickerTooltip",!t);return a?c.a.createElement(a,e):void 0},vs=a(183);var ys=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"BotKeyboardMenu",!t);return a?c.a.createElement(a,e):void 0}),Cs=a(184),Es=a(119);a(239);var ws=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a,type:s}=Object(o.y)(e)||{};if(!t||!a||!s)return{};const{currentUserId:n,forwardMessages:{fromChatId:c,toChatId:r,messageIds:i}}=e,l=Object(o.mb)(e,t,a),d="scheduled"===s?Object(o.E)(e,t):Object(o.C)(e,t,a),b=e.settings.byKey.animationLevel>=1,u=r===t;let h,O;if(l?h=Object(o.k)(e,t,l):d?h=Object(o.D)(e,t,a,s):u&&1===i.length&&(h=Object(o.k)(e,c,i[0])),l&&h){const{forwardInfo:a}=h,s=t===n;a&&(a.isChannelPost||s)&&(O=Object(o.K)(e,h)),O||(O=Object(o.tb)(e,h))}else u&&(O=Object(m.lb)(c)?Object(o.Gb)(e,c):Object(o.f)(e,c));return{replyingToId:l,editingId:d,message:h,sender:O,shouldAnimate:b,forwardedMessagesCount:u?i.length:void 0}},(e,t)=>Object(d.l)(t,["setReplyingToId","setEditingId","focusMessage","exitForwardMode"]))(({replyingToId:e,editingId:t,message:a,sender:s,shouldAnimate:n,forwardedMessagesCount:r,setReplyingToId:o,setEditingId:i,focusMessage:l,exitForwardMode:d})=>{const b=Boolean((e||t)&&a||s&&r),u=Object(Es.a)([r],r?300:void 0),{shouldRender:m,transitionClassNames:h}=Object(Z.a)(u&&b,void 0,!n,void 0,!n),O=Object(c.m)(()=>{e?o({messageId:void 0}):t?i({messageId:void 0}):r&&d()},[e,t,r,o,i,d]);Object(c.n)(()=>b?Object(te.a)(O):void 0,[b,O]);const j=Object(c.m)(()=>{l({chatId:a.chatId,messageId:a.id})},[l,a]),g=Object(J.a)("ComposerEmbeddedMessage",h),f=r&&r>1?r+" forwarded messages":void 0;if(m)return c.a.createElement("div",{className:g},c.a.createElement("div",null,c.a.createElement(oe.a,{round:!0,color:"translucent",ariaLabel:"Cancel replying",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement($t,{className:"inside-input",message:a,sender:s,customText:f,title:t?"Edit Message":void 0,onClick:j})))}));var Ms=Object(c.h)(e=>{const{attachments:t}=e,a=Object(Ce.a)(ye.a.Extra,"AttachmentModal",!t.length);return a?c.a.createElement(a,e):void 0});var Ss=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"PollModal",!t);return a?c.a.createElement(a,e):void 0});var ks=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"DropArea",!t);return a?c.a.createElement(a,e):void 0});a(240);const Ns=new RegExp(n.gb,"i");var Ps=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a})=>{const s=Object(o.cb)(e,t,a);return{webPagePreview:e.webPagePreview,noWebPage:s}},(e,t)=>Object(d.l)(t,["loadWebPagePreview","clearWebPagePreview","toggleMessageWebPage"]))(({chatId:e,threadId:t,messageText:a,disabled:s,webPagePreview:n,noWebPage:r,loadWebPagePreview:o,clearWebPagePreview:l,toggleMessageWebPage:d})=>{const b=Object(c.p)(()=>{const{text:e,entities:t}=Object(Wa.a)(a),s=t&&t.find(({type:e})=>e===i.ApiMessageEntityTypes.TextUrl);if(s)return s.url;const n=e.match(Ns);return n?n[0]:void 0},[a]);Object(c.n)(()=>{b?o({text:b}):(l(),d({chatId:e,threadId:t}))},[e,d,l,b,o,t]),Object(je.a)(()=>{l(),d({chatId:e,threadId:t})},[e]);const u=Boolean(n&&a.length&&!r&&!s),{shouldRender:m,transitionClassNames:h}=Object(Z.a)(u),O=Object(Ke.a)(n);if(!m||!O)return;const{photo:j,...g}=O,f={content:{webPage:g}};return c.a.createElement("div",{className:Object(J.a)("WebPagePreview",h)},c.a.createElement("div",null,c.a.createElement(oe.a,{round:!0,color:"translucent",ariaLabel:"Clear Webpage Preview",onClick:()=>{d({chatId:e,threadId:t,noWebPage:!0})}},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(Ma,{message:f,inPreview:!0})))})),Ts=a(122);var As=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"CalendarModal",!t);return a?c.a.createElement(a,e):void 0});var xs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"PaymentModal",!t);return a?c.a.createElement(a,e):void 0});var Rs,Ls=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"ReceiptModal",!t);return a?c.a.createElement(a,e):void 0});a(241);!function(e){e.Send="send",e.Record="record",e.Edit="edit"}(Rs||(Rs={}));var Fs=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=n&&Object(o.o)(e,n),r=n?Object(o.O)(e,n):void 0,l=Object(o.P)(e,t),d=r&&Object(o.bb)(e,t),b=Object(o.ob)(e,t),{language:u}=e.settings.byKey,h=Object(o.F)(e,u);return{editingMessage:Object(o.D)(e,t,a,s),connectionState:e.connectionState,draft:Object(o.B)(e,t,a),chat:n,isChatWithBot:r,isChatWithSelf:l,canScheduleUntilOnline:!l&&!r&&n&&c&&Object(m.lb)(t)&&c.status&&Boolean(c.status.wasOnline),isRightColumnShown:Object(o.W)(e),isSelectModeActive:Object(o.S)(e),withScheduledButton:a===i.MAIN_THREAD_ID&&"thread"===s&&Boolean(b&&b.length),shouldSchedule:"scheduled"===s,botKeyboardMessageId:d?d.id:void 0,isForwarding:t===e.forwardMessages.toChatId,canSuggestMembers:n&&Object(m.kb)(n),isPollModalOpen:e.isPollModalOpen,stickersForEmoji:e.stickers.forEmoji.stickers,groupChatMembers:n&&n.fullInfo&&n.fullInfo.members,currentUserId:e.currentUserId,usersById:e.users.byId,lastSyncTime:e.lastSyncTime,contentToBeScheduled:e.messages.contentToBeScheduled,isPaymentModalOpen:e.payment.isPaymentModalOpen,isReceiptModalOpen:Boolean(e.payment.receipt),shouldSuggestStickers:e.settings.byKey.shouldSuggestStickers,recentEmojis:e.recentEmojis,language:u,emojiKeywords:h?h.keywords:void 0}},(e,t)=>Object(d.l)(t,["sendMessage","editMessage","saveDraft","clearDraft","showError","setStickerSearchQuery","setGifSearchQuery","forwardMessages","openPollModal","closePollModal","closePaymentModal","clearReceipt","loadScheduledHistory","openChat","addRecentEmoji","loadEmojiKeywords"]))(({dropAreaState:e,shouldSchedule:t,canScheduleUntilOnline:a,onDropHide:r,editingMessage:o,chatId:l,threadId:d,messageListType:b,draft:u,chat:O,connectionState:j,isChatWithBot:f,isChatWithSelf:p,isRightColumnShown:I,isSelectModeActive:v,isForwarding:y,canSuggestMembers:C,isPollModalOpen:E,isPaymentModalOpen:w,isReceiptModalOpen:M,botKeyboardMessageId:S,withScheduledButton:k,stickersForEmoji:N,groupChatMembers:P,currentUserId:T,usersById:A,lastSyncTime:R,contentToBeScheduled:L,shouldSuggestStickers:F,language:D,emojiKeywords:B,recentEmojis:U,sendMessage:H,editMessage:G,saveDraft:q,clearDraft:_,showError:V,setStickerSearchQuery:$,setGifSearchQuery:z,forwardMessages:W,openPollModal:K,closePollModal:Q,loadScheduledHistory:Y,closePaymentModal:X,openChat:Z,clearReceipt:ee,addRecentEmoji:ae,loadEmojiKeywords:se})=>{const ce=Object(c.q)(null),[re,ie]=Object(c.r)(""),le=Object(c.q)(),de=Object(na.a)(e),[be,ue,he]=Object(ot.a)(),[Oe,je]=Object(c.r)(),ge=Object(c.q)(re);Object(c.n)(()=>{ge.current=re},[re]),Object(c.n)(()=>{le.current=void 0},[l]),Object(c.n)(()=>{l&&R&&d===i.MAIN_THREAD_ID&&Y()},[l,Y,R,d]),Object(c.o)(()=>{ce.current&&(ce.current.innerHTML='')},[]),Object(c.n)(()=>{L&&(je(L),ue())},[L,ue]);const[fe,pe]=Object(c.r)([]),[Ie,ve,ye]=Object(ot.a)(),[Ce,Ee,we]=Object(ot.a)(),[Me,Se,ke]=Object(ot.a)(),[Ne,Pe,Te]=Object(ot.a)(),[Ae,xe]=Object(ot.a)(),[Re,Le,Fe]=Object(ot.a)(),{startRecordingVoice:De,stopRecordingVoice:Be,pauseRecordingVoice:He,activeVoiceRecording:Ge,currentRecordTime:qe,recordButtonRef:_e,startRecordTimeRef:Ve}=(()=>{const e=Object(c.q)(null),[t,a]=Object(c.r)(),s=Object(c.q)(),[n,r]=Object(c.r)();Object(c.n)(()=>{h.e&&as()},[]);const o=Object(c.m)(async()=>{try{const{stop:t,pause:n}=await ss(t=>{e.current&&(s.current&&Date.now()%4==0&&(e.current.style.boxShadow=`0 0 0 ${50*(t||0)}px rgba(0,0,0,.15)`),r(Date.now()))});s.current=Date.now(),r(Date.now()),a({stop:t,pause:n})}catch(e){console.error(e)}},[]),i=Object(c.m)(()=>{if(t){e.current&&(e.current.style.boxShadow="none");try{return t.pause()}catch(e){return void console.error(e)}}},[t]),l=Object(c.m)(()=>{if(t){a(void 0),s.current=void 0,r(void 0),e.current&&(e.current.style.boxShadow="none");try{return t.stop()}catch(e){return void console.error(e)}}},[t]);return Object(c.n)(()=>t?Object(te.a)(l):void 0,[t,l]),{startRecordingVoice:o,pauseRecordingVoice:i,stopRecordingVoice:l,activeVoiceRecording:t,currentRecordTime:n,recordButtonRef:e,startRecordTimeRef:s}})(),$e=o?Rs.Edit:!h.m||Ge||re&&!fe.length||y?Rs.Send:Rs.Record,ze=!t,{isMentionTooltipOpen:We,mentionFilter:Ke,closeMentionTooltip:Qe,insertMention:Ye,mentionFilteredMembers:Xe}=Object(ds.a)(C&&!fe.length,re,ie,void 0,P,T,A),{isContextMenuOpen:Je,handleContextMenu:Ze,handleContextMenuClose:et,handleContextMenuHide:at}=Object(Et.a)(_e,!($e===Rs.Send&&ze)),st=Object(c.p)(()=>Object(m.c)(O,f),[O,f]),nt=O&&Object(m.gb)(O),ct=Object(m.k)(O),{isStickerTooltipOpen:rt,closeStickerTooltip:it}=function(e,t,a){const{loadStickersForEmoji:n,clearStickersForEmoji:r}=Object(s.d)(),o=h.d&&1===Object(is.a)(t)||!h.d&&Boolean(t.match(/^]*?>$/g)),i=Boolean(a)&&o;return Object(c.n)(()=>{e&&o?n({emoji:t}):!i&&o||r()},[t,o,r,n,e]),{isStickerTooltipOpen:i,closeStickerTooltip:r}}(Boolean(F&&st.canSendStickers&&!fe.length),re,N),{isEmojiTooltipOpen:lt,closeEmojiTooltip:dt,filteredEmojis:bt,insertEmoji:ut}=Object(ls.a)(Boolean(F&&st.canSendStickers&&!fe.length),re,U,void 0,ie,B),mt=Object(c.m)((e,t=n.v)=>{const a=window.getSelection(),s=document.getElementById(t),c=Object(tt.a)(e,["escape_html","emoji_html","br_html"]).join("").replace(/\u200b+/g,"​");if(a.rangeCount){const t=a.getRangeAt(0);if(Object(Qa.a)(t))return void(h.d?document.execCommand("insertText",!1,e):(!function(e){const t=window.getSelection();if(t&&t.getRangeAt&&t.rangeCount){const a=t.getRangeAt(0);a.deleteContents();const s=a.createContextualFragment(e),n=s.lastChild;a.insertNode(s),n&&(a.setStartAfter(n),a.setEndAfter(n),t.removeAllRanges(),t.addRange(a))}}(c),s.dispatchEvent(new Event("input",{bubbles:!0}))))}ie(`${ge.current}${c}`),h.g||requestAnimationFrame(()=>{Object(za.a)(s)})},[]),ht=Object(c.m)(()=>{const e=window.getSelection();if(e.rangeCount){const t=e.getRangeAt(0);if(Object(Qa.a)(t))return void document.execCommand("delete",!1)}ie(function(e){const t=document.createElement("div");t.contentEditable="true",t.style.position="absolute",t.style.left="-10000px",t.style.top="-10000px",t.innerHTML=e,document.body.appendChild(t);let a=t.lastChild;if(a.lastChild)for(;a.lastChild;)a=a.lastChild;const s=a.textContent.length,n=document.createRange(),c=window.getSelection();n.setStart(a,s),n.setEnd(a,s),c.removeAllRanges(),c.addRange(n),document.execCommand("delete",!1);const r=t.innerHTML;return document.body.removeChild(t),r}(ge.current))},[]),Ot=Object(c.m)(()=>{ie(""),pe([]),it(),he(),je(void 0),Qe(),dt(),h.g?setTimeout(()=>ke(),350):ke()},[it,he,Qe,dt,ke]),jt=Object(na.a)(l);Object(c.n)(()=>{jt&&l!==jt&&(Be(),Ot())},[l,jt,Ot,Be]);const gt=((e,t,a,s,r,o)=>{Object(c.n)(()=>{a?(t(cs(a.content.text)),requestAnimationFrame(()=>{const e=document.getElementById(n.v);Object(za.a)(e,!0)})):t("")},[a,t]);return Object(c.m)(()=>{const{text:t,entities:n}=Object(Wa.a)(e.current);a&&(t||Object(m.cb)(a)?(o({messageId:a.id,text:t,entities:n}),s()):r())},[o,a,e,r,s])})(ge,ie,o,Ot,Pe,G);((e,t,a,s,r,o,i,l,d)=>{const b=Object(c.m)((e,t)=>{r.current.length&&!i?l({chatId:e,threadId:t,draft:Object(Wa.a)(r.current)}):d({chatId:e,threadId:t})},[d,i,r,l]),u=Object(c.p)(()=>Object(g.a)(e=>e(),n.u,!1),[t]),m=Object(na.a)(t),h=Object(na.a)(a);Object(c.n)(()=>(rs=t,os=a,()=>{rs=void 0,os=void 0,b(t,a)}),[t,a,b]),Object(c.n)(()=>{t===m&&a===h||e&&(o(cs(e)),requestAnimationFrame(()=>{const e=document.getElementById(n.v);Object(za.a)(e,!0)}))},[t,a,e,o,b,m,h]);const O=Object(na.a)(s);Object(c.n)(()=>{t&&a&&m===t&&h===a&&O!==s&&(s.length?u(()=>{rs===t&&os===a&&b(t,a)}):b(t,a))},[t,s,m,O,h,u,a,b]),Object(c.n)(()=>{function e(){t&&a&&b(t,a)}return window.addEventListener("blur",e),()=>{window.removeEventListener("blur",e)}},[t,a,b])})(u,l,d,re,ge,ie,o,q,_),((e,t,a)=>{Object(c.n)(()=>{async function s(s){if(!s.clipboardData)return;const c=document.activeElement;if(c&&"INPUT"===c.tagName&&![n.v,n.w].includes(c.id))return;const{items:r}=s.clipboardData,o=Array.from(r).find(e=>ns.includes(e.type)),i=o&&o.getAsFile(),l=s.clipboardData.getData("text").substring(0,4096);if(i||l){if(s.preventDefault(),i&&!a){const e=await Ka(i.name,i,!0);t(t=>[...t,e])}l&&e(l,c?c.id:void 0)}}return document.addEventListener("paste",s,!1),()=>{document.removeEventListener("paste",s,!1)}},[e,a,t])})(mt,pe,o);const ft=Object(c.m)(async(e,t)=>{pe(await Promise.all(e.map(e=>Ka(e.name,e,t))))},[]),pt=Object(c.m)(async(e,t)=>{pe([...fe,...await Promise.all(e.map(e=>Ka(e.name,e,t)))])},[fe]),It=Object(c.m)(()=>{pe([])},[]),vt=Object(c.m)(async(e=!1,t)=>{if("connectionStateReady"!==j)return;let a=fe;if(Ge){const e=await Be();if(e){const{blob:t,duration:s,waveform:n}=e;a=[await Ka("wonderful-voice-message.ogg",t,!1,{voice:{duration:s,waveform:n}})]}}const{text:s,entities:c}=Object(Wa.a)(ge.current);if(a.length||s||y)if(a.length&&s&&s.length>1024){const e=s.length-1024;V({error:{message:"CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS",textParams:{"{EXTRA_CHARS_COUNT}":e,"{PLURAL_S}":e>1?"s":""}}})}else{if(a.length||s){if(ct&&!nt){const e=Math.floor(Date.now()/1e3),t=le.current&&Math.floor(e-le.current),a=ct.nextSendDate&&ct.nextSendDate>e;if(t&&t{e={...e,isPreloadedGlobally:!0},t?(je({sticker:e}),ue()):(H({sticker:e}),requestAnimationFrame(Ot))},[t,ue,H,Ot]),Ct=Object(c.m)(e=>{t?(je({gif:e}),ue()):(H({gif:e}),requestAnimationFrame(Ot))},[t,ue,H,Ot]),wt=Object(c.m)(e=>{t?(je({poll:e}),Q(),ue()):(H({poll:e}),Q())},[Q,ue,H,t]),Mt=Object(c.m)(()=>{t?(je({isSilent:!0}),ue()):vt(!0)},[vt,ue,t]),St=Object(c.m)(e=>{const{isSilent:t,...a}=Oe||{},s=Math.round(Math.max(e.getTime(),Date.now()+6e4)/1e3);Oe&&0!==Object.keys(a).length?(H({...Oe,scheduledAt:s}),requestAnimationFrame(Ot)):vt(!!t,s),he()},[he,vt,Ot,Oe,H]),kt=Object(c.m)(()=>{St(new Date(1e3*n.lb))},[St]),Nt=Object(c.m)(()=>{he(),je(void 0)},[he]),Pt=Object(c.m)(e=>{"stickers"===e?($({query:""}),z({query:void 0})):(z({query:""}),$({query:void 0}))},[$,z]),Tt=Object(c.m)(()=>{const e=document.getElementById(n.v);h.g&&e===document.activeElement?(e.blur(),setTimeout(()=>{Se()},100)):Se()},[Se]),At=Object(c.m)(()=>{Z({id:l,threadId:d,type:"scheduled"})},[Z,l,d]);Object(c.n)(()=>{I&&h.g&&ke()},[I,ke]),Object(c.n)(()=>{v?Le():setTimeout(()=>{Fe()},200)},[v,Fe,Le]);const xt=Object(c.m)(()=>{switch($e){case Rs.Send:t?(Ge&&He(),ue()):(vt(),requestAnimationFrame(Ot));break;case Rs.Record:De();break;case Rs.Edit:gt()}},[$e,Ot,t,De,gt,Ge,ue,He,vt]),Rt=Object(ne.a)(),Lt=$e===Rs.Record&&!st.canAttachMedia,Ft=Object(na.a)(o,!0),Dt=o||Ft,Bt=new Date;Bt.setSeconds(0),Bt.setMilliseconds(0);const Ut=new Date;Ut.setFullYear(Ut.getFullYear()+1);let Ht="SendMessage";switch($e){case Rs.Edit:Ht="Save edited message";break;case Rs.Record:Ht=Lt?"Conversation.DefaultRestrictedMedia":"AccDescrVoiceMessage"}const Gt=Object(J.a)("Composer",!v&&"shown",Re&&"hover-disabled"),qt=Object(J.a)("mobile-symbol-menu-button",Ae?Me&&"menu-opened":Me&&"is-loading");return c.a.createElement("div",{className:Gt},st.canAttachMedia&&c.a.createElement(Ts.a,{containerId:"#middle-column-portals"},c.a.createElement(ks,{isOpen:e!==Ue.a.None,withQuick:[e,de].includes(Ue.a.QuickFile),onHide:r,onFileSelect:ft})),c.a.createElement(Ms,{attachments:fe,caption:fe.length?re:"",canSuggestMembers:C,groupChatMembers:P,currentUserId:T,usersById:A,recentEmojis:U,onCaptionUpdate:ie,language:D,addRecentEmoji:ae,loadEmojiKeywords:se,onSend:t?ue:vt,onFileAppend:pt,onClear:It}),c.a.createElement(Ss,{isOpen:Boolean(E),onClear:Q,onSend:wt}),c.a.createElement(xs,{isOpen:Boolean(w),onClose:X}),c.a.createElement(Ls,{isOpen:Boolean(M),onClose:ee}),Dt&&c.a.createElement(bs,{isOpen:Ne,isSchedule:"scheduled"===b,onClose:Te,message:Dt}),c.a.createElement(fs,{isOpen:We,filter:Ke,onClose:Qe,onInsertUserName:Ye,filteredChatMembers:Xe,usersById:A}),c.a.createElement("div",{id:"message-compose"},c.a.createElement("div",{className:"svg-appendix",ref:ce}),c.a.createElement(ws,null),c.a.createElement(Ps,{chatId:l,threadId:d,messageText:fe.length?"":re,disabled:!st.canAttachEmbedLinks}),c.a.createElement("div",{className:"message-input-wrapper"},h.g?c.a.createElement(oe.a,{className:qt,round:!0,color:"translucent",onClick:Me?ke:Tt,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"}),c.a.createElement("i",{className:"icon-keyboard"}),c.a.createElement(me.a,{color:"gray"})):c.a.createElement(Os,{className:""+(Me?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Se,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"})),c.a.createElement(Cs.a,{id:"message-input-text",html:fe.length?"":re,placeholder:Ge&&window.innerWidth<=600?"":Rt("Message"),shouldSetFocus:Me,shouldSupressFocus:h.g&&Me,shouldSupressTextFormatter:lt||We,onUpdate:ie,onSend:$e===Rs.Edit?gt:t?ue:vt,onSupressedFocus:ke}),k&&c.a.createElement(oe.a,{round:!0,faded:!0,className:"scheduled-button",color:"translucent",onClick:At,ariaLabel:"Open scheduled messages"},c.a.createElement("i",{className:"icon-schedule"})),S&&!Ge&&!o&&c.a.createElement(Os,{className:""+(Ie?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:ve,ariaLabel:"Open bot command keyboard"},c.a.createElement("i",{className:"icon-bot-command"})),!Ge&&!o&&c.a.createElement(Os,{className:""+(Ce?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Ee,ariaLabel:"Add an attachment"},c.a.createElement("i",{className:"icon-attach"})),Ge&&qe&&c.a.createElement("span",{className:"recording-state"},Object(x.i)(qe-Ve.current)),c.a.createElement(Is,{isOpen:rt,onStickerSelect:yt}),c.a.createElement(vs.a,{isOpen:lt,emojis:bt,onClose:dt,onEmojiSelect:ut,addRecentEmoji:ae,loadEmojiKeywords:se,language:D}),c.a.createElement(js,{isOpen:Ce,allowedAttachmentOptions:st,onFileSelect:ft,onPollCreate:K,onClose:we}),S&&c.a.createElement(ys,{messageId:S,isOpen:Ie,onClose:ye}),c.a.createElement(gs,{isOpen:Me,allowedAttachmentOptions:st,onLoad:xe,onClose:ke,onEmojiSelect:mt,onStickerSelect:yt,onGifSelect:Ct,onRemoveSymbol:ht,onSearchOpen:Pt,addRecentEmoji:ae}))),Ge&&c.a.createElement(oe.a,{round:!0,color:"danger",className:"cancel",onClick:Be,ariaLabel:"Cancel voice recording"},c.a.createElement("i",{className:"icon-delete"})),c.a.createElement(oe.a,{ref:_e,round:!0,color:"secondary",className:`${$e} ${Ge?"recording":""}`,disabled:Lt,ariaLabel:Rt(Ht),onClick:xt,onContextMenu:$e===Rs.Send&&ze?Ze:void 0},c.a.createElement("i",{className:"icon-send"}),c.a.createElement("i",{className:"icon-microphone-alt"}),c.a.createElement("i",{className:"icon-check"})),ze&&c.a.createElement(ps,{isOpen:Je,onSilentSend:p?void 0:Mt,onScheduleSend:t?void 0:ue,onClose:et,onCloseAnimationEnd:at}),c.a.createElement(As,{isOpen:be,withTimePicker:!0,selectedAt:Bt.getTime(),maxAt:Object(x.k)(Ut),isFutureMode:!0,secondButtonLabel:a?"Send When Online":void 0,onClose:Nt,onSubmit:St,onSecondButtonClick:a?kt:void 0}))}));var Ds=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Ce.a)(ye.a.Extra,"MobileSearch",!t,!0);return a?c.a.createElement(a,e):void 0});var Bs=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Ce.a)(ye.a.Extra,"MessageSelectToolbar",!t);return a?c.a.createElement(a,e):void 0});var Us=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"UnpinAllMessagesModal",!t);return a?c.a.createElement(a,e):void 0});a(242);const Hs=h.g?450+n.c:void 0;function Gs(e){return"file"===e.kind&&e.type&&n.l.includes(e.type)}var qs=Object(c.h)(Object(s.h)(e=>{const{theme:t}=e.settings.byKey,{isBlurred:a,background:s,backgroundColor:n,patternColor:c}=e.settings.themes[t]||{},r=Object(o.y)(e),{chats:{listIds:l}}=e,d={theme:t,customBackground:s,backgroundColor:n,patternColor:c,isRightColumnShown:Object(o.W)(e),isBackgroundBlurred:a,isMobileSearchActive:Boolean(h.g&&Object(o.A)(e)),isSelectModeActive:Object(o.S)(e),animationLevel:e.settings.byKey.animationLevel};if(!r||!l.active)return d;const{chatId:b,threadId:u,type:O}=r,j=Object(o.f)(e,b),g=Object(o.jb)(e,b),{chatId:f,messageId:p}=e.audioPlayer,I=j&&Object(m.e)(j,u),v=Object(o.L)(e,b),y="pinned"===O;return{...d,chatId:b,threadId:u,messageListType:O,isPrivate:Object(m.lb)(b),canPost:!y&&(!j||I)&&(!v||h.g),isPinnedMessageList:y,messageSendingRestrictionReason:j&&Object(m.K)(j),hasPinnedOrAudioMessage:u!==i.MAIN_THREAD_ID||Boolean(g&&g.length)||Boolean(f&&p),pinnedMessagesCount:g?g.length:0}},(e,t)=>Object(d.l)(t,["openChat","unpinAllMessages","loadUser"]))(({chatId:e,threadId:t,messageListType:a,isPrivate:s,isPinnedMessageList:r,canPost:o,messageSendingRestrictionReason:l,hasPinnedOrAudioMessage:d,pinnedMessagesCount:b,customBackground:u,theme:m,backgroundColor:O,patternColor:j,isRightColumnShown:g,isBackgroundBlurred:f,isMobileSearchActive:p,isSelectModeActive:I,animationLevel:v,openChat:y,unpinAllMessages:C,loadUser:E})=>{const{width:w}=_e(),[M,S]=Object(c.r)(Ue.a.None),[k,N]=Object(c.r)(),[P,T]=Object(c.r)(),[A,x]=Object(c.r)(!1),R=d&&(wn.ab&&w=n.Z&&we?Object(te.a)(()=>{y({id:void 0})}):void 0,[e,y]),Object(c.n)(()=>{S(Ue.a.None),N(void 0),T(void 0)},[e]),Object(c.n)(()=>{s&&E({userId:e})},[e,s,E]);const G=Object(c.m)(e=>{if(h.l)return;const{items:t}=e.dataTransfer||{},a=t&&Array.from(t).every(Gs);S(a?Ue.a.QuickFile:Ue.a.Document)},[]),q=Object(c.m)(()=>{S(Ue.a.None)},[]),_=Object(c.m)(()=>{x(!0)},[]),V=Object(c.m)(()=>{x(!1)},[]),$=Object(c.m)(()=>{C({chatId:e}),V(),y({id:e})},[C,y,V,e]),z=((e,t)=>{const[a,s]=Object(c.r)(t);return Object(c.n)(()=>{t&&(t.startsWith("#")?s(t):He.c(n.m,e,He.a.Blob).then(e=>{const t=URL.createObjectURL(e);Object(Ge.g)(t).then(()=>{s(`url(${t})`)})}))},[t,e]),t?a:void 0})(m,u),W=Object(J.a)(U&&"has-header-tools",u&&"custom-bg-image",O&&"custom-bg-color",u&&f&&"blurred",h.n?"mask-image-disabled":"mask-image-enabled"),K=Object(J.a)("messaging-disabled",!I&&"shown"),{composerHiddenScale:Q,toolbarHiddenScale:Y,composerTranslateX:X,toolbarTranslateX:Z,unpinHiddenScale:ee,toolbarForUnpinHiddenScale:se}=Object(c.p)(()=>$e(w,B),[B,w]),ce=Object(ne.a)(),re=Object(J.a)("middle-column-footer",!B&&"no-composer",B&&P&&!I&&"with-notch");return c.a.createElement("div",{id:"MiddleColumn",className:W,style:`\n --composer-hidden-scale: ${Q};\n --toolbar-hidden-scale: ${Y};\n --unpin-hidden-scale: ${ee};\n --toolbar-unpin-hidden-scale: ${se};\n --composer-translate-x: ${X}px;\n --toolbar-translate-x: ${Z}px;\n --pattern-color: ${j};\n --theme-background-color:\n ${O||("dark"===m?n.n:n.I)};\n `},c.a.createElement("div",{id:"middle-column-bg",style:z?"--custom-background: "+z:void 0}),c.a.createElement("div",{id:"middle-column-portals"}),L&&F&&c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"messages-layout",onDragEnter:B?G:void 0},c.a.createElement(ht,{chatId:L,threadId:F,messageListType:D}),c.a.createElement(ae.a,{name:v===n.e?"slide":"fade",activeKey:"thread"===D&&F===i.MAIN_THREAD_ID?1:2,shouldCleanup:!0},()=>c.a.createElement(c.a.Fragment,null,c.a.createElement(Va,{key:`${L}-${F}-${D}`,chatId:L,threadId:F,type:D,canPost:B,hasTools:U,onFabToggle:N,onNotchToggle:T}),c.a.createElement("div",{className:re},B&&c.a.createElement(Fs,{chatId:L,threadId:F,messageListType:D,dropAreaState:M,onDropHide:q}),r&&c.a.createElement("div",{className:"unpin-button-container",dir:ce.isRtl?"rtl":void 0},c.a.createElement(oe.a,{size:"tiny",fluid:!0,color:"secondary",className:"unpin-all-button",onClick:_},c.a.createElement("i",{className:"icon-unpin"}),c.a.createElement("span",null,ce("Chat.Pinned.UnpinAll",b,"i")))),!r&&!B&&l&&c.a.createElement("div",{className:K},c.a.createElement("div",{className:"messaging-disabled-inner"},c.a.createElement("span",null,l))),c.a.createElement(Bs,{messageListType:D,isActive:I,canPost:B})))),c.a.createElement($a,{isShown:H,canPost:B})),h.g&&c.a.createElement(Ds,{isActive:Boolean(p)})),e&&c.a.createElement(Us,{isOpen:A,chatId:e,pinnedMessagesCount:b,onClose:V,onUnpin:$}))}));a(243);const _s=Object(g.a)(e=>e(),200,!1);var Vs;!function(e){e[e.Profile=0]="Profile",e[e.MemberList=1]="MemberList",e[e.SharedMedia=2]="SharedMedia",e[e.Search=3]="Search",e[e.Management=4]="Management",e[e.ManageInitial=5]="ManageInitial",e[e.ManageChannelSubscribers=6]="ManageChannelSubscribers",e[e.ManageChatAdministrators=7]="ManageChatAdministrators",e[e.ManageChatPrivacyType=8]="ManageChatPrivacyType",e[e.ManageDiscussion=9]="ManageDiscussion",e[e.ManageGroupPermissions=10]="ManageGroupPermissions",e[e.ManageGroupRemovedUsers=11]="ManageGroupRemovedUsers",e[e.ManageGroupUserPermissionsCreate=12]="ManageGroupUserPermissionsCreate",e[e.ManageGroupUserPermissions=13]="ManageGroupUserPermissions",e[e.ManageGroupRecentActions=14]="ManageGroupRecentActions",e[e.ManageGroupAdminRights=15]="ManageGroupAdminRights",e[e.ManageGroupMembers=16]="ManageGroupMembers",e[e.StickerSearch=17]="StickerSearch",e[e.GifSearch=18]="GifSearch",e[e.PollResults=19]="PollResults"}(Vs||(Vs={}));var $s=Object(c.h)(Object(s.h)((e,{chatId:t,isProfile:a,isManagement:s})=>{const{query:n}=Object(o.A)(e)||{},{query:c}=Object(o.z)(e)||{},{query:r}=Object(o.s)(e)||{},i=t?Object(o.f)(e,t):void 0,l=i&&Object(m.jb)(i);return{canManage:Boolean(!s&&a&&i&&!Object(o.P)(e,i.id)&&(Object(m.lb)(i.id)||(Object(m.gb)(i)||i.isCreator)&&!i.isNotJoined)),isChannel:l,messageSearchQuery:n,stickerSearchQuery:c,gifSearchQuery:r}},(e,t)=>Object(d.l)(t,["setLocalTextSearchQuery","setStickerSearchQuery","setGifSearchQuery","searchTextMessagesLocal","toggleManagement","openHistoryCalendar"]))(({isColumnOpen:e,isProfile:t,isSearch:a,isManagement:s,isStickerSearch:n,isGifSearch:r,isPollResults:o,profileState:i,managementScreen:d,canManage:b,isChannel:u,onClose:m,messageSearchQuery:O,stickerSearchQuery:j,gifSearchQuery:g,setLocalTextSearchQuery:f,setStickerSearchQuery:p,setGifSearchQuery:I,searchTextMessagesLocal:v,toggleManagement:y,openHistoryCalendar:C})=>{var E;const w=Object(c.q)(null),M=Object(c.m)(e=>{f({query:e}),e.length&&_s(v)},[v,f]),S=Object(c.m)(e=>{p({query:e})},[p]),k=Object(c.m)(e=>{I({query:e})},[I]),[N,P]=Object(c.r)(!e);Object(c.n)(()=>{setTimeout(()=>{P(!e)},300)},[e]);const T=Object(ne.a)(),A=t?i===l.k.Profile?Vs.Profile:i===l.k.SharedMedia?Vs.SharedMedia:i===l.k.MemberList?Vs.MemberList:-1:a?Vs.Search:o?Vs.PollResults:n?Vs.StickerSearch:r?Vs.GifSearch:s?d===l.g.Initial?Vs.ManageInitial:d===l.g.ChatPrivacyType?Vs.ManageChatPrivacyType:d===l.g.Discussion?Vs.ManageDiscussion:d===l.g.ChannelSubscribers?Vs.ManageChannelSubscribers:d===l.g.GroupPermissions?Vs.ManageGroupPermissions:d===l.g.ChatAdministrators?Vs.ManageChatAdministrators:d===l.g.GroupRemovedUsers?Vs.ManageGroupRemovedUsers:d===l.g.GroupUserPermissionsCreate?Vs.ManageGroupUserPermissionsCreate:d===l.g.GroupUserPermissions?Vs.ManageGroupUserPermissions:d===l.g.GroupRecentActions?Vs.ManageGroupRecentActions:d===l.g.ChatAdminRights?Vs.ManageGroupAdminRights:d===l.g.GroupMembers?Vs.ManageGroupMembers:void 0:void 0,R=null!==(E=Object(Ke.a)(A,!0))&&void 0!==E?E:-1;function L(){if(-1!==R)switch(R){case Vs.PollResults:return c.a.createElement("h3",null,T("PollResults"));case Vs.Search:return c.a.createElement(c.a.Fragment,null,c.a.createElement(ie.a,{parentContainerClassName:"RightSearch",value:O,onChange:M}),c.a.createElement(oe.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>C({selectedAt:Object(x.k)(Date.now())}),ariaLabel:"Search messages by date"},c.a.createElement("i",{className:"icon-calendar"})));case Vs.ManageInitial:return c.a.createElement("h3",null,T("Edit"));case Vs.ManageChatPrivacyType:return c.a.createElement("h3",null,T(u?"ChannelTypeHeader":"GroupTypeHeader"));case Vs.ManageDiscussion:return c.a.createElement("h3",null,T("Discussion"));case Vs.ManageChatAdministrators:return c.a.createElement("h3",null,T("ChannelAdministrators"));case Vs.ManageGroupRecentActions:return c.a.createElement("h3",null,T("Group.Info.AdminLog"));case Vs.ManageGroupAdminRights:return c.a.createElement("h3",null,T("EditAdminRights"));case Vs.ManageGroupPermissions:return c.a.createElement("h3",null,T("ChannelPermissions"));case Vs.ManageGroupRemovedUsers:return c.a.createElement("h3",null,T("ChannelBlockedUsers"));case Vs.ManageGroupUserPermissionsCreate:return c.a.createElement("h3",null,T("ChannelAddException"));case Vs.ManageGroupUserPermissions:return c.a.createElement("h3",null,T("UserRestrictions"));case Vs.StickerSearch:return c.a.createElement(ie.a,{value:j,placeholder:T("SearchStickersHint"),onChange:S});case Vs.GifSearch:return c.a.createElement(ie.a,{value:g,placeholder:T("SearchGifsTitle"),onChange:k});case Vs.SharedMedia:return c.a.createElement("h3",null,T("SharedMedia"));case Vs.ManageChannelSubscribers:return c.a.createElement("h3",null,T("ChannelSubscribers"));case Vs.MemberList:case Vs.ManageGroupMembers:return c.a.createElement("h3",null,T("GroupMembers"));default:return c.a.createElement(c.a.Fragment,null,c.a.createElement("h3",null,"Profile"),c.a.createElement("section",{className:"tools"},b&&c.a.createElement(oe.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:T("Edit"),onClick:y},c.a.createElement("i",{className:"icon-edit"}))))}}const F=h.g||A===Vs.SharedMedia||A===Vs.MemberList||s,D=Object(J.a)("animated-close-icon",N&&"no-transition");return Object(c.n)(()=>{w.current.classList.toggle("state-back",F)},[F]),c.a.createElement("div",{className:"RightHeader"},c.a.createElement(oe.a,{className:"close-button",round:!0,color:"translucent",size:"smaller",onClick:m,ariaLabel:T(F?"Common.Back":"Common.Close")},c.a.createElement("div",{ref:w,className:D})),c.a.createElement(ae.a,{name:N?"none":"slide-fade",activeKey:R},L))})),zs=a(127);function Ws(e,t,a,s,r,o,i,l,d,b,u){const h="members"!==s&&r?r:s,O=Object(c.p)(()=>{if(o&&i)return Object(m.Eb)(o.map(({userId:e})=>e),i)},[o,i]),[j,g,f]=function(e,t,a,s){const[c,r]=Object(zs.a)(a?t:void 0,s,void 0,n.R),o=!c||!s||c[0]===s[0];return[c,r,!o]}(0,t,u,O),[p,I,v]=Ks("media",h,a,u,l,d),[y,C,E]=Ks("documents",h,a,u,l,d),[w,M,S]=Ks("links",h,a,u,l,d),[k,N,P]=Ks("audio",h,a,u,l,d);let T,A,x=!1;switch(h){case"members":T=j,A=g,x=f;break;case"media":T=p,A=I,x=v;break;case"documents":T=y,A=C,x=E;break;case"links":T=w,A=M,x=S;break;case"audio":T=k,A=N,x=P}return[h,T,A,x]}function Ks(e,t,a,s,r,o){const i=Object(c.q)();Object(je.a)(()=>{t===e&&r&&o&&(i.current=Object(m.w)(r,o,e).reverse())},[r,o,t,e]);const[l,d]=Object(zs.a)(s?a:void 0,i.current,void 0,"media"===e?n.ob:n.X);return[l,d,!(!l||!i.current||l[0]===i.current[0])]}var Qs=a(58);const Ys=Object(g.g)(e=>e(),250,!1);let Xs=!1;var Js=a(113),Zs=a(106);var en=a(133),tn=a(191);a(244);var an=Object(c.h)(({chat:e,user:t,photo:a,isFirstPhoto:s,isSavedMessages:n,lastSyncTime:r,onClick:o})=>{const l=Object(ne.a)(),d=t&&Object(m.pb)(t);function b(s="big",c){if(a&&!c)return`photo${a.id}?size=c`;let r;return n||d||(t?r=Object(m.f)(t,s):e&&(r=Object(m.f)(e,s))),r}const u=b(),h=Object(at.a)(u,!1,i.ApiMediaFormat.BlobUrl,r),O=Object(at.a)(!h&&s?b("normal",!0):void 0,!1,i.ApiMediaFormat.BlobUrl,r),j=Object(tn.a)(!h&&a&&a.thumbnail&&a.thumbnail.dataUri),g=h||O||j,f=Object(na.a)(g);let p="";if(n)p=c.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(d)p=c.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(g)p=c.a.createElement("img",{src:g,className:"avatar-media",alt:"",decoding:"async"});else if(!g&&t){const e=Object(m.Z)(t);p=e?Object(Qe.c)(e,2):void 0}else if(!g&&e){const t=Object(m.l)(l,e);p=t&&Object(Qe.c)(t,Object(m.lb)(e.id)?2:1)}else p=c.a.createElement("div",{className:"spinner-wrapper"},c.a.createElement(me.a,{color:"white"}));const I=Object(J.a)("ProfilePhoto","color-bg-"+Object(m.X)(t||e),n&&"saved-messages",d&&"deleted-account",!n&&!g&&"no-photo");return c.a.createElement("div",{className:I,onClick:g?o:void 0},f&&g&&f!==g&&c.a.createElement("img",{src:f,className:"prev-avatar-media",alt:"",decoding:"async"}),"string"==typeof p?Object(tt.a)(p,["hq_emoji"]):p)});a(245);var sn=Object(c.h)(Object(s.h)((e,{userId:t,forceShowSelf:a})=>{const{lastSyncTime:s}=e,n=Object(o.Gb)(e,t),c=Object(o.f)(e,t),r=!a&&n&&n.isSelf,{animationLevel:i}=e.settings.byKey;return{lastSyncTime:s,user:n,chat:c,isSavedMessages:r,animationLevel:i}},(e,t)=>Object(d.l)(t,["loadFullUser","openMediaViewer"]))(({user:e,chat:t,isSavedMessages:a,lastSyncTime:s,animationLevel:n,loadFullUser:r,openMediaViewer:o})=>{const{id:d}=e||{},{id:b}=t||{},u=e?Object(m.Z)(e):t?t.title:"",O=(e?e.photos:t?t.photos:void 0)||[],j=n>=1?"slide":"none",[g,f]=Object(c.r)(0),p=a||O.length<=1||0===g,I=a||O.length<=1||g===O.length-1;Object(c.n)(()=>{g>O.length&&f(Math.max(0,O.length-1))},[g,O.length]);const v=Object(ne.a)();Object(c.n)(()=>{s&&d&&r({userId:d})},[d,r,s]),function(e,t,a){Object(c.n)(()=>{t.slice(a,a+4).forEach(e=>{bt.c(`photo${e.id}?size=c`)||bt.b(`photo${e.id}?size=c`,i.ApiMediaFormat.BlobUrl)})},[a,t])}(0,O,g);const y=Object(c.m)(()=>{o({avatarOwnerId:d||b,profilePhotoIndex:g,origin:l.h.ProfileAvatar})},[o,d,b,g]),C=Object(c.m)(()=>{p||f(g-1)},[g,p]),E=Object(c.m)(()=>{I||f(g+1)},[g,I]);if(Object(c.n)(()=>{const e=document.querySelector(".profile-slide-container > .active, .profile-slide-container > .to");if(e)return Object(Oe.b)(e,{excludedClosestSelector:".navigation",onSwipe:h.l?(e,t)=>{t===Oe.a.Right?C():t===Oe.a.Left&&E()}:void 0})},[E,C]),!e&&!t)return;function w(){const s=!a&&O&&O.length>0?O[g]:void 0;return c.a.createElement(an,{key:g,user:e,chat:t,photo:s,isSavedMessages:a,isFirstPhoto:p,onClick:y})}const M=e&&e.isVerified||t&&t.isVerified;return c.a.createElement("div",{className:"ProfileInfo",dir:v.isRtl?"rtl":void 0},c.a.createElement("div",{className:"photo-wrapper"},function(){if(!(a||!O||O.length<=1))return c.a.createElement("div",{className:"photo-dashes"},O.map((e,t)=>c.a.createElement("span",{className:"photo-dash "+(t===g?"current":"")})))}(),c.a.createElement(ae.a,{activeKey:g,name:j,className:"profile-slide-container"},w),!p&&c.a.createElement("button",{type:"button",className:"navigation prev","aria-label":v("AccDescrPrevious"),onClick:C}),!I&&c.a.createElement("button",{type:"button",className:"navigation next","aria-label":v("Next"),onClick:E})),c.a.createElement("div",{className:"info",dir:v.isRtl?"rtl":"auto"},a?c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},v("SavedMessages"))):c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},u&&Object(tt.a)(u)),M&&c.a.createElement(en.a,null)),!a&&(e?c.a.createElement("div",{className:"status "+(Object(m.xb)(e)?"online":"")},c.a.createElement("span",{className:"user-status",dir:"auto"},Object(m.ab)(v,e))):c.a.createElement("span",{className:"status",dir:"auto"},Object(m.jb)(t)?v("Subscribers",t.membersCount,"i"):v("Members",t.membersCount,"i")))))}));var nn=Object(c.h)(Object(s.h)((e,{chatOrUserId:t})=>{const{lastSyncTime:a}=e,s=t?Object(o.f)(e,t):void 0;return{lastSyncTime:a,chat:s,user:Object(m.lb)(t)?Object(o.Gb)(e,t):void 0,canInviteUsers:s&&(!Object(m.jb)(s)&&!Object(m.yb)(s,"inviteUsers")||Object(m.q)(s,"inviteUsers"))}},(e,t)=>Object(d.l)(t,["loadFullUser","updateChatMutedState","showNotification"]))(({lastSyncTime:e,user:t,chat:a,forceShowSelf:s,canInviteUsers:n,loadFullUser:r,showNotification:o,updateChatMutedState:i})=>{const{id:l,fullInfo:d,username:b,phoneNumber:u,isSelf:h}=t||{},{id:O,isMuted:j,username:g}=a||{},f=Object(ne.a)();Object(c.n)(()=>{e&&l&&r({userId:l})},[r,l,e]);const p=Object(c.m)(()=>{i({chatId:O,isMuted:!j})},[O,j,i]);if(!a||a.isRestricted||h&&!s)return;function I(e,t){Object(E.c)(e),o({message:t+" was copied"})}const v=u&&Object(Oa.c)(u),y=Object(m.h)(a),C=0===y.indexOf("http")?y:"http://"+y,w=b||g,M=d&&d.bio||Object(m.g)(a);return c.a.createElement("div",{className:"ChatExtra"},v&&!!v.length&&c.a.createElement(Zs.a,{icon:"phone",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(v,f("Phone"))},c.a.createElement("span",{className:"title",dir:"auto"},v),c.a.createElement("span",{className:"subtitle"},f("Phone"))),w&&c.a.createElement(Zs.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I("@"+w,f("Username"))},c.a.createElement("span",{className:"title",dir:"auto"},Object(tt.a)(w)),c.a.createElement("span",{className:"subtitle"},f("Username"))),M&&!!M.length&&c.a.createElement(Zs.a,{icon:"info",multiline:!0,narrow:!0,isStatic:!0},c.a.createElement("span",{className:"title",dir:"auto"},Object(tt.a)(M,["br","links","emoji"])),c.a.createElement("span",{className:"subtitle"},f(l?"UserBio":"Info"))),n&&!w&&!!y.length&&c.a.createElement(Zs.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(y,f("SetUrlPlaceholder"))},c.a.createElement("div",{className:"title"},c.a.createElement(wa.a,{url:C,className:"title",text:y})),c.a.createElement("span",{className:"subtitle"},f("SetUrlPlaceholder"))),c.a.createElement(Zs.a,{icon:"unmute",ripple:!0,onClick:p},c.a.createElement("span",null,f("Notifications")),c.a.createElement(de,{id:"group-notifications",label:l?"Toggle User Notifications":"Toggle Chat Notifications",checked:!j,inactive:!0})))})),cn=a(165),rn=a(185),on=a(118);a(249);const ln=[{type:"media",title:"SharedMediaTab2"},{type:"documents",title:"SharedFilesTab2"},{type:"links",title:"SharedLinksTab2"},{type:"audio",title:"SharedMusicTab2"}];function dn(e){return[`.shared-media-transition > div:only-child > .${e}-list > .scroll-item`,`.shared-media-transition > div.active > .${e}-list > .scroll-item`].join(", ")}var bn=Object(c.h)(Object(s.h)((e,{chatId:t,userId:a})=>{const s=Object(o.f)(e,t),n=Object(o.m)(e,a||t),{currentType:c,resultsByType:r}=Object(o.v)(e)||{},{foundIds:i}=r&&c&&r[c]||{},{byId:l}=e.users,d=s&&Object(m.kb)(s),b=s&&Object(m.jb)(s),u=d||b&&Object(m.gb)(s),h=s&&s.fullInfo&&s.fullInfo.members,O=u&&s&&s.fullInfo&&!s.fullInfo.canViewMembers;let j;return a?j=a:Object(m.lb)(t)&&(j=t),{isChannel:b,resolvedUserId:j,chatMessages:n,foundIds:i,mediaSearchType:c,hasMembersTab:u,areMembersHidden:O,...u&&h&&{members:h,usersById:l},isRightColumnShown:Object(o.W)(e),isRestricted:s&&s.isRestricted,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(d.l)(t,["setLocalMediaSearchType","loadMoreMembers","searchMediaMessagesLocal","openMediaViewer","openAudioPlayer","openUserInfo","focusMessage","loadProfilePhotos"]))(({chatId:e,profileState:t,onProfileStateChange:a,isChannel:s,resolvedUserId:r,chatMessages:o,foundIds:d,mediaSearchType:b,hasMembersTab:u,areMembersHidden:m,members:O,usersById:j,isRightColumnShown:g,isRestricted:f,lastSyncTime:p,setLocalMediaSearchType:I,loadMoreMembers:v,searchMediaMessagesLocal:y,openMediaViewer:C,openAudioPlayer:E,openUserInfo:w,focusMessage:M,loadProfilePhotos:S})=>{const k=Object(c.q)(null),N=Object(c.q)(null),P=Object(ne.a)(),[T,A]=Object(c.r)(0),x=Object(c.p)(()=>[...u?[{type:"members",title:s?"ChannelSubscribers":"GroupMembers"}]:[],...ln],[u,s]),R=x[T].type,[L,F,D,B]=Ws(0,v,y,R,b,O,j,o,d,0,p),U=x.findIndex(({type:e})=>e===L),{handleScroll:H}=function(e,t,a,s){Object(Qs.a)(([a])=>{if(a&&a!==t){const a=e.current,n=a.querySelector(".TabList");a.scrollTop{Xs=!1},350))}},[t,s]),Object(Qs.a)(([t])=>{if(a!==l.k.Profile||a===t)return;const n=e.current;if(!n)return;const c=n.querySelector(".TabList");!c||c.offsetTop>n.scrollTop||(Xs=!0,Object(vt.a)(n,n.firstElementChild,"start",void 0,2*n.offsetHeight),setTimeout(()=>{Xs=!1},350),s(a))},[a]);const n=Object(c.m)(()=>{const a=e.current;if(!a)return;const n=a.querySelector(".TabList");if(!n)return;let c=l.k.Profile;a.scrollTop>=n.offsetTop&&(c="members"===t?l.k.MemberList:l.k.SharedMedia),s(c)},[e,s,t]);return Object(c.n)(()=>{Xs||n()},[n,t]),{handleScroll:Object(c.m)(()=>{Xs||Ys(n)},[n])}}(k,R,t,a),{applyTransitionFix:G,releaseTransitionFix:q}=function(e,t=".Transition.shared-media-transition"){return Object(c.n)(()=>{function a(){const a=e.current,s=a.querySelector(t),n=a.querySelector(".TabList");s&&n&&(s.style.minHeight=a.offsetHeight-n.offsetHeight+"px")}return a(),window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[e,t]),{applyTransitionFix:Object(c.m)(()=>{const t=e.current;if("hidden"!==t.style.overflowY){const e=t.offsetWidth-t.clientWidth;t.style.overflowY="hidden",t.style.marginRight=e+"px"}},[e]),releaseTransitionFix:Object(c.m)(()=>{const t=e.current;t.style.overflowY="scroll",t.style.marginRight="0"},[e])}}(k),[_,V]=(()=>{const[e,t]=Object(c.r)(!1);return[e,Object(c.m)(()=>{t(e=>!e)},[])]})(),$=Object(c.m)(()=>{q(),V()},[q,V]);Object(c.n)(()=>{I({mediaType:R})},[I,R]);const z=r||e;Object(c.n)(()=>{p&&S({profileId:z})},[S,z,p]);const W=Object(c.m)(e=>{C({chatId:z,threadId:i.MAIN_THREAD_ID,messageId:e,origin:l.h.SharedMedia})},[z,C]),K=Object(c.m)(e=>{E({chatId:z,messageId:e})},[z,E]),Q=Object(c.m)(e=>{w({id:e})},[w]),Y=Object(c.m)(e=>{M({chatId:z,messageId:e})},[z,M]);let X;Object(c.n)(()=>{if(N.current&&h.l)return Object(Oe.b)(N.current,{onSwipe:(e,t)=>{t===Oe.a.Left?A(Math.min(T+1,x.length-1)):t===Oe.a.Right&&A(Math.max(0,T-1))}})},[T,x.length]);const J="members"===L||!u&&"media"===L;J?X=g?0:1e3:F||(X=n.pb);const Z=Object(Es.a)([e,L],X);function ee(){if(!F||!Z||!o){const e=J&&F&&!Z;return c.a.createElement("div",{className:"content empty-list"},!e&&c.a.createElement(me.a,null))}if(!F.length){let e;switch(L){case"members":e=m?"You have no access to group members list.":"No members found";break;case"documents":e=P("lng_media_file_empty_search");break;case"links":e=P("lng_media_link_empty_search");break;case"audio":e=P("lng_media_song_empty_search");break;default:e=P("SharedMedia.EmptyTitle")}return c.a.createElement("div",{className:"content empty-list"},c.a.createElement(on.a,{text:e}))}return c.a.createElement("div",{className:`content ${L}-list`,dir:P.isRtl&&"media"===L?"rtl":void 0,teactFastList:!0},"media"===L?F.map(e=>o[e]&&c.a.createElement(cn.a,{key:e,message:o[e],onClick:W})):"documents"===L?F.map(e=>o[e]&&c.a.createElement(zt.a,{key:e,message:o[e],withDate:!0,smaller:!0,className:"scroll-item",onDateClick:Y})):"links"===L?F.map(e=>o[e]&&c.a.createElement(rn.a,{key:e,message:o[e],onMessageClick:Y})):"audio"===L?F.map(e=>o[e]&&c.a.createElement(Wt.a,{key:e,renderingFor:"sharedMedia",message:o[e],date:o[e].date,lastSyncTime:p,className:"scroll-item",onPlay:K,onDateClick:Y})):"members"===L?F.map((e,t)=>c.a.createElement(Zs.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>Q(e)},c.a.createElement(Ye.a,{userId:e,forceShowSelf:!0}))):void 0)}return c.a.createElement(Js.a,{ref:k,className:"Profile custom-scroll",itemSelector:dn(L),items:Z?F:void 0,cacheBuster:_,sensitiveArea:n.fb,preloadBackwards:Z?"members"===L?n.R:n.ob:0,noScrollRestoreOnTop:!0,noFastList:!0,onLoadMore:D,onScroll:H},!B&&function(e,t){return c.a.createElement("div",{className:"profile-info"},c.a.createElement(sn,{userId:t||e,forceShowSelf:t!==e}),c.a.createElement(nn,{chatOrUserId:t||e,forceShowSelf:t!==e}))}(e,r),!f&&c.a.createElement("div",{className:"shared-media"},c.a.createElement(ae.a,{ref:N,name:P.isRtl?"slide-reversed":"slide",activeKey:U,renderCount:x.length,shouldRestoreHeight:!0,className:"shared-media-transition",onStart:G,onStop:$},ee),c.a.createElement(pe.a,{big:!0,activeTab:T,tabs:x,onSwitchTab:A})))}));var un=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"RightSearch");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});var mn=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"Management");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});var hn=Object(c.h)(()=>{const e=Object(Ce.a)(ye.a.Extra,"StickerSearch");return e?c.a.createElement(e,null):c.a.createElement(Ee.a,null)});var On=Object(c.h)(()=>{const e=Object(Ce.a)(ye.a.Extra,"GifSearch");return e?c.a.createElement(e,null):c.a.createElement(Ee.a,null)});var jn=Object(c.h)(()=>{const e=Object(Ce.a)(ye.a.Extra,"PollResults");return e?c.a.createElement(e,null):c.a.createElement(Ee.a,null)});a(250);const gn=Object.keys(l.l).length/2,fn=Object.keys(l.g).length/2;function pn(){const e=document.querySelector(".RightHeader .SearchInput input");e&&e.blur()}var In=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},s=Object(o.d)(e);return{contentKey:Object(o.nb)(e),chatId:t,threadId:a,currentProfileUserId:e.users.selectedId,isChatSelected:Boolean(t&&s)}},(e,t)=>Object(d.l)(t,["openUserInfo","toggleChatInfo","toggleManagement","closeLocalTextSearch","setStickerSearchQuery","setGifSearchQuery","closePollResults"]))(({contentKey:e,chatId:t,threadId:a,currentProfileUserId:s,isChatSelected:r,toggleChatInfo:o,toggleManagement:i,openUserInfo:d,closeLocalTextSearch:b,setStickerSearchQuery:u,setGifSearchQuery:m,closePollResults:h})=>{var O;const{width:j}=_e(),[g,f]=Object(c.r)(l.k.Profile),[p,I]=Object(c.r)(l.g.Initial),[v,y]=Object(c.r)(),[C,E]=Object(c.r)(),w=g!==l.k.Profile,M=void 0!==e,S=e===l.l.ChatInfo||e===l.l.UserInfo,k=e===l.l.Search,N=e===l.l.Management,P=e===l.l.StickerSearch,T=e===l.l.GifSearch,A=e===l.l.PollResults,x=j<=n.ab,[R,L]=Object(c.r)(!M),F=null!==(O=Object(Ke.a)(e,!0,!r))&&void 0!==O?O:-1,D=Object(c.m)(()=>{switch(e){case l.l.ChatInfo:if(w){f(l.k.Profile);break}o();break;case l.l.UserInfo:if(w){f(l.k.Profile);break}d({id:void 0});break;case l.l.Management:switch(p){case l.g.Initial:i();break;case l.g.ChatPrivacyType:case l.g.Discussion:case l.g.GroupPermissions:case l.g.GroupType:case l.g.ChatAdministrators:case l.g.ChannelSubscribers:case l.g.GroupMembers:I(l.g.Initial);break;case l.g.GroupUserPermissionsCreate:case l.g.GroupRemovedUsers:case l.g.GroupUserPermissions:I(l.g.GroupPermissions),y(void 0),E(void 0);break;case l.g.ChatAdminRights:case l.g.GroupRecentActions:I(l.g.ChatAdministrators)}break;case l.l.Search:pn(),b();break;case l.l.StickerSearch:case l.l.GifSearch:pn(),u({query:void 0}),m({query:void 0});break;case l.l.PollResults:h()}},[e,w,o,d,h,p,i,b,u,m]),B=Object(c.m)((e,t)=>{y(e),E(t)},[]);function U(){if(-1!==F)switch(F){case l.l.ChatInfo:case l.l.UserInfo:return c.a.createElement(bn,{key:s||t,chatId:t,userId:s,profileState:g,onProfileStateChange:f});case l.l.Search:return c.a.createElement(un,{chatId:t,threadId:a});case l.l.Management:return c.a.createElement(mn,{chatId:t,currentScreen:p,isPromotedByCurrentUser:C,selectedChatMemberId:v,onScreenSelect:I,onChatMemberSelect:B});case l.l.StickerSearch:return c.a.createElement(hn,null);case l.l.GifSearch:return c.a.createElement(On,null);case l.l.PollResults:return c.a.createElement(jn,null)}}return Object(c.n)(()=>M?Object(te.a)(D):void 0,[M,D]),Object(c.n)(()=>{setTimeout(()=>{L(!M)},300)},[M]),Object(c.n)(()=>{M&&x&&D()},[x]),Object(Ot.a)(([a,s])=>{(a===l.l.ChatInfo&&e===l.l.UserInfo||a===l.l.UserInfo&&e===l.l.ChatInfo||s!==t)&&(f(l.k.Profile),I(l.g.Initial))},[e,t]),c.a.createElement("div",{id:"RightColumn-wrapper",className:r?void 0:"is-hidden"},x&&c.a.createElement("div",{className:"overlay-backdrop",onClick:D}),c.a.createElement("div",{id:"RightColumn"},c.a.createElement($s,{chatId:t,isColumnOpen:M,isProfile:S,isSearch:k,isManagement:N,isStickerSearch:P,isGifSearch:T,isPollResults:A,profileState:g,managementScreen:p,onClose:D}),c.a.createElement(ae.a,{name:R?"none":"zoom-fade",renderCount:gn+fn,activeKey:N?gn+p:F},U)))}));var vn=Object(c.h)(({isOpen:e})=>{const t=Object(Ce.a)(ye.a.Extra,"MediaViewer",!e);return t?c.a.createElement(t,null):void 0});var yn=Object(c.h)(({isOpen:e})=>{const t=Object(Ce.a)(ye.a.Extra,"Notifications",!e);return t?c.a.createElement(t,null):void 0});var Cn=Object(c.h)(({isOpen:e})=>{const t=Object(Ce.a)(ye.a.Extra,"Errors",!e);return t?c.a.createElement(t,null):void 0});var En=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"ForwardPicker",!t);return a?c.a.createElement(a,e):void 0});var wn=Object(c.h)(e=>{const{url:t}=e,a=Object(Ce.a)(ye.a.Extra,"SafeLinkModal",!t);return a?c.a.createElement(a,e):void 0});var Mn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"HistoryCalendar",!t);return a?c.a.createElement(a,e):void 0});a(251);let Sn,kn,Nn=!1;function Pn(e){document.querySelectorAll('link[rel="icon"]').forEach(t=>{e?t.href.includes("favicon-unread")||(t.href=t.href.replace("favicon","favicon-unread")):t.href=t.href.replace("favicon-unread","favicon")})}var Tn=Object(c.h)(Object(s.h)(e=>{const{chatId:t,messageId:a}=e.audioPlayer,s=t&&a?Object(o.k)(e,t,a):void 0;return{animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime,isLeftColumnShown:e.isLeftColumnShown,isRightColumnShown:Object(o.W)(e),isMediaViewerOpen:Object(o.T)(e),isForwardModalOpen:Object(o.R)(e),hasNotifications:Boolean(e.notifications.length),hasErrors:Boolean(e.errors.length),audioMessage:s,safeLinkModalUrl:e.safeLinkModalUrl,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}},(e,t)=>Object(d.l)(t,["loadAnimatedEmojis","loadNotificationSettings","loadNotificationExceptions"]))(({lastSyncTime:e,isLeftColumnShown:t,isRightColumnShown:a,isMediaViewerOpen:r,isForwardModalOpen:i,animationLevel:l,hasNotifications:d,hasErrors:b,audioMessage:u,safeLinkModalUrl:m,isHistoryCalendarOpen:h,loadAnimatedEmojis:O,loadNotificationSettings:j,loadNotificationExceptions:g})=>{n.p&&!Nn&&(Nn=!0,console.log(">>> RENDER MAIN")),Object(c.n)(()=>{e&&(O(),j(),g())},[e,O,g,j]);const{transitionClassNames:f}=Object(Z.a)(!t,void 0,!0),{transitionClassNames:p}=Object(Z.a)(a,void 0,!0),I=Object(J.a)(f.replace(/([\w-]+)/g,"middle-column-$1"),p.replace(/([\w-]+)/g,"right-column-$1"));function v(e){e.preventDefault(),e.stopPropagation()}return Object(c.n)(()=>{document.body.classList.toggle("is-middle-column-open",I.includes("middle-column-open")),document.body.classList.toggle("is-right-column-shown",I.includes("right-column-open"))},[I]),Object(c.n)(()=>{l>0&&(document.body.classList.add("animating-right-column"),Object(X.b)(350+n.c),Sn&&(clearTimeout(Sn),Sn=void 0),Sn=window.setTimeout(()=>{document.body.classList.remove("animating-right-column"),Sn=void 0},350+n.c))},[l,a]),Object(ee.a)(()=>{const e=Object(o.q)(Object(s.e)());let t=0;clearInterval(kn),kn=window.setInterval(()=>{if(document.title.includes(n.D))Pn(!1);else{if(t%2==0){const t=Object(o.q)(Object(s.e)())-e;t>0&&(document.title=`${t} notification${t>1?"s":""}`,Pn(!0))}else document.title=n.eb,Pn(!1);t++}},1e3)},()=>{clearInterval(kn),kn=void 0,document.title.includes(n.D)||(document.title=n.eb),Pn(!1)}),c.a.createElement("div",{id:"Main",className:I,onDrop:v,onDragOver:v},c.a.createElement(Be,null),c.a.createElement(qs,null),c.a.createElement(In,null),c.a.createElement(vn,{isOpen:r}),c.a.createElement(En,{isOpen:i}),c.a.createElement(yn,{isOpen:d}),c.a.createElement(Cn,{isOpen:b}),u&&c.a.createElement(mt,{key:u.id,message:u,noUi:!0}),c.a.createElement(wn,{url:m}),c.a.createElement(Mn,{isOpen:h}))}));n.p&&console.log(">>> FINISH LOAD MAIN BUNDLE"),Object(s.e)().connectionState||Object(s.d)().initApi()},197:function(e,t,a){},198:function(e,t,a){},199:function(e,t,a){},210:function(e,t,a){},211:function(e,t,a){},212:function(e,t,a){},215:function(e,t,a){},216:function(e,t,a){},217:function(e,t,a){},221:function(e,t,a){},222:function(e,t,a){},224:function(e,t,a){},227:function(e,t,a){},228:function(e,t,a){},229:function(e,t,a){},230:function(e,t,a){},231:function(e,t,a){},232:function(e,t,a){},233:function(e,t,a){},234:function(e,t,a){},235:function(e,t,a){},236:function(e,t,a){},237:function(e,t,a){},239:function(e,t,a){},240:function(e,t,a){},241:function(e,t,a){},242:function(e,t,a){},243:function(e,t,a){},244:function(e,t,a){},245:function(e,t,a){},249:function(e,t,a){},250:function(e,t,a){},251:function(e,t,a){}}]); -//# sourceMappingURL=4.7d611cd5e39f10293bca.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{104:function(e,t,a){"use strict";a.r(t),a.d(t,"Main",(function(){return Tn}));var s=a(2),n=a(1),c=a(0),r=(a(84),a(37)),o=a(6);window.addEventListener("popstate",e=>{if(!e.state)return;const{chatId:t,threadId:a,messageListType:n}=e.state;Object(s.d)().openChat({id:t,threadId:a,type:n,noPushState:!0})}),Object(s.b)("openChat",(e,t,a)=>{const{id:n,threadId:c=-1,type:i="thread",noPushState:l}=a,d=Object(o.y)(e);return d&&d.chatId===n&&d.threadId===c&&d.type===i||(e=Object(r.n)(e),e={...e,messages:{...e.messages,contentToBeScheduled:void 0},...n!==e.forwardMessages.toChatId&&{forwardMessages:{}}},Object(s.g)(e),l||window.history.pushState({chatId:n,threadId:c,messageListType:i},"")),Object(r.N)(e,n,c,i)}),Object(s.b)("openChatWithInfo",(e,t,a)=>{Object(s.g)({...e,isChatInfoShown:!0}),t.openChat(a)}),Object(s.b)("resetChatCreation",e=>({...e,chatCreation:void 0}));var i=a(5),l=a(20),d=a(3);let b;Object(s.b)("setScrollOffset",(e,t,a)=>{const{chatId:s,threadId:n,scrollOffset:c}=a;return Object(r.x)(e,s,n,"scrollOffset",c)}),Object(s.b)("setReplyingToId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i}=n;return Object(r.x)(e,c,i,"replyingToId",s)}),Object(s.b)("setEditingId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c,threadId:i,type:l}=n,d="scheduled"===l?"editingScheduledId":"editingId";return Object(r.x)(e,c,i,d,s)}),Object(s.b)("editLastMessage",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(!t||!a)return;const s=Object(o.m)(e,t),n=Object(o.Hb)(e,t,a);if(!s||!n)return;const c=Object(d.g)(n,t=>Boolean(s[t]&&Object(o.b)(e,s[t],a).canEdit));return c?Object(r.x)(e,t,a,"editingId",c):void 0}),Object(s.b)("replyToNextMessage",(e,t,a)=>{const{targetIndexDelta:s}=a,{chatId:n,threadId:c}=Object(o.y)(e)||{};if(!n||!c)return;const r=Object(o.m)(e,n),l=Object(o.Hb)(e,n,c);if(!r||!l)return;const d=Object(o.mb)(e,n,c);let b;if(Object(o.X)(e,n,c)&&d){const e=Object.keys(r),t=e.indexOf(d.toString())+s;b=t<=e.length+1&&t>=0?Number(e[t]):void 0}else if(c===i.MAIN_THREAD_ID){const t=Object(o.f)(e,n);b=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.Cb)(e,n,c);b=t?t.lastMessageId:void 0}t.setReplyingToId({messageId:b}),t.focusMessage({chatId:n,threadId:c,messageId:b})}),Object(s.b)("openMediaViewer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c,avatarOwnerId:r,profilePhotoIndex:o,origin:i}=a;return{...e,mediaViewer:{chatId:s,threadId:n,messageId:c,avatarOwnerId:r,profilePhotoIndex:o,origin:i},forwardMessages:{}}}),Object(s.b)("closeMediaViewer",e=>({...e,mediaViewer:{}})),Object(s.b)("openAudioPlayer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c}=a;return{...e,audioPlayer:{chatId:s,threadId:n,messageId:c}}}),Object(s.b)("closeAudioPlayer",e=>({...e,audioPlayer:{}})),Object(s.b)("openPollResults",(e,t,a)=>{const{chatId:n,messageId:c}=a;Object(o.W)(e)?n===e.pollResults.chatId&&c===e.pollResults.messageId||Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}}):window.setTimeout(()=>{const e=Object(s.e)();Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}})},450)}),Object(s.b)("closePollResults",e=>{Object(s.g)({...e,pollResults:{}})}),Object(s.b)("focusLastMessage",(e,t)=>{const a=Object(o.y)(e);if(!a)return;const{chatId:s,threadId:n}=a;let c;if(n===i.MAIN_THREAD_ID){const t=Object(o.f)(e,s);c=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.Cb)(e,s,n);c=t?t.lastMessageId:void 0}c&&t.focusMessage({chatId:s,threadId:n,messageId:c,noHighlight:!0})}),Object(s.b)("focusMessage",(e,t,a)=>{const{chatId:n,threadId:c=i.MAIN_THREAD_ID,messageListType:d="thread",noHighlight:u,groupedId:m,groupedChatId:h}=a;let{messageId:O}=a;if(void 0!==m){const t=Object(o.J)(e,h,m);t&&t.length&&([O]=t)}const j=Object(o.y)(e),g=!j||n!==j.chatId||c!==j.threadId||d!==j.type;b&&(clearTimeout(b),b=void 0),b=window.setTimeout(()=>{let e=Object(s.e)();e=Object(r.P)(e),e=Object(r.O)(e),Object(s.g)(e)},2e3),e=Object(r.P)(e,n,O,u),e=Object(r.O)(e,void 0),g&&(e=Object(r.O)(e,l.b.Static));const f=Object(o.Hb)(e,n,c);if(f&&f.includes(O))return Object(s.g)(e),void t.openChat({id:n,threadId:c});if(g&&(e=Object(r.x)(e,n,c,"viewportIds",void 0)),e=Object(r.x)(e,n,c,"outlyingIds",void 0),f&&!g){const t=O>f[0]?l.b.Down:l.b.Up;e=Object(r.O)(e,t)}Object(s.g)(e),t.openChat({id:n,threadId:c}),t.loadViewportMessages()}),Object(s.b)("openForwardMenu",(e,t,a)=>{const{fromChatId:s,messageIds:n,groupedId:c}=a;let r;return c&&(r=Object(o.ab)(e,s,c)),{...e,forwardMessages:{fromChatId:s,messageIds:r||n,isModalShown:!0}}}),Object(s.b)("exitForwardMode",e=>{Object(s.g)({...e,forwardMessages:{}})}),Object(s.b)("setForwardChatId",(e,t,a)=>{const{id:n}=a;Object(s.g)({...e,forwardMessages:{...e.forwardMessages,toChatId:n,isModalShown:!1}}),t.openChat({id:n}),t.closeMediaViewer(),t.exitMessageSelectMode()}),Object(s.b)("openForwardMenuForSelectedMessages",(e,t)=>{if(!e.selectedMessages)return;const{chatId:a,messageIds:s}=e.selectedMessages;t.openForwardMenu({fromChatId:a,messageIds:s})}),Object(s.b)("enterMessageSelectMode",(e,t,a)=>{const{messageId:s}=a||{},n=Object(o.r)(e);return n?Object(r.m)(e,n.id,s):e}),Object(s.b)("toggleMessageSelection",(e,t,a)=>{const{messageId:s,groupedId:n,childMessageIds:c,withShift:i}=a,l=Object(o.y)(e);if(!l)return;const{chatId:d,threadId:b,type:u}=l;return Object(r.G)(e,d,b,u,s,n,c,i)}),Object(s.b)("exitMessageSelectMode",r.n),Object(s.b)("openPollModal",e=>({...e,isPollModalOpen:!0})),Object(s.b)("closePollModal",e=>({...e,isPollModalOpen:!1}));Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{query:s}=a,{chatId:n}=e.globalSearch;return Object(r.R)(e,{globalResults:{},localResults:{},resultsByType:void 0,...s?{fetchingStatus:{chats:!n,messages:!0}}:{fetchingStatus:void 0},query:s})}),Object(s.b)("addRecentlyFoundChatId",(e,t,a)=>{const{id:s}=a,{recentlyFoundChatIds:n}=e.globalSearch;if(!n)return Object(r.R)(e,{recentlyFoundChatIds:[s]});const c=n.filter(e=>e!==s);return c.unshift(s),c.length>10&&c.pop(),Object(r.R)(e,{recentlyFoundChatIds:c})}),Object(s.b)("clearRecentlyFoundChats",e=>Object(r.R)(e,{recentlyFoundChatIds:void 0})),Object(s.b)("setGlobalSearchContent",(e,t,a)=>{const{content:s}=a;return Object(r.S)(e,s)}),Object(s.b)("setGlobalSearchChatId",(e,t,a)=>{const{id:s}=a;return Object(r.R)(e,{chatId:s,query:void 0,resultsByType:void 0})});var u=a(50),m=a(4);Object(s.b)("openLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return Object(r.Y)(e,t,a,!0)}),Object(s.b)("closeLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{};if(t&&a)return e=Object(r.Y)(e,t,a,!1),e=Object(r.t)(e,t,a,void 0)}),Object(s.b)("setLocalTextSearchQuery",(e,t,a)=>{const{chatId:s,threadId:n}=Object(o.y)(e)||{};if(!s||!n)return;const{query:c}=a,i=Object(m.a)(s,n),{query:l}=e.localTextSearch.byChatThreadKey[i]||{};return c!==l&&(e=Object(r.t)(e,s,n,u.a)),e=Object(r.Y)(e,s,n,!0,c)}),Object(s.b)("setLocalMediaSearchType",(e,t,a)=>{const{chatId:s}=Object(o.y)(e)||{};if(!s)return;const{mediaType:n}=a;return Object(r.X)(e,s,n)}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,stickers:{...e.stickers,search:{query:s,resultIds:void 0}}}}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,gifs:{...e.gifs,search:{query:s,offsetId:void 0,results:void 0}}}}),Object(s.b)("openUserInfo",(e,t,a)=>{const{id:s}=a;t.openChat({id:s})});Object(s.b)("openChat",e=>Object(r.fb)(e,void 0)),Object(s.b)("setSettingOption",(e,t,a)=>Object(r.v)(e,a)),Object(s.b)("setThemeSettings",(e,t,a)=>{const{theme:s,...n}=a;return Object(r.w)(e,s,n)});var h=a(7),O=a(169);Object(s.b)("toggleChatInfo",e=>({...e,isChatInfoShown:!e.isChatInfoShown})),Object(s.b)("toggleManagement",e=>{const{chatId:t}=Object(o.y)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!(e.management.byChatId[t]||{}).isActive}}}}}),Object(s.b)("closeManagement",e=>{const{chatId:t}=Object(o.y)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!1}}}}}),Object(s.b)("openChat",(e,t,a)=>{if(!h.g)return;const{id:s}=a;return{...e,isLeftColumnShown:void 0===s}}),Object(s.b)("toggleLeftColumn",e=>({...e,isLeftColumnShown:!e.isLeftColumnShown})),Object(s.b)("addRecentEmoji",(e,t,a)=>{const{emoji:s}=a,{recentEmojis:n}=e;if(!n)return{...e,recentEmojis:[s]};const c=n.filter(e=>e!==s);return c.unshift(s),c.length>18&&c.pop(),{...e,recentEmojis:c}}),Object(s.b)("addRecentSticker",(e,t,a)=>{const{sticker:s}=a,{recent:n}=e.stickers;if(!n)return{...e,stickers:{...e.stickers,recent:{hash:0,stickers:[s]}}};const c=n.stickers.filter(e=>e.id!==s.id);return c.unshift(s),{...e,stickers:{...e.stickers,recent:{...n,stickers:c}}}}),Object(s.b)("showNotification",(e,t,a)=>{const s=a,n=[...e.notifications],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,notifications:n}}),Object(s.b)("dismissNotification",e=>{const t=[...e.notifications];return t.pop(),{...e,notifications:t}}),Object(s.b)("showError",(e,t,a)=>{const{error:s}=a;if(!Object(O.a)(s))return e;const n=[...e.errors],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,errors:n}}),Object(s.b)("dismissError",e=>{const t=[...e.errors];return t.pop(),{...e,errors:t}}),Object(s.b)("toggleSafeLinkModal",(e,t,a)=>{const{url:s}=a;return{...e,safeLinkModalUrl:s}}),Object(s.b)("openHistoryCalendar",(e,t,a)=>{const{selectedAt:s}=a;return{...e,historyCalendarSelectedAt:s}}),Object(s.b)("closeHistoryCalendar",e=>({...e,historyCalendarSelectedAt:void 0})),Object(s.b)("openPaymentModal",(e,t,a)=>{const{messageId:s}=a;return{...e,payment:{...e.payment,messageId:s,isPaymentModalOpen:!0}}}),Object(s.b)("closePaymentModal",e=>{const t=Object(r.h)(e);return Object(r.i)(t)});a(85);var j=a(10),g=a(9);const f=Object(g.g)(e=>e(),1e3,!0),p=Object(g.g)(e=>e(),3e3,!0),I=Object(g.a)(e=>e(),500,!1,!0);async function v(e,t,a){const c=await Object(j.a)("fetchChats",{limit:n.j,offsetDate:a,archived:"archived"===e,withPinned:void 0===Object(s.e)().chats.orderedPinnedIds[e]});if(!c)return;const{chatIds:o}=c;o.length>0&&o[0]===t&&o.shift();let l=Object(s.e)();l=Object(r.f)(l,Object(d.c)(c.users,"id")),l=Object(r.M)(l,Object(d.c)(c.chats,"id")),l=Object(r.I)(l,e,o),l=Object(r.J)(l,e,c),Object.keys(c.draftsById).map(Number).forEach(e=>{l=Object(r.x)(l,e,i.MAIN_THREAD_ID,"draft",c.draftsById[e])}),Object.keys(c.replyingToById).map(Number).forEach(e=>{l=Object(r.x)(l,e,i.MAIN_THREAD_ID,"replyingToId",c.replyingToById[e])}),0!==o.length||l.chats.isFullyLoaded[e]||(l={...l,chats:{...l.chats,isFullyLoaded:{...l.chats.isFullyLoaded,[e]:!0}}}),Object(s.g)(l)}async function y(e){const t=await Object(j.a)("fetchFullChat",e);if(!t)return;const{users:a,fullInfo:n}=t;let c=Object(s.e)();a&&(c=Object(r.f)(c,Object(d.c)(a,"id"))),c=Object(r.H)(c,e.id,{fullInfo:n}),Object(s.g)(c)}async function C(e,t,a){const n=Object(s.e)(),c=Object(o.h)(n,t);if(c&&!c.isMin)return void(a?e.focusMessage({chatId:c.id,messageId:a}):e.openChat({id:c.id}));const i=Object(o.r)(n);e.openChat({id:-1});const l=await Object(j.a)("getChatByUsername",t);if(!l)return i&&e.openChat({id:i.id}),void e.showNotification({message:"User does not exist"});Object(s.g)(Object(r.H)(Object(s.e)(),l.id,l)),a?e.focusMessage({chatId:l.id,messageId:a}):e.openChat({id:l.id})}Object(s.b)("preloadTopChatMessages",(e,t)=>{(async()=>{const a=[];for(let c=0;ce!==l&&!a.includes(e));if(!u)return;a.push(u.id),t.loadViewportMessages({chatId:u.id,threadId:i.MAIN_THREAD_ID})}})()}),Object(s.b)("openChat",(e,t,a)=>{const{id:s,threadId:n}=a,{currentUserId:c}=e,r=Object(o.f)(e,s);if(r&&r.hasUnreadMark&&t.toggleChatUnread({id:s}),r)Object(m.nb)(r)&&!r.isMin&&t.requestChatUpdate({chatId:s});else if(s===c)Object(j.a)("fetchChat",{type:"self"});else{const t=Object(o.Gb)(e,s);t&&Object(j.a)("fetchChat",{type:"user",user:t})}if(n!==i.MAIN_THREAD_ID){Object(o.Eb)(e,s,n)||t.requestThreadInfoUpdate({chatId:s,threadId:n})}}),Object(s.b)("openSupportChat",(e,t)=>{const a=Object(o.Ab)(e);t.openChat({id:a?a.id:-1}),a||(async()=>{const e=await Object(j.a)("fetchChat",{type:"support"});e&&t.openChat({id:e.chatId})})()}),Object(s.b)("openTipsChat",(e,t)=>{t.openChatByUsername({username:n.Cb})}),Object(s.b)("loadMoreChats",(e,t,a)=>{const{listType:s="active"}=a,n=e.chats.listIds[s];if(e.chats.isFullyLoaded[s])return;const c=n?n.map(t=>e.chats.byId[t]).filter(t=>Boolean(t&&t.lastMessage)&&!Object(o.N)(e,t.id)).sort((e,t)=>e.lastMessage.date-t.lastMessage.date)[0]:void 0;f(c?()=>v(s,c.id,c.lastMessage.date):()=>v(s))}),Object(s.b)("loadFullChat",(e,t,a)=>{const{chatId:s,force:n}=a,c=Object(o.f)(e,s);c&&(n?y(c):I(()=>y(c)))}),Object(s.b)("loadTopChats",()=>{p(()=>v("active"))}),Object(s.b)("requestChatUpdate",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);n&&Object(j.a)("requestChatUpdate",n)}),Object(s.b)("updateChatMutedState",(e,t,a)=>{const{chatId:s,isMuted:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("updateChatMutedState",{chat:c,isMuted:n})}),Object(s.b)("createChannel",(e,t,a)=>{const{title:n,about:c,photo:i,memberIds:d}=a;!async function(e,t,a,n){Object(s.g)({...Object(s.e)(),chatCreation:{progress:l.a.InProgress}});const c=await Object(j.a)("createChannel",{title:e,about:a,users:t});if(!c)return;const{id:o,accessHash:i}=c;let d=Object(s.e)();d=Object(r.H)(d,o,c),d={...d,chatCreation:{...d.chatCreation,progress:c?l.a.Complete:l.a.Error}},Object(s.g)(d),Object(s.d)().openChat({id:o}),o&&i&&n&&await Object(j.a)("editChatPhoto",{chatId:o,accessHash:i,photo:n})}(n,d.map(t=>Object(o.Gb)(e,t)).filter(Boolean),c,i)}),Object(s.b)("joinChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(j.a)("joinChannel",{channelId:c,accessHash:r})}),Object(s.b)("leaveChannel",(e,t,a)=>{(async()=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&await Object(j.a)("leaveChannel",{channelId:c,accessHash:r}),t.openChat({id:void 0})})()}),Object(s.b)("deleteChannel",(e,t,a)=>{(async()=>{const{chatId:s}=a,n=Object(o.f)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&await Object(j.a)("deleteChannel",{channelId:c,accessHash:r}),t.openChat({id:void 0})})()}),Object(s.b)("createGroupChat",(e,t,a)=>{const{title:n,memberIds:c,photo:i}=a;!async function(e,t,a){Object(s.g)({...Object(s.e)(),chatCreation:{progress:l.a.InProgress}});const n=await Object(j.a)("createGroupChat",{title:e,users:t});if(!n)return;const{id:c}=n;let o=Object(s.e)();o=Object(r.H)(o,c,n),o={...o,chatCreation:{...o.chatCreation,progress:n?l.a.Complete:l.a.Error}},Object(s.g)(o),Object(s.d)().openChat({id:c}),c&&a&&await Object(j.a)("editChatPhoto",{chatId:c,photo:a})}(n,c.map(t=>Object(o.Gb)(e,t)).filter(Boolean),i)}),Object(s.b)("toggleChatPinned",(e,t,a)=>{const{id:s,folderId:c}=a,r=Object(o.f)(e,s);if(r)if(c){const t=Object(o.i)(e,c);if(t){const a=!Object(o.N)(e,s,c),{pinnedChatIds:n,includedChatIds:r}=t,i=a?[s,...n||[]]:(n||[]).filter(e=>e!==s),l=[s,...r];Object(j.a)("editChatFolder",{id:c,folderUpdate:{...t,pinnedChatIds:i,includedChatIds:l}})}}else{const t=Object(o.j)(e,s),a=Object(o.N)(e,s,"archived"===t?n.h:void 0);Object(j.a)("toggleChatPinned",{chat:r,shouldBePinned:!a})}}),Object(s.b)("toggleChatArchived",(e,t,a)=>{const{id:s}=a,c=Object(o.f)(e,s);c&&Object(j.a)("toggleChatArchived",{chat:c,folderId:Object(m.ib)(c)?0:n.h})}),Object(s.b)("loadChatFolders",()=>{!async function(){const e=await Object(j.a)("fetchChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,...e}})}}()}),Object(s.b)("loadRecommendedChatFolders",()=>{!async function(){const e=await Object(j.a)("fetchRecommendedChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,recommended:e}})}}()}),Object(s.b)("editChatFolder",(e,t,a)=>{const{id:s,folderUpdate:n}=a,c=Object(o.i)(e,s);c&&Object(j.a)("editChatFolder",{id:s,folderUpdate:{id:s,emoticon:c.emoticon,pinnedChatIds:c.pinnedChatIds,...n}})}),Object(s.b)("addChatFolder",(e,t,a)=>{const{folder:c}=a,{orderedIds:r}=e.chatFolders;!async function(e,t){const{id:a,description:n,...c}=e;if(await Object(j.a)("editChatFolder",{id:t+1,folderUpdate:{id:t+1,...c}}),!n)return;const r=Object(s.e)(),{recommended:o}=r.chatFolders;o&&Object(s.g)({...r,chatFolders:{...r.chatFolders,recommended:o.filter(({id:e})=>e!==a)}})}(c,r&&r.length?Math.max.apply(Math.max,r):n.h)}),Object(s.b)("deleteChatFolder",(e,t,a)=>{const{id:s}=a;Object(o.i)(e,s)&&async function(e){await Object(j.a)("deleteChatFolder",e)}(s)}),Object(s.b)("toggleChatUnread",(e,t,a)=>{const{id:s}=a,n=Object(o.f)(e,s);n&&(n.unreadCount?Object(j.a)("markMessageListRead",{chat:n,threadId:i.MAIN_THREAD_ID}):Object(j.a)("toggleDialogUnread",{chat:n,hasUnreadMark:!n.hasUnreadMark}))}),Object(s.b)("openTelegramLink",(e,t,a)=>{const{url:s}=a;let c=n.hb.exec(s);if(c){const e=c[1];(async()=>{const a=await Object(j.a)("openChatByInvite",e);a&&t.openChat({id:a.id})})()}else{c=n.ib.exec(s);const e=c[1],a=c[2]?Number(c[2]):void 0;C(t,e,a)}}),Object(s.b)("openChatByUsername",(e,t,a)=>{const{username:s}=a;C(t,s)}),Object(s.b)("togglePreHistoryHidden",(e,t,a)=>{const{chatId:s,isEnabled:n}=a;let c=Object(o.f)(e,s);c&&(async()=>{if(Object(m.jb)(c)){if(c=await Object(j.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}Object(j.a)("togglePreHistoryHidden",{chat:c,isEnabled:n})})()}),Object(s.b)("updateChatDefaultBannedRights",(e,t,a)=>{const{chatId:s,bannedRights:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("updateChatDefaultBannedRights",{chat:c,bannedRights:n})}),Object(s.b)("updateChatMemberBannedRights",(e,t,a)=>{const{chatId:n,userId:c,bannedRights:i}=a;let l=Object(o.f)(e,n);const d=Object(o.Gb)(e,c);l&&d&&(async()=>{if(Object(m.jb)(l)){if(l=await Object(j.a)("migrateChat",l),!l)return;t.openChat({id:l.id})}await Object(j.a)("updateChatMemberBannedRights",{chat:l,user:d,bannedRights:i});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{members:b,kickedMembers:u}=a.fullInfo,h=!!i.viewMessages,O=!Object.keys(i).length;Object(s.g)(Object(r.H)(e,n,{fullInfo:{...a.fullInfo,...b&&h&&{members:b.filter(e=>e.userId!==c)},...b&&!h&&{members:b.map(e=>e.userId===c?{...e,bannedRights:i}:e)},...O&&u&&{kickedMembers:u.filter(e=>e.userId!==c)}}}))})()}),Object(s.b)("updateChatAdmin",(e,t,a)=>{const{chatId:n,userId:c,adminRights:i,customTitle:l}=a;let d=Object(o.f)(e,n);const b=Object(o.Gb)(e,c);d&&b&&(async()=>{if(Object(m.jb)(d)){if(d=await Object(j.a)("migrateChat",d),!d)return;t.openChat({id:d.id})}await Object(j.a)("updateChatAdmin",{chat:d,user:b,adminRights:i,customTitle:l});const e=Object(s.e)(),a=Object(o.f)(e,n);if(!a||!a.fullInfo)return;const{adminMembers:u}=a.fullInfo,h=!Object.keys(i).length;Object(s.g)(Object(r.H)(e,n,{fullInfo:{...a.fullInfo,...u&&h&&{adminMembers:u.filter(e=>e.userId!==c)},...u&&!h&&{adminMembers:u.map(e=>e.userId===c?{...e,adminRights:i,customTitle:l}:e)}}}))})()}),Object(s.b)("updateChat",(e,t,a)=>{const{chatId:n,title:c,about:i,photo:d}=a,b=Object(o.f)(e,n);b&&(async()=>{Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.InProgress)),await Promise.all([b.title!==c?Object(j.a)("updateChatTitle",b,c):void 0,b.fullInfo&&b.fullInfo.about!==i?Object(j.a)("updateChatAbout",b,i):void 0,d?Object(j.a)("editChatPhoto",{chatId:n,accessHash:b.accessHash,photo:d}):void 0]),Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.Complete))})()}),Object(s.b)("toggleSignatures",(e,t,a)=>{const{chatId:s,isEnabled:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("toggleSignatures",{chat:c,isEnabled:n})}),Object(s.b)("loadGroupsForDiscussion",()=>{(async()=>{const e=await Object(j.a)("fetchGroupsForDiscussion");if(!e)return;const t=e.reduce((e,t)=>(t&&(e[t.id]=t),e),{}),a=Object(r.c)(Object(s.e)(),t);Object(s.g)({...a,chats:{...a.chats,forDiscussionIds:Object.keys(t).map(Number)}})})()}),Object(s.b)("linkDiscussionGroup",(e,t,a)=>{const{channelId:s,chatId:n}=a,c=Object(o.f)(e,s);let r=Object(o.f)(e,n);c&&r&&(async()=>{if(Object(m.jb)(r)){if(r=await Object(j.a)("migrateChat",r),!r)return;t.openChat({id:r.id})}let{fullInfo:e}=r;if(!e){const t=await Object(j.a)("fetchFullChat",r);if(!t)return;e=t.fullInfo}e.isPreHistoryHidden&&await Object(j.a)("togglePreHistoryHidden",{chat:r,isEnabled:!1}),Object(j.a)("setDiscussionGroup",{channel:c,chat:r})})()}),Object(s.b)("unlinkDiscussionGroup",(e,t,a)=>{const{channelId:s}=a,n=Object(o.f)(e,s);if(!n)return;let c;n.fullInfo&&n.fullInfo.linkedChatId&&(c=Object(o.f)(e,n.fullInfo.linkedChatId)),(async()=>{await Object(j.a)("setDiscussionGroup",{channel:n}),c&&y(c)})()}),Object(s.b)("setActiveChatFolder",(e,t,a)=>({...e,chatFolders:{...e.chatFolders,activeChatFolder:a}})),Object(s.b)("loadMoreMembers",e=>{(async()=>{const{chatId:t}=Object(o.y)(e)||{},a=t?Object(o.f)(e,t):void 0;if(!a||Object(m.jb)(a))return;const n=a.fullInfo&&a.fullInfo.members&&a.fullInfo.members.length||void 0,c=await Object(j.a)("fetchMembers",a.id,a.accessHash,"recent",n);if(!c)return;const{members:i,users:l}=c;i&&i.length&&(e=Object(s.e)(),e=Object(r.f)(e,Object(d.c)(l,"id")),e=Object(r.H)(e,a.id,{fullInfo:{...a.fullInfo,members:[...(a.fullInfo||{}).members||[],...i||[]]}}),Object(s.g)(e))})()});var E=a(153);const w=new Map,M=Object(g.g)(e=>e(),1e3,!0);async function S(e,t,a,c,i=!1,b=!1){const u=e.id;let m;switch(c){case l.e.Backwards:m=void 0;break;case l.e.Around:m=-(Math.round(n.V/2)+1);break;case l.e.Forwards:m=-(n.V+1)}const h=await Object(j.a)("fetchMessages",{chat:Object(o.Db)(Object(s.e)(),u,t),offsetId:a,addOffset:m,limit:n.V,threadId:t});if(!h)return;const{messages:O,users:g,chats:f,threadInfos:p}=h,I=Object(d.c)(O,"id"),v=Object.keys(I).map(Number);let y=Object(s.e)();y=Object(r.b)(y,u,I),y=i?Object(r.db)(y,u,t,v):Object(r.V)(y,u,t,v),y=Object(r.f)(y,Object(d.c)(g,"id")),y=Object(r.c)(y,Object(d.c)(f,"id")),y=Object(r.lb)(y,u,p);let C=Object(o.Y)(y,u,t);const E=Object(o.gb)(y,u,t);if(i&&C&&E&&Object(d.b)(C,E)&&(y=Object(r.V)(y,u,t,E),C=Object(o.Y)(y,u,t),y=Object(r.x)(y,u,t,"outlyingIds",void 0),i=!1),!b){const e=i?E:C,{newViewportIds:s}=k(e,a,c);y=Object(r.z)(y,u,t,s)}Object(s.g)(y)}function k(e,t,a){const{length:s}=e,c=t?function(e,t){return te[e.length-1]?e.length-1:e.findIndex((a,s)=>a===t||at)}(e,t):-1,r=a===l.e.Backwards?c:c+1||s,o=r-n.V,i=r+n.V-1,d=e.slice(Math.max(0,o),i+1);let b,u;switch(a){case l.e.Backwards:b=r>0,u=o>=0;break;case l.e.Forwards:b=r0,u=d.length===n.V}return{newViewportIds:d,areSomeLocal:b,areAllLocal:u}}async function N(e){let t;const a=e.attachment?(e,n)=>{w.has(n)||(t=n,w.set(n,a));const c=Object(s.e)();Object(s.g)({...c,fileUploads:{byMessageLocalId:{...c.fileUploads.byMessageLocalId,[n]:{progress:e}}}})}:void 0;e.replyingTo&&await Object(g.f)();const n=Object(s.e)(),c=Object(o.y)(n);if(!c)return;const{threadId:r}=c;e.replyingTo||r===i.MAIN_THREAD_ID||(e.replyingTo=Object(o.Eb)(n,e.chat.id,r)),await Object(j.a)("sendMessage",e,a),a&&t&&w.delete(t)}Object(s.b)("loadViewportMessages",(e,t,a)=>{const{direction:s=l.e.Around,isBudgetPreload:c=!1}=a||{};let{chatId:i,threadId:d}=a||{};if(!i){const t=Object(o.y)(e);if(!t)return;i=t.chatId,d=t.threadId}const b=Object(o.f)(e,i);if(!b||b.isRestricted)return;const u=Object(o.Hb)(e,i,d),m=Object(o.Y)(e,i,d),h=Object(o.gb)(e,i,d);if(u&&u.length&&s!==l.e.Around){const a=s===l.e.Backwards?u[0]:u[u.length-1],n=Boolean(h),o=n?h:m,{newViewportIds:O,areSomeLocal:j,areAllLocal:g}=k(o,a,s);if(j&&(e=Object(r.z)(e,i,d,O)),async function(e,t,a,s,n,c,r,o){t||await S(n,c,o,r,a,s);s||(await Promise.resolve(),e.loadViewportMessages({chatId:n.id,threadId:c,direction:r,isBudgetPreload:!0}))}(t,g,n,c,b,d,s,a),c)return}else{const t=Object(o.I)(e,i)||Object(o.lb)(e,i,d),a=Boolean(t&&m&&!m.includes(t)),s=(a?h:m)||[],{newViewportIds:u,areSomeLocal:O,areAllLocal:j}=k(s,t,l.e.Around);O&&u.length>=n.V&&(e=Object(r.z)(e,i,d,u)),j||S(b,d,t,l.e.Around,a,c)}return e}),Object(s.b)("loadMessage",(e,t,a)=>{const{chatId:n,messageId:c,replyOriginForId:l}=a,b=Object(o.f)(e,n);b&&async function(e,t,a){const n=await Object(j.a)("fetchMessage",{chat:e,messageId:t});if(!n)return;if(n===i.MESSAGE_DELETED){if(a){let t=Object(s.e)();const n=Object(o.k)(t,e.id,a);t=Object(r.L)(t,e.id,a,{...n,replyToMessageId:void 0}),Object(s.g)(t)}return}let c=Object(s.e)();c=Object(r.L)(c,e.id,t,n.message),c=Object(r.f)(c,Object(d.c)(n.users,"id")),Object(s.g)(c)}(b,c,l)}),Object(s.b)("sendMessage",(e,t,a)=>{const s=Object(o.y)(e);if(!s)return;const{chatId:c,threadId:r,type:i}=s;if("scheduled"===i&&!a.scheduledAt)return{...e,messages:{...e.messages,contentToBeScheduled:a}};const l=Object(o.f)(e,c);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:c,threadId:r,value:!1});const b={...a,chat:l,replyingTo:Object(o.mb)(e,c,r),noWebPage:Object(o.cb)(e,c,r)},u=!a.attachments||a.attachments.length<=1,m=!u&&a.attachments&&a.attachments.length>1;if(u){const{attachments:e,...t}=b;N({...t,attachment:e?e[0]:void 0})}else if(m){const{text:e,entities:t,attachments:a,...s}=b,c=Object(d.n)(a,n.L);for(let a=0;a0?o:void 0}),r.forEach(e=>{N({...s,attachment:e,groupedId:o})})}}else{const{text:e,entities:t,attachments:a,replyingTo:s,...n}=b;e&&N({...n,text:e,entities:t,replyingTo:s}),a.forEach(e=>{N({...n,attachment:e})})}}),Object(s.b)("editMessage",(e,t,a)=>{const{text:s,entities:n}=a,c=Object(o.y)(e);if(!c)return;const{chatId:r,threadId:i,type:l}=c,d=Object(o.f)(e,r),b=Object(o.D)(e,r,i,l);d&&b&&(Object(j.a)("editMessage",{chat:d,message:b,text:s,entities:n,noWebPage:Object(o.cb)(e,r,i)}),t.setEditingId({messageId:void 0}))}),Object(s.b)("cancelSendingMessage",(e,t,a)=>{const{chatId:s,messageId:n}=a,c=Object(o.k)(e,s,n),r=c&&w.get(c.previousLocalId||c.id);r&&Object(j.b)(r),t.apiUpdate({"@type":"deleteMessages",ids:[n],chatId:s})}),Object(s.b)("saveDraft",(e,t,a)=>{const{chatId:s,threadId:n,draft:c}=a;if(!c)return;const{text:l,entities:d}=c,b=Object(o.f)(e,s);return n===i.MAIN_THREAD_ID&&Object(j.a)("saveDraft",{chat:b,text:l,entities:d,replyToMsgId:Object(o.mb)(e,s,n)}),Object(r.x)(e,s,n,"draft",c)}),Object(s.b)("clearDraft",(e,t,a)=>{const{chatId:s,threadId:n,localOnly:c}=a;if(!Object(o.B)(e,s,n))return;const l=Object(o.f)(e,s);return c||n!==i.MAIN_THREAD_ID||Object(j.a)("clearDraft",l),Object(r.x)(e,s,n,"draft",void 0)}),Object(s.b)("toggleMessageWebPage",(e,t,a)=>{const{chatId:s,threadId:n,noWebPage:c}=a;return Object(r.x)(e,s,n,"noWebPage",c)}),Object(s.b)("pinMessage",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageId:n,isUnpin:c,isOneSide:r,isSilent:i}=a;Object(j.a)("pinMessage",{chat:s,messageId:n,isUnpin:c,isOneSide:r,isSilent:i})}),Object(s.b)("unpinAllMessages",(e,t,a)=>{const n=Object(o.f)(e,a.chatId);n&&async function(e){await Object(j.a)("unpinAllMessages",{chat:e});let t=Object(s.e)();t=Object(r.x)(t,e.id,i.MAIN_THREAD_ID,"pinnedIds",[]),Object(s.g)(t)}(n)}),Object(s.b)("deleteMessages",(e,t,a)=>{const{messageIds:s,shouldDeleteForAll:n}=a,c=Object(o.y)(e);if(!c)return;const{chatId:r,threadId:i}=c,l=Object(o.f)(e,r);Object(j.a)("deleteMessages",{chat:l,messageIds:s,shouldDeleteForAll:n});const d=Object(o.C)(e,r,i);s.includes(d)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteScheduledMessages",(e,t,a)=>{const{messageIds:s}=a,n=Object(o.y)(e);if(!n)return;const{chatId:c}=n,r=Object(o.f)(e,c);Object(j.a)("deleteScheduledMessages",{chat:r,messageIds:s});const i=Object(o.E)(e,c);s.includes(i)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteHistory",(e,t,a)=>{(async()=>{const{chatId:s,shouldDeleteForAll:n}=a,c=Object(o.f)(e,s);if(!c)return;const r=c.lastMessage&&c.lastMessage.id;await Object(j.a)("deleteHistory",{chat:c,shouldDeleteForAll:n,maxId:r}),t.openChat({id:void 0})})()}),Object(s.b)("markMessageListRead",(e,t,a)=>{const s=Object(o.y)(e);if(!s)return;const{chatId:n,threadId:c}=s,r=Object(o.Db)(e,n,c);if(!r)return;const{maxId:i}=a;M(()=>{Object(j.a)("markMessageListRead",{chat:r,threadId:c,maxId:i})})}),Object(s.b)("markMessagesRead",(e,t,a)=>{const s=Object(o.r)(e);if(!s)return;const{messageIds:n}=a;Object(j.a)("markMessagesRead",{chat:s,messageIds:n})}),Object(s.b)("loadWebPagePreview",(e,t,a)=>{const{text:n}=a;!async function(e){const t=await Object(j.a)("fetchWebPagePreview",{message:e});Object(s.g)({...Object(s.e)(),webPagePreview:t})}(n)}),Object(s.b)("clearWebPagePreview",e=>{if(e.webPagePreview)return{...e,webPagePreview:void 0}}),Object(s.b)("sendPollVote",(e,t,a)=>{const{chatId:s,messageId:n,options:c}=a,r=Object(o.f)(e,s);r&&Object(j.a)("sendPollVote",{chat:r,messageId:n,options:c})}),Object(s.b)("loadPollOptionResults",(e,t,a)=>{const{chat:n,messageId:c,option:o,offset:i,limit:l,shouldResetVoters:b}=a;!async function(e,t,a,n,c,o){const i=await Object(j.a)("loadPollOptionResults",{chat:e,messageId:t,option:a,offset:n,limit:c});if(!i)return;let l=Object(s.e)();l=Object(r.f)(l,Object(d.c)(i.users,"id"));const{voters:b}=l.pollResults;Object(s.g)({...l,pollResults:{...l.pollResults,voters:{...b,[a]:[...!o&&b&&b[a]?b[a]:[],...i&&i.users.map(e=>e.id)].filter((e,t,a)=>a.indexOf(e)===t)},offsets:{...l.pollResults.offsets?l.pollResults.offsets:{},[a]:i.nextOffset||""}}})}(n,c,o,i,l,b)}),Object(s.b)("forwardMessages",e=>{const{fromChatId:t,messageIds:a,toChatId:n}=e.forwardMessages,c=t?Object(o.f)(e,t):void 0,r=n?Object(o.f)(e,n):void 0,i=t&&a?a.sort((e,t)=>e-t).map(a=>Object(o.k)(e,t,a)).filter(Boolean):void 0;c&&r&&i&&i.length&&function(e,t,a){Object(j.a)("forwardMessages",{fromChat:e,toChat:t,messages:a}),Object(s.g)({...Object(s.e)(),forwardMessages:{}})}(c,r,i)}),Object(s.b)("loadScheduledHistory",e=>{const t=Object(o.r)(e);if(!t)return;const{hash:a}=e.scheduledMessages.byChatId[t.id]||{};!async function(e,t){const a=await Object(j.a)("fetchScheduledHistory",{chat:e,hash:t});if(!a)return;const{hash:n,messages:c}=a,o=Object(d.c)(c,"id"),l=Object.keys(o).map(Number).sort((e,t)=>t-e);let b=Object(s.e)();b=Object(r.u)(b,e.id,o,n),b=Object(r.x)(b,e.id,i.MAIN_THREAD_ID,"scheduledIds",l),Object(s.g)(b)}(t,a)}),Object(s.b)("sendScheduledMessages",(e,t,a)=>{const{chatId:s,id:n}=a,c=Object(o.f)(e,s);c&&Object(j.a)("sendScheduledMessages",{chat:c,ids:[n]})}),Object(s.b)("rescheduleMessage",(e,t,a)=>{const{chatId:s,messageId:n,scheduledAt:c}=a,r=Object(o.f)(e,s),i=r&&Object(o.pb)(e,r.id,n);r&&i&&Object(j.a)("rescheduleMessage",{chat:r,message:i,scheduledAt:c})}),Object(s.b)("requestThreadInfoUpdate",(e,t,a)=>{const{chatId:s,threadId:n}=a,c=Object(o.Db)(e,s,n);c&&Object(j.a)("requestThreadInfoUpdate",{chat:c,threadId:n})}),Object(s.b)("loadPinnedMessages",(e,t,a)=>{const{chatId:n}=a,c=Object(o.f)(e,n);c&&async function(e){const t=await Object(j.a)("fetchPinnedMessages",{chat:e});if(!t)return;const{messages:a,chats:n,users:c}=t,o=Object(d.c)(a,"id"),l=Object.keys(o).map(Number).sort((e,t)=>t-e);let b=Object(s.e)();b=Object(r.b)(b,e.id,o),b=Object(r.x)(b,e.id,i.MAIN_THREAD_ID,"pinnedIds",l),b=Object(r.f)(b,Object(d.c)(c,"id")),b=Object(r.c)(b,Object(d.c)(n,"id")),Object(s.g)(b)}(c)}),Object(s.b)("loadMessageLink",(e,t,a)=>{const{messageId:s,chatId:n}=a,c=Object(o.f)(e,n),r=Object(o.k)(e,n,s);c&&r&&(async()=>{const e=await Object(j.a)("fetchMessageLink",{chat:c,message:r});e&&Object(E.c)(e.link)})()});var P=a(52);const T=Object(g.g)(e=>e(),500,!1);async function A(e,t){const a=await Object(j.a)("searchGifs",{query:e,offset:t});a&&Object(s.g)(Object(r.Q)(Object(s.e)(),!t,a.gifs,a.nextOffset))}Object(s.b)("loadStickerSets",e=>{const{hash:t}=e.stickers.added||{};!async function(e=0){const t=await Object(j.a)("fetchStickerSets",{hash:e});if(!t)return;Object(s.g)(Object(r.ib)(Object(s.e)(),"added",t.hash,t.sets))}(t)}),Object(s.b)("loadAddedStickers",(e,t)=>{const{setIds:a}=e.stickers.added;a&&a.length&&(async()=>{for(let e=0;e0&&await Object(g.e)(500)})()}),Object(s.b)("loadRecentStickers",e=>{const{hash:t}=e.stickers.recent||{};!async function(e=0){const t=await Object(j.a)("fetchRecentStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,recent:t}})}(t)}),Object(s.b)("loadFavoriteStickers",e=>{const{hash:t}=e.stickers.favorite||{};!async function(e=0){const t=await Object(j.a)("fetchFavoriteStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,favorite:t}})}(t)}),Object(s.b)("loadFeaturedStickers",e=>{const{hash:t}=e.stickers.featured||{};!async function(e=0){const t=await Object(j.a)("fetchFeaturedStickers",{hash:e});if(!t)return;Object(s.g)(Object(r.ib)(Object(s.e)(),"featured",t.hash,t.sets))}(t)}),Object(s.b)("loadStickers",(e,t,a)=>{const{stickerSetId:n}=a;let{stickerSetAccessHash:c}=a;if(!c){const t=Object(o.xb)(e,n);if(!t)return;c=t.accessHash}!async function(e,t){const a=await Object(j.a)("fetchStickers",{stickerSetId:e,accessHash:t});if(!a)return;const{set:n,stickers:c,packs:o}=a;let i=Object(s.e)();i=Object(r.hb)(i,n.id,{...n,stickers:c,packs:o});const l=i.stickers.forEmoji.emoji;l&&o[l]&&(i=Object(r.o)(i));Object(s.g)(i)}(n,c)}),Object(s.b)("loadAnimatedEmojis",()=>{!async function(){const e=await Object(j.a)("fetchAnimatedEmojis");if(!e)return;const{set:t,stickers:a}=e;Object(s.g)(Object(r.q)(Object(s.e)(),{...t,stickers:a}))}()}),Object(s.b)("loadSavedGifs",e=>{const{hash:t}=e.gifs.saved;!async function(e=0){const t=await Object(j.a)("fetchSavedGifs",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,gifs:{...a.gifs,saved:t}})}(t)}),Object(s.b)("faveSticker",(e,t,a)=>{const{sticker:s}=a;s&&Object(j.a)("faveSticker",{sticker:s})}),Object(s.b)("unfaveSticker",(e,t,a)=>{const{sticker:n}=a;n&&function(e){const t=Object(s.e)();Object(s.g)({...t,stickers:{...t.stickers,favorite:{...t.stickers.favorite,stickers:t.stickers.favorite.stickers.filter(({id:t})=>t!==e.id)}}}),Object(j.a)("faveSticker",{sticker:e,unfave:!0})}(n)}),Object(s.b)("toggleStickerSet",(e,t,a)=>{const{stickerSetId:s}=a,n=Object(o.xb)(e,s);if(!n)return;const{accessHash:c,installedDate:r}=n;Object(j.a)(r?"uninstallStickerSet":"installStickerSet",{stickerSetId:s,accessHash:c})}),Object(s.b)("loadEmojiKeywords",(e,t,a)=>{const{language:n}=a;let c=Object(o.F)(e,n);c&&c.isLoading||(Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{...c,isLoading:!0}}}),(async()=>{const t=await Object(j.a)("fetchEmojiKeywords",{language:n,fromVersion:c?c.version:0});e=Object(s.e)(),c=Object(o.F)(e,n),t?Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{isLoading:!1,version:t.version,keywords:{...c&&c.keywords,...t.keywords}}}}):Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{...c,isLoading:!1}}})})())}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:n}=a;n&&T(()=>{!async function(e,t=0){const a=await Object(j.a)("searchStickers",{query:e,hash:t});if(!a)return;const n=Object(s.e)(),{setsById:c,added:o}=n.stickers,i=a.sets.map(({id:e})=>e);o.setIds&&o.setIds.forEach(t=>{if(!i.includes(t)){const{title:a}=c[t]||{};a&&Object(P.a)(a,e)&&i.unshift(t)}});Object(s.g)(Object(r.ib)(n,"search",a.hash,a.sets,i))}(n)})}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;"string"==typeof s&&T(()=>{A(s)})}),Object(s.b)("searchMoreGifs",e=>{const{query:t,offset:a}=e.gifs.search;"string"==typeof t&&T(()=>{A(t,a)})}),Object(s.b)("loadStickersForEmoji",(e,t,a)=>{const{emoji:n}=a,{hash:c}=e.stickers.forEmoji;T(()=>{!async function(e,t=0){let a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,forEmoji:{...a.stickers.forEmoji,emoji:e}}});const n=await Object(j.a)("fetchStickersForEmoji",{emoji:e,hash:t});if(a=Object(s.e)(),!n||a.stickers.forEmoji.emoji!==e)return;a=Object(r.jb)(a,e,n.stickers,n.hash),Object(s.g)(a)}(n,c)})}),Object(s.b)("clearStickersForEmoji",e=>({...e,stickers:{...e.stickers,forEmoji:{}}}));var x=a(36);const R=Object(g.g)(e=>e(),500,!1);async function L(e="",t,a,c,i,l){let b;if(c){const s=await Object(j.a)("searchMessagesLocal",{chatOrUser:c,query:e,type:t,limit:n.y,offsetId:a,minDate:l,maxDate:i});if(s){const{messages:e,users:t,totalCount:a,nextOffsetId:n}=s;b={messages:e,users:t,chats:[],totalCount:a,nextRate:n}}}else b=await Object(j.a)("searchMessagesGlobal",{query:e,offsetRate:a,limit:n.y,type:t,maxDate:i,minDate:l});let u=Object(s.e)();const m=Object(o.t)(u);if(!b||""!==e&&e!==m)return void Object(s.g)(Object(r.T)(u,{messages:!1}));const{messages:h,users:O,chats:g,totalCount:f,nextRate:p}=b;g.length&&(u=Object(r.c)(u,Object(d.c)(g,"id"))),O.length&&(u=Object(r.f)(u,Object(d.c)(O,"id"))),h.length&&(u=Object(r.d)(u,h)),u=Object(r.U)(u,h,f,t,p),Object(s.g)(u)}async function F(){const e=await Object(j.a)("fetchChats",{limit:n.j,archived:!0,withPinned:!0});if(!e)return;let t=Object(s.e)();t=Object(r.ob)(t,Object(d.c)(e.users,"id")),t=Object(r.M)(t,Object(d.c)(e.chats,"id")),t=Object(r.r)(t,"archived",e.chatIds),t=Object(r.J)(t,"archived",e),Object(s.g)(t)}async function D(){let e=Object(s.e)();const{recentlyFoundChatIds:t}=e.globalSearch,{userIds:a}=e.contactList||{};if(!(a&&a.length||t&&t.length))return;const n=[...t||[],...a||[]].map(t=>Object(o.Gb)(e,t)).filter(Boolean),c=await Object(j.a)("fetchUsers",{users:n});c&&(e=Object(s.e)(),e=Object(r.ob)(e,Object(d.c)(c,"id")),Object(s.g)(e))}Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{chatId:n}=e.globalSearch,{query:c}=a;c&&!n&&R(()=>{!async function(e){const t=await Object(j.a)("searchChats",{query:e});let a=Object(s.e)();const n=Object(o.t)(a);if(!t||!n||e!==n)return void Object(s.g)(Object(r.T)(a,{chats:!1}));const{localChats:c,localUsers:i,globalChats:l,globalUsers:b}=t;(c.length||l.length)&&(a=Object(r.c)(a,Object(d.c)([...c,...l],"id")));(i.length||b.length)&&(a=Object(r.f)(a,Object(d.c)([...i,...b],"id")));a=Object(r.T)(a,{chats:!1}),a=Object(r.R)(a,{localResults:{chatIds:c.map(({id:e})=>e),userIds:i.map(({id:e})=>e)},globalResults:{...a.globalSearch.globalResults,chatIds:b.map(({id:e})=>e),userIds:l.map(({id:e})=>e)}}),Object(s.g)(a)}(c)})}),Object(s.b)("setGlobalSearchDate",(e,t,a)=>{const{date:n}=a,c=n?Object(x.m)(n):n,i=Object(r.R)(e,{date:n,query:"",resultsByType:{...e.globalSearch.resultsByType,text:{totalCount:void 0,foundIds:[],nextOffsetId:0}}});Object(s.g)(i);const{chatId:l}=e.globalSearch;L("","text",void 0,l?Object(o.f)(e,l):void 0,c,n)}),Object(s.b)("searchMessagesGlobal",(e,t,a)=>{const{query:s,resultsByType:n,chatId:c,date:r}=e.globalSearch,i=r?Object(x.m)(r):r,{type:l}=a,{nextOffsetId:d}=n&&n[l]||{};L(s,l,d,c?Object(o.f)(e,c):void 0,i,r)}),Object(s.b)("searchTextMessagesLocal",e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},c=t?Object(o.f)(e,t):void 0,l=Object(o.A)(e);if(!c||!l||!a)return;const{query:b,results:u}=l,m=u?u.nextOffsetId:void 0;let h;if(a!==i.MAIN_THREAD_ID){const s=Object(o.Cb)(e,t,a);h=s?s.topMessageId:void 0}!async function(e,t,a,c,i){const l=await Object(j.a)("searchMessagesLocal",{chatOrUser:e,type:"text",query:c,topMessageId:a,limit:n.X,offsetId:i});if(!l)return;const{messages:b,users:u,totalCount:m,nextOffsetId:h}=l,O=Object(d.c)(b,"id"),g=Object.keys(O).map(Number);let f=Object(s.e)();const p=Object(o.A)(f);if(!p||c&&c!==p.query)return;f=Object(r.b)(f,e.id,O),f=Object(r.f)(f,Object(d.c)(u,"id")),f=Object(r.Z)(f,e.id,t,g,m,h),Object(s.g)(f)}(c,a,h,b,m)}),Object(s.b)("searchMediaMessagesLocal",e=>{const t=Object(o.w)(e),a=t?e.users.byId[t]||e.chats.byId[t]:void 0,c=Object(o.v)(e);if(!a||!c)return;const{currentType:i,resultsByType:l}=c,b=i&&l&&l[i],u=b?b.nextOffsetId:void 0;i&&async function(e,t,a){const c=await Object(j.a)("searchMessagesLocal",{chatOrUser:e,type:t,limit:n.ob,offsetId:a});if(!c)return;const{messages:i,users:l,totalCount:b,nextOffsetId:u}=c,m=Object(d.c)(i,"id"),h=Object.keys(m).map(Number);let O=Object(s.e)();if(!Object(o.v)(O))return;O=Object(r.b)(O,e.id,m),O=Object(r.f)(O,Object(d.c)(l,"id")),O=Object(r.W)(O,e.id,t,h,b,u),Object(s.g)(O)}(a,i,u)}),Object(s.b)("searchMessagesByDate",(e,t,a)=>{const{timestamp:n}=a,{chatId:c}=Object(o.y)(e)||{};if(!c)return;const r=Object(o.f)(e,c);r&&async function(e,t){const a=await Object(j.a)("findFirstMessageIdAfterDate",{chat:e,timestamp:t});if(!a)return;Object(s.d)().focusMessage({chatId:e.id,messageId:a})}(r,n)}),Object(s.b)("checkPublicLink",(e,t,a)=>{const{chatId:n}=Object(o.y)(e)||{};if(!n)return;if(e.management.progress===l.f.InProgress)return;const{username:c}=a;(async()=>{e=Object(r.bb)(e,l.f.InProgress),e=Object(r.ab)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e);const t=await Object(j.a)("checkChatUsername",{username:c});e=Object(s.e)(),e=Object(r.bb)(e,t?l.f.Complete:l.f.Error),e=Object(r.ab)(e,n,{isUsernameAvailable:t}),Object(s.g)(e)})()}),Object(s.b)("updatePublicLink",(e,t,a)=>{const{chatId:n}=Object(o.y)(e)||{};let c=n&&Object(o.f)(e,n);if(!n||!c)return;const{username:i}=a;(async()=>{if(e=Object(r.bb)(e,l.f.InProgress),Object(s.g)(e),Object(m.jb)(c)){if(c=await Object(j.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}const a=await Object(j.a)("setChatUsername",{chat:c,username:i});e=Object(s.e)(),e=Object(r.bb)(e,a?l.f.Complete:l.f.Error),e=Object(r.ab)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e)})()}),Object(s.b)("updatePrivateLink",e=>{const{chatId:t}=Object(o.y)(e)||{},a=t&&Object(o.f)(e,t);t&&a&&Object(j.a)("updatePrivateLink",{chat:a})}),Object(s.b)("sync",(e,t)=>{!async function(e){n.p&&console.log(">>> START SYNC");await Object(j.a)("fetchCurrentUser");const t=await async function(){const e=await Object(j.a)("fetchChats",{limit:n.j,withPinned:!0});if(!e)return;let t=Object(s.e)();const{recentlyFoundChatIds:a}=t.globalSearch,{userIds:c}=t.contactList||{},{currentUserId:l}=t,b=[...a||[],...c||[],...l?[l]:[]],u=b.map(e=>Object(o.Gb)(t,e)).filter(Boolean),h=b.map(e=>Object(o.f)(t,e)).filter(Boolean),{chatId:O}=Object(o.y)(t)||{};if(O){const e=Object(o.f)(t,O);if(e&&!b.includes(O)&&h.push(e),Object(m.mb)(O)){const e=Object(o.Gb)(t,O);e&&!b.includes(O)&&u.push(e)}}u.push(...e.users),h.push(...e.chats),t=Object(r.s)(t,Object(d.c)(h,"id")),t=Object(r.r)(t,"active",e.chatIds),t={...t,chats:{...t.chats}},t=Object(r.J)(t,"active",e),Object.keys(e.draftsById).map(Number).forEach(a=>{t=Object(r.x)(t,a,i.MAIN_THREAD_ID,"draft",e.draftsById[a])}),Object.keys(e.replyingToById).map(Number).forEach(a=>{t=Object(r.x)(t,a,i.MAIN_THREAD_ID,"replyingToId",e.replyingToById[a])}),Object(s.g)(t),O&&!t.chats.byId[O]&&Object(s.d)().openChat({id:void 0});return u}();await async function(e){let t=!1,a=e||[],c=Object(s.e)();const{chatId:l}=Object(o.y)(c)||{},b=Object.keys(c.messages.byChatId).map(Number).reduce((e,t)=>{const a=Object(o.B)(c,t,i.MAIN_THREAD_ID);return a?{...e,[t]:a}:e},{});if(l){const e=await(u=c.chats.byId[l],Object(j.a)("fetchMessages",{chat:u,threadId:i.MAIN_THREAD_ID,offsetId:u.lastReadInboxMessageId,addOffset:-(Math.round(n.V/2)+1),limit:n.V}));c=Object(s.e)();const{chatId:b}=Object(o.y)(c)||{};if(e&&b===l){const s=c.messages.byChatId[l],n=Object(d.c)(e.messages,"id"),o=Object.keys(n).map(Number);c={...c,messages:{...c.messages,byChatId:{[l]:{byId:n,threadsById:{[i.MAIN_THREAD_ID]:{...s&&s.threadsById[i.MAIN_THREAD_ID],listedIds:o,viewportIds:o,outlyingIds:void 0}}}}}},c=Object(r.M)(c,Object(d.c)(e.chats,"id")),c=Object(r.lb)(c,l,e.threadInfos),t=!0,a=Array.prototype.concat(a,e.users)}}var u;t||(c={...c,messages:{...c.messages,byChatId:{}}});Object.keys(b).map(Number).forEach(e=>{c=Object(r.x)(c,e,i.MAIN_THREAD_ID,"draft",b[e])}),e?c=Object(r.y)(c,Object(d.c)(a,"id")):a&&(c=Object(r.ob)(c,Object(d.c)(a,"id")));Object(s.g)(c);const{chatId:m,messageId:h}=c.audioPlayer;m&&h&&!Object(o.k)(c,m,h)&&Object(s.d)().closeAudioPlayer()}(t),Object(s.g)({...Object(s.e)(),lastSyncTime:Date.now()}),n.p&&console.log(">>> FINISH SYNC");e()}(t.afterSync)}),Object(s.b)("afterSync",(e,t)=>{!async function(e){n.p&&console.log(">>> START AFTER-SYNC");e.loadFavoriteStickers(),await Promise.all([D(),F()]),await Object(j.a)("fetchCurrentUser"),n.p&&console.log(">>> FINISH AFTER-SYNC")}(t)});const B=Object(g.a)(e=>e(),500,!1,!0);function U(e,{visibility:t,allowedIds:a,deniedIds:s}){const{users:{byId:n},chats:{byId:c}}=e,r={visibility:t};let o,i;const l=e=>{if(!Object(m.mb)(e))return;const{id:t,accessHash:a}=n[e]||{};return t?{id:t,accessHash:a}:void 0},d=e=>{if(Object(m.mb)(e))return;const t=c[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(o=a.map(l).filter(Boolean),i=a.map(d).filter(Boolean),o.length>0&&(r.allowedUsers=o),i.length>0&&(r.allowedChats=i)),"everybody"!==t&&"contacts"!==t||(o=s.map(l).filter(Boolean),i=s.map(d).filter(Boolean),o.length>0&&(r.blockedUsers=o),i.length>0&&(r.blockedChats=i)),r}Object(s.b)("loadFullUser",(e,t,a)=>{const{userId:s}=a,n=Object(o.Gb)(e,s);if(!n)return;const{id:c,accessHash:r}=n;B(()=>Object(j.a)("fetchFullUser",{id:c,accessHash:r}))}),Object(s.b)("loadUser",(e,t,a)=>{const{userId:n}=a,c=Object(o.Gb)(e,n);c&&(async()=>{const t=await Object(j.a)("fetchUsers",{users:[c]});t&&(e=Object(s.e)(),e=Object(r.ob)(e,Object(d.c)(t,"id")),Object(s.g)(e))})()}),Object(s.b)("loadTopUsers",e=>{const{hash:t,lastRequestedAt:a}=e.topPeers;(!a||Date.now()-a>6e4)&&async function(e){const t=await Object(j.a)("fetchTopUsers",{hash:e});if(!t)return;const{hash:a,ids:n,users:c}=t;let o=Object(s.e)();o=Object(r.f)(o,Object(d.c)(c,"id")),o={...o,topPeers:{...o.topPeers,hash:a,userIds:n,lastRequestedAt:Date.now()}},Object(s.g)(o)}(t)}),Object(s.b)("loadContactList",e=>{const{hash:t}=e.contactList||{};!async function(e){const t=await Object(j.a)("fetchContactList",{hash:e});if(!t)return;let a=Object(r.f)(Object(s.e)(),Object(d.c)(t.users,"id"));a=Object(r.c)(a,Object(d.c)(t.chats,"id"));const n=e=>e.lastName||e.firstName||"",c=new Intl.Collator("en-US"),o=t.users.sort((e,t)=>c.compare(n(e),n(t))).filter(e=>!e.isSelf);Object(s.g)({...a,contactList:{hash:t.hash,userIds:o.map(e=>e.id)}})}(t)}),Object(s.b)("loadCurrentUser",()=>{Object(j.a)("fetchCurrentUser")}),Object(s.b)("updateContact",(e,t,a)=>{const{userId:n,isMuted:c,firstName:i,lastName:d}=a;!async function(e,t,a,n){const c=Object(s.e)(),i=Object(o.Gb)(c,e);if(!i)return;Object(s.d)().updateChatMutedState({chatId:e,isMuted:t}),Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.InProgress));await Object(j.a)("updateContact",{phone:i.phoneNumber,firstName:a,lastName:n})&&Object(s.g)(Object(r.nb)(Object(s.e)(),i.id,{firstName:a,lastName:n}));Object(s.g)(Object(r.bb)(Object(s.e)(),l.f.Complete))}(n,c,i,d)}),Object(s.b)("deleteUser",(e,t,a)=>{const{userId:n}=a;!async function(e){const t=Object(s.e)(),a=Object(o.Gb)(t,e);if(!a)return;const{id:n,accessHash:c}=a;await Object(j.a)("deleteUser",{id:n,accessHash:c})}(n)}),Object(s.b)("loadProfilePhotos",(e,t,a)=>{const{profileId:n}=a,c=Object(m.mb)(n),i=c?Object(o.Gb)(e,n):void 0,l=c?void 0:Object(o.f)(e,n);(async()=>{const e=await Object(j.a)("fetchProfilePhotos",i,l);if(!e||!e.photos)return;let t=Object(s.e)();c?t=Object(r.nb)(t,n,{photos:e.photos}):(t=Object(r.f)(t,Object(d.c)(e.users,"id")),t=Object(r.H)(t,n,{photos:e.photos})),Object(s.g)(t)})()}),Object(s.b)("clickInlineButton",(e,t,a)=>{const{button:c}=a;switch(c.type){case"command":t.sendBotCommand({command:c.value});break;case"url":c.value.match(n.hb)||c.value.match(n.ib)?t.openTelegramLink({url:c.value}):t.toggleSafeLinkModal({url:c.value});break;case"callback":{const t=Object(o.r)(e);if(!t)return;!async function(e,t,a){const n=await Object(j.a)("answerCallbackButton",{chatId:e.id,accessHash:e.accessHash,messageId:t,data:a});if(!n||!n.message)return;const{message:c,alert:r}=n;r?Object(s.d)().showError({error:{message:c}}):Object(s.d)().showNotification({message:c})}(t,c.messageId,c.value);break}case"requestPoll":t.openPollModal();break;case"buy":{const a=Object(o.r)(e),{messageId:s,value:n}=c;if(!a)return;n?t.getReceipt({receiptMessageId:n,chatId:a.id,messageId:s}):(t.getPaymentForm({messageId:s}),t.setInvoiceMessageInfo(Object(o.k)(e,a.id,s)),t.openPaymentModal({messageId:s}));break}}}),Object(s.b)("sendBotCommand",(e,t,a)=>{const{command:s}=a,{currentUserId:n}=e,c=Object(o.r)(e);n&&c&&async function(e,t,a){await Object(j.a)("sendMessage",{chat:e,text:a})}(c,0,s)}),Object(s.b)("updateProfile",(e,t,a)=>{const{photo:n,firstName:c,lastName:i,bio:d,username:b}=a;(async()=>{const{currentUserId:t}=e;if(t){if(Object(s.g)({...Object(s.e)(),profileEdit:{progress:l.j.InProgress}}),n&&await Object(j.a)("updateProfilePhoto",n),c||i||d){if(await Object(j.a)("updateProfile",{firstName:c,lastName:i,about:d})){e=Object(s.e)();const a=t&&Object(o.Gb)(e,t);a&&Object(s.g)(Object(r.nb)(e,a.id,{firstName:c,lastName:i,fullInfo:{...a.fullInfo,bio:d}}))}}if(b){await Object(j.a)("updateUsername",b)&&t&&Object(s.g)(Object(r.nb)(Object(s.e)(),t,{username:b}))}Object(s.g)({...Object(s.e)(),profileEdit:{progress:l.j.Complete}})}})()}),Object(s.b)("checkUsername",(e,t,a)=>{const{username:n}=a;(async()=>{if(e.profileEdit&&e.profileEdit.progress===l.j.InProgress)return;Object(s.g)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:l.j.Idle,isUsernameAvailable:void 0}});const t=await Object(j.a)("checkUsername",n);e=Object(s.e)(),Object(s.g)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()}),Object(s.b)("loadWallpapers",()=>{(async()=>{const e=await Object(j.a)("fetchWallpapers",0);if(!e)return;const t=Object(s.e)();Object(s.g)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()}),Object(s.b)("uploadWallpaper",(e,t,a)=>{const n=a,c=URL.createObjectURL(n);Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[{slug:l.n,document:{fileName:"",size:n.size,mimeType:n.type,previewBlobUrl:c}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await Object(j.a)("uploadWallpaper",n);if(!t)return;const{wallpaper:a}=t;if(!(e=Object(s.e)()).settings.loadedWallpapers)return;const r=e.settings.loadedWallpapers[0];if(!r||r.slug!==l.n)return;const o={...a,document:{...a.document,previewBlobUrl:c}};Object(s.g)({...e,settings:{...e.settings,loadedWallpapers:[o,...e.settings.loadedWallpapers.slice(1)]}})})()}),Object(s.b)("loadBlockedContacts",()=>{(async()=>{const e=await Object(j.a)("fetchBlockedContacts");if(!e)return;let t=Object(s.e)();e.users&&e.users.length&&(t=Object(r.f)(t,Object(d.c)(e.users,"id"))),e.chats&&e.chats.length&&(t=Object(r.M)(t,Object(d.c)(e.chats,"id"))),t={...t,blocked:{...t.blocked,ids:[...t.blocked.ids||[],...e.blockedIds],totalCount:e.totalCount}},Object(s.g)(t)})()}),Object(s.b)("blockContact",(e,t,a)=>{const{contactId:n}=a;(async()=>{if(!await Object(j.a)("blockContact",n))return;const e=Object(s.e)();Object(s.g)(Object(r.a)(e,n))})()}),Object(s.b)("unblockContact",(e,t,a)=>{const{contactId:n}=a;let c;if(Object(m.mb)(n)){const t=Object(o.Gb)(e,n);if(!t)return;c=t.accessHash}(async()=>{if(!await Object(j.a)("unblockContact",n,c))return;const e=Object(s.e)();Object(s.g)(Object(r.p)(e,n))})()}),Object(s.b)("loadAuthorizations",()=>{(async()=>{const e=await Object(j.a)("fetchAuthorizations");e&&Object(s.g)({...Object(s.e)(),activeSessions:e})})()}),Object(s.b)("terminateAuthorization",(e,t,a)=>{const{hash:n}=a;(async()=>{if(!await Object(j.a)("terminateAuthorization",n))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.hash!==n)})})()}),Object(s.b)("terminateAllAuthorizations",()=>{(async()=>{if(!await Object(j.a)("terminateAllAuthorizations"))return;const e=Object(s.e)();Object(s.g)({...e,activeSessions:e.activeSessions.filter(e=>e.isCurrent)})})()}),Object(s.b)("loadNotificationExceptions",()=>{Object(j.a)("fetchNotificationExceptions")}),Object(s.b)("loadNotificationSettings",()=>{(async()=>{const e=await Object(j.a)("fetchNotificationSettings");e&&Object(s.g)(Object(r.v)(Object(s.e)(),e))})()}),Object(s.b)("updateNotificationSettings",(e,t,a)=>{const{peerType:n,isSilent:c,shouldShowPreviews:o}=a;(async()=>{await Object(j.a)("updateNotificationSettings",n,{isSilent:c,shouldShowPreviews:o})&&Object(s.g)(Object(r.cb)(Object(s.e)(),n,c,o))})()}),Object(s.b)("updateContactSignUpNotification",(e,t,a)=>{const{isSilent:n}=a;(async()=>{await Object(j.a)("updateContactSignUpNotification",n)&&Object(s.g)(Object(r.v)(Object(s.e)(),{hasContactJoinedNotifications:!n}))})()}),Object(s.b)("loadLanguages",()=>{(async()=>{const e=await Object(j.a)("fetchLanguages");e&&Object(s.g)(Object(r.v)(Object(s.e)(),{languages:e}))})()}),Object(s.b)("loadPrivacySettings",()=>{(async()=>{const[e,t,a,n,c]=await Promise.all([Object(j.a)("fetchPrivacySettings","phoneNumber"),Object(j.a)("fetchPrivacySettings","lastSeen"),Object(j.a)("fetchPrivacySettings","profilePhoto"),Object(j.a)("fetchPrivacySettings","forwards"),Object(j.a)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&a&&n&&c))return;const r=Object(s.e)();r.settings.privacy.phoneNumber=e,r.settings.privacy.lastSeen=t,r.settings.privacy.profilePhoto=a,r.settings.privacy.forwards=n,r.settings.privacy.chatInvite=c,Object(s.g)(r)})()}),Object(s.b)("setPrivacyVisibility",(e,t,a)=>{const{privacyKey:n,visibility:c}=a,{privacy:{[n]:r}}=e.settings;if(!r)return;const o=U(e,{visibility:c,allowedIds:[...r.allowUserIds,...r.allowChatIds],deniedIds:[...r.blockUserIds,...r.blockChatIds]});(async()=>{const e=await Object(j.a)("setPrivacySettings",n,o);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("setPrivacySettings",(e,t,a)=>{const{privacyKey:n,isAllowList:c,contactsIds:r}=a,{privacy:{[n]:o}}=e.settings;if(!o)return;const i=U(e,{visibility:o.visibility,allowedIds:c?r:[...o.allowUserIds,...o.allowChatIds],deniedIds:c?[...o.blockUserIds,...o.blockChatIds]:r});(async()=>{const e=await Object(j.a)("setPrivacySettings",n,i);if(e){const t=Object(s.e)();t.settings.privacy[n]=e,Object(s.g)(t)}})()}),Object(s.b)("loadPasswordInfo",()=>{(async()=>{const e=await Object(j.a)("getPasswordInfo");if(!e)return;let t=Object(s.e)();t=Object(r.v)(t,{hasPassword:e.hasPassword}),t=Object(r.mb)(t,{hint:e.hint}),Object(s.g)(t)})()}),Object(s.b)("checkPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(r.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("checkPassword",n);Object(s.g)(Object(r.mb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("clearPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(r.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("clearPassword",n);Object(s.g)(Object(r.mb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("updatePassword",(e,t,a)=>{const{currentPassword:n,password:c,hint:o,email:i,onSuccess:l}=a;Object(s.g)(Object(r.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("updatePassword",n,c,o,i);Object(s.g)(Object(r.mb)(Object(s.e)(),{isLoading:!1})),e&&l()})()}),Object(s.b)("updateRecoveryEmail",(e,t,a)=>{const{currentPassword:n,email:c,onSuccess:o}=a;Object(s.g)(Object(r.mb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(j.a)("updateRecoveryEmail",n,c);Object(s.g)(Object(r.mb)(Object(s.e)(),{isLoading:!1,waitingEmailCodeLength:void 0})),e&&o()})()}),Object(s.b)("provideTwoFaEmailCode",(e,t,a)=>{const{code:s}=a;Object(j.a)("provideRecoveryEmailCode",s)}),Object(s.b)("clearTwoFaError",e=>Object(r.mb)(e,{error:void 0}));var H=a(60);Object(s.b)("validateRequestedInfo",(e,t,a)=>{const{requestInfo:n,saveInfo:c}=a,i=Object(o.hb)(e);i&&async function(e,t,a){const n=await Object(j.a)("validateRequestedInfo",{messageId:e,requestInfo:t,shouldSave:a});if(!n)return;const{id:c,shippingOptions:o}=n;if(!c)return;let i=Object(r.E)(Object(s.e)(),c);o?(i=Object(r.gb)(i,o),i=Object(r.C)(i,l.i.Shipping)):i=Object(r.C)(i,l.i.PaymentInfo);Object(s.g)(i)}(i,n,c)}),Object(s.b)("getPaymentForm",(e,t,a)=>{const{messageId:n}=a;n&&async function(e){const t=await Object(j.a)("getPaymentForm",{messageId:e});if(!t)return;let a=Object(r.B)(Object(s.e)(),t),n=l.i.PaymentInfo;a.payment.invoice&&(a.payment.invoice.shippingAddressRequested||a.payment.invoice.nameRequested||a.payment.invoice.phoneRequested||a.payment.invoice.emailRequested)&&(n=l.i.ShippingInfo);a=Object(r.C)(a,n),Object(s.g)(a)}(n)}),Object(s.b)("getReceipt",(e,t,a)=>{const{receiptMessageId:n,chatId:c,messageId:i}=a;i&&n&&c&&async function(e,t,a){const n=await Object(j.a)("getReceipt",t);if(!n)return;let c=Object(s.e)();const i=Object(o.k)(c,a,e);c=Object(r.D)(c,n,i),Object(s.g)(c)}(i,n,c)}),Object(s.b)("clearPaymentError",e=>{Object(s.g)({...e,payment:{...e.payment,error:void 0}})}),Object(s.b)("clearReceipt",e=>{Object(s.g)({...e,payment:{...e.payment,receipt:void 0}})}),Object(s.b)("sendCredentialsInfo",(e,t,a)=>{const n=Object(o.kb)(e);if(!n)return;const{credentials:c}=a,{data:i}=c;!async function(e,t){const a=function(e){const t=Object.keys(e).map(t=>`${t}=${e[t]}`).join("&");return t.length>0?"?"+t:""}({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvv,"card[address_zip]":e.zip,"card[address_country]":e.country}),n=await fetch("https://api.stripe.com/v1/tokens"+a,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:"Bearer "+t}}),c=await n.json();if(c.error){const e=Object(H.b)(c.error),t=Object(s.e)();return void Object(s.g)({...t,payment:{...t.payment,error:{...e}}})}let o=Object(r.F)(Object(s.e)(),{type:c.type,id:c.id});o=Object(r.C)(o,l.i.Checkout),Object(s.g)(o)}(i,n)}),Object(s.b)("sendPaymentForm",(e,t,a)=>{const{shippingOptionId:n,saveCredentials:c}=a,i=Object(o.hb)(e),l=Object(o.ib)(e),d=Object(o.kb)(e),b=Object(o.zb)(e);i&&d&&async function(e,t,a,n){if(await Object(j.a)("sendPaymentForm",{messageId:e,credentials:t,requestedInfoId:a,shippingOptionId:n})){const e=Object(r.h)(Object(s.e)());Object(s.g)(Object(r.i)(e))}}(i,{save:c,data:b},l,n)}),Object(s.b)("setPaymentStep",(e,t,a={})=>Object(r.C)(e,a.step||l.i.ShippingInfo)),Object(s.b)("setInvoiceMessageInfo",(e,t,a)=>Object(r.A)(e,a));a(87);var G=a(29),q=a(78);const _=Object(g.g)(e=>e(),1e3,!0);Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateChat":{a.noTopChatsRequest||Object(o.M)(e,a.id)||t.loadTopChats();const n=Object(r.H)(e,a.id,a.chat,a.newProfilePhoto);Object(s.g)(n);const c=Object(o.q)(n);_(()=>Object(q.a)(c));break}case"updateChatJoin":{const n=Object(o.j)(e,a.id);if(!n)break;e=Object(r.I)(e,n,[a.id]),e=Object(r.H)(e,a.id,{isNotJoined:!1}),Object(s.g)(e);const c=Object(o.f)(e,a.id);c&&t.requestChatUpdate({chatId:c.id});break}case"updateChatLeave":{const t=Object(o.j)(e,a.id);if(!t)break;const{[t]:n}=e.chats.listIds;n&&(e=Object(r.r)(e,t,n.filter(e=>e!==a.id))),e=Object(r.H)(e,a.id,{isNotJoined:!0}),Object(s.g)(e);break}case"updateChatInbox":Object(s.g)(Object(r.H)(e,a.id,a.chat));break;case"updateChatTypingStatus":{const{id:t,typingStatus:n}=a;Object(s.g)(Object(r.H)(e,t,{typingStatus:n})),setTimeout(()=>{const e=Object(s.e)(),a=Object(o.f)(e,t);a&&n&&a.typingStatus&&a.typingStatus.timestamp===n.timestamp&&Object(s.g)(Object(r.H)(e,t,{typingStatus:void 0}))},6e3);break}case"newMessage":{const{message:n}=a,{chatId:c,threadId:l,type:d}=Object(o.y)(e)||{};if(n.senderId===e.currentUserId&&!n.isFromScheduled)return;const b=Object(o.f)(e,a.chatId);if(!b)return;const u="thread"===d&&l===i.MAIN_THREAD_ID&&a.chatId===c;u?setTimeout(()=>{t.requestChatUpdate({chatId:a.chatId})},1e3):Object(s.g)(Object(r.H)(e,a.chatId,{unreadCount:b.unreadCount?b.unreadCount+1:1,...a.message.hasUnreadMention&&{unreadMentionsCount:b.unreadMentionsCount?b.unreadMentionsCount+1:1}}));const m=Object(o.q)(Object(s.e)());Object(q.a)(m),Object(G.b)({chat:b,message:n,isActiveChat:u});break}case"updateCommonBoxMessages":case"updateChannelMessages":{const{ids:t,messageUpdate:n}=a;if(!1!==n.hasUnreadMention)return;t.forEach(t=>{const s="channelId"in a?a.channelId:Object(o.p)(e,t),n=Object(o.f)(e,s);n&&n.unreadMentionsCount&&(e=Object(r.H)(e,s,{unreadMentionsCount:n.unreadMentionsCount-1}))}),Object(s.g)(e);break}case"updateChatFullInfo":{const{fullInfo:t}=a,n=e.chats.byId[a.id];if(!n)return;Object(s.g)(Object(r.H)(e,a.id,{fullInfo:{...n.fullInfo,...t}}));break}case"updatePinnedChatIds":{const{ids:t,folderId:c}=a,r=c===n.h?"archived":"active";e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:t.length?t:void 0}}},Object(s.g)(e);break}case"updateChatPinned":{const{id:t,isPinned:c}=a,r=Object(o.j)(e,t);if(r){const{[r]:a}=e.chats.orderedPinnedIds;let s=a||[];if(c){if(!s.includes(t)){if("active"===r&&s.length>=n.K){const t=e.chats.listIds.active;s=s.filter(e=>t&&t.includes(e))}s=[t,...s]}}else s=s.filter(e=>e!==t);e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:s.length?s:void 0}}}}Object(s.g)(e);break}case"updateChatListType":{const{id:t,folderId:n}=a;Object(s.g)(Object(r.K)(e,t,n));break}case"updateChatFolder":{const{id:t,folder:n}=a,{byId:c,orderedIds:r}=e.chatFolders,o=n?{...c,[t]:n}:Object(d.l)(c,Object.keys(c).map(Number).filter(e=>e!==t)),i=n?r&&r.includes(t)?r:[...r||[],t]:r?r.filter(e=>e!==t):void 0;Object(s.g)({...e,chatFolders:{...e.chatFolders,byId:o,orderedIds:i}});break}case"updateChatFoldersOrder":{const{orderedIds:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,orderedIds:t}});break}case"updateRecommendedChatFolders":{const{folders:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,recommended:t}});break}case"updateChatMembers":{const t=e.chats.byId[a.id],{replacedMembers:n,addedMember:c,deletedMemberId:o}=a;if(!t)return;let i=!1,l=t.fullInfo&&t.fullInfo.members?[...t.fullInfo.members]:[];if(n)l=n,i=!0;else if(c)l.length&&l.some(e=>e.userId===c.userId)||(l.push(c),i=!0);else if(l.length&&o){const e=l.findIndex(e=>e.userId===o);e>-1&&(l.slice(e,1),i=!0)}if(i){const n=l.filter(({isOwner:e,isAdmin:t})=>e||t);Object(s.g)(Object(r.H)(e,a.id,{membersCount:l.length,fullInfo:{...t.fullInfo,members:l,adminMembers:n}}))}break}case"deleteProfilePhotos":{const{chatId:t,ids:n}=a,c=e.chats.byId[t];c&&c.photos&&Object(s.g)(Object(r.H)(e,t,{photos:c.photos.filter(e=>!n.includes(e.id))}));break}case"draftMessage":{const{chatId:t,formattedText:n,replyingToId:c}=a;e.chats.byId[t]&&(e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"draft",n),e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"replyingToId",c),Object(s.g)(e))}}});function V(e,t,a,s,n=!1){const c=n?Object(o.pb)(e,t,a):Object(o.k)(e,t,a);if(c&&s.content){const{photo:e,video:t,sticker:a,document:n}=Object(m.w)(c);e&&s.content.photo?(s.content.photo.blobUrl=e.blobUrl,s.content.photo.thumbnail=e.thumbnail):t&&s.content.video?s.content.video.blobUrl=t.blobUrl:a&&s.content.sticker?s.content.sticker.isPreloadedGlobally=a.isPreloadedGlobally:n&&s.content.document&&(s.content.document.previewBlobUrl=n.previewBlobUrl)}return n?Object(r.eb)(e,t,a,s):Object(r.L)(e,t,a,s)}function $(e,t){const{id:a,chatId:s}=t,n=Object(o.f)(e,s);if(n&&n.unreadCount&&!Object(o.Y)(e,s,i.MAIN_THREAD_ID))return e;if(e=Object(r.V)(e,s,i.MAIN_THREAD_ID,[a]),Object(o.X)(e,s,i.MAIN_THREAD_ID)){const t=Object(o.H)(e,s,i.MAIN_THREAD_ID),n=Object(r.g)(e,s,i.MAIN_THREAD_ID,a),c=Object(o.Hb)(n,s,i.MAIN_THREAD_ID);t&&!c.includes(t)||(e=n)}const{threadInfo:c,firstMessageId:l}=Object(o.Bb)(e,s,t)||{};return!l&&Object(m.tb)(t)||c&&(e=Object(r.V)(e,s,c.threadId,[a]),Object(o.X)(e,s,c.threadId)&&(e=Object(r.g)(e,s,c.threadId,a),l||(e=Object(r.x)(e,s,c.threadId,"firstMessageId",t.id)),c.lastMessageId||(e=Object(r.x)(e,s,c.threadId,"threadInfo",{...c,lastMessageId:t.id})))),e}function W(e,t,a,s=!1){const{chats:n}=e,c=n.byId[t]&&n.byId[t].lastMessage;if(c&&!s){if(!(c.id===a.id||c.id===a.previousLocalId||a.id>c.id))return e}return Object(r.H)(e,t,{lastMessage:a})}function z(e,t){const a=Object(o.m)(e,t),s=Object(o.Y)(e,t,i.MAIN_THREAD_ID);if(!a||!s)return;let n=s.length;for(;n--;){const e=a[s[n]];if(!e.isDeleting)return e}}function K(e,t,a,n){if(e){t.forEach(t=>{const a=z(n=Object(r.L)(n,e,t,{isDeleting:!0}),e);a&&(n=W(n,e,a,!0))}),Object(s.g)(n),a.requestChatUpdate({chatId:e});const c=[];return t.forEach(t=>{const a=Object(o.k)(n,e,t);if(!a)return;const{threadInfo:s}=Object(o.Bb)(n,e,a)||{};s&&c.push(s.threadId)}),Object(d.o)(c).forEach(t=>{a.requestThreadInfoUpdate({chatId:e,threadId:t})}),void setTimeout(()=>{Object(s.g)(Object(r.j)(Object(s.e)(),e,t))},350)}const c=[];t.forEach(e=>{const t=Object(o.p)(n,e);if(t){c.push(t);const a=z(n=Object(r.L)(n,t,e,{isDeleting:!0}),t);a&&(n=W(n,t,a,!0)),setTimeout(()=>{Object(s.g)(Object(r.j)(Object(s.e)(),t,[e]))},350)}}),Object(s.g)(n),Object(d.o)(c).forEach(e=>{a.requestChatUpdate({chatId:e})})}Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"newMessage":{const{chatId:n,id:c,message:i}=a;e=$(e=V(e,n,c,i),i),i.threadInfo&&(e=Object(r.kb)(e,i.threadInfo.chatId,i.threadInfo.threadId,i.threadInfo)),Object(s.g)(e);const l=Object(o.k)(e,n,c);if(Object(o.a)(e,n,i)){if(i.isOutgoing&&(!i.content||!i.content.action)){const a=Object(o.y)(e);a&&t.focusMessage({chatId:n,threadId:a.threadId,messageId:i.id,noHighlight:!0})}const{threadInfo:a}=Object(o.Bb)(e,n,i)||{};a&&t.requestThreadInfoUpdate({chatId:n,threadId:a.threadId}),Object(m.tb)(i)||setTimeout(()=>{Object(s.g)(W(Object(s.e)(),n,l))},350)}else Object(s.g)(W(Object(s.e)(),n,l));Object(o.M)(e,n)||t.loadTopChats();break}case"newScheduledMessage":{const{chatId:t,id:n,message:c}=a;e=V(e,t,n,c,!0);const l=Object(o.ob)(e,t)||[];e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"scheduledIds",Object(d.o)([...l,n])),Object(s.g)(e);break}case"updateMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.k)(e,t,n))return;e=V(e,t,n,c);const i=Object(o.k)(e,t,n);c.threadInfo&&(e=Object(r.kb)(e,c.threadInfo.chatId,c.threadInfo.threadId,c.threadInfo)),e=W(e,t,i),Object(s.g)(e);break}case"updateScheduledMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.pb)(e,t,n))return;e=V(e,t,n,c,!0);const l=Object.keys(Object(o.qb)(e,t)||{}).map(Number).sort((e,t)=>t-e);e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"scheduledIds",l),Object(s.g)(e);break}case"updateMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a;e=$(e,c);const i=Object(o.k)(e,t,n);e=Object(r.j)(e,t,[n]),c.isScheduled&&(e=Object(r.k)(e,t,[n])),e=Object(r.L)(e,t,c.id,{...i,...c,previousLocalId:n});const l=Object(o.k)(e,t,c.id);e=W(e,t,l),Object(s.g)(e);break}case"updateScheduledMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a,l=Object(o.ob)(e,t)||[];e=Object(r.x)(e,t,i.MAIN_THREAD_ID,"scheduledIds",[...l,c.id]);const d=Object(o.pb)(e,t,n);e=Object(r.k)(e,t,[n]),e=Object(r.eb)(e,t,c.id,{...d,...c,previousLocalId:n}),Object(s.g)(e);break}case"updatePinnedIds":{const{chatId:t,isPinned:n,messageIds:c}=a,l=Object(o.jb)(e,t)||[],d=n?[...l,...c].sort((e,t)=>t-e):l.filter(e=>!c.includes(e));Object(s.g)(Object(r.x)(e,t,i.MAIN_THREAD_ID,"pinnedIds",d));break}case"updateThreadInfo":{const{chatId:t,threadId:n,threadInfo:c,firstMessageId:i}=a,l={...Object(o.Cb)(e,t,n),...c};if(!l.threadId)return;e=Object(r.kb)(e,t,n,l),i&&(e=Object(r.x)(e,t,n,"firstMessageId",i)),Object(s.g)(e);break}case"resetMessages":{const{id:n}=a,c=Object(o.m)(e,n);c&&!Object(m.mb)(n)&&(e=Object(r.j)(e,n,Object.keys(c).map(Number)),Object(s.g)(e),t.loadFullChat({chatId:n,force:!0}));break}case"deleteMessages":{const{ids:s,chatId:n}=a;K(n,s,t,e);break}case"deleteScheduledMessages":{const{ids:t,chatId:n}=a;!function(e,t,a,n){if(!e)return;t.forEach(t=>{n=Object(r.eb)(n,e,t,{isDeleting:!0})}),Object(s.g)(n),setTimeout(()=>{n=Object(r.k)(Object(s.e)(),e,t);const a=Object(o.qb)(n,e);n=Object(r.x)(n,e,i.MAIN_THREAD_ID,"scheduledIds",Object.keys(a||{}).map(Number)),Object(s.g)(n)},350)}(n,t,0,e);break}case"deleteHistory":{const{chatId:s}=a;K(s,Object.keys(e.messages.byChatId[s].byId).map(Number),t,e);break}case"updateCommonBoxMessages":{const{ids:t,messageUpdate:n}=a;t.forEach(t=>{const a=Object(o.p)(e,t);a&&(e=Object(r.L)(e,a,t,n))}),Object(s.g)(e);break}case"updateChannelMessages":{const{channelId:t,ids:n,messageUpdate:c}=a;n.forEach(a=>{e=Object(r.L)(e,t,a,c)}),Object(s.g)(e);break}case"updateMessagePoll":{const{pollId:t,pollUpdate:n}=a,c=Object(o.l)(e,t);if(c&&c.content.poll){const t={...c.content.poll,...n},{results:a}=t.results||{};if(a&&!a.some(e=>e.isChosen)){const{results:e}=c.content.poll.results,s=e&&e.filter(e=>e.isChosen);s&&s.forEach(e=>{const s=a.findIndex(t=>t.option===e.option);s>=0&&(t.results.results[s].isChosen=!0)})}Object(s.g)(Object(r.L)(e,c.chatId,c.id,{content:{...c.content,poll:t}}))}break}case"updateMessagePollVote":{const{pollId:t,userId:n,options:c}=a,i=Object(o.l)(e,t);if(!i||!i.content.poll||!i.content.poll.results)break;const{poll:l}=i.content,{recentVoterIds:d,totalVoters:b,results:u}=l.results,m=d?[...d]:[],h=b?b+1:1,O=u?[...u]:[];m.push(n),c.forEach(t=>{const a=O.find(e=>e.option===t),s=O.findIndex(e=>e.option===t),c=a?{...a}:{option:t,votersCount:0};c.votersCount+=1,n===e.currentUserId&&(c.isChosen=!0),s?O[s]=c:O.push(c)}),Object(s.g)(Object(r.L)(e,i.chatId,i.id,{content:{...i.content,poll:{...l,results:{...l.results,recentVoterIds:m,totalVoters:h,results:O}}}}));break}}});const Q=Object(g.g)((function(){let e=Object(s.e)();Y.forEach(([t,a])=>{e=Object(r.nb)(e,t,{status:a})}),Object(s.g)(e),Y=[]}),3e3,!0);let Y=[];Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"deleteUser":return Object(r.l)(e,a.id);case"updateUser":return Object(r.nb)(e,a.id,a.user);case"updateUserStatus":return s=a.userId,n=a.status,Y.push([s,n]),void Q();case"updateUserFullInfo":{const{id:t,fullInfo:s}=a,n=e.users.byId[t];if(!n)return;return Object(r.nb)(e,t,{fullInfo:{...n.fullInfo,...s}})}}var s,n}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateStickerSet":return Object(r.hb)(e,a.id,a.stickerSet)}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updatePeerBlocked":return a.isBlocked?Object(r.a)(Object(s.e)(),a.id):Object(r.p)(Object(s.e)(),a.id);case"updateResetContactList":Object(s.g)({...Object(s.e)(),contactList:{hash:0,userIds:[]}});break;case"updateFavoriteStickers":t.loadFavoriteStickers();break;case"updatePrivacy":e.settings.privacy[a.key]=a.rules}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateNotifySettings":return Object(r.cb)(e,a.peerType,a.isSilent,a.shouldShowPreviews);case"updateNotifyExceptions":{const{id:t,isMuted:n,isSilent:c,shouldShowPreviews:o}=a;e.chats.byId[t]&&(e=Object(r.H)(e,t,{isMuted:n})),Object(s.g)(Object(r.e)(e,t,{isMuted:n,isSilent:c,shouldShowPreviews:o}));break}}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateTwoFaStateWaitCode":return{...e,twoFaSettings:{...e.twoFaSettings,isLoading:!1,waitingEmailCodeLength:a.length}};case"updateTwoFaError":return{...e,twoFaSettings:{...e.twoFaSettings,error:a.message}}}});var J=a(48),X=a(8),Z=a(35),ee=a(131),te=a(47),ae=a(111),se=a(77),ne=a(25),ce=a(62),re=a(42),oe=a(32),ie=a(154),le=a(141);a(198);var de=Object(c.h)(({id:e,name:t,value:a,label:s,checked:n=!1,disabled:r,inactive:o,noAnimation:i,onChange:l,onCheck:d})=>{const b=Object(c.m)(e=>{l&&l(e),d&&d(e.currentTarget.checked)},[l,d]),u=Object(X.a)("Switcher",r&&"disabled",o&&"inactive",i&&"no-animation");return c.a.createElement("label",{className:u,title:s},c.a.createElement("input",{type:"checkbox",id:e,name:t,value:a,checked:n,disabled:r,onChange:b}),c.a.createElement("span",{className:"widget"}))});a(199);const be=[0,1,2];var ue=Object(c.h)(Object(s.h)(e=>{const{query:t,fetchingStatus:a,chatId:s,date:n}=e.globalSearch,{currentUserId:c}=e,{byId:r}=e.chats,{theme:o,animationLevel:i}=e.settings.byKey;return{searchQuery:t,isLoading:!!a&&Boolean(a.chats||a.messages),currentUserId:c,chatsById:r,globalSearchChatId:s,searchDate:n,theme:o,animationLevel:i}},(e,t)=>Object(d.l)(t,["openChat","openTipsChat","setGlobalSearchDate","setGlobalSearchChatId","setSettingOption"]))(({content:e,contactsFilter:t,onSearchQuery:a,onSelectSettings:s,onSelectContacts:r,onSelectArchived:o,setGlobalSearchChatId:i,onReset:d,searchQuery:b,isLoading:u,currentUserId:O,globalSearchChatId:j,searchDate:g,theme:f,animationLevel:p,chatsById:I,openChat:v,openTipsChat:y,setGlobalSearchDate:C,setSettingOption:E})=>{const w=Object(ne.a)(),M=e===l.d.ChatList,S={date:void 0},k={id:void 0},N=Object(c.p)(()=>g?Object(x.a)(new Date(1e3*g)):void 0,[g]),P=Object(c.p)(()=>M&&I?Object.values(I).reduce((e,t)=>Object(m.ib)(t)&&t.unreadCount?e+1:e,0):0,[M,I]),T=Object(c.p)(()=>({onTrigger:e,isOpen:t})=>c.a.createElement(oe.a,{round:!0,ripple:M&&!h.g,size:"smaller",color:"translucent",className:t?"active":"",onClick:M?e:()=>d(),ariaLabel:M?w("AccDescrOpenMenu2"):"Return to chat list"},c.a.createElement("div",{className:Object(X.a)("animated-menu-icon",!M&&"state-back")})),[M,w,d]),A=Object(c.m)(()=>{b||a("")},[b,a]),R=Object(c.m)(()=>{v({id:O})},[O,v]),L=Object(c.m)(e=>{e.stopPropagation();const t="light"===f?"dark":"light";E({theme:t}),Object(se.a)(t,p>0)},[p,E,f]),F=Object(c.m)(e=>{e.stopPropagation();const t=0===p?2:0;be.forEach((e,a)=>{document.body.classList.toggle("animation-level-"+a,t===a)}),E({animationLevel:t})},[p,E]),D=Boolean(j)||e===l.d.GlobalSearch||e===l.d.Contacts,B=e===l.d.Contacts?w("SearchFriends"):w("Search");return c.a.createElement("div",{className:"LeftMainHeader"},c.a.createElement("div",{id:"LeftMainHeader",className:"left-header"},c.a.createElement(ce.a,{trigger:T,footer:`${n.f} alpha ${n.g}`},c.a.createElement(re.a,{icon:"saved-messages",onClick:R},w("SavedMessages")),c.a.createElement(re.a,{icon:"archive",onClick:o},c.a.createElement("span",{className:"menu-item-name"},w("ArchivedChats")),P>0&&c.a.createElement("div",{className:"archived-badge"},P)),c.a.createElement(re.a,{icon:"user",onClick:r},w("Contacts")),c.a.createElement(re.a,{icon:"settings",onClick:s},w("Settings")),c.a.createElement(re.a,{icon:"darkmode",onClick:L},c.a.createElement("span",{className:"menu-item-name"},w("lng_menu_night_mode")),c.a.createElement(de,{id:"darkmode",label:w("dark"===f?"lng_settings_disable_night_theme":"lng_settings_enable_night_theme"),checked:"dark"===f,noAnimation:!0})),c.a.createElement(re.a,{icon:"animations",onClick:F},c.a.createElement("span",{className:"menu-item-name capitalize"},w("Appearance.Animations").toLowerCase()),c.a.createElement(de,{id:"animations",label:"Toggle Animations",checked:p>0})),c.a.createElement(re.a,{icon:"help",onClick:y},w("TelegramFeatures")),c.a.createElement(re.a,{icon:"bug",href:n.x},"Report Bug"),c.a.createElement(re.a,{icon:"char-K",href:"https://web.telegram.org/k/",onClick:()=>{localStorage.setItem("kz_version",JSON.stringify("K"))}},"Switch to K Version"),c.a.createElement(re.a,{icon:"char-W",href:"https://web.telegram.org/?legacy=1"},"Switch to Old Version")),c.a.createElement(ie.a,{inputId:"telegram-search-input",parentContainerClassName:"LeftSearch",className:j||g?"with-picker-item":"",value:t||b,focused:D,isLoading:u,placeholder:B,autoComplete:"off",canClose:Boolean(j||g),onChange:a,onReset:d,onFocus:A},N&&c.a.createElement(le.a,{icon:"calendar",title:N,canClose:!0,isMinimized:Boolean(j),className:"search-date",onClick:C,clickArg:S}),j&&c.a.createElement(le.a,{chatOrUserId:j,onClick:i,canClose:!0,clickArg:k}))))})),me=a(21);a(200);var he=Object(s.h)(e=>Object(d.l)(e,["connectionState"]))(({connectionState:e})=>{const t=Object(ne.a)();return"connectionStateConnecting"===e&&c.a.createElement("div",{id:"ConnectionState",dir:t.isRtl?"rtl":void 0},c.a.createElement(me.a,{color:"black"}),c.a.createElement("div",{className:"state-text"},t("WaitingForNetwork")))}),Oe=a(132),je=a(51),ge=a(26),fe=(e,t,a)=>{const s=Object(c.q)(),n=(e=>Object(c.p)(()=>Object(g.g)(e=>e(),e),[e]))(t),r=Object(ge.a)();return Object(je.a)(()=>{let t=!0;n(()=>{s.current=e(),t||r()}),t=!1},a),s.current},pe=a(168),Ie=a(190);var ve=Object(c.h)(Object(s.h)(e=>{const{chats:{byId:t},users:{byId:a},chatFolders:{byId:s,orderedIds:n,activeChatFolder:c},currentUserId:r,lastSyncTime:i}=e;return{chatsById:t,usersById:a,chatFoldersById:s,orderedFolderIds:n,lastSyncTime:i,notifySettings:Object(o.eb)(e),notifyExceptions:Object(o.db)(e),activeChatFolder:c,currentUserId:r}},(e,t)=>Object(d.l)(t,["loadChatFolders","setActiveChatFolder","openChat"]))(({chatsById:e,usersById:t,chatFoldersById:a,notifySettings:s,notifyExceptions:n,orderedFolderIds:r,activeChatFolder:o,currentUserId:i,lastSyncTime:l,loadChatFolders:b,setActiveChatFolder:u,openChat:O})=>{const j=Object(c.q)(null),g=Object(ne.a)();Object(c.n)(()=>{l&&b()},[l,b]);const f=Object(c.p)(()=>r?r.map(e=>a[e]||{}).filter(Boolean):void 0,[a,r]),p=fe(()=>{if(!f||!f.length)return;const a=Object.keys(e).map(Number),c=f.map(c=>{const{unreadDialogsCount:r,hasActiveDialogs:o}=Object(m.p)(e,t,c,a,s,n)||{};return{id:c.id,badgeCount:r,isBadgeActive:o}});return Object(d.c)(c,"id")},3e3,[f,e,t,s,n]),I=Object(c.p)(()=>{if(f&&f.length)return[{title:g("FilterAllChats")},...f.map(e=>({title:e.title,...p&&p[e.id]}))]},[f,p,g]),v=Object(c.m)(e=>{u(e)},[u]);Object(c.n)(()=>{I&&I.length&&o>=I.length&&u(0)},[o,I,u]),Object(c.n)(()=>{if(j.current&&h.l&&I&&I.length)return Object(Oe.b)(j.current,{onSwipe:(e,t)=>{t===Oe.a.Left?u(Math.min(o+1,I.length-1)):t===Oe.a.Right&&u(Math.max(0,o-1))}})},[o,I,u]);const y=Object(c.q)();y.current=0!==o,Object(c.n)(()=>y.current?Object(te.a)(()=>{y.current&&u(0)}):void 0,[o,u]),Object(c.n)(()=>{const e=e=>{if(e.metaKey&&e.code.startsWith("Digit")&&I){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;if("0"===t)return void O({id:i});const a=Number(t)-1;if(a>I.length-1)return;u(a),e.preventDefault()}};return document.addEventListener("keydown",e,!0),()=>{document.removeEventListener("keydown",e,!0)}});const{shouldRender:C,transitionClassNames:E}=Object(Z.a)(!r,void 0,!0);function w(e){const t=Object.values(a).find(({title:e})=>e===I[o].title);return t&&0!==o?c.a.createElement(Ie.a,{folderType:"folder",folderId:t.id,noChatsText:g("FilterNoChatsToDisplay"),isActive:e}):c.a.createElement(Ie.a,{folderType:"all",isActive:e})}return c.a.createElement("div",{className:"ChatFolders"},I&&I.length?c.a.createElement(pe.a,{tabs:I,activeTab:o,onSwitchTab:v}):C?c.a.createElement("div",{className:Object(X.a)("tabs-placeholder",E)}):void 0,c.a.createElement(ae.a,{ref:j,name:g.isRtl?"slide-reversed":"slide",activeKey:o,renderCount:I?I.length:void 0},w))})),ye=a(11),Ce=a(17),Ee=a(16);var we=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"LeftSearch");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});var Me=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"ContactList");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)}),Se=a(53);a(211);let ke;var Ne=Object(c.h)(({isShown:e,onNewPrivateChat:t,onNewChannel:a,onNewGroup:s})=>{const[n,r]=Object(c.r)(!1);Object(c.n)(()=>{e||r(!1)},[e]);const o=Object(ne.a)(),i=Object(X.a)("NewChatButton",e&&"revealed",n&&"menu-is-open"),l=Object(c.m)(()=>{ke&&(clearTimeout(ke),ke=void 0)},[]),d=Object(c.m)(()=>{ke&&(clearTimeout(ke),ke=void 0),ke=window.setTimeout(()=>{r(!1)},750)},[]);return c.a.createElement("div",{className:i,onMouseEnter:l,onMouseLeave:d},c.a.createElement(oe.a,{round:!0,color:"primary",className:n?"active":"",onClick:()=>{r(!n)},ariaLabel:o(n?"Close":"NewMessageTitle"),tabIndex:-1},c.a.createElement("i",{className:"icon-new-chat-filled"}),c.a.createElement("i",{className:"icon-close"})),c.a.createElement(Se.a,{isOpen:n,positionX:"right",positionY:"bottom",autoClose:!0,onClose:()=>{r(!1)}},c.a.createElement(re.a,{icon:"channel",onClick:a},o("NewChannel")),c.a.createElement(re.a,{icon:"group",onClick:s},o("NewGroup")),c.a.createElement(re.a,{icon:"user",onClick:t},o("NewMessageTitle"))))});a(212);const Pe=Object.keys(l.d).length/2;let Te;var Ae=Object(c.h)(({content:e,searchQuery:t,searchDate:a,contactsFilter:s,onSearchQuery:n,onContentChange:r,onReset:o})=>{const[i,d]=Object(c.r)(h.l),b=Object(c.q)(!1),u=Object(c.m)(()=>{r(l.d.Settings)},[r]),m=Object(c.m)(()=>{r(l.d.Contacts)},[r]),O=Object(c.m)(()=>{r(l.d.NewChannelStep1)},[r]),j=Object(c.m)(()=>{r(l.d.NewGroupStep1)},[r]),g=Object(c.m)(()=>{r(l.d.Archived)},[r]),f=Object(c.m)(()=>{e===l.d.ChatList&&(b.current=!0,d(!0))},[e]),p=Object(c.m)(()=>{b.current=!1,Te&&(clearTimeout(Te),Te=void 0),Te=window.setTimeout(()=>{b.current||d(!1)},250)},[]);return Object(c.n)(()=>{let t;return e!==l.d.ChatList?t=window.setTimeout(()=>{d(!1)},250):(b.current||h.l)&&d(!0),()=>{t&&(clearTimeout(t),t=void 0)}},[e]),c.a.createElement("div",{id:"LeftColumn-main",onMouseEnter:h.l?void 0:f,onMouseLeave:h.l?void 0:p},c.a.createElement(ue,{content:e,contactsFilter:s,onSearchQuery:n,onSelectSettings:u,onSelectContacts:m,onSelectArchived:g,onReset:o}),c.a.createElement(he,null),c.a.createElement(ae.a,{name:"zoom-fade",renderCount:Pe,activeKey:e},n=>{switch(e){case l.d.ChatList:return c.a.createElement(ve,null);case l.d.GlobalSearch:return c.a.createElement(we,{searchQuery:t,searchDate:a,isActive:n,onReset:o});case l.d.Contacts:return c.a.createElement(Me,{filter:s});default:return}}),c.a.createElement(Ne,{isShown:i,onNewPrivateChat:m,onNewChannel:O,onNewGroup:j}))});var xe=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"Settings");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});var Re=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"NewChat");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});var Le,Fe=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"ArchivedChats");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});a(213);!function(e){e[e.Main=0]="Main",e[e.Settings=1]="Settings",e[e.Archived=2]="Archived",e[e.NewGroup=3]="NewGroup",e[e.NewChannel=4]="NewChannel"}(Le||(Le={}));const De=Object.keys(Le).length/2;var Be=Object(c.h)(Object(s.h)(e=>{const{globalSearch:{query:t,date:a},chatFolders:{activeChatFolder:s}}=e;return{searchQuery:t,searchDate:a,activeChatFolder:s}},(e,t)=>Object(d.l)(t,["setGlobalSearchQuery","setGlobalSearchChatId","resetChatCreation","setGlobalSearchDate","loadPasswordInfo","clearTwoFaError"]))(({searchQuery:e,searchDate:t,activeChatFolder:a,setGlobalSearchQuery:s,setGlobalSearchChatId:n,resetChatCreation:r,setGlobalSearchDate:o,loadPasswordInfo:i,clearTwoFaError:d})=>{const[b,u]=Object(c.r)(l.d.ChatList),[m,O]=Object(c.r)(l.m.Main),[j,g]=Object(c.r)(""),[f,p]=Object(c.r)(0);let I=Le.Main;switch(b){case l.d.Archived:I=Le.Archived;break;case l.d.Settings:I=Le.Settings;break;case l.d.NewChannelStep1:case l.d.NewChannelStep2:I=Le.NewChannel;break;case l.d.NewGroupStep1:case l.d.NewGroupStep2:I=Le.NewGroup}const v=Object(c.m)(e=>{if(b!==l.d.NewGroupStep2||e){if(b===l.d.NewGroupStep1){const e=document.getElementById("new-group-picker-search");e&&e.blur()}if(b===l.d.Settings)switch(m){case l.m.EditProfile:case l.m.Folders:case l.m.General:case l.m.Notifications:case l.m.Privacy:case l.m.Language:return void O(l.m.Main);case l.m.GeneralChatBackground:return void O(l.m.General);case l.m.GeneralChatBackgroundColor:return void O(l.m.GeneralChatBackground);case l.m.PrivacyPhoneNumber:case l.m.PrivacyLastSeen:case l.m.PrivacyProfilePhoto:case l.m.PrivacyForwarding:case l.m.PrivacyGroupChats:case l.m.PrivacyActiveSessions:case l.m.PrivacyBlockedUsers:case l.m.TwoFaDisabled:case l.m.TwoFaEnabled:case l.m.TwoFaCongratulations:return void O(l.m.Privacy);case l.m.PrivacyPhoneNumberAllowedContacts:case l.m.PrivacyPhoneNumberDeniedContacts:return void O(l.m.PrivacyPhoneNumber);case l.m.PrivacyLastSeenAllowedContacts:case l.m.PrivacyLastSeenDeniedContacts:return void O(l.m.PrivacyLastSeen);case l.m.PrivacyProfilePhotoAllowedContacts:case l.m.PrivacyProfilePhotoDeniedContacts:return void O(l.m.PrivacyProfilePhoto);case l.m.PrivacyForwardingAllowedContacts:case l.m.PrivacyForwardingDeniedContacts:return void O(l.m.PrivacyForwarding);case l.m.PrivacyGroupChatsAllowedContacts:case l.m.PrivacyGroupChatsDeniedContacts:return void O(l.m.PrivacyGroupChats);case l.m.TwoFaNewPassword:return void O(l.m.TwoFaDisabled);case l.m.TwoFaNewPasswordConfirm:return void O(l.m.TwoFaNewPassword);case l.m.TwoFaNewPasswordHint:return void O(l.m.TwoFaNewPasswordConfirm);case l.m.TwoFaNewPasswordEmail:return void O(l.m.TwoFaNewPasswordHint);case l.m.TwoFaNewPasswordEmailCode:return void O(l.m.TwoFaNewPasswordEmail);case l.m.TwoFaChangePasswordCurrent:case l.m.TwoFaTurnOff:case l.m.TwoFaRecoveryEmailCurrentPassword:return void O(l.m.TwoFaEnabled);case l.m.TwoFaChangePasswordNew:return void O(l.m.TwoFaChangePasswordCurrent);case l.m.TwoFaChangePasswordConfirm:return void O(l.m.TwoFaChangePasswordNew);case l.m.TwoFaChangePasswordHint:return void O(l.m.TwoFaChangePasswordConfirm);case l.m.TwoFaRecoveryEmail:return void O(l.m.TwoFaRecoveryEmailCurrentPassword);case l.m.TwoFaRecoveryEmailCode:return void O(l.m.TwoFaRecoveryEmail);case l.m.FoldersCreateFolder:case l.m.FoldersEditFolder:return void O(l.m.Folders)}b!==l.d.ChatList||0!==a?(u(l.d.ChatList),g(""),s({query:""}),o({date:void 0}),n({id:void 0}),r(),setTimeout(()=>{p(Date.now())},250)):u(l.d.GlobalSearch)}else u(l.d.NewGroupStep1)},[b,a,s,o,n,r,m]),y=Object(c.m)(t=>{b!==l.d.Contacts?(u(l.d.GlobalSearch),t!==e&&s({query:t})):g(t)},[b,s,e]);return Object(c.n)(()=>b!==l.d.ChatList||0===a?Object(te.a)(()=>v()):void 0,[a,b,v]),Object(c.n)(()=>{d(),m===l.m.Privacy&&i()},[d,i,m]),c.a.createElement(ae.a,{id:"LeftColumn",name:h.g?"slide-layers":"push-slide",renderCount:De,activeKey:I},a=>{switch(I){case Le.Archived:return c.a.createElement(Fe,{isActive:a,onReset:v});case Le.Settings:return c.a.createElement(xe,{currentScreen:m,onScreenSelect:O,onReset:v});case Le.NewChannel:return c.a.createElement(Re,{key:f,isChannel:!0,content:b,onContentChange:u,onReset:v});case Le.NewGroup:return c.a.createElement(Re,{key:f,content:b,onContentChange:u,onReset:v});default:return c.a.createElement(Ae,{content:b,searchQuery:e,searchDate:t,contactsFilter:j,onContentChange:u,onSearchQuery:y,onReset:v})}})})),Ue=a(139),He=a(12),Ge=a(13),qe=a(56);var _e=()=>{const[e,t]=Object(c.r)(qe.a.get());return Object(c.n)(()=>{const e=Object(g.g)(()=>{t(qe.a.get())},250,!1);return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}},[]),e},Ve=a(175);function $e(e,t){const a=e<=n.db?16:32,s=function(e){if(e>n.ab){const t=Math.min(Math.max(.25*e,288),424),a=Math.min(.25*e,424);return Math.min(e-t-a,728)}if(e>n.Z){const t=Math.min(Math.max(.4*e,288),424);return Math.min(e-t,728)}if(e>728)return 728;return e}(e),c=e<=n.db?54:64,r=t?s-a-c:s-a,o=e>n.db?Math.min(s-a,512):s-a,i=o/r,l=r/o;return{composerHiddenScale:i,toolbarHiddenScale:l,composerTranslateX:t?c/2*l:0,toolbarTranslateX:t?c/2*-1*i:0,unpinHiddenScale:o/258,toolbarForUnpinHiddenScale:258/o}}var We=a(134),ze=a(144),Ke=a(135),Qe=a(49),Ye=a(109),Je=a(123);var Xe=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"HeaderMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var Ze=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=Boolean(n&&Object(m.kb)(n));if(n&&n.isRestricted)return{noMenu:!0};const r=Object(o.P)(e,t),l="thread"===s&&a===i.MAIN_THREAD_ID,d="thread"===s&&a!==i.MAIN_THREAD_ID,b=Object(o.W)(e),u=Boolean(Object(o.L)(e,t)),O=Boolean(l&&n&&(c||Object(m.ob)(n))&&n.isNotJoined),j=l||d,g=l&&!r&&!O,f=!Object(o.S)(e),p=l&&!O;return{noMenu:!(h.g&&O||h.g&&j||g||f||p),isChannel:c,isRightColumnShown:b,canStartBot:u,canSubscribe:O,canSearch:j,canMute:g,canSelect:f,canLeave:p}},(e,t)=>Object(d.l)(t,["joinChannel","sendBotCommand","openLocalTextSearch"]))(({chatId:e,threadId:t,noMenu:a,isChannel:s,canStartBot:n,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,isRightColumnShown:b,joinChannel:u,sendBotCommand:m,openLocalTextSearch:O})=>{const j=Object(c.q)(null),[g,f]=Object(c.r)(!1),[p,I]=Object(c.r)(void 0),v=Object(c.m)(()=>{f(!0);const e=j.current.getBoundingClientRect();I({x:e.right,y:e.bottom})},[]),y=Object(c.m)(()=>{f(!1)},[]),C=Object(c.m)(()=>{I(void 0)},[]),E=Object(c.m)(()=>{u({chatId:e})},[u,e]),w=Object(c.m)(()=>{m({command:"/start"})},[m]),M=Object(c.m)(()=>{if(O(),h.g){document.querySelector("#MobileSearch input").focus()}else setTimeout(()=>{const e=document.querySelector(".RightHeader .SearchInput input");e&&e.focus()},400)},[O]),S=Object(ne.a)();return c.a.createElement("div",{className:"HeaderActions"},!h.g&&r&&c.a.createElement(oe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:E},S(s?"Subscribe":"Join Group")),!h.g&&n&&c.a.createElement(oe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:w},S("Start")),!h.g&&o&&c.a.createElement(oe.a,{round:!0,ripple:b,color:"translucent",size:"smaller",onClick:M,ariaLabel:"Search in this chat"},c.a.createElement("i",{className:"icon-search"})),(h.g||!r)&&c.a.createElement(oe.a,{ref:j,className:g?"active":"",round:!0,ripple:!h.g,size:"smaller",color:"translucent",disabled:a,ariaLabel:"More actions",onClick:v},c.a.createElement("i",{className:"icon-more"})),p&&c.a.createElement(Xe,{chatId:e,threadId:t,isOpen:g,anchor:p,isChannel:s,canSubscribe:r,canSearch:o,canMute:i,canSelect:l,canLeave:d,onSubscribeChannel:E,onSearchClick:M,onClose:y,onCloseAnimationEnd:C}))})),et=a(115),tt=a(23),at=a(108),st=a(44);function nt(e){const t=e&&Object(m.F)(e),{sticker:a}=e&&e.content||{},s=t&&a&&!Object(h.p)()&&t.includes("image/webp"),[r,o]=Object(c.r)(st.a),i=e&&e.id;return Object(c.o)(()=>{s&&Object(st.c)("b64-"+i,t).then(o).catch(e=>{n.p&&console.error(e)})},[i,s,t]),s?r:t}var ct=a(117),rt=a(43),ot=a(34);function it(e,t,a,s,n){return`M${e},${t+n}a${n},${n},0,0,1,\n ${a},0v${s-2*n}a${n},${n},0,0,1,${-a},0Z`}var lt=Object(c.h)(({count:e,index:t})=>{const a=Object(c.q)(null),s=Object(c.p)(()=>function(e,t){const a=e-t-1,s=function(e){let t=8;1===e?t=36:2===e?t=17:3===e?t=11:(4===e||e>3)&&(t=7.5);return t}(e),n=function(e,t){let a=36;1===e?a=36:2===e?a=17:3===e?a=1===t?12:11:(4===e||e>3)&&(a=7.5);return a}(e,a),c=function(e,t){return e<=3?36:t*e+2*(e-1)}(e,s),r="clipPath"+e,o=function(e,t,a){let s="";if(3===a)s=it(0,0,2,t,1)+it(0,12,2,t+1,1)+it(0,25,2,t,1);else for(let e=0;e\n \n `}(r,s,e),i=function(e,t,a){if(1===a)return 0;if(2===a)return 0===e?0:t+2;return 3===a?0===e?0:1===e?12:25:(t+2)*e}(a,s,e),l=function(e,t,a,s){if(t<=4)return 0;if(e<=1)return 0;if(e>=t-2)return s-36;return(a+4)/2+(e-2)*(a+2)}(a,e,s,c);return{markHeight:n,clipPath:o,markTranslateY:i,trackTranslateY:l,trackHeight:c,clipPathId:r}}(e,t),[e,t]);if(Object(c.n)(()=>{if(!a.current)return;const{trackHeight:e,trackTranslateY:t,markHeight:n,markTranslateY:c,clipPathId:r,clipPath:o}=s,i=a.current.firstElementChild;if(a&&a.current){const s=a.current,{style:l}=s;l.height=e+"px",l.transform=`translateY(-${t}px)`,l.clipPath=`url("#${r}")`;const d=s.querySelector("svg"),b=s.querySelector("div"),u=s.querySelector("defs");d||i&&(i.innerHTML=` ${o} `),u&&(u.innerHTML=o),b&&(b.style.height=n+"px",b.style.transform=`translateY(${c}px)`)}},[s]),1===e)return c.a.createElement("div",{className:"pinned-message-border"},c.a.createElement("div",{className:"pinned-message-border-wrapper-1",ref:a}));const{trackHeight:n,trackTranslateY:r,markHeight:o,markTranslateY:i,clipPathId:l}=s;return c.a.createElement("div",{className:Object(X.a)("pinned-message-border",e>4&&"pinned-message-border-mask")},c.a.createElement("div",{className:"pinned-message-border-wrapper",ref:a,style:`clip-path: url("#${l}"); width: 2px;\n height: ${n}px; transform: translateY(-${r}px);`},c.a.createElement("span",null),c.a.createElement("div",{className:"pinned-message-border-mark",style:`height: ${o}px; transform: translateY(${i}px);`})))});var dt=Object(c.h)(({message:e,count:t,index:a,customTitle:s,className:n,onUnpinMessage:r,onClick:o,onAllPinnedClick:i})=>{const l=Object(ne.a)(),d=nt(e),b=Object(at.a)(Object(m.E)(e,"pictogram")),u=Object(m.O)(l,e,Boolean(d)),[h,O,j]=Object(ot.a)(),g=Object(c.m)(()=>{j(),r&&r(e.id)},[j,r,e.id]);return c.a.createElement("div",{className:Object(X.a)("HeaderPinnedMessage-wrapper",n)},t>1&&c.a.createElement(oe.a,{round:!0,size:"smaller",color:"translucent",className:"pin-list-button",ariaLabel:l("EventLogFilterPinnedMessages"),onClick:i},c.a.createElement("i",{className:"icon-pin-list"})),r&&c.a.createElement(oe.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:l("UnpinMessageAlertTitle"),className:"unpin-button",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(ct.a,{isOpen:h,onClose:j,text:"Would you like to unpin this message?",confirmLabel:"Unpin",confirmHandler:g}),c.a.createElement("div",{className:"HeaderPinnedMessage",onClick:o,dir:l.isRtl?"rtl":void 0},c.a.createElement(lt,{count:t,index:a}),d&&function(e,t){const{width:a,height:s}=Object(et.k)();return c.a.createElement("img",{src:t||e,width:a,height:s,alt:""})}(d,b),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"title",dir:"auto"},s||`${l("PinnedMessage")} ${a>0?"#"+(t-a):""}`),c.a.createElement("p",{dir:"auto"},Object(tt.a)(u))),c.a.createElement(rt.a,null)))}),bt=a(54),ut=a(176);a(216);var mt=Object(s.h)((e,{message:t})=>({sender:Object(o.tb)(e,t)}),(e,t)=>Object(d.l)(t,["focusMessage","closeAudioPlayer"]))(({message:e,className:t,noUi:a,sender:s,focusMessage:n,closeAudioPlayer:r})=>{const o=Object(ne.a)(),i=s?Object(m.W)(o,s):void 0,l=bt.c(Object(m.E)(e,"inline")),{playPause:d,isPlaying:b}=Object(ut.a)(Object(m.B)(e),Object(m.r)(e),l,void 0,void 0,!0),u=Object(c.m)(()=>{n({chatId:e.chatId,messageId:e.id})},[n,e.chatId,e.id]),O=Object(c.m)(()=>{b&&d(),r()},[r,b,d]);if(a)return;const j=Object(m.u)(e);return c.a.createElement("div",{className:Object(X.a)("AudioPlayer",t),dir:o.isRtl?"rtl":void 0},c.a.createElement(oe.a,{round:!0,ripple:!h.g,color:"translucent",size:"smaller",className:Object(X.a)("toggle-play",b?"pause":"play"),onClick:d,ariaLabel:b?"Pause audio":"Play audio"},c.a.createElement("i",{className:"icon-play"}),c.a.createElement("i",{className:"icon-pause"})),c.a.createElement("div",{className:"AudioPlayer-content",onClick:u},j?function(e){const{title:t,performer:a,fileName:s}=e;return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title",dir:"auto"},Object(tt.a)(t||s)),a&&c.a.createElement("div",{className:"subtitle",dir:"auto"},Object(tt.a)(a)))}(j):function(e,t){return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title",dir:"auto"},t&&Object(tt.a)(t)),c.a.createElement("div",{className:"subtitle",dir:"auto"},e))}(o("AttachAudio"),i),c.a.createElement(rt.a,null)),c.a.createElement(oe.a,{round:!0,className:"player-close",color:"translucent",size:"smaller",onClick:O,ariaLabel:"Close player"},c.a.createElement("i",{className:"icon-close"})))});a(217);var ht=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const{isLeftColumnShown:n,lastSyncTime:c}=e,{byId:r}=e.chats,l=Object(o.f)(e,t),{typingStatus:d}=l||{},{chatId:b,messageId:u}=e.audioPlayer,m=b&&u?Object(o.k)(e,b,u):void 0,h=Object(o.Db)(e,t,a);let O;if("pinned"===s){const a=Object(o.jb)(e,t);O=a&&a.length}else if("scheduled"===s){const a=Object(o.ob)(e,t);O=a&&a.length}else if("thread"===s&&a!==i.MAIN_THREAD_ID){const s=Object(o.Cb)(e,t,a);s&&(O=s.messagesCount)}const j={typingStatus:d,isLeftColumnShown:n,isRightColumnShown:Object(o.W)(e),isSelectModeActive:Object(o.S)(e),audioMessage:m,chat:l,chatsById:r,originChatId:h?h.id:t,messagesCount:O,isChatWithSelf:Object(o.P)(e,t),isChatWithBot:l&&Object(o.O)(e,l),lastSyncTime:c,notifySettings:Object(o.eb)(e),notifyExceptions:Object(o.db)(e)},g=Object(o.m)(e,t);if("thread"!==s||!g)return j;if(Object.assign(j,{messagesById:g}),a!==i.MAIN_THREAD_ID){const s=Object(o.Eb)(e,t,a),n=s?Object(o.k)(e,t,s):void 0,c=n?Object(o.K)(e,n):void 0;return{...j,pinnedMessageIds:s,canUnpin:!1,topMessageSender:c}}const f=Object(o.jb)(e,t);if(f&&f.length){const t=g[f[0]],{canUnpin:s}=t&&Object(o.b)(e,t,a)||{};return{...j,pinnedMessageIds:f,canUnpin:s}}return j},(e,t)=>Object(d.l)(t,["openChatWithInfo","pinMessage","focusMessage","openChat","loadPinnedMessages","toggleLeftColumn","exitMessageSelectMode"]))(({chatId:e,threadId:t,messageListType:a,pinnedMessageIds:s,messagesById:r,canUnpin:o,topMessageSender:l,typingStatus:d,isSelectModeActive:b,isLeftColumnShown:u,isRightColumnShown:O,audioMessage:j,chat:g,chatsById:f,originChatId:p,messagesCount:I,isChatWithSelf:v,isChatWithBot:y,lastSyncTime:C,notifySettings:E,notifyExceptions:w,openChatWithInfo:M,pinMessage:S,focusMessage:k,openChat:N,loadPinnedMessages:P,toggleLeftColumn:T,exitMessageSelectMode:A})=>{const x=Object(ne.a)(),[R,L]=Object(c.r)(0),F=Array.isArray(s)?s[R]:s,D=r&&F?r[F]:void 0,B=Array.isArray(s)?s.length:s?1:0,U=g&&Object(m.l)(x,g).length,H=l?Object(m.W)(x,l):void 0;Object(c.n)(()=>{t===i.MAIN_THREAD_ID&&C&&P({chatId:e})},[e,P,C,t]),Object(c.n)(()=>{L(0)},[s]),Object(ze.a)(e,F,D);const{width:G}=_e(),q=G<=n.Z,_=G>=n.db&&u,V=Object(c.q)(null),$=Object(c.q)(!0),W=Object(c.m)(()=>{M({id:e})},[M,e]),z=Object(c.m)(t=>{S({chatId:e,messageId:t,isUnpin:!0})},[S,e]),K=Object(c.m)(()=>{if(D){k({chatId:D.chatId,threadId:t,messageId:D.id});const e=Object(We.a)(B,R+1);L(e)}},[D,k,t,B,R]),Q=Object(c.m)(()=>{N({id:e,threadId:i.MAIN_THREAD_ID,type:"pinned"})},[N,e]),Y=Object(c.m)(()=>{if(h.g){const e=document.getElementById(n.v);e&&e.blur()}t!==i.MAIN_THREAD_ID||"thread"!==a?("scheduled"===a&&b&&A(),N({id:p,threadId:i.MAIN_THREAD_ID})):h.g?N({id:void 0}):T()},[N,p,t,a,T,b,A]),J=Object(c.p)(()=>{if(!q||!f)return;let e=!1;const t=Object.values(f).reduce((t,a)=>{if(Object(m.ib)(a))return t;const s=a.unreadCount||0;return!s||Object(m.Db)(a,E,w)&&!a.unreadMentionsCount||(e=!0),t+s},0);return t?{isActive:e,totalCount:t}:void 0},[q,f,E,w]),ee=G>=n.Z&&Gn.db&&G30),te=ee||G>n.ab&&G{const e=V.current;if(e)return te&&ue?void(O||ee?($.current&&(e.classList.add("tools-stacked","animated"),$.current=!1),setTimeout(()=>{e.classList.remove("animated")},350)):(e.classList.remove("tools-stacked"),$.current=!0)):(e.classList.remove("tools-stacked","animated"),void($.current=!0))},[te,ue,ee,O]),c.a.createElement("div",{className:"MiddleHeader",ref:V},c.a.createElement(ae.a,{name:"slide-fade",activeKey:"thread"===a?t:1},me),c.a.createElement("div",{className:"header-tools"},ie&&de&&!se&&c.a.createElement(dt,{key:e,message:de,count:B,index:R,customTitle:be,className:le,onUnpinMessage:o?z:void 0,onClick:K,onAllPinnedClick:Q}),se&&re&&c.a.createElement(mt,{key:Object(m.B)(re),message:re,className:ce}),c.a.createElement(Ze,{chatId:e,threadId:t,messageListType:a})))})),Ot=a(159);function jt(e){return"albumId"in e}function gt(e,t){let a,s=[],n={originalDate:e[0].date,datetime:Number(Object(x.j)(1e3*e[0].date)),senderGroups:[s]};const c=[n];return e.forEach((r,o)=>{r.isInAlbum?a?(a.messages.push(r),r.content.text&&(a.mainMessage=r)):a={albumId:r.groupedId,messages:[r],mainMessage:r}:s.push(r);const i=e[o+1];if(!a||i&&i.groupedId&&i.groupedId===a.albumId||(s.push(a),a=void 0),i){const e=Number(Object(x.j)(1e3*i.date));n.datetime!==e?(n={originalDate:i.date,datetime:e,senderGroups:[]},c.push(n),s=[],n.senderGroups.push(s)):(i.id===t||r.senderId!==i.senderId||r.isOutgoing!==i.isOutgoing||Object(m.eb)(r)||Object(m.eb)(i)||r.forwardInfo&&i.forwardInfo&&(r.forwardInfo.senderUserId!==i.forwardInfo.senderUserId||r.forwardInfo.fromChatId!==i.forwardInfo.fromChatId||r.forwardInfo.hiddenUserName!==i.forwardInfo.hiddenUserName)||r.inlineButtons||i.inlineButtons)&&(s=[],n.senderGroups.push(s))}}),c}var ft=a(107);function pt(){const[e,t]=Object(ot.a)(!1),a=(s=1e3,n=!1,Object(c.p)(()=>Object(g.a)(e=>e(),s,n,r),[s,n,r]));var s,n,r;return{isScrolled:e,updateStickyDates:Object(c.m)((e,s)=>{t(),document.body.classList.contains("is-scrolling-messages")||Object(g.b)(()=>{document.body.classList.add("is-scrolling-messages")}),a(()=>{Object(g.b)(()=>{const t=document.querySelector(".stuck");t&&t.classList.remove("stuck");const a=function(e,t){const a=e.querySelectorAll(".sticky-date"),s=e.scrollTop;return Array.from(a).find(e=>{const{offsetTop:a,offsetHeight:n}=e,c=a-s;return-n<=c&&c<=(t?60:10)})}(e,s);a&&a.classList.add("stuck"),document.body.classList.remove("is-scrolling-messages")})})},[t,a])}}var It=a(155),vt=a(124);let yt=!1;var Ct=({containerRef:e,className:t,messageIds:a,focusingId:s,loadMoreForwards:r,loadMoreBackwards:o,isViewportNewest:i,firstUnreadId:l,onFabToggle:d,onNotchToggle:b,children:u})=>{const m=Object(c.q)(null),h=Object(c.q)(null),O=Object(c.q)(null),j=Object(c.m)(()=>{if(yt)return;if(!a||!a.length)return d(!1),void b(!1);if(!i)return d(!0),void b(!0);const{offsetHeight:t,scrollHeight:s,scrollTop:n}=e.current,c=s-n-t,r=c<=0;d(l?!r:!(c<=50)),b(!r)},[a,i,e,d,l,b]),{observe:g,freeze:f,unfreeze:p}=Object(ft.a)({rootRef:e,margin:n.U},t=>{if(!r||!o)return;const a=t.find(({isIntersecting:e})=>e);if(!a)return;const{target:s}=a;"backwards-trigger"===s.className?(Object(It.a)(e.current),o()):"forwards-trigger"===s.className&&(Object(It.a)(e.current),r())});Object(ft.c)(m,g),Object(ft.c)(h,g);const{observe:I,freeze:v,unfreeze:y}=Object(ft.a)({rootRef:e,margin:50},j);Object(ft.c)(O,I);const{observe:C}=Object(ft.a)({rootRef:e},j);return Object(ft.c)(O,C),Object(je.a)(()=>{s?(f(),v()):(y(),p())},[s]),Object(je.a)(()=>{yt=!0,setTimeout(()=>{yt=!1},100)},[a]),Object(c.n)(j,[l]),c.a.createElement("div",{className:t,teactFastList:!0},c.a.createElement("div",{ref:m,key:"backwards-trigger",className:"backwards-trigger"}),u,c.a.createElement("div",{ref:h,key:"forwards-trigger",className:"forwards-trigger"}),c.a.createElement("div",{ref:O,key:"fab-trigger",className:"fab-trigger"}))},Et=a(145),wt=a(146);function Mt(e){return"number"==typeof e}function St(e,t){return e?t?238:175:100}function kt(e){const t=Object(m.ub)(e),a=Object(m.rb)(e),s=Object(m.H)(e)||Object(m.S)(e),n=Object(m.Q)(e),c=Boolean(Object(m.S)(e)),{width:r,height:o}=s?Object(et.f)(s,t,a,c):Object(et.h)(n,t,a),i=St(Boolean(Object(m.P)(e)));let l=1;re+t,t)}function Lt(e,t,a){return ea?a:e}function Ft(e){const t={width:0,height:0};return e.forEach(({dimensions:e,sides:a})=>{a&Tt&&(t.width=e.width+e.x),a&At&&(t.height=e.height+e.y)}),t}function Dt(e,t,a,s){const c=a.messages.map(e=>{const t=kt(e);return t.width/t.height});const r=function(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}(c),o=function(e){return e.reduce((e,t)=>t+e,1)/e.length}(c),i=c.length,l=c.some(e=>e>2),d=function(e,t,a){return a<=n.db?a/100*69-(t?1.625:0)*et.c:((e?30:29)-(t?1.625:0))*et.c}(e,t,s);let b;const u={ratios:c,proportions:r,averageRatio:o,maxWidth:d,minWidth:100,maxHeight:d,spacing:2};return b=i>=5||l?function({ratios:e,averageRatio:t,maxWidth:a,minWidth:s,spacing:n,maxHeight:c=4*a/3}){const r=function(e,t){return e.map(e=>t>1.1?Lt(e,1,2.75):Lt(e,.6667,1))}(e,t),o=e.length,i=new Array(o),l=[],d=e=>{const t=[];let s=0;e.forEach(e=>{t.push(((e,t)=>{const s=Rt(r.slice(e,e+t),0);return(a-(t-1)*n)/s})(s,e)),s+=e}),l.push({lineCounts:e,heights:t})};for(let e=1;e!==o;++e){const t=o-e;e<=3&&t<=3&&d([e,t])}for(let e=1;e!==o-1;++e)for(let a=1;a!==o-e;++a){const s=o-e-a;e<=3&&a<=(t<.85?4:3)&&s<=3&&d([e,a,s])}for(let e=1;e!==o-1;++e)for(let t=1;t!==o-e;++t)for(let a=1;a!==o-e-t;++a){const s=o-e-t-a;e<=3&&t<=3&&a<=3&&s<=4&&d([e,t,a,s])}let b,u=0;for(let e=0;e{for(let e=1;e!==r;++e)if(a[e-1]>a[e])return 1.5;return 1})(),m=Math.abs(o-c)*i*d;(!b||m1.4&&t[1]-t[0]<.2?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=Math.round(Math.min(a/t[0],Math.min(a/t[1],(n-s)/2)));return[{dimensions:{x:0,y:0,width:a,height:c},sides:xt|Pt|Tt},{dimensions:{x:0,y:c+s,width:a,height:c},sides:xt|At|Tt}]}(e):"ww"===a||"qq"===a?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=(a-s)/2,r=Math.round(Math.min(c/t[0],Math.min(c/t[1],n)));return[{dimensions:{x:0,y:0,width:c,height:r},sides:Pt|xt|At},{dimensions:{x:c+s,y:0,width:c,height:r},sides:Pt|Tt|At}]}(e):function(e){const{ratios:t,minWidth:a,maxWidth:s,spacing:n,maxHeight:c}=e,r=Math.round(1.5*a),o=Math.min(Math.round(Math.max(.4*(s-n),(s-n)/t[0]/(1/t[0]+1/t[1]))),s-n-r),i=s-o-n,l=Math.min(c,Math.round(Math.min(i/t[0],o/t[1])));return[{dimensions:{x:0,y:0,width:i,height:l},sides:Pt|xt|At},{dimensions:{x:i+n,y:0,width:o,height:l},sides:Pt|Tt|At}]}(e)}(u):3===i?function(e){const{proportions:t}=e;return"n"===t[0]?function(e){const{maxHeight:t,spacing:a,ratios:s,maxWidth:n,minWidth:c}=e,r=t,o=Math.round(Math.min((t-a)/2,s[1]*(n-a)/(s[2]+s[1]))),i=r-o-a,l=Math.max(c,Math.round(Math.min((n-a)/2,Math.min(o*s[2],i*s[1])))),d=Math.min(Math.round(r*s[0]),n-a-l);return[{dimensions:{x:0,y:0,width:d,height:r},sides:Pt|xt|At},{dimensions:{x:d+a,y:0,width:l,height:i},sides:Pt|Tt},{dimensions:{x:d+a,y:i+a,width:l,height:o},sides:At|Tt}]}(e):function(e){const{maxWidth:t,ratios:a,maxHeight:s,spacing:n}=e,c=t,r=Math.round(Math.min(c/a[0],.66*(s-n))),o=(t-n)/2,i=Math.min(s-r-n,Math.round(Math.min(o/a[1],o/a[2])));return[{dimensions:{x:0,y:0,width:c,height:r},sides:xt|Pt|Tt},{dimensions:{x:0,y:r+n,width:o,height:i},sides:At|xt},{dimensions:{x:o+n,y:r+n,width:c-o-n,height:i},sides:At|Tt}]}(e)}(u):function(e){const{proportions:t}=e;return"w"===t[0]?function({maxWidth:e,ratios:t,spacing:a,maxHeight:s,minWidth:n}){const c=e,r=Math.round(Math.min(c/t[0],.66*(s-a))),o=Math.round((e-2*a)/(t[1]+t[2]+t[3])),i=Math.max(n,Math.round(Math.min(.4*(e-2*a),o*t[1]))),l=Math.round(Math.max(Math.max(n,.33*(e-2*a)),o*t[3])),d=c-i-l-2*a,b=Math.min(s-r-a,o);return[{dimensions:{x:0,y:0,width:c,height:r},sides:xt|Pt|Tt},{dimensions:{x:0,y:r+a,width:i,height:b},sides:At|xt},{dimensions:{x:i+a,y:r+a,width:d,height:b},sides:At},{dimensions:{x:i+a+d+a,y:r+a,width:l,height:b},sides:Tt|At}]}(e):function({maxHeight:e,ratios:t,maxWidth:a,spacing:s,minWidth:n}){const c=e,r=Math.round(Math.min(c*t[0],.6*(a-s))),o=Math.round((e-2*s)/(1/t[1]+1/t[2]+1/t[3])),i=Math.round(o/t[1]),l=Math.round(o/t[2]),d=c-i-l-2*s,b=Math.max(n,Math.min(a-r-s,o));return[{dimensions:{x:0,y:0,width:r,height:c},sides:Pt|xt|At},{dimensions:{x:r+s,y:0,width:b,height:i},sides:Pt|Tt},{dimensions:{x:r+s,y:i+s,width:b,height:l},sides:Tt},{dimensions:{x:r+s,y:i+l+2*s,width:b,height:d},sides:At|Tt}]}(e)}(u),{layout:b,containerStyle:Ft(b)}}let Bt;function Ut(e){return Bt||(Bt=document.createElement("span"),Bt.style.font='400 12px Roboto, "Helvetica Neue", "Apple Color Emoji", sans-serif',Bt.style.whiteSpace="nowrap",Bt.style.position="absolute",Bt.style.left="-999px",Bt.style.opacity=".01",document.body.appendChild(Bt)),Bt.innerHTML=e,Bt.offsetWidth}function Ht(e,t,a,s,n){Object(c.o)(()=>{if(a&&e.current){const t=e.current.closest(".MessageList");Object(vt.a)(t,e.current,n?"end":"center",20,void 0===s?1500:1e3,s)}},[e,t,a,s,n])}var Gt=a(112),qt=a(67);var _t=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"ContextMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var Vt=Object(c.h)(Object(s.h)((e,{message:t})=>{const a=t.senderId,{targetUserId:s,targetChatId:n}=t.content.action||{},c=t.replyToMessageId,r=c?Object(o.k)(e,t.chatId,c):void 0,i=Object(o.U)(e,t),{direction:l,noHighlight:d}=i&&e.focusedMessage||{},b=Object(o.f)(e,t.chatId);return{sender:b&&(Object(m.kb)(b)||a===t.chatId)?b:a?Object(o.Gb)(e,a):void 0,...s&&{targetUser:Object(o.Gb)(e,s)},targetChatId:n,targetMessage:r,isFocused:i,...i&&{focusDirection:l,noFocusHighlight:d}}})(({message:e,observeIntersection:t,isEmbedded:a,appearanceOrder:s=0,isLastInList:n,sender:r,targetUser:o,targetMessage:i,targetChatId:l,isFocused:d,focusDirection:b,noFocusHighlight:u})=>{const m=Object(c.q)(null);Object(ft.c)(m,t),Object(ze.a)(e.chatId,e.replyToMessageId,i),Ht(m,e.chatId,d,b,u);const h=Object(ne.a)(),O=s<=0,[j,g]=Object(ot.a)(O);Object(c.n)(()=>{O||setTimeout(g,10*s)},[s,g,O]);const{transitionClassNames:f}=Object(Z.a)(j,void 0,O,!1),p=Object(qt.a)(h,e,r,o,i,l,a?{isEmbedded:!0,asPlain:!0}:void 0),{isContextMenuOpen:I,contextMenuPosition:v,handleBeforeContextMenu:y,handleContextMenu:C,handleContextMenuClose:E,handleContextMenuHide:w}=Object(Et.a)(m),M=void 0!==v;if(a)return c.a.createElement("span",{className:"embedded-action-message"},Object(tt.a)(p));const S=Object(X.a)("ActionMessage message-list-item",d&&!u&&"focused",M&&"has-menu-open",n&&"last-in-list",f);return c.a.createElement("div",{ref:m,id:"message"+e.id,className:S,"data-message-id":e.id,onMouseDown:y,onContextMenu:C},c.a.createElement("span",null,p),v&&c.a.createElement(_t,{isOpen:I,anchor:v,message:e,messageListType:"thread",onClose:E,onCloseAnimationEnd:w}))}));a(218);var $t=({className:e,message:t,sender:a,title:s,customText:n,observeIntersection:r,onClick:o})=>{const i=Object(c.q)(null),l=Object(ft.b)(i,r),d=Object(at.a)(t&&Object(m.E)(t,"pictogram"),!l),b=t&&"sticker-reply-thumb"+t.id,u=nt(t),h=Boolean(t&&Object(m.J)(t)),O=Object(ne.a)(),j=a&&Object(m.W)(O,a);return c.a.createElement("div",{ref:i,className:Object(X.a)("EmbeddedMessage",e),onClick:t?o:void 0},u&&function(e,t,a,s){const{width:n,height:r}=Object(et.k)();return c.a.createElement("img",{id:e,src:a||t,width:n,height:r,alt:"",className:s?"round":""})}(b,u,d,h),c.a.createElement("div",{className:"message-text"},c.a.createElement("p",{dir:"auto"},t?Object(m.eb)(t)?c.a.createElement(Vt,{message:t,isEmbedded:!0}):Object(tt.a)(Object(m.O)(O,t,Boolean(u))):n||" "),c.a.createElement("div",{className:"message-title",dir:"auto"},Object(tt.a)(j||s||" "))))},Wt=a(160),zt=a(167),Kt=a(172);a(222);var Qt=Object(c.h)(({message:e,outgoingStatus:t,signature:a,onClick:s})=>{const n=Object(ne.a)();return c.a.createElement("span",{className:"MessageMeta",dir:n.isRtl?"rtl":"ltr",onClick:s},Boolean(e.views)&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"message-views"},Object(Qe.b)(e.views)),c.a.createElement("i",{className:"icon-channelviews"})),a&&c.a.createElement("span",{className:"message-signature"},Object(tt.a)(a)),c.a.createElement("span",{className:"message-time"},e.isEdited&&n("EditedMessage")+" ",Object(x.h)(1e3*e.date)),t&&c.a.createElement(Kt.a,{status:t}))}),Yt=a(114),Jt=a(116),Xt=a(161);a(223);var Zt=({message:e,observeIntersection:t,observeIntersectionForPlaying:a,shouldLoop:s,lastSyncTime:r})=>{const o=Object(c.q)(null),[i,l,d]=Object(ot.a)(),b=e.content.sticker,{isAnimated:u,stickerSetId:h}=b,O=h===n.S,j=Object(ft.b)(o,t),g=Object(ft.b)(o,a),f=b.isPreloadedGlobally?"sticker"+b.id:Object(m.E)(e,"inline"),p=nt(e),I=Object(at.a)(f,!j,Object(m.D)(e,"inline",!0),r),v=Boolean(I),[y,C]=Object(ot.a)(v),E=u?y:v,{shouldRenderFullMedia:w,transitionClassNames:M}=Object(Yt.a)(E,"slow"),{width:S,height:k}=Object(et.l)(b),N=Object(X.a)("thumbnail",!p&&"empty"),P=Object(X.a)("Sticker media-inner",O&&"inactive");return c.a.createElement("div",{ref:o,className:P,onClick:O?void 0:l},!E&&c.a.createElement("img",{id:"sticker-thumb-"+e.id,src:p,width:S,height:k,alt:"",className:N}),!u&&w&&c.a.createElement("img",{id:"sticker-"+e.id,src:I,width:S,height:k,alt:"",className:Object(X.a)("full-media",M)}),u&&v&&c.a.createElement(Jt.a,{key:f,className:Object(X.a)("full-media",M),id:f,animationData:I,size:S,play:g,noLoop:!s,onLoad:C}),c.a.createElement(Xt.a,{isOpen:i,fromSticker:b,onClose:d}))},ea=a(128),ta=a(120),aa=a(162);function sa(e,t){return Object(aa.a)(Object(m.F)(e),Boolean(t),h.g&&!h.c)}var na=a(38);var ca=async(e,t,a,s)=>s?"rgba(255,255,255,1)":async function(e,t){const a=new Image;a.src=e,a.width||await new Promise(e=>{a.onload=e});const s=document.createElement("canvas"),n=s.getContext("2d");s.width=a.width,s.height=a.height,n.drawImage(a,0,0,a.width,a.height);const c=t?a.width-1:0,r=a.height-1;return`rgba(${Array.from(n.getImageData(c,r,1,1).data).join(",")})`}(e,t);var ra=a(121);var oa=({id:e,message:t,observeIntersection:a,shouldAutoLoad:s,isInSelectMode:n,isSelected:r,uploadProgress:o,size:i="inline",dimensions:l,nonInteractive:d,shouldAffectAppendix:b,onClick:u,onCancelUpload:h})=>{const O=Object(c.q)(null),j=(Object(m.H)(t)||Object(m.S)(t)).blobUrl,g=Object(ft.b)(O,a),[f,p]=Object(c.r)(s),I=f&&g,{mediaData:v,downloadProgress:y}=Object(ta.a)(Object(m.E)(t,i),!I),C=j||v,E=sa(t,C),{isUploading:w,isTransferring:M,transferProgress:S}=Object(m.s)(t,o||y,I&&!C),k=!1===Object(na.a)(f),{shouldRender:N,transitionClassNames:P}=Object(Z.a)(M,void 0,k,"slow"),{shouldRenderThumb:T,shouldRenderFullMedia:A,transitionClassNames:x}=Object(Yt.a)(C,"slow"),R=Object(c.m)(()=>{w?h&&h(t):C?u&&u(t.id):p(e=>!e)},[C,w,t,h,u]),L=Object(m.ub)(t);Object(c.o)(()=>{if(!b)return;const e=O.current.closest(".message-content");C?ca(C,L,0,r).then(t=>{e.style.setProperty("--appendix-bg",t),e.setAttribute("data-has-custom-appendix","")}):e.classList.add("has-appendix-thumb")},[C,L,b,n,r]);const{width:F,height:D,isSmall:B}=l||kt(t),U=Object(X.a)("media-inner",!w&&!d&&"interactive",B&&"small-image",F===D&&"square-image"),H=l?`width: ${F}px; height: ${D}px; left: ${l.x}px; top: ${l.y}px;`:"";return c.a.createElement("div",{id:e,ref:O,className:U,style:H,onClick:w?void 0:R},T&&c.a.createElement("canvas",{ref:E,className:"thumbnail",style:`width: ${F}px; height: ${D}px`}),A&&c.a.createElement("img",{src:C,className:"full-media "+x,width:F,height:D,alt:""}),N&&c.a.createElement("div",{className:"media-loading "+P},c.a.createElement(ra.a,{progress:S,onClick:w?R:void 0})),!C&&!f&&c.a.createElement("i",{className:"icon-download"}),M&&c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*S),"%"))},ia=a(137),la=a(136);function da(e,t){const a=Object(c.q)();a.current=t;const s=Object(c.m)(()=>{e.current&&e.current.pause()},[e]),n=Object(c.m)(()=>{e.current&&a.current&&Object(la.a)(e.current)},[e]);Object(J.a)(s,n)}var ba=a(147),ua=(e,t=!1)=>{const a=Object(c.q)(!1),s=Object(c.q)(!1),n=Object(c.m)(()=>{s.current=!0,t&&e.current&&(a.current||(a.current=!e.current.paused),e.current.pause())},[t,e]),r=Object(c.m)(()=>{t&&e.current&&a.current&&document.body.contains(e.current)&&Object(la.a)(e.current),a.current=!1,s.current=!1},[t,e]),o=Object(c.m)(()=>{Object(g.b)(r)},[r]);document.hasFocus()||n(),Object(ee.a)(n,o)};function ma(){return(ma=Object.assign||function(e){for(var t=1;t{const b=Object(c.q)(null),u=Object(c.q)(null),h=t.content.video,O=h.blobUrl,j=Boolean(O)||Object(m.b)(h),g=Object(ft.b)(b,a),[f,p]=Object(c.r)(s),I=Boolean(f&&g&&o),[v,y]=Object(c.r)(n),C=Object(at.a)(Object(m.E)(t,"pictogram"),!(g&&o),Object(m.D)(t,"pictogram"),o),E=sa(t),{mediaData:w,downloadProgress:M}=Object(ta.a)(Object(m.E)(t,"inline"),!I,Object(m.D)(t,"inline"),o),S=O||w,k=Boolean(j&&g&&S),{isBuffered:N,bufferingHandlers:P}=Object(ia.a)(!s),{isUploading:T,isTransferring:A,transferProgress:R}=Object(m.s)(t,r||M,I&&j&&!N),L=!1===Object(na.a)(f),{shouldRender:F,transitionClassNames:D}=Object(Z.a)(A,void 0,L),{shouldRenderThumb:B,transitionClassNames:U}=Object(Yt.a)(S,"slow"),[H,G]=Object(c.r)(0),q=Object(c.m)(e=>{G(Math.max(0,e.currentTarget.currentTime-1))},[]),_=Object(m.ub)(t),V=Object(m.rb)(t),{width:$,height:W}=i||Object(et.h)(h,_,V);da(u,Boolean(k&&n)),ua(u,v),Object(ba.a)(u,[k]);const z=Object(c.m)(()=>{T?d&&d(t):j&&!S?p(e=>!e):j&&S&&!v?(y(!0),u.current.play()):l&&l(t.id)},[T,j,S,v,l,d,t]),K=Object(X.a)("media-inner dark",!T&&"interactive"),Q=Object(X.a)("full-media",U),Y=i?`width: ${$}px; height: ${W}px; left: ${i.x}px; top: ${i.y}px;`:"",J=k,ee=!j&&w,te=!j||f&&!v&&!F,ae=j&&!f;return c.a.createElement("div",{ref:b,id:e,className:K,style:Y,onClick:T?void 0:z},(!k||B)&&c.a.createElement("canvas",{ref:E,className:"thumbnail",style:`width: ${$}px; height: ${W}px;`}),C&&c.a.createElement("img",{src:C,className:"thumbnail",style:`width: ${$}px; height: ${W}px;`,alt:""}),J&&c.a.createElement("video",ma({ref:u,className:Q,width:$,height:W,autoPlay:v,muted:!0,loop:!0,playsInline:!0},P,{onTimeUpdate:q}),c.a.createElement("source",{src:S})),ee&&c.a.createElement("img",{src:w,className:"full-media "+U,width:$,height:W,alt:""}),te&&c.a.createElement("i",{className:"icon-large-play"}),F&&c.a.createElement("div",{className:"media-loading "+D},c.a.createElement(ra.a,{progress:R,onClick:T?z:void 0})),ae&&c.a.createElement("i",{className:"icon-download"}),A&&!j?c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*R),"%"):A&&j?c.a.createElement("span",{className:"message-upload-progress"},"..."):c.a.createElement("div",{className:"message-media-duration"},h.isGif?"GIF":Object(x.e)(h.duration-H)))},Oa=a(18);a(225);var ja=Object(s.h)((e,{contact:t})=>({user:Object(o.Gb)(e,t.userId)}),(e,t)=>Object(d.l)(t,["openUserInfo"]))(({contact:e,user:t,openUserInfo:a})=>{const{firstName:s,lastName:n,phoneNumber:r,userId:o}=e,i=Object(c.m)(()=>{a({id:o})},[a,o]);return c.a.createElement("div",{className:Object(X.a)("Contact",Boolean(o)&&"interactive"),onClick:o?i:void 0},c.a.createElement(Gt.a,{size:"large",user:t,text:s||n}),c.a.createElement("div",{className:"contact-info"},c.a.createElement("div",{className:"contact-name"},s," ",n),c.a.createElement("div",{className:"contact-phone"},Object(Oa.c)(r))))}),ga=a(46);var fa=Object(c.h)(({id:e,options:t,selected:a=[],disabled:s,round:n,loadingOptions:r,onChange:o})=>{const[i,l]=Object(c.r)([]),d=Object(c.m)(e=>{const{value:t,checked:a}=e.currentTarget;let s;s=a?[...i,t]:i.filter(e=>e!==t),l(s),o(s)},[o,i]);return c.a.createElement("div",{id:e,className:"radio-group"},t.map(e=>c.a.createElement(ga.a,{label:e.label,subLabel:e.subLabel,value:e.value,checked:-1!==a.indexOf(e.value),disabled:s,round:n,isLoading:r?-1!==r.indexOf(e.value):void 0,onChange:d})))}),pa=a(126),Ia=a(181);a(228);function va(e,t){return t>0?(e/t*100).toFixed():0}var ya=({answer:e,voteResults:t,totalVoters:a,maxVotersCount:s,correctResults:n,shouldAnimate:r})=>{const o=t&&t.find(t=>t.option===e.option),i=0===n.length||-1!==n.indexOf(e.option),l=n.length>0&&i||o&&o.isChosen,d=o?va(o.votersCount,a||0):0,[b,u]=Object(c.r)(r?0:d),m=Object(c.q)(null),h=o?va(o.votersCount,s||0):0,O=b{r&&u(d)},[r,d]),Object(c.n)(()=>{const e=m.current;if(e&&r){const t=e.firstElementChild,a=O?"":"stroke-dasharray: 100% 200%; stroke-dashoffset: -44";t?t.setAttribute("style",a):e.innerHTML=`\n \n \n `}},[O,r]),!t||!o)return;const j=`width: ${h}%; transform:scaleX(${O?0:1})`;return c.a.createElement("div",{className:"PollOption",dir:"ltr"},c.a.createElement("div",{className:"poll-option-share "+("100"===d?"limit-width":"")},d,"%",l&&c.a.createElement("span",{className:Object(X.a)("poll-option-chosen",!i&&"wrong",r&&"animate")},c.a.createElement("i",{className:i?"icon-check":"icon-close"}))),c.a.createElement("div",{className:"poll-option-right"},c.a.createElement("div",{className:"poll-option-text",dir:"auto"},Object(tt.a)(e.text)),c.a.createElement("div",{className:Object(X.a)("poll-option-answer",l&&!i&&"wrong")},c.a.createElement("div",{className:"poll-option-corner",ref:m}),c.a.createElement("div",{className:"poll-option-line",style:j}))))};a(229);var Ca=Object(c.h)(Object(s.h)((e,{poll:t})=>{const{recentVoterIds:a}=t.results,{byId:s}=e.users;return a&&0!==a.length?{recentVoterIds:a,usersById:s}:{}},(e,t)=>Object(d.l)(t,["loadMessage","openPollResults"]))(({message:e,poll:t,recentVoterIds:a,usersById:s,loadMessage:n,onSendVote:r,openPollResults:o})=>{const{id:i,chatId:l}=e,{summary:d,results:b}=t,[u,m]=Object(c.r)(!1),[h,O]=Object(c.r)([]),[j,g]=Object(c.r)(!1),[f,p]=Object(c.r)(!1),[I,v]=Object(c.r)(!d.closed&&d.closeDate&&d.closeDate>0?Math.min(d.closeDate-Math.floor(Date.now()/1e3),d.closePeriod):0),y=Object(c.q)(null),{results:C,totalVoters:E}=b,w=C&&C.some(e=>e.isChosen),M=!d.closed&&!w,S=!M&&d.isPublic&&Number(b.totalVoters)>0,k=M&&d.multipleChoice,N=C?Math.max(...C.map(e=>e.votersCount)):E,P=C?C.reduce((e,t)=>(t.isCorrect&&e.push(t.option),e),[]):[],T=d.answers.map(e=>({label:e.text,value:e.option,hidden:Boolean(d.quiz&&d.closePeriod&&I<=0)}));Object(c.n)(()=>{u&&t.results.results&&t.results.results.some(e=>e.isChosen)&&m(!1)},[u,t.results.results]),Object(c.n)(()=>{I>0&&setTimeout(()=>v(I-1),1e3);const e=y.current;if(e){const t=12*Math.PI,a=e.lastElementChild,s=e.firstElementChild;if(I<=5&&e.classList.add("hurry-up"),a&&s){const e=(d.closePeriod-I)/d.closePeriod*t;s.textContent=Object(x.e)(I),a.firstElementChild.setAttribute("stroke-dashoffset","-"+e)}else e.innerHTML=`\n ${Object(x.e)(I)}\n \n \n `}},[I,d.closePeriod]),Object(c.n)(()=>{d.quiz&&(I<=0||w&&!d.closed)&&n({chatId:l,messageId:i})},[l,I,w,n,i,d.closed,d.quiz]),Object(c.n)(()=>{let e;return d.quiz&&!d.closed&&d.closePeriod&&d.closePeriod>0&&(e=window.setTimeout(()=>{n({chatId:l,messageId:i})},1e3*d.closePeriod)),()=>{e&&window.clearTimeout(e)}},[M,l,n,i,d.closePeriod,d.closed,d.quiz]);const A=Object(c.p)(()=>a?a.reduce((e,t)=>{const a=s[t];return a&&e.push(a),e},[]):[],[s,a]),R=Object(c.m)(e=>{O([e]),m(!0),p(!0),r([e])},[r]),L=Object(c.m)(e=>{O(e)},[]),F=Object(c.m)(()=>{m(!0),p(!0),r(h)},[r,h]),D=Object(c.m)(()=>{o({chatId:l,messageId:i})},[l,i,o]),B=Object(c.m)(()=>{g(!0)},[]),U=Object(c.m)(()=>{g(!1),p(!1)},[]);Object(c.n)(()=>{if(f&&w&&d.quiz&&b.results&&t.results.solution){b.results.find(e=>e.isChosen&&e.isCorrect)||g(!0)}},[w,f,b.results,d.quiz,t.results.solution]);const H=Object(ne.a)();return c.a.createElement("div",{className:"Poll",dir:H.isRtl?"auto":"ltr"},j&&t.results.solution&&c.a.createElement(Ia.a,{message:Object(wt.b)(t.results.solution,t.results.solutionEntities),duration:5e3,onDismiss:U,containerId:"#middle-column-portals"}),c.a.createElement("div",{className:"poll-question"},Object(tt.a)(d.question)),c.a.createElement("div",{className:"poll-type"},H(function(e){if(void 0===e.isPublic)return" ";if(e.quiz)return e.isPublic?"QuizPoll":"AnonymousQuizPoll";if(e.closed)return"FinalResults";return e.isPublic?"PublicPoll":"AnonymousPoll"}(d)),A.length>0&&c.a.createElement("div",{className:"poll-recent-voters"},A.map(e=>c.a.createElement(Gt.a,{size:"micro",user:e}))),I>0&&M&&c.a.createElement("div",{ref:y,className:"poll-countdown"}),d.quiz&&t.results.solution&&!M&&c.a.createElement(oe.a,{round:!0,size:"tiny",color:"translucent",className:"poll-quiz-help",disabled:j,onClick:B,ariaLabel:"Show Solution"},c.a.createElement("i",{className:"icon-lamp"}))),M&&c.a.createElement("div",{className:"poll-answers"},k?c.a.createElement(fa,{options:T,onChange:L,disabled:e.isScheduled||u,loadingOptions:u?h:void 0,round:!0}):c.a.createElement(pa.a,{name:"poll-"+i,options:T,onChange:R,disabled:e.isScheduled||u,loadingOption:u?h[0]:void 0})),!M&&c.a.createElement("div",{className:"poll-results"},d.answers.map((function(e){return c.a.createElement(ya,{key:e.option,shouldAnimate:f,answer:e,voteResults:C,totalVoters:E,maxVotersCount:N,correctResults:P})}))),!S&&!k&&c.a.createElement("div",{className:"poll-voters-count"},function(e,t,a){if(!a)return e(t?"Chat.Quiz.TotalVotesEmpty":"Chat.Poll.TotalVotesResultEmpty");return e(t?"Answer":"Vote",a,"i")}(H,d.quiz,b.totalVoters)),k&&c.a.createElement(oe.a,{isText:!0,disabled:0===h.length,size:"tiny",onClick:F},H("PollSubmitVotes")),S&&c.a.createElement(oe.a,{isText:!0,size:"tiny",onClick:D},H("PollViewResults")))})),Ea=a(39),wa=a(57);a(230);var Ma=Object(c.h)(({message:e,observeIntersection:t,shouldAutoLoad:a,inPreview:s,onMediaClick:n,onCancelMediaTransfer:r})=>{const o=Object(m.R)(e);let i=!1;if(o&&o.photo){const{width:t,height:a}=kt(e);i=t===a}const l=Object(c.m)(()=>{n()},[n]);if(!o)return;const{siteName:d,url:b,displayUrl:u,title:h,description:O,photo:j}=o,g=j&&n&&!i&&!o.hasDocument,f=Object(Ea.a)(O,170),p=Object(X.a)("WebPage",j?i&&"with-square-photo":!s&&"without-photo");return c.a.createElement("div",{className:p,"data-initial":(d||u)[0],dir:"auto"},j&&c.a.createElement(oa,{message:e,observeIntersection:t,shouldAutoLoad:a,size:i?"pictogram":"inline",nonInteractive:!g,onClick:g?l:void 0,onCancelUpload:r}),c.a.createElement("div",{className:"WebPage-text"},c.a.createElement(wa.a,{className:"site-name",url:b,text:d||u}),!s&&h&&c.a.createElement("p",{className:"site-title"},Object(tt.a)(h)),f&&c.a.createElement("p",{className:"site-description"},Object(tt.a)(f,["emoji","br"]))))});a(231);var Sa=Object(c.h)(({message:e})=>{const t=Object(m.A)(e),{title:a,text:s,description:n,photoUrl:r}=t;return c.a.createElement("div",{className:"Invoice"},a&&c.a.createElement("p",{className:"title"},Object(tt.a)(a)),s&&c.a.createElement("p",null,Object(tt.a)(s,["emoji","br"])),c.a.createElement("div",{className:"description "+(r?"has-image":"")},r&&c.a.createElement("img",{className:"invoice-image",src:r,alt:""}),n&&c.a.createElement("p",{className:"description-text"},Object(tt.a)(n,["emoji","br"]))))});function ka(e){return Object(c.h)(Object(s.h)((e,t)=>{const{message:a}=t;return{isInSelectMode:Object(o.S)(e),isSelected:Object(o.V)(e,a.id)}},(e,t)=>Object(d.l)(t,["toggleMessageSelection"]))(t=>{const{isInSelectMode:a,isSelected:s,message:n,toggleMessageSelection:r,dimensions:o}=t,i=Object(c.m)(e=>{e.stopPropagation(),r({messageId:n.id,withShift:e&&e.shiftKey})},[r,n]),l=Object(c.p)(()=>({...t,isInSelectMode:a,isSelected:s,dimensions:{...t.dimensions,x:0,y:0},onClick:a?void 0:t.onClick}),[t,a,s]);return c.a.createElement("div",{className:Object(X.a)("album-item-select-wrapper",s&&"is-selected"),style:o?`left: ${o.x}px; top: ${o.y}px;`:"",onClick:a?i:void 0},a&&c.a.createElement("div",{className:"message-select-control"},s&&c.a.createElement("i",{className:"icon-select"})),c.a.createElement(e,l))}))}a(232);const Na=ka(oa),Pa=ka(ha);var Ta=Object(s.h)(e=>({uploadsById:e.fileUploads.byMessageLocalId}),(e,t)=>Object(d.l)(t,["cancelSendingMessage"]))(({album:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,hasCustomAppendix:n,lastSyncTime:r,isOwn:o,albumLayout:i,onMediaClick:l,uploadsById:d,cancelSendingMessage:b})=>{const u=e.messages.length,h=Object(c.m)(e=>{b({chatId:e.chatId,messageId:e.id})},[b]);const{width:O,height:j}=i.containerStyle;return c.a.createElement("div",{className:"Album",style:`width: ${O}px; height: ${j}px;`},e.messages.map((function(e,b){const{photo:O,video:j}=Object(m.w)(e),g=d[e.previousLocalId||e.id],f=g?g.progress:void 0,{dimensions:p,sides:I}=i.layout[b];if(O){const s=n&&(o?b===u-1:Boolean(I&xt&&I&At));return c.a.createElement(Na,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAffectAppendix:s,uploadProgress:f,dimensions:p,onClick:l,onCancelUpload:h})}if(j)return c.a.createElement(Pa,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,uploadProgress:f,lastSyncTime:r,dimensions:p,onClick:l,onCancelUpload:h})})))});a(233);function Aa(){return(Aa=Object.assign||function(e){for(var t=1;t{const r=Object(c.q)(null),o=Object(c.q)(null),i=Object(c.q)(null),l=e.content.video,d=Object(ft.b)(r,t),[b,u]=Object(c.r)(a&&s),h=Boolean(b&&d&&n),{mediaData:O,downloadProgress:j}=Object(ta.a)(Object(m.E)(e,"inline"),!h,Object(m.D)(e,"inline"),n),g=sa(e,O),{isBuffered:f,bufferingHandlers:p}=Object(ia.a)(),I=b&&!f,v=!1===Object(na.a)(b),{shouldRender:y,transitionClassNames:C}=Object(Z.a)(I||!f,void 0,v),{shouldRenderThumb:E,transitionClassNames:w}=Object(Yt.a)(O,"slow"),[M,S]=Object(c.r)(!1),[k,N]=Object(c.r)(0);Object(c.n)(()=>{if(!M)return;const e=188*Math.PI,t=e-k*e,a=i.current,s=o.current,n=s.firstElementChild;n?n.firstElementChild.setAttribute("stroke-dashoffset",t.toString()):s.innerHTML=`\n \n `,N(a.currentTime/a.duration)},[M,k]);const P=Boolean(O&&d),T=()=>{S(!1),N(0),Object(la.a)(i.current),requestAnimationFrame(()=>{o.current.innerHTML=""})},A=(R=T,()=>{xa&&xa(),xa=R});var R;Object(c.n)(()=>{i.current&&(P?Object(la.a)(i.current):i.current.pause())},[P]),da(i,P),ua(i,Boolean(O)),Object(ba.a)(i,[O]);const L=Object(c.m)(()=>{if(!O)return void u(e=>!e);const e=i.current;M?e.paused?Object(la.a)(e):e.pause():(A(),e.currentTime=0,S(!0))},[A,M,O]),F=Object(c.m)(e=>{const t=e.currentTarget;N(t.currentTime/t.duration)},[]),D=Object(X.a)("full-media",w);return c.a.createElement("div",{ref:r,className:"RoundVideo media-inner",onClick:L},E&&c.a.createElement("div",{className:"thumbnail-wrapper"},c.a.createElement("canvas",{ref:g,className:"thumbnail",style:`width: ${et.d}px; height: ${et.d}px`})),O&&c.a.createElement("div",{className:"video-wrapper"},c.a.createElement("video",Aa({ref:i,className:D,width:et.d,height:et.d,autoPlay:!0,muted:!M,loop:!M,playsInline:!0,onEnded:M?T:void 0},p,{onTimeUpdate:M?F:void 0}),c.a.createElement("source",{src:O}))),c.a.createElement("div",{className:"progress",ref:o}),y&&c.a.createElement("div",{className:"media-loading "+C},c.a.createElement(ra.a,{progress:j})),!O&&!b&&c.a.createElement("i",{className:"icon-large-play"}),c.a.createElement("div",{className:"message-media-duration"},M?Object(x.e)(i.current.currentTime):Object(x.e)(l.duration),(!M||i.current.paused)&&c.a.createElement("i",{className:"icon-muted-chat"})))};a(234);var La=({message:e,onClick:t})=>c.a.createElement("div",{className:"InlineButtons"},e.inlineButtons.map(e=>c.a.createElement("div",{className:"row"},e.map(e=>c.a.createElement(oe.a,{size:"tiny",ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>t({button:e})},e.text,"url"===e.type&&c.a.createElement("i",{className:"icon-arrow-right"}))))));a(235);var Fa=Object(c.h)(Object(s.h)((e,{message:t})=>{const{threadId:a,chatId:s}=t.threadInfo,n=Object(o.Cb)(e,s,a)||t.threadInfo,{byId:c}=e.users,{byId:r}=e.chats;return{threadInfo:n,usersById:c,chatsById:r}},(e,t)=>Object(d.l)(t,["openChat"]))(({disabled:e,threadInfo:t,usersById:a,chatsById:s,openChat:n})=>{const r=Object(ne.a)(),{threadId:o,chatId:i,messagesCount:l,lastMessageId:d,lastReadInboxMessageId:b,recentReplierIds:u}=t,h=Object(c.m)(()=>{n({id:i,threadId:o})},[n,i,o]);if(void 0===l)return;const O=u&&u.map(e=>Object(m.mb)(e)?a[e]:s[e]).filter(Boolean);const j=Boolean(b&&d&&b0&&c.a.createElement("div",{className:"recent-repliers",dir:r.isRtl?"rtl":"ltr"},O.map(e=>c.a.createElement(Gt.a,{key:e.id,size:"small",user:Object(m.mb)(e.id)?e:void 0,chat:Object(m.mb)(e.id)?void 0:e}))),c.a.createElement("div",{className:"label",dir:"auto"},l?r("Comments",l,"i"):r("LeaveAComment")),c.a.createElement("i",{className:"icon-next"}))}));a(236);function Da(e){const t=Ua(e.currentTarget);t&&t.setAttribute("data-is-document-group-hover","")}function Ba(e){const t=Ua(e.currentTarget);t&&t.removeAttribute("data-is-document-group-hover")}function Ua(e){let t=e;do{t=t.nextElementSibling}while(t&&!t.classList.contains("last-in-document-group"));return t}var Ha=Object(c.h)(Object(s.h)((e,t)=>{const{focusedMessage:a,forwardMessages:s,lastSyncTime:n}=e,{message:c,album:r,withSenderName:i,withAvatar:l,threadId:d,messageListType:b}=t,{id:u,chatId:h,viaBotId:O,replyToMessageId:j,isOutgoing:g}=c,f=Object(o.f)(e,h),p=Object(o.P)(e,h),I=f&&Object(m.kb)(f),v=!p&&Object(m.fb)(c),y=i||l||v?Object(o.tb)(e,c):void 0,C=Object(o.K)(e,c),E=O?Object(o.Gb)(e,O):void 0,w=d?Object(o.Eb)(e,h,d):void 0,M=c.id===w,S=j===w,k=j&&!S?Object(o.k)(e,h,j):void 0,N=k&&Object(o.tb)(e,k),P=Object(o.Fb)(e,c),T="thread"===b&&(r?r.messages.some(t=>Object(o.U)(e,t)):Object(o.U)(e,c)),{direction:A,noHighlight:x}=T&&a||{},R=s.messageIds&&s.messageIds.includes(u),{query:L}=Object(o.A)(e)||{},F=Object(m.M)(c);let D;return D=r&&r.messages?r.messages.every(({id:t})=>Object(o.V)(e,t)):Object(o.V)(e,u),{forceSenderName:v,sender:y,originSender:C,botSender:E,shouldHideReply:S,isThreadTop:M,replyMessage:k,replyMessageSender:N,...g&&{outgoingStatus:Object(o.fb)(e,c,"scheduled"===b)},..."number"==typeof P&&{uploadProgress:P},isFocused:T,...T&&{focusDirection:A,noFocusHighlight:x},isForwarding:R,isChatWithSelf:p,isChannel:I,lastSyncTime:n,highlight:L,isSingleEmoji:Boolean(F),animatedEmoji:F?Object(o.c)(e,F):void 0,isInSelectMode:Object(o.S)(e),isSelected:D,isGroupSelected:!!c.groupedId&&!c.isInAlbum&&Object(o.Q)(e,h,c.groupedId),threadId:d,isPinnedList:"pinned"===b,shouldAutoLoadMedia:f?Object(o.ub)(e,c,f,y):void 0,shouldAutoPlayMedia:Object(o.vb)(e,c),shouldLoopStickers:Object(o.wb)(e)}},(e,t)=>Object(d.l)(t,["focusMessage","openMediaViewer","openAudioPlayer","cancelSendingMessage","openUserInfo","openChat","markMessagesRead","sendPollVote","toggleMessageSelection","setReplyingToId","openForwardMenu","clickInlineButton"]))(({message:e,observeIntersectionForBottom:t,observeIntersectionForMedia:a,observeIntersectionForAnimatedStickers:s,album:n,withAvatar:r,withSenderName:o,noComments:d,appearanceOrder:b,isFirstInGroup:u,isLastInGroup:h,isFirstInDocumentGroup:O,isLastInDocumentGroup:j,isLastInList:g,forceSenderName:f,sender:p,originSender:I,botSender:v,isThreadTop:y,shouldHideReply:C,replyMessage:E,replyMessageSender:w,outgoingStatus:M,uploadProgress:S,isFocused:k,focusDirection:N,noFocusHighlight:P,isForwarding:T,isChatWithSelf:A,isChannel:x,lastSyncTime:R,highlight:L,animatedEmoji:F,isInSelectMode:D,isSelected:B,isGroupSelected:U,threadId:H,messageListType:G,isPinnedList:q,shouldAutoLoadMedia:_,shouldAutoPlayMedia:V,shouldLoopStickers:$,focusMessage:W,openMediaViewer:z,openAudioPlayer:K,openUserInfo:Q,openChat:Y,cancelSendingMessage:J,markMessagesRead:ee,sendPollVote:te,toggleMessageSelection:ae,setReplyingToId:se,openForwardMenu:ce,clickInlineButton:re})=>{const ie=Object(c.q)(null),le=Object(c.q)(null),de=Object(c.q)(null);Object(ft.c)(le,t);const{width:be}=_e(),{isContextMenuOpen:ue,contextMenuPosition:me,handleBeforeContextMenu:he,handleContextMenu:Oe,handleContextMenuClose:je,handleContextMenuHide:ge}=Object(Et.a)(ie,!1,!0),fe=b<=0,[pe,Ie]=Object(ot.a)(fe);Object(c.n)(()=>{fe||setTimeout(Ie,10*b)},[b,Ie,fe]);const{transitionClassNames:ve}=Object(Z.a)(pe,void 0,fe,!1),{chatId:ye,id:Ce,threadInfo:Ee}=e,we=Object(m.ub)(e),Me="scheduled"===G||e.isScheduled,Se=Object(m.vb)(e)&&!C,ke=Boolean(Ee)&&"thread"===G,{forwardInfo:Ne,viaBotId:Pe}=e,Te=Ne&&!A&&!Ne.isLinkedChannelPost,Ae=!!e.groupedId&&!e.isInAlbum,xe=Boolean(n)&&n.messages.length>1,{text:Re,photo:Le,video:Fe,audio:De,voice:Be,document:Ue,sticker:He,contact:Ge,poll:qe,webPage:Ve,invoice:$e}=Object(m.w)(e),We=Object(m.y)(e),Ke=Object(wt.a)(e,L,Mt(We)),Qe=void 0!==me,Ye=Object(X.a)("Message message-list-item",u&&"first-in-group",h&&"last-in-group",O&&"first-in-document-group",j&&"last-in-document-group",g&&"last-in-list",we&&"own",Boolean(e.views)&&"has-views",e.isEdited&&"was-edited",Se&&"has-reply",Qe&&"has-menu-open",k&&!P&&"focused",T&&"is-forwarding",e.isDeleting&&"is-deleting",Ae&&"is-in-document-group",xe&&"is-album",e.hasUnreadMention&&"has-unread-mention",B&&"is-selected",D&&"is-in-selection-mode",y&&"is-thread-top",Boolean(e.inlineButtons)&&"has-inline-buttons",ve),Je=function(e,{hasReply:t,customShape:a,isLastInGroup:s,asForwarded:n,hasThread:c,forceSenderName:r,hasComments:o}={}){const{text:i,photo:l,video:d,audio:b,voice:u,document:h,poll:O,webPage:j,contact:g}=Object(m.w)(e),f=["message-content"],p=(l||d)&&!i,I=Boolean(e.viaBotId);return Mt(a)?f.push("emoji-only emoji-only-"+a):i&&f.push("text"),a&&(f.push("custom-shape"),d&&d.isRound&&f.push("round"),o&&f.push("has-comments")),l||d?f.push("media"):b?f.push("audio"):u?f.push("voice"):h?f.push("document"):g?f.push("contact"):O?f.push("poll"):j&&(f.push("web-page"),j.photo&&f.push("media")),n&&!a&&f.push("is-forwarded"),t&&f.push("is-reply"),c&&f.push("has-replies"),I&&f.push("is-via-bot"),r&&f.push("force-sender-name"),a||(f.push("has-shadow"),(t||n||!p||I||r)&&f.push("has-solid-background"),!s||!l&&p||f.push("has-appendix")),f.join(" ")}(e,{hasReply:Se,customShape:We,isLastInGroup:h,asForwarded:Te,hasThread:ke,forceSenderName:f,hasComments:e.threadInfo&&e.threadInfo.messagesCount>0}),Xe=!Ne||!A&&p?p:I,Ze=Ne?I:p,at=x&&e.adminTitle||Ne&&!Te&&Ne.adminTitle||void 0,st=e.threadInfo&&(!Ae||j)&&"thread"===G&&!d,nt=Je.includes("has-appendix");Object(ze.a)(ye,Se?e.replyToMessageId:void 0,E,e.id),Ht(ie,ye,k,N,P),Object(c.o)(()=>{de.current&&(de.current.innerHTML=we?'':'')},[we,nt]);const ct=Object(c.m)(t=>{t.stopPropagation(),ae({messageId:Ce,groupedId:e.groupedId})},[Ce,e.groupedId,ae]),rt=Object(c.m)(e=>{const t=xe&&n&&n.messages?{messageId:Ce,childMessageIds:n.messages.map(({id:e})=>e),withShift:e&&e.shiftKey}:{messageId:Ce,withShift:e&&e.shiftKey};ae(t)},[ae,Ce,xe,n]),it=Object(c.m)(()=>{se({messageId:Ce})},[se,Ce]),lt=Object(c.m)(e=>{e.stopPropagation()},[]),dt=Object(c.m)(()=>{Xe&&(Object(m.mb)(Xe.id)?Q({id:Xe.id}):Y({id:Xe.id}))},[Xe,Q,Y]),bt=Object(c.m)(()=>{Ze&&(Object(m.mb)(Ze.id)?Q({id:Ze.id}):Y({id:Ze.id}))},[Ze,Q,Y]),ut=Object(c.m)(()=>{v&&Q({id:v.id})},[v,Q]),mt=Object(c.m)(()=>{W({chatId:ye,threadId:H,messageId:e.replyToMessageId})},[W,ye,H,e.replyToMessageId]),ht=Object(c.m)(()=>{z({chatId:ye,threadId:H,messageId:Ce,origin:Me?l.h.ScheduledInline:l.h.Inline})},[ye,H,Ce,z,Me]),Ot=Object(c.m)(()=>{K({chatId:ye,messageId:Ce})},[ye,Ce,K]),jt=Object(c.m)(e=>{z({chatId:ye,threadId:H,messageId:e,origin:Me?l.h.ScheduledAlbum:l.h.Album})},[ye,H,z,Me]),gt=Object(c.m)(()=>{ee({messageIds:[Ce]})},[Ce,ee]),pt=Object(c.m)(()=>{J({chatId:ye,messageId:Ce})},[J,ye,Ce]),It=Object(c.m)(e=>{te({chatId:ye,messageId:Ce,options:e})},[ye,Ce,te]),vt=Object(c.m)(()=>{ce({fromChatId:ye,groupedId:e.groupedId})},[ce,ye,e.groupedId]),yt=Object(c.m)(()=>{if(n&&n.messages){const e=n.messages.map(({id:e})=>e);ce({fromChatId:ye,messageIds:e})}else ce({fromChatId:ye,messageIds:[Ce]})},[n,ce,ye,Ce]),Ct=Object(c.m)(()=>{W({chatId:ye,threadId:i.MAIN_THREAD_ID,messageId:Ce})},[W,ye,Ce]),Nt=Object(c.m)(()=>{W(Ae?{chatId:Ne.fromChatId,groupedId:e.groupedId,groupedChatId:ye}:{chatId:Ne.fromChatId,messageId:Ne.fromMessageId})},[W,Ne,e,ye,Ae]),Pt=Object(ne.a)();let Tt,At="",xt=!1;const Rt=Object(c.p)(()=>xe?Dt(we,Boolean(Te),n,be):void 0,[xe,be,we,Te,n]),Lt=Te?28:0;if(xe||!Le&&!Fe)Rt&&(Tt=Math.max(St(Boolean(Re),st),Rt.containerStyle.width),Tt-Rt.containerStyle.width>18&&(xt=!0));else{let t;Le?t=kt(e).width:Fe&&(t=Fe.isRound?et.d:kt(e).width),t&&(Tt=Math.max(St(Boolean(Re),st),t),Tt-t>18&&(xt=!0))}Tt&&(At=`width: ${Tt+Lt}px`);const Ft=Object(c.p)(()=>at?Ut(at):void 0,[at]),Bt=!(Qe||D||T)&&(!Ae||j),qt=Bt&&x&&!Me,Vt=Bt&&(Ne&&(Ne.isChannelPost||A&&!we)&&Ne.fromMessageId||q);return c.a.createElement("div",{ref:ie,id:"message"+Ce,className:Ye,style:Ft?`--meta-safe-author-width: ${Ft}px`:void 0,"data-message-id":Ce,onClick:D?rt:void 0,onDoubleClick:D?void 0:it,onMouseDown:D?void 0:he,onContextMenu:D?void 0:Oe,onMouseEnter:Ae&&!j?Da:void 0,onMouseLeave:Ae&&!j?Ba:void 0},c.a.createElement("div",{ref:le,className:"bottom-marker","data-message-id":Ce,"data-last-message-id":n?n.messages[n.messages.length-1].id:void 0,"data-has-unread-mention":e.hasUnreadMention}),!Ae&&c.a.createElement("div",{className:"message-select-control"},B&&c.a.createElement("i",{className:"icon-select"})),j&&c.a.createElement("div",{className:Object(X.a)("message-select-control group-select",U&&"is-selected"),onClick:ct},U&&c.a.createElement("i",{className:"icon-select"})),r&&function(){const e=Xe&&Object(m.mb)(Xe.id),t=Xe&&e?Xe:void 0,a=Xe&&!e?Xe:void 0,s=!Xe&&Ne?Ne.hiddenUserName:void 0;return c.a.createElement(Gt.a,{size:"small",user:t,chat:a,text:s,lastSyncTime:R,onClick:t||a?dt:void 0})}(),c.a.createElement("div",{className:"message-content-wrapper",onClick:D&&Ae?rt:void 0},c.a.createElement("div",{className:Je,style:At,dir:"auto"},nt&&c.a.createElement("div",{className:"svg-appendix",ref:de}),Te&&!We&&(!Ae||O)&&c.a.createElement("div",{className:"message-title"},Pt("ForwardedMessage")),function(){const t=Object(X.a)("content-inner",Te&&!We&&"forwarded-message",Se&&"reply-message",xt&&"no-media-corners"),r=h&&!Ke&&!Te&&!ke,i=!Ve&&!F&&Ke;return c.a.createElement("div",{className:t,onDoubleClick:lt,dir:"auto"},function(){if(We||!(o&&!Le&&!Fe||Te||Pe||f)||Ae&&!O)return;let t,a;Ze?(t=Object(m.W)(Pt,Ze),Te||(a="color-"+Object(m.Y)(Ze))):Ne&&Ne.hiddenUserName&&(t=Ne.hiddenUserName);return c.a.createElement("div",{className:"message-title",dir:"ltr"},t?c.a.createElement("span",{className:Object(X.a)(Ze&&"interactive",a),onClick:Ze?bt:void 0,dir:"auto"},Object(tt.a)(t)):v?void 0:" ",v&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"via"},Pt("ViaBot")),c.a.createElement("span",{className:"interactive",onClick:ut},Object(tt.a)("@"+v.username))),Ne&&Ne.isLinkedChannelPost?c.a.createElement("span",{className:"admin-title",dir:"auto"},Pt("DiscussChannel")):e.adminTitle&&!x?c.a.createElement("span",{className:"admin-title",dir:"auto"},e.adminTitle):void 0)}(),Se&&c.a.createElement($t,{message:E,sender:w,observeIntersection:a,onClick:mt}),He&&c.a.createElement(Zt,{message:e,observeIntersection:a,observeIntersectionForPlaying:s,shouldLoop:$,lastSyncTime:R}),F&&c.a.createElement(ea.a,{isInline:!0,sticker:F,observeIntersection:a,lastSyncTime:R}),xe&&c.a.createElement(Ta,{album:n,albumLayout:Rt,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:V,isOwn:we,hasCustomAppendix:r,lastSyncTime:R,onMediaClick:jt}),!xe&&Le&&c.a.createElement(oa,{message:e,observeIntersection:a,shouldAutoLoad:_,uploadProgress:S,shouldAffectAppendix:r,onClick:ht,onCancelUpload:pt}),!xe&&Fe&&Fe.isRound&&c.a.createElement(Ra,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:V,lastSyncTime:R}),!xe&&Fe&&!Fe.isRound&&c.a.createElement(ha,{message:e,observeIntersection:a,shouldAutoLoad:_,shouldAutoPlay:V,uploadProgress:S,lastSyncTime:R,onClick:ht,onCancelUpload:pt}),(De||Be)&&c.a.createElement(zt.a,{message:e,uploadProgress:S,lastSyncTime:R,isSelectable:Ae,isSelected:B,onPlay:Ot,onReadMedia:!Be||we&&!A?void 0:gt,onCancelUpload:pt}),Ue&&c.a.createElement(Wt.a,{message:e,observeIntersection:a,uploadProgress:S,isSelectable:Ae,isSelected:B,onCancelUpload:pt}),Ge&&c.a.createElement(ja,{contact:Ge}),qe&&c.a.createElement(Ca,{message:e,poll:qe,onSendVote:It}),!F&&Ke&&c.a.createElement("p",{className:"text-content "+(i?"with-meta":""),dir:"auto"},Ke,i&&c.a.createElement(Qt,{message:e,outgoingStatus:M,signature:at,onClick:rt})),Ve&&c.a.createElement(Ma,{message:e,observeIntersection:a,shouldAutoLoad:_,onMediaClick:ht,onCancelMediaTransfer:pt}),$e&&c.a.createElement(Sa,{message:e}))}(),(!Ae||j)&&!(!Ve&&!F&&Ke)&&c.a.createElement(Qt,{message:e,outgoingStatus:M,signature:at,onClick:rt}),qt?c.a.createElement(oe.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:Pt("lng_context_forward_msg"),onClick:j?vt:yt},c.a.createElement("i",{className:"icon-share-filled"})):Vt?c.a.createElement(oe.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Focus message",onClick:q?Ct:Nt},c.a.createElement("i",{className:"icon-arrow-right"})):void 0,st&&c.a.createElement(Fa,{message:e,disabled:d}),Je.includes("has-appendix")&&c.a.createElement("div",{className:"svg-appendix",ref:de})),e.inlineButtons&&c.a.createElement(La,{message:e,onClick:re})),me&&c.a.createElement(_t,{isOpen:ue,anchor:me,message:e,album:n,messageListType:G,onClose:je,onCloseAnimationEnd:ge}))}));a(237);const Ga=h.b?1e3:350,qa=h.g?300:500,_a=Object(g.a)(e=>e(),200,!1);var Va=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,type:s})=>{const n=Object(o.f)(e,t);if(!n)return{};const c=Object(o.x)(e,t,a,s),r="scheduled"===s?Object(o.qb)(e,t):Object(o.m)(e,t),l=Object(o.Eb)(e,t,a);if(a!==i.MAIN_THREAD_ID&&!(r&&l&&r[l]))return{};const{isRestricted:d,restrictionReason:b,lastMessage:u}=n,h=Object(o.I)(e,t),O=a===i.MAIN_THREAD_ID&&!c&&!n.unreadCount&&!h&&u&&!u.groupedId;let j;if(Object(o.L)(e,t)){const a=Object(o.g)(e,t);j=a.fullInfo?a.fullInfo.botDescription||"NoMessages":"Updating bot info..."}return{isChatLoaded:!0,isRestricted:d,restrictionReason:b,isChannelChat:Object(m.kb)(n),isChatWithSelf:Object(o.P)(e,t),messageIds:c,messagesById:r,firstUnreadId:Object(o.H)(e,t,a),isViewportNewest:"thread"!==s||Object(o.X)(e,t,a),threadFirstMessageId:Object(o.G)(e,t,a),focusingId:h,isSelectModeActive:Object(o.S)(e),animationLevel:e.settings.byKey.animationLevel,...O&&{lastMessage:u},botDescription:j,threadTopMessageId:l,hasLinkedChat:n.fullInfo&&"linkedChatId"in n.fullInfo?Boolean(n.fullInfo.linkedChatId):void 0}},(e,t)=>Object(d.l)(t,["loadViewportMessages","markMessageListRead","markMessagesRead","setScrollOffset","openHistoryCalendar"]))(({chatId:e,threadId:t,type:a,hasTools:r,onFabToggle:i,onNotchToggle:b,isChatLoaded:u,isChannelChat:h,canPost:O,isChatWithSelf:j,messageIds:f,messagesById:p,firstUnreadId:I,isViewportNewest:v,threadFirstMessageId:y,isRestricted:C,restrictionReason:E,focusingId:w,isSelectModeActive:M,animationLevel:S,loadViewportMessages:k,markMessageListRead:N,markMessagesRead:P,setScrollOffset:T,lastMessage:A,botDescription:R,threadTopMessageId:L,hasLinkedChat:F,openHistoryCalendar:D})=>{const B=Object(c.q)(null),U=Object(c.q)("thread"===a&&Object(o.rb)(Object(s.e)(),e,t)||0),H=Object(c.q)(),G=Object(c.q)(),q=Object(c.q)(),_=Object(c.q)(),V=Object(c.q)(),$=Object(c.q)(),W=Object(c.q)(!1),z=Object(c.q)(!f),[K,Q]=Object(c.r)(),[Y,Z]=Object(c.r)(Boolean(w)),ee=Boolean(f);Object(je.a)(()=>{ee&&Object(g.d)(()=>{z.current=!1})},[ee]),Object(je.a)(()=>{V.current=I,_.current||(_.current=I)},[I]);const{observe:te,freeze:ae,unfreeze:se}=Object(ft.a)({rootRef:B,throttleMs:Ga,margin:qa}),{observe:ce,freeze:re,unfreeze:oe}=Object(ft.a)({rootRef:B},e=>{if("thread"!==a)return;let t=0;const s=[];e.forEach(e=>{const{isIntersecting:a,target:n}=e;if(!a)return;const{dataset:c}=n,r=Number(c.lastMessageId||c.messageId);r>t&&(t=r),c.hasUnreadMention&&s.push(r)}),V.current&&t>=V.current&&N({maxId:t}),s.length&&P({messageIds:s})});Object(je.a)(()=>{$.current=w,w?(ae(),re()):(oe(),se())},[w]);const{observe:ie}=Object(ft.a)({rootRef:B,throttleMs:Ga});Object(c.n)(()=>{w?Z(!0):setTimeout(()=>{Z(!1)},200)},[w]);const le=Object(c.p)(()=>{if(!f||!p)return;const e=!L||f[0]&&y!==f[0]?f:[L,...f];if(!e.length)return;const t=e.map(e=>p[e]);return gt(Object(d.k)(t,["date","id"]),_.current)},[f,p,y,L]),[de,be,ue]=Object(c.p)(()=>"thread"===a?[Object(g.a)(()=>k({direction:l.e.Backwards}),1e3,!0,!1),Object(g.a)(()=>k({direction:l.e.Forwards}),1e3,!0,!1),Object(g.a)(()=>k({direction:l.e.Around}),1e3,!0,!1)]:[],[k,f]),{isScrolled:me,updateStickyDates:he}=pt(),Oe=Object(c.m)(()=>{if(W.current)return void(W.current=!1);const s=B.current;$.current||he(s,r),_a(()=>{Object(g.b)(()=>{s.parentElement&&(U.current=s.scrollHeight-s.scrollTop,"thread"===a&&T({chatId:e,threadId:t,scrollOffset:U.current}))})})},[he,r,a,T,e,t]);Object(c.n)(()=>{if(!("ResizeObserver"in window))return;const e=new ResizeObserver(([e])=>{e.target.offsetParent&&Q(e.contentRect.height)});return e.observe(B.current),()=>{e.disconnect()}},[]);const{height:ge}=_e();Object(c.n)(()=>{B.current.dataset.normalHeight=String(B.current.offsetHeight)},[ge]),Object(c.n)(()=>{if(!ue||!u||C||w)return;const e=B.current;(!f||f.length{if(!f||!q.current)return;const e=q.current.filter(e=>f.includes(Number(e.dataset.messageId))),t=e[1]||e[0];t&&(H.current=t.id,G.current=t.getBoundingClientRect().top)},[f,v,K,r]),Object(Ot.a)(([e,t,a])=>{const s=B.current;if(q.current=Array.from(s.querySelectorAll(".message-list-item")),!s.offsetParent)return;const c=v&&f&&f.length{s.parentElement&&s.parentElement.classList.remove("force-messages-scroll")},1e3));const{scrollTop:o,scrollHeight:i,offsetHeight:l}=s,d=U.current,b=q.current[q.current.length-1],u=b?b.offsetHeight:0,m=v&&t&&d-(a||l)-u<=100;let h;const O=f&&e&&f[0]!==e[0],j=f&&e&&f[f.length-1]!==e[e.length-1],p=f&&$.current===f[f.length-1];if(m&&j&&!O&&!p&&(b&&Object(g.b)(()=>{Object(vt.a)(s,b,"end",20,void 0,void 0,void 0,!0)}),h=i-l,U.current=Math.max(i-h,l),!c))return;const I=void 0!==a&&a!==K,y=H.current&&s.querySelector("#"+H.current),C=!y&&_.current&&s.querySelector(".unread-divider");if(m&&I){if(Object(vt.b)())return;h=i-l}else if(y){h=o+(y.getBoundingClientRect().top-(G.current||0))}else h=C?C.offsetTop-(r?60:10):i-d;Object(It.a)(s,h),$.current||(W.current=!0,Object(g.b)(()=>{W.current=!1})),U.current=Math.max(i-h,l)},[f,v,K,r]),Object(c.n)(()=>{(!S||S>0)&&Object(J.b)(200+n.c)},[S,M]);const fe=Object(ne.a)(),pe=Boolean(e&&Object(m.mb)(e)),Ie=Boolean(!pe&&!h||j),ve=Object(X.a)("MessageList custom-scroll",!Ie&&"no-avatars",h&&"no-avatars",!O&&"no-composer","pinned"===a&&"type-pinned",M&&"select-mode-active",Y&&"has-focusing",me&&"scrolled");return c.a.createElement("div",{ref:B,className:ve,onScroll:Oe},C?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,E?E.text:"This is a private "+(h?"channel":"chat"))):R?c.a.createElement("div",{className:"empty rich"},c.a.createElement("span",null,Object(tt.a)(fe(R),["br","emoji","links"]))):f&&!le?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,fe("NoMessages"))):f&&le||A?c.a.createElement(Ct,{containerRef:B,className:"messages-container",messageIds:f||[A.id],focusingId:w,loadMoreForwards:be,loadMoreBackwards:de,isViewportNewest:v,firstUnreadId:I,onFabToggle:i,onNotchToggle:b},function(e,t,a,s,r,o,i,l,b,u,h,O,j,g,f,p){const I=c.a.createElement("div",{className:Object(X.a)("unread-divider","local-action-message"),key:"unread-messages"},c.a.createElement("span",null,e("UnreadMessages"))),v=f?0:t.reduce((e,t)=>e+Object(d.h)(t.senderGroups).length,0);let y=0;const C=t.map((t,O,f)=>{const C=t.senderGroups.map((t,n,g)=>{if(1===t.length&&!jt(t[0])&&Object(m.eb)(t[0])){const e=t[0],s=n===g.length-1&&O===f.length-1;return Object(d.e)([e.id===l.current&&I,c.a.createElement(Vt,{key:e.id,message:e,observeIntersection:a,appearanceOrder:v-++y,isLastInList:s})])}let p;return Object(d.h)(t.map((C,E)=>{const w=jt(C)?C.mainMessage:C,M=jt(C)?C:void 0,S=Object(m.ub)(w),k=jt(C),N=t[E+1];w.previousLocalId&&i.current==="message"+w.previousLocalId&&(i.current="message"+w.id);const P=!k&&w.groupedId?w.groupedId:void 0,T=N&&!jt(N)?N.groupedId:void 0,A={isFirstInGroup:0===E,isLastInGroup:E===t.length-1,isFirstInDocumentGroup:Boolean(P&&P!==p),isLastInDocumentGroup:Boolean(P&&P!==T),isLastInList:E===t.length-1&&n===g.length-1&&O===f.length-1};p=P;const x=Object(m.G)(w),R="scheduled"!==u?x:`${w.date}_${x}`;return Object(d.e)([w.id===l.current?I:void 0,c.a.createElement(Ha,{key:R,message:w,observeIntersectionForBottom:a,observeIntersectionForMedia:s,observeIntersectionForAnimatedStickers:r,album:M,withAvatar:A.isLastInGroup&&o&&!S&&!(w.id===h),withSenderName:A.isFirstInGroup&&o&&!S,threadId:b,messageListType:u,noComments:!1===j,appearanceOrder:v-++y,isFirstInGroup:A.isFirstInGroup,isLastInGroup:A.isLastInGroup,isFirstInDocumentGroup:A.isFirstInDocumentGroup,isLastInDocumentGroup:A.isLastInDocumentGroup,isLastInList:A.isLastInList}),w.id===h&&c.a.createElement("div",{className:"local-action-message",key:"discussion-started"},c.a.createElement("span",null,e("DiscussionStarted")))])}))});return c.a.createElement("div",{className:"message-date-group",key:t.datetime,teactFastList:!0},c.a.createElement("div",{className:Object(X.a)("sticky-date",!g&&"interactive"),key:"date-header",onClick:g?void 0:()=>p({selectedAt:t.datetime})},c.a.createElement("span",{dir:"auto"},g&&t.originalDate===n.lb&&e("MessageScheduledUntilOnline"),g&&t.originalDate!==n.lb&&e("MessageScheduledOn",Object(x.c)(e,t.datetime,void 0,!0)),!g&&Object(x.c)(e,t.datetime))),Object(d.h)(C))});return Object(d.h)(C)}(fe,le||gt([A]),ce,te,ie,Ie,H,_,t,a,L,0,F,!!le&&"scheduled"===a,!le||!z.current,D)):c.a.createElement(Ee.a,{color:"white"}))}));a(238);var $a=Object(c.h)(Object(s.h)(e=>{const t=Object(o.y)(e);if(!t)return{};const{chatId:a,threadId:s,type:n}=t,c=Object(o.f)(e,a);return{messageListType:n,unreadCount:c&&s===i.MAIN_THREAD_ID&&"thread"===n?c.unreadCount:void 0}},(e,t)=>Object(d.l)(t,["focusLastMessage"]))(({isShown:e,canPost:t,messageListType:a,unreadCount:s,focusLastMessage:n})=>{const r=Object(ne.a)(),o=Object(c.q)(null),i=Object(c.m)(()=>{if(e)if("thread"===a)n();else{const e=o.current.parentElement.querySelector(".MessageList"),t=e.querySelectorAll(".message-list-item"),a=t[t.length-1];if(!a)return;Object(vt.a)(e,a,"end",20)}},[e,a,n]),l=Object(X.a)("ScrollDownButton",e&&"revealed",!t&&"no-composer");return c.a.createElement("div",{ref:o,className:l},c.a.createElement("div",{className:"ScrollDownButton-inner"},c.a.createElement(oe.a,{color:"secondary",round:!0,onClick:i,ariaLabel:r("AccDescrPageDown")},c.a.createElement("i",{className:"icon-arrow-down"})),Boolean(s)&&c.a.createElement("div",{className:"unread-count"},Object(Qe.b)(s))))})),Wa=a(129),za=a(138);async function Ka(e,t,a,s){const n=URL.createObjectURL(t),{type:c,size:r}=t;let o,i;if(c.startsWith("image/"))if(a){const a=await Object(Ge.g)(n),{width:r,height:i}=a;if(r>1280||i>1280||"image/jpeg"!==c){const c=await function(e){return new Promise(t=>{const a=document.createElement("canvas"),s=a.getContext("2d");let{width:n,height:c}=e;(n>1280||c>1280)&&(n>=c?(c*=1280/n,n=1280):(n*=1280/c,c=1280)),a.width=n,a.height=c,s.drawImage(e,0,0,e.width,e.height,0,0,n,c),a.toBlob(t,"image/jpeg",100)})}(a);return c?(URL.revokeObjectURL(n),Ka(e,c,!0,s)):Ka(e,t,!1,s)}o={width:r,height:i}}else i=n;else if(c.startsWith("video/")){if(r<10485760){const{videoWidth:e,videoHeight:t,duration:a}=await Object(Ge.h)(n);o={width:e,height:t,duration:a}}i=await Object(Ge.c)(n)}return{blobUrl:n,filename:e,mimeType:c,size:r,quick:o,previewBlobUrl:i,...s}}var Qa=a(182),Ya=a.p+"8ccc0b555efcec3616377aea078dda16.js";const Ja={encoderPath:Ya,reuseWorker:!0},Xa={type:"audio/ogg"};let Za,es,ts;async function as(){return Za||(Za=a.e(9).then(a.t.bind(null,317,7)),es=(await Za).default,ts=new es(Ja)),Za}async function ss(e){await async function(){await as(),await ts.start()}();const t=Date.now();let a;const s=[],n=[];ts.ondataavailable=e=>{s.push(e)};const c=function(e,t){const a=e.sourceNode,s=a.context.createAnalyser();s.fftSize=64,a.connect(s);const n=s.frequencyBinCount,c=new Uint8Array(n);let r=!1;return function e(){if(r)return;s.getByteFrequencyData(c);const a=c.reduce((e,t)=>e+t,0),o=a/n/255;t(o<.1?0:o),requestAnimationFrame(e)}(),()=>{r=!0}}(ts,t=>{n.push(255*t),e(t)});return{stop:()=>new Promise((e,r)=>{ts.onstop=()=>{e({blob:new Blob(s,Xa),duration:Math.round(((a||Date.now())-t)/1e3),waveform:n})},ts.onerror=r;const o=Math.max(0,t+1e3-Date.now());setTimeout(()=>{ts.stop(),c()},o)}),pause:()=>{const e=Math.max(0,t+1e3-Date.now());setTimeout(()=>{ts.pause(),a=Date.now(),c()},e)}}}const ns=["image/png","image/jpeg","image/gif"];function cs(e){const{text:t,entities:a}=e||{};if(!t)return"";const s=Object(wt.b)(t,a,void 0,void 0,!0);return Array.isArray(s)?s.join(""):s}let rs,os;var is=a(64);var ls=a(183),ds=a(191);var bs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"DeleteMessageModal",!t);return a?c.a.createElement(a,e):void 0});function us(){return(us=Object.assign||function(e){for(var t=1;t{const a=Object(c.q)(!1),s=Object(c.m)(()=>{if(a.current=!0,hs)return hs=!1,void e();ms&&(clearTimeout(ms),ms=void 0),ms=window.setTimeout(()=>{a.current&&e()},200)},[e]),n=Object(c.m)(()=>{a.current=!1},[]);return c.a.createElement(oe.a,us({},t,{onMouseEnter:h.l?void 0:s,onMouseLeave:h.l?void 0:n,onClick:h.l?e:void 0}))});var js=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"AttachMenu",!t);return a?c.a.createElement(a,e):void 0});var gs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"SymbolMenu",!t);return a?c.a.createElement(a,e):void 0});var fs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"MentionTooltip",!t);return a?c.a.createElement(a,e):void 0});var ps=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"CustomSendMenu",!t);return a?c.a.createElement(a,e):void 0});var Is=e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"StickerTooltip",!t);return a?c.a.createElement(a,e):void 0},vs=a(184);var ys=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"BotKeyboardMenu",!t);return a?c.a.createElement(a,e):void 0}),Cs=a(185),Es=a(119);a(240);var ws=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a,type:s}=Object(o.y)(e)||{};if(!t||!a||!s)return{};const{currentUserId:n,forwardMessages:{fromChatId:c,toChatId:r,messageIds:i}}=e,l=Object(o.mb)(e,t,a),d="scheduled"===s?Object(o.E)(e,t):Object(o.C)(e,t,a),b=e.settings.byKey.animationLevel>=1,u=r===t;let h,O;if(l?h=Object(o.k)(e,t,l):d?h=Object(o.D)(e,t,a,s):u&&1===i.length&&(h=Object(o.k)(e,c,i[0])),l&&h){const{forwardInfo:a}=h,s=t===n;a&&(a.isChannelPost||s)&&(O=Object(o.K)(e,h)),O||(O=Object(o.tb)(e,h))}else u&&(O=Object(m.mb)(c)?Object(o.Gb)(e,c):Object(o.f)(e,c));return{replyingToId:l,editingId:d,message:h,sender:O,shouldAnimate:b,forwardedMessagesCount:u?i.length:void 0}},(e,t)=>Object(d.l)(t,["setReplyingToId","setEditingId","focusMessage","exitForwardMode"]))(({replyingToId:e,editingId:t,message:a,sender:s,shouldAnimate:n,forwardedMessagesCount:r,setReplyingToId:o,setEditingId:i,focusMessage:l,exitForwardMode:d})=>{const b=Boolean((e||t)&&a||s&&r),u=Object(Es.a)([r],r?300:void 0),{shouldRender:m,transitionClassNames:h}=Object(Z.a)(u&&b,void 0,!n,void 0,!n),O=Object(c.m)(()=>{e?o({messageId:void 0}):t?i({messageId:void 0}):r&&d()},[e,t,r,o,i,d]);Object(c.n)(()=>b?Object(te.a)(O):void 0,[b,O]);const j=Object(c.m)(()=>{l({chatId:a.chatId,messageId:a.id})},[l,a]),g=Object(X.a)("ComposerEmbeddedMessage",h),f=r&&r>1?r+" forwarded messages":void 0;if(m)return c.a.createElement("div",{className:g},c.a.createElement("div",null,c.a.createElement(oe.a,{round:!0,color:"translucent",ariaLabel:"Cancel replying",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement($t,{className:"inside-input",message:a,sender:s,customText:f,title:t?"Edit Message":void 0,onClick:j})))}));var Ms=Object(c.h)(e=>{const{attachments:t}=e,a=Object(Ce.a)(ye.a.Extra,"AttachmentModal",!t.length);return a?c.a.createElement(a,e):void 0});var Ss=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"PollModal",!t);return a?c.a.createElement(a,e):void 0});var ks=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"DropArea",!t);return a?c.a.createElement(a,e):void 0});a(241);const Ns=new RegExp(n.gb,"i");var Ps=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a})=>{const s=Object(o.cb)(e,t,a);return{webPagePreview:e.webPagePreview,noWebPage:s}},(e,t)=>Object(d.l)(t,["loadWebPagePreview","clearWebPagePreview","toggleMessageWebPage"]))(({chatId:e,threadId:t,messageText:a,disabled:s,webPagePreview:n,noWebPage:r,loadWebPagePreview:o,clearWebPagePreview:l,toggleMessageWebPage:d})=>{const b=Object(c.p)(()=>{const{text:e,entities:t}=Object(za.a)(a),s=t&&t.find(({type:e})=>e===i.ApiMessageEntityTypes.TextUrl);if(s)return s.url;const n=e.match(Ns);return n?n[0]:void 0},[a]);Object(c.n)(()=>{b?o({text:b}):(l(),d({chatId:e,threadId:t}))},[e,d,l,b,o,t]),Object(je.a)(()=>{l(),d({chatId:e,threadId:t})},[e]);const u=Boolean(n&&a.length&&!r&&!s),{shouldRender:m,transitionClassNames:h}=Object(Z.a)(u),O=Object(Ke.a)(n);if(!m||!O)return;const{photo:j,...g}=O,f={content:{webPage:g}};return c.a.createElement("div",{className:Object(X.a)("WebPagePreview",h)},c.a.createElement("div",null,c.a.createElement(oe.a,{round:!0,color:"translucent",ariaLabel:"Clear Webpage Preview",onClick:()=>{d({chatId:e,threadId:t,noWebPage:!0})}},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(Ma,{message:f,inPreview:!0})))})),Ts=a(122);var As=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"CalendarModal",!t);return a?c.a.createElement(a,e):void 0});var xs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"PaymentModal",!t);return a?c.a.createElement(a,e):void 0});var Rs,Ls=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"ReceiptModal",!t);return a?c.a.createElement(a,e):void 0});a(242);!function(e){e.Send="send",e.Record="record",e.Edit="edit"}(Rs||(Rs={}));var Fs=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.f)(e,t),c=n&&Object(o.o)(e,n),r=n?Object(o.O)(e,n):void 0,l=Object(o.P)(e,t),d=r&&Object(o.bb)(e,t),b=Object(o.ob)(e,t),{language:u}=e.settings.byKey,h=Object(o.F)(e,u);return{editingMessage:Object(o.D)(e,t,a,s),connectionState:e.connectionState,draft:Object(o.B)(e,t,a),chat:n,isChatWithBot:r,isChatWithSelf:l,canScheduleUntilOnline:!l&&!r&&n&&c&&Object(m.mb)(t)&&c.status&&Boolean(c.status.wasOnline),isRightColumnShown:Object(o.W)(e),isSelectModeActive:Object(o.S)(e),withScheduledButton:a===i.MAIN_THREAD_ID&&"thread"===s&&Boolean(b&&b.length),shouldSchedule:"scheduled"===s,botKeyboardMessageId:d?d.id:void 0,isForwarding:t===e.forwardMessages.toChatId,canSuggestMembers:n&&Object(m.lb)(n),isPollModalOpen:e.isPollModalOpen,stickersForEmoji:e.stickers.forEmoji.stickers,groupChatMembers:n&&n.fullInfo&&n.fullInfo.members,currentUserId:e.currentUserId,usersById:e.users.byId,lastSyncTime:e.lastSyncTime,contentToBeScheduled:e.messages.contentToBeScheduled,isPaymentModalOpen:e.payment.isPaymentModalOpen,isReceiptModalOpen:Boolean(e.payment.receipt),shouldSuggestStickers:e.settings.byKey.shouldSuggestStickers,recentEmojis:e.recentEmojis,language:u,emojiKeywords:h?h.keywords:void 0}},(e,t)=>Object(d.l)(t,["sendMessage","editMessage","saveDraft","clearDraft","showError","setStickerSearchQuery","setGifSearchQuery","forwardMessages","openPollModal","closePollModal","closePaymentModal","clearReceipt","loadScheduledHistory","openChat","addRecentEmoji","loadEmojiKeywords"]))(({dropAreaState:e,shouldSchedule:t,canScheduleUntilOnline:a,onDropHide:r,editingMessage:o,chatId:l,threadId:d,messageListType:b,draft:u,chat:O,connectionState:j,isChatWithBot:f,isChatWithSelf:p,isRightColumnShown:I,isSelectModeActive:v,isForwarding:y,canSuggestMembers:C,isPollModalOpen:E,isPaymentModalOpen:w,isReceiptModalOpen:M,botKeyboardMessageId:S,withScheduledButton:k,stickersForEmoji:N,groupChatMembers:P,currentUserId:T,usersById:A,lastSyncTime:R,contentToBeScheduled:L,shouldSuggestStickers:F,language:D,emojiKeywords:B,recentEmojis:U,sendMessage:H,editMessage:G,saveDraft:q,clearDraft:_,showError:V,setStickerSearchQuery:$,setGifSearchQuery:W,forwardMessages:z,openPollModal:K,closePollModal:Q,loadScheduledHistory:Y,closePaymentModal:J,openChat:Z,clearReceipt:ee,addRecentEmoji:ae,loadEmojiKeywords:se})=>{const ce=Object(c.q)(null),[re,ie]=Object(c.r)(""),le=Object(c.q)(),de=Object(na.a)(e),[be,ue,he]=Object(ot.a)(),[Oe,je]=Object(c.r)(),ge=Object(c.q)(re);Object(c.n)(()=>{ge.current=re},[re]),Object(c.n)(()=>{le.current=void 0},[l]),Object(c.n)(()=>{l&&R&&d===i.MAIN_THREAD_ID&&Y()},[l,Y,R,d]),Object(c.o)(()=>{ce.current&&(ce.current.innerHTML='')},[]),Object(c.n)(()=>{L&&(je(L),ue())},[L,ue]);const[fe,pe]=Object(c.r)([]),[Ie,ve,ye]=Object(ot.a)(),[Ce,Ee,we]=Object(ot.a)(),[Me,Se,ke]=Object(ot.a)(),[Ne,Pe,Te]=Object(ot.a)(),[Ae,xe]=Object(ot.a)(),[Re,Le,Fe]=Object(ot.a)(),{startRecordingVoice:De,stopRecordingVoice:Be,pauseRecordingVoice:He,activeVoiceRecording:Ge,currentRecordTime:qe,recordButtonRef:_e,startRecordTimeRef:Ve}=(()=>{const e=Object(c.q)(null),[t,a]=Object(c.r)(),s=Object(c.q)(),[n,r]=Object(c.r)();Object(c.n)(()=>{h.e&&as()},[]);const o=Object(c.m)(async()=>{try{const{stop:t,pause:n}=await ss(t=>{e.current&&(s.current&&Date.now()%4==0&&(e.current.style.boxShadow=`0 0 0 ${50*(t||0)}px rgba(0,0,0,.15)`),r(Date.now()))});s.current=Date.now(),r(Date.now()),a({stop:t,pause:n})}catch(e){console.error(e)}},[]),i=Object(c.m)(()=>{if(t){e.current&&(e.current.style.boxShadow="none");try{return t.pause()}catch(e){return void console.error(e)}}},[t]),l=Object(c.m)(()=>{if(t){a(void 0),s.current=void 0,r(void 0),e.current&&(e.current.style.boxShadow="none");try{return t.stop()}catch(e){return void console.error(e)}}},[t]);return Object(c.n)(()=>t?Object(te.a)(l):void 0,[t,l]),{startRecordingVoice:o,pauseRecordingVoice:i,stopRecordingVoice:l,activeVoiceRecording:t,currentRecordTime:n,recordButtonRef:e,startRecordTimeRef:s}})(),$e=o?Rs.Edit:!h.m||Ge||re&&!fe.length||y?Rs.Send:Rs.Record,We=!t,{isMentionTooltipOpen:ze,mentionFilter:Ke,closeMentionTooltip:Qe,insertMention:Ye,mentionFilteredMembers:Je}=Object(ds.a)(C&&!fe.length,re,ie,void 0,P,T,A),{isContextMenuOpen:Xe,handleContextMenu:Ze,handleContextMenuClose:et,handleContextMenuHide:at}=Object(Et.a)(_e,!($e===Rs.Send&&We)),st=Object(c.p)(()=>Object(m.c)(O,f),[O,f]),nt=O&&Object(m.hb)(O),ct=Object(m.k)(O),{isStickerTooltipOpen:rt,closeStickerTooltip:it}=function(e,t,a){const{loadStickersForEmoji:n,clearStickersForEmoji:r}=Object(s.d)(),o=h.d&&1===Object(is.a)(t)||!h.d&&Boolean(t.match(/^]*?>$/g)),i=Boolean(a)&&o;return Object(c.n)(()=>{e&&o?n({emoji:t}):!i&&o||r()},[t,o,r,n,e]),{isStickerTooltipOpen:i,closeStickerTooltip:r}}(Boolean(F&&st.canSendStickers&&!fe.length),re,N),{isEmojiTooltipOpen:lt,closeEmojiTooltip:dt,filteredEmojis:bt,insertEmoji:ut}=Object(ls.a)(Boolean(F&&st.canSendStickers&&!fe.length),re,U,void 0,ie,B),mt=Object(c.m)((e,t=n.v)=>{const a=window.getSelection(),s=document.getElementById(t),c=Object(tt.a)(e,["escape_html","emoji_html","br_html"]).join("").replace(/\u200b+/g,"​");if(a.rangeCount){const t=a.getRangeAt(0);if(Object(Qa.a)(t))return void(h.d?document.execCommand("insertText",!1,e):(!function(e){const t=window.getSelection();if(t&&t.getRangeAt&&t.rangeCount){const a=t.getRangeAt(0);a.deleteContents();const s=a.createContextualFragment(e),n=s.lastChild;a.insertNode(s),n&&(a.setStartAfter(n),a.setEndAfter(n),t.removeAllRanges(),t.addRange(a))}}(c),s.dispatchEvent(new Event("input",{bubbles:!0}))))}ie(`${ge.current}${c}`),h.g||requestAnimationFrame(()=>{Object(Wa.a)(s)})},[]),ht=Object(c.m)(()=>{const e=window.getSelection();if(e.rangeCount){const t=e.getRangeAt(0);if(Object(Qa.a)(t))return void document.execCommand("delete",!1)}ie(function(e){const t=document.createElement("div");t.contentEditable="true",t.style.position="absolute",t.style.left="-10000px",t.style.top="-10000px",t.innerHTML=e,document.body.appendChild(t);let a=t.lastChild;if(a.lastChild)for(;a.lastChild;)a=a.lastChild;const s=a.textContent.length,n=document.createRange(),c=window.getSelection();n.setStart(a,s),n.setEnd(a,s),c.removeAllRanges(),c.addRange(n),document.execCommand("delete",!1);const r=t.innerHTML;return document.body.removeChild(t),r}(ge.current))},[]),Ot=Object(c.m)(()=>{ie(""),pe([]),it(),he(),je(void 0),Qe(),dt(),h.g?setTimeout(()=>ke(),350):ke()},[it,he,Qe,dt,ke]),jt=Object(na.a)(l);Object(c.n)(()=>{jt&&l!==jt&&(Be(),Ot())},[l,jt,Ot,Be]);const gt=((e,t,a,s,r,o)=>{Object(c.n)(()=>{a?(t(cs(a.content.text)),requestAnimationFrame(()=>{const e=document.getElementById(n.v);Object(Wa.a)(e,!0)})):t("")},[a,t]);return Object(c.m)(()=>{const{text:t,entities:n}=Object(za.a)(e.current);a&&(t||Object(m.db)(a)?(o({messageId:a.id,text:t,entities:n}),s()):r())},[o,a,e,r,s])})(ge,ie,o,Ot,Pe,G);((e,t,a,s,r,o,i,l,d)=>{const b=Object(c.m)((e,t)=>{r.current.length&&!i?l({chatId:e,threadId:t,draft:Object(za.a)(r.current)}):d({chatId:e,threadId:t})},[d,i,r,l]),u=Object(c.p)(()=>Object(g.a)(e=>e(),n.u,!1),[t]),m=Object(na.a)(t),h=Object(na.a)(a);Object(c.n)(()=>(rs=t,os=a,()=>{rs=void 0,os=void 0,b(t,a)}),[t,a,b]),Object(c.n)(()=>{t===m&&a===h||e&&(o(cs(e)),requestAnimationFrame(()=>{const e=document.getElementById(n.v);Object(Wa.a)(e,!0)}))},[t,a,e,o,b,m,h]);const O=Object(na.a)(s);Object(c.n)(()=>{t&&a&&m===t&&h===a&&O!==s&&(s.length?u(()=>{rs===t&&os===a&&b(t,a)}):b(t,a))},[t,s,m,O,h,u,a,b]),Object(c.n)(()=>{function e(){t&&a&&b(t,a)}return window.addEventListener("blur",e),()=>{window.removeEventListener("blur",e)}},[t,a,b])})(u,l,d,re,ge,ie,o,q,_),((e,t,a)=>{Object(c.n)(()=>{async function s(s){if(!s.clipboardData)return;const c=document.activeElement;if(c&&"INPUT"===c.tagName&&![n.v,n.w].includes(c.id))return;const{items:r}=s.clipboardData,o=Array.from(r).find(e=>ns.includes(e.type)),i=o&&o.getAsFile(),l=s.clipboardData.getData("text").substring(0,4096);if(i||l){if(s.preventDefault(),i&&!a){const e=await Ka(i.name,i,!0);t(t=>[...t,e])}l&&e(l,c?c.id:void 0)}}return document.addEventListener("paste",s,!1),()=>{document.removeEventListener("paste",s,!1)}},[e,a,t])})(mt,pe,o);const ft=Object(c.m)(async(e,t)=>{pe(await Promise.all(e.map(e=>Ka(e.name,e,t))))},[]),pt=Object(c.m)(async(e,t)=>{pe([...fe,...await Promise.all(e.map(e=>Ka(e.name,e,t)))])},[fe]),It=Object(c.m)(()=>{pe([])},[]),vt=Object(c.m)(async(e=!1,t)=>{if("connectionStateReady"!==j)return;let a=fe;if(Ge){const e=await Be();if(e){const{blob:t,duration:s,waveform:n}=e;a=[await Ka("wonderful-voice-message.ogg",t,!1,{voice:{duration:s,waveform:n}})]}}const{text:s,entities:c}=Object(za.a)(ge.current);if(a.length||s||y)if(a.length&&s&&s.length>1024){const e=s.length-1024;V({error:{message:"CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS",textParams:{"{EXTRA_CHARS_COUNT}":e,"{PLURAL_S}":e>1?"s":""}}})}else{if(a.length||s){if(ct&&!nt){const e=Math.floor(Date.now()/1e3),t=le.current&&Math.floor(e-le.current),a=ct.nextSendDate&&ct.nextSendDate>e;if(t&&t{e={...e,isPreloadedGlobally:!0},t?(je({sticker:e}),ue()):(H({sticker:e}),requestAnimationFrame(Ot))},[t,ue,H,Ot]),Ct=Object(c.m)(e=>{t?(je({gif:e}),ue()):(H({gif:e}),requestAnimationFrame(Ot))},[t,ue,H,Ot]),wt=Object(c.m)(e=>{t?(je({poll:e}),Q(),ue()):(H({poll:e}),Q())},[Q,ue,H,t]),Mt=Object(c.m)(()=>{t?(je({isSilent:!0}),ue()):vt(!0)},[vt,ue,t]),St=Object(c.m)(e=>{const{isSilent:t,...a}=Oe||{},s=Math.round(Math.max(e.getTime(),Date.now()+6e4)/1e3);Oe&&0!==Object.keys(a).length?(H({...Oe,scheduledAt:s}),requestAnimationFrame(Ot)):vt(!!t,s),he()},[he,vt,Ot,Oe,H]),kt=Object(c.m)(()=>{St(new Date(1e3*n.lb))},[St]),Nt=Object(c.m)(()=>{he(),je(void 0)},[he]),Pt=Object(c.m)(e=>{"stickers"===e?($({query:""}),W({query:void 0})):(W({query:""}),$({query:void 0}))},[$,W]),Tt=Object(c.m)(()=>{const e=document.getElementById(n.v);h.g&&e===document.activeElement?(e.blur(),setTimeout(()=>{Se()},100)):Se()},[Se]),At=Object(c.m)(()=>{Z({id:l,threadId:d,type:"scheduled"})},[Z,l,d]);Object(c.n)(()=>{I&&h.g&&ke()},[I,ke]),Object(c.n)(()=>{v?Le():setTimeout(()=>{Fe()},200)},[v,Fe,Le]);const xt=Object(c.m)(()=>{switch($e){case Rs.Send:t?(Ge&&He(),ue()):(vt(),requestAnimationFrame(Ot));break;case Rs.Record:De();break;case Rs.Edit:gt()}},[$e,Ot,t,De,gt,Ge,ue,He,vt]),Rt=Object(ne.a)(),Lt=$e===Rs.Record&&!st.canAttachMedia,Ft=Object(na.a)(o,!0),Dt=o||Ft,Bt=new Date;Bt.setSeconds(0),Bt.setMilliseconds(0);const Ut=new Date;Ut.setFullYear(Ut.getFullYear()+1);let Ht="SendMessage";switch($e){case Rs.Edit:Ht="Save edited message";break;case Rs.Record:Ht=Lt?"Conversation.DefaultRestrictedMedia":"AccDescrVoiceMessage"}const Gt=Object(X.a)("Composer",!v&&"shown",Re&&"hover-disabled"),qt=Object(X.a)("mobile-symbol-menu-button",Ae?Me&&"menu-opened":Me&&"is-loading");return c.a.createElement("div",{className:Gt},st.canAttachMedia&&c.a.createElement(Ts.a,{containerId:"#middle-column-portals"},c.a.createElement(ks,{isOpen:e!==Ue.a.None,withQuick:[e,de].includes(Ue.a.QuickFile),onHide:r,onFileSelect:ft})),c.a.createElement(Ms,{attachments:fe,caption:fe.length?re:"",canSuggestMembers:C,groupChatMembers:P,currentUserId:T,usersById:A,recentEmojis:U,onCaptionUpdate:ie,language:D,addRecentEmoji:ae,loadEmojiKeywords:se,onSend:t?ue:vt,onFileAppend:pt,onClear:It}),c.a.createElement(Ss,{isOpen:Boolean(E),onClear:Q,onSend:wt}),c.a.createElement(xs,{isOpen:Boolean(w),onClose:J}),c.a.createElement(Ls,{isOpen:Boolean(M),onClose:ee}),Dt&&c.a.createElement(bs,{isOpen:Ne,isSchedule:"scheduled"===b,onClose:Te,message:Dt}),c.a.createElement(fs,{isOpen:ze,filter:Ke,onClose:Qe,onInsertUserName:Ye,filteredChatMembers:Je,usersById:A}),c.a.createElement("div",{id:"message-compose"},c.a.createElement("div",{className:"svg-appendix",ref:ce}),c.a.createElement(ws,null),c.a.createElement(Ps,{chatId:l,threadId:d,messageText:fe.length?"":re,disabled:!st.canAttachEmbedLinks}),c.a.createElement("div",{className:"message-input-wrapper"},h.g?c.a.createElement(oe.a,{className:qt,round:!0,color:"translucent",onClick:Me?ke:Tt,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"}),c.a.createElement("i",{className:"icon-keyboard"}),c.a.createElement(me.a,{color:"gray"})):c.a.createElement(Os,{className:""+(Me?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Se,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"})),c.a.createElement(Cs.a,{id:"message-input-text",html:fe.length?"":re,placeholder:Ge&&window.innerWidth<=600?"":Rt("Message"),shouldSetFocus:Me,shouldSupressFocus:h.g&&Me,shouldSupressTextFormatter:lt||ze,onUpdate:ie,onSend:$e===Rs.Edit?gt:t?ue:vt,onSupressedFocus:ke}),k&&c.a.createElement(oe.a,{round:!0,faded:!0,className:"scheduled-button",color:"translucent",onClick:At,ariaLabel:"Open scheduled messages"},c.a.createElement("i",{className:"icon-schedule"})),S&&!Ge&&!o&&c.a.createElement(Os,{className:""+(Ie?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:ve,ariaLabel:"Open bot command keyboard"},c.a.createElement("i",{className:"icon-bot-command"})),!Ge&&!o&&c.a.createElement(Os,{className:""+(Ce?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Ee,ariaLabel:"Add an attachment"},c.a.createElement("i",{className:"icon-attach"})),Ge&&qe&&c.a.createElement("span",{className:"recording-state"},Object(x.i)(qe-Ve.current)),c.a.createElement(Is,{isOpen:rt,onStickerSelect:yt}),c.a.createElement(vs.a,{isOpen:lt,emojis:bt,onClose:dt,onEmojiSelect:ut,addRecentEmoji:ae,loadEmojiKeywords:se,language:D}),c.a.createElement(js,{isOpen:Ce,allowedAttachmentOptions:st,onFileSelect:ft,onPollCreate:K,onClose:we}),S&&c.a.createElement(ys,{messageId:S,isOpen:Ie,onClose:ye}),c.a.createElement(gs,{isOpen:Me,allowedAttachmentOptions:st,onLoad:xe,onClose:ke,onEmojiSelect:mt,onStickerSelect:yt,onGifSelect:Ct,onRemoveSymbol:ht,onSearchOpen:Pt,addRecentEmoji:ae}))),Ge&&c.a.createElement(oe.a,{round:!0,color:"danger",className:"cancel",onClick:Be,ariaLabel:"Cancel voice recording"},c.a.createElement("i",{className:"icon-delete"})),c.a.createElement(oe.a,{ref:_e,round:!0,color:"secondary",className:`${$e} ${Ge?"recording":""}`,disabled:Lt,ariaLabel:Rt(Ht),onClick:xt,onContextMenu:$e===Rs.Send&&We?Ze:void 0},c.a.createElement("i",{className:"icon-send"}),c.a.createElement("i",{className:"icon-microphone-alt"}),c.a.createElement("i",{className:"icon-check"})),We&&c.a.createElement(ps,{isOpen:Xe,onSilentSend:p?void 0:Mt,onScheduleSend:t?void 0:ue,onClose:et,onCloseAnimationEnd:at}),c.a.createElement(As,{isOpen:be,withTimePicker:!0,selectedAt:Bt.getTime(),maxAt:Object(x.k)(Ut),isFutureMode:!0,secondButtonLabel:a?"Send When Online":void 0,onClose:Nt,onSubmit:St,onSecondButtonClick:a?kt:void 0}))}));var Ds=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Ce.a)(ye.a.Extra,"MobileSearch",!t,!0);return a?c.a.createElement(a,e):void 0});var Bs=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Ce.a)(ye.a.Extra,"MessageSelectToolbar",!t);return a?c.a.createElement(a,e):void 0});var Us=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"UnpinAllMessagesModal",!t);return a?c.a.createElement(a,e):void 0});a(243);const Hs=h.g?450+n.c:void 0;function Gs(e){return"file"===e.kind&&e.type&&n.l.includes(e.type)}var qs=Object(c.h)(Object(s.h)(e=>{const{theme:t}=e.settings.byKey,{isBlurred:a,background:s,backgroundColor:n,patternColor:c}=e.settings.themes[t]||{},r=Object(o.y)(e),{chats:{listIds:l}}=e,d={theme:t,customBackground:s,backgroundColor:n,patternColor:c,isRightColumnShown:Object(o.W)(e),isBackgroundBlurred:a,isMobileSearchActive:Boolean(h.g&&Object(o.A)(e)),isSelectModeActive:Object(o.S)(e),animationLevel:e.settings.byKey.animationLevel};if(!r||!l.active)return d;const{chatId:b,threadId:u,type:O}=r,j=Object(o.f)(e,b),g=Object(o.jb)(e,b),{chatId:f,messageId:p}=e.audioPlayer,I=j&&Object(m.e)(j,u),v=Object(o.L)(e,b),y="pinned"===O;return{...d,chatId:b,threadId:u,messageListType:O,isPrivate:Object(m.mb)(b),canPost:!y&&(!j||I)&&(!v||h.g),isPinnedMessageList:y,messageSendingRestrictionReason:j&&Object(m.L)(j),hasPinnedOrAudioMessage:u!==i.MAIN_THREAD_ID||Boolean(g&&g.length)||Boolean(f&&p),pinnedMessagesCount:g?g.length:0}},(e,t)=>Object(d.l)(t,["openChat","unpinAllMessages","loadUser"]))(({chatId:e,threadId:t,messageListType:a,isPrivate:s,isPinnedMessageList:r,canPost:o,messageSendingRestrictionReason:l,hasPinnedOrAudioMessage:d,pinnedMessagesCount:b,customBackground:u,theme:m,backgroundColor:O,patternColor:j,isRightColumnShown:g,isBackgroundBlurred:f,isMobileSearchActive:p,isSelectModeActive:I,animationLevel:v,openChat:y,unpinAllMessages:C,loadUser:E})=>{const{width:w}=_e(),[M,S]=Object(c.r)(Ue.a.None),[k,N]=Object(c.r)(),[P,T]=Object(c.r)(),[A,x]=Object(c.r)(!1),R=d&&(wn.ab&&w=n.Z&&we?Object(te.a)(()=>{y({id:void 0})}):void 0,[e,y]),Object(c.n)(()=>{S(Ue.a.None),N(void 0),T(void 0)},[e]),Object(c.n)(()=>{s&&E({userId:e})},[e,s,E]);const G=Object(c.m)(e=>{if(h.l)return;const{items:t}=e.dataTransfer||{},a=t&&Array.from(t).every(Gs);S(a?Ue.a.QuickFile:Ue.a.Document)},[]),q=Object(c.m)(()=>{S(Ue.a.None)},[]),_=Object(c.m)(()=>{x(!0)},[]),V=Object(c.m)(()=>{x(!1)},[]),$=Object(c.m)(()=>{C({chatId:e}),V(),y({id:e})},[C,y,V,e]),W=((e,t)=>{const[a,s]=Object(c.r)(t);return Object(c.n)(()=>{t&&(t.startsWith("#")?s(t):He.c(n.m,e,He.a.Blob).then(e=>{const t=URL.createObjectURL(e);Object(Ge.g)(t).then(()=>{s(`url(${t})`)})}))},[t,e]),t?a:void 0})(m,u),z=Object(X.a)(U&&"has-header-tools",u&&"custom-bg-image",O&&"custom-bg-color",u&&f&&"blurred",h.n?"mask-image-disabled":"mask-image-enabled"),K=Object(X.a)("messaging-disabled",!I&&"shown"),{composerHiddenScale:Q,toolbarHiddenScale:Y,composerTranslateX:J,toolbarTranslateX:Z,unpinHiddenScale:ee,toolbarForUnpinHiddenScale:se}=Object(c.p)(()=>$e(w,B),[B,w]),ce=Object(ne.a)(),re=Object(X.a)("middle-column-footer",!B&&"no-composer",B&&P&&!I&&"with-notch");return c.a.createElement("div",{id:"MiddleColumn",className:z,style:`\n --composer-hidden-scale: ${Q};\n --toolbar-hidden-scale: ${Y};\n --unpin-hidden-scale: ${ee};\n --toolbar-unpin-hidden-scale: ${se};\n --composer-translate-x: ${J}px;\n --toolbar-translate-x: ${Z}px;\n --pattern-color: ${j};\n --theme-background-color:\n ${O||("dark"===m?n.n:n.I)};\n `},c.a.createElement("div",{id:"middle-column-bg",style:W?"--custom-background: "+W:void 0}),c.a.createElement("div",{id:"middle-column-portals"}),L&&F&&c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"messages-layout",onDragEnter:B?G:void 0},c.a.createElement(ht,{chatId:L,threadId:F,messageListType:D}),c.a.createElement(ae.a,{name:v===n.e?"slide":"fade",activeKey:"thread"===D&&F===i.MAIN_THREAD_ID?1:2,shouldCleanup:!0},()=>c.a.createElement(c.a.Fragment,null,c.a.createElement(Va,{key:`${L}-${F}-${D}`,chatId:L,threadId:F,type:D,canPost:B,hasTools:U,onFabToggle:N,onNotchToggle:T}),c.a.createElement("div",{className:re},B&&c.a.createElement(Fs,{chatId:L,threadId:F,messageListType:D,dropAreaState:M,onDropHide:q}),r&&c.a.createElement("div",{className:"unpin-button-container",dir:ce.isRtl?"rtl":void 0},c.a.createElement(oe.a,{size:"tiny",fluid:!0,color:"secondary",className:"unpin-all-button",onClick:_},c.a.createElement("i",{className:"icon-unpin"}),c.a.createElement("span",null,ce("Chat.Pinned.UnpinAll",b,"i")))),!r&&!B&&l&&c.a.createElement("div",{className:K},c.a.createElement("div",{className:"messaging-disabled-inner"},c.a.createElement("span",null,l))),c.a.createElement(Bs,{messageListType:D,isActive:I,canPost:B})))),c.a.createElement($a,{isShown:H,canPost:B})),h.g&&c.a.createElement(Ds,{isActive:Boolean(p)})),e&&c.a.createElement(Us,{isOpen:A,chatId:e,pinnedMessagesCount:b,onClose:V,onUnpin:$}))}));a(244);const _s=Object(g.a)(e=>e(),200,!1);var Vs;!function(e){e[e.Profile=0]="Profile",e[e.MemberList=1]="MemberList",e[e.SharedMedia=2]="SharedMedia",e[e.Search=3]="Search",e[e.Management=4]="Management",e[e.ManageInitial=5]="ManageInitial",e[e.ManageChannelSubscribers=6]="ManageChannelSubscribers",e[e.ManageChatAdministrators=7]="ManageChatAdministrators",e[e.ManageChatPrivacyType=8]="ManageChatPrivacyType",e[e.ManageDiscussion=9]="ManageDiscussion",e[e.ManageGroupPermissions=10]="ManageGroupPermissions",e[e.ManageGroupRemovedUsers=11]="ManageGroupRemovedUsers",e[e.ManageGroupUserPermissionsCreate=12]="ManageGroupUserPermissionsCreate",e[e.ManageGroupUserPermissions=13]="ManageGroupUserPermissions",e[e.ManageGroupRecentActions=14]="ManageGroupRecentActions",e[e.ManageGroupAdminRights=15]="ManageGroupAdminRights",e[e.ManageGroupMembers=16]="ManageGroupMembers",e[e.StickerSearch=17]="StickerSearch",e[e.GifSearch=18]="GifSearch",e[e.PollResults=19]="PollResults"}(Vs||(Vs={}));var $s=Object(c.h)(Object(s.h)((e,{chatId:t,isProfile:a,isManagement:s})=>{const{query:n}=Object(o.A)(e)||{},{query:c}=Object(o.z)(e)||{},{query:r}=Object(o.s)(e)||{},i=t?Object(o.f)(e,t):void 0,l=i&&Object(m.kb)(i);return{canManage:Boolean(!s&&a&&i&&!Object(o.P)(e,i.id)&&(Object(m.mb)(i.id)||(Object(m.hb)(i)||i.isCreator)&&!i.isNotJoined)),isChannel:l,messageSearchQuery:n,stickerSearchQuery:c,gifSearchQuery:r}},(e,t)=>Object(d.l)(t,["setLocalTextSearchQuery","setStickerSearchQuery","setGifSearchQuery","searchTextMessagesLocal","toggleManagement","openHistoryCalendar"]))(({isColumnOpen:e,isProfile:t,isSearch:a,isManagement:s,isStickerSearch:n,isGifSearch:r,isPollResults:o,profileState:i,managementScreen:d,canManage:b,isChannel:u,onClose:m,messageSearchQuery:O,stickerSearchQuery:j,gifSearchQuery:g,setLocalTextSearchQuery:f,setStickerSearchQuery:p,setGifSearchQuery:I,searchTextMessagesLocal:v,toggleManagement:y,openHistoryCalendar:C})=>{var E;const w=Object(c.q)(null),M=Object(c.m)(e=>{f({query:e}),e.length&&_s(v)},[v,f]),S=Object(c.m)(e=>{p({query:e})},[p]),k=Object(c.m)(e=>{I({query:e})},[I]),[N,P]=Object(c.r)(!e);Object(c.n)(()=>{setTimeout(()=>{P(!e)},300)},[e]);const T=Object(ne.a)(),A=t?i===l.k.Profile?Vs.Profile:i===l.k.SharedMedia?Vs.SharedMedia:i===l.k.MemberList?Vs.MemberList:-1:a?Vs.Search:o?Vs.PollResults:n?Vs.StickerSearch:r?Vs.GifSearch:s?d===l.g.Initial?Vs.ManageInitial:d===l.g.ChatPrivacyType?Vs.ManageChatPrivacyType:d===l.g.Discussion?Vs.ManageDiscussion:d===l.g.ChannelSubscribers?Vs.ManageChannelSubscribers:d===l.g.GroupPermissions?Vs.ManageGroupPermissions:d===l.g.ChatAdministrators?Vs.ManageChatAdministrators:d===l.g.GroupRemovedUsers?Vs.ManageGroupRemovedUsers:d===l.g.GroupUserPermissionsCreate?Vs.ManageGroupUserPermissionsCreate:d===l.g.GroupUserPermissions?Vs.ManageGroupUserPermissions:d===l.g.GroupRecentActions?Vs.ManageGroupRecentActions:d===l.g.ChatAdminRights?Vs.ManageGroupAdminRights:d===l.g.GroupMembers?Vs.ManageGroupMembers:void 0:void 0,R=null!==(E=Object(Ke.a)(A,!0))&&void 0!==E?E:-1;function L(){if(-1!==R)switch(R){case Vs.PollResults:return c.a.createElement("h3",null,T("PollResults"));case Vs.Search:return c.a.createElement(c.a.Fragment,null,c.a.createElement(ie.a,{parentContainerClassName:"RightSearch",value:O,onChange:M}),c.a.createElement(oe.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>C({selectedAt:Object(x.k)(Date.now())}),ariaLabel:"Search messages by date"},c.a.createElement("i",{className:"icon-calendar"})));case Vs.ManageInitial:return c.a.createElement("h3",null,T("Edit"));case Vs.ManageChatPrivacyType:return c.a.createElement("h3",null,T(u?"ChannelTypeHeader":"GroupTypeHeader"));case Vs.ManageDiscussion:return c.a.createElement("h3",null,T("Discussion"));case Vs.ManageChatAdministrators:return c.a.createElement("h3",null,T("ChannelAdministrators"));case Vs.ManageGroupRecentActions:return c.a.createElement("h3",null,T("Group.Info.AdminLog"));case Vs.ManageGroupAdminRights:return c.a.createElement("h3",null,T("EditAdminRights"));case Vs.ManageGroupPermissions:return c.a.createElement("h3",null,T("ChannelPermissions"));case Vs.ManageGroupRemovedUsers:return c.a.createElement("h3",null,T("ChannelBlockedUsers"));case Vs.ManageGroupUserPermissionsCreate:return c.a.createElement("h3",null,T("ChannelAddException"));case Vs.ManageGroupUserPermissions:return c.a.createElement("h3",null,T("UserRestrictions"));case Vs.StickerSearch:return c.a.createElement(ie.a,{value:j,placeholder:T("SearchStickersHint"),onChange:S});case Vs.GifSearch:return c.a.createElement(ie.a,{value:g,placeholder:T("SearchGifsTitle"),onChange:k});case Vs.SharedMedia:return c.a.createElement("h3",null,T("SharedMedia"));case Vs.ManageChannelSubscribers:return c.a.createElement("h3",null,T("ChannelSubscribers"));case Vs.MemberList:case Vs.ManageGroupMembers:return c.a.createElement("h3",null,T("GroupMembers"));default:return c.a.createElement(c.a.Fragment,null,c.a.createElement("h3",null,"Profile"),c.a.createElement("section",{className:"tools"},b&&c.a.createElement(oe.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:T("Edit"),onClick:y},c.a.createElement("i",{className:"icon-edit"}))))}}const F=h.g||A===Vs.SharedMedia||A===Vs.MemberList||s,D=Object(X.a)("animated-close-icon",N&&"no-transition");return Object(c.n)(()=>{w.current.classList.toggle("state-back",F)},[F]),c.a.createElement("div",{className:"RightHeader"},c.a.createElement(oe.a,{className:"close-button",round:!0,color:"translucent",size:"smaller",onClick:m,ariaLabel:T(F?"Common.Back":"Common.Close")},c.a.createElement("div",{ref:w,className:D})),c.a.createElement(ae.a,{name:N?"none":"slide-fade",activeKey:R},L))})),Ws=a(127);function zs(e,t,a,s,r,o,i,l,d,b,u){const h="members"!==s&&r?r:s,O=Object(c.p)(()=>{if(o&&i)return Object(m.Fb)(o.map(({userId:e})=>e),i)},[o,i]),[j,g,f]=function(e,t,a,s){const[c,r]=Object(Ws.a)(a?t:void 0,s,void 0,n.R),o=!c||!s||c[0]===s[0];return[c,r,!o]}(0,t,u,O),[p,I,v]=Ks("media",h,a,u,l,d),[y,C,E]=Ks("documents",h,a,u,l,d),[w,M,S]=Ks("links",h,a,u,l,d),[k,N,P]=Ks("audio",h,a,u,l,d);let T,A,x=!1;switch(h){case"members":T=j,A=g,x=f;break;case"media":T=p,A=I,x=v;break;case"documents":T=y,A=C,x=E;break;case"links":T=w,A=M,x=S;break;case"audio":T=k,A=N,x=P}return[h,T,A,x]}function Ks(e,t,a,s,r,o){const i=Object(c.q)();Object(je.a)(()=>{t===e&&r&&o&&(i.current=Object(m.x)(r,o,e).reverse())},[r,o,t,e]);const[l,d]=Object(Ws.a)(s?a:void 0,i.current,void 0,"media"===e?n.ob:n.X);return[l,d,!(!l||!i.current||l[0]===i.current[0])]}var Qs=a(58);const Ys=Object(g.g)(e=>e(),250,!1);let Js=!1;var Xs=a(113),Zs=a(106);var en=a(133),tn=a(192);a(245);var an=Object(c.h)(({chat:e,user:t,photo:a,isFirstPhoto:s,isSavedMessages:n,lastSyncTime:r,onClick:o})=>{const l=Object(ne.a)(),d=t&&Object(m.qb)(t);function b(s="big",c){if(a&&!c)return`photo${a.id}?size=c`;let r;return n||d||(t?r=Object(m.f)(t,s):e&&(r=Object(m.f)(e,s))),r}const u=b(),h=Object(at.a)(u,!1,i.ApiMediaFormat.BlobUrl,r),O=Object(at.a)(!h&&s?b("normal",!0):void 0,!1,i.ApiMediaFormat.BlobUrl,r),j=Object(tn.a)(!h&&a&&a.thumbnail&&a.thumbnail.dataUri),g=h||O||j,f=Object(na.a)(g);let p="";if(n)p=c.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(d)p=c.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(g)p=c.a.createElement("img",{src:g,className:"avatar-media",alt:"",decoding:"async"});else if(!g&&t){const e=Object(m.ab)(t);p=e?Object(Qe.c)(e,2):void 0}else if(!g&&e){const t=Object(m.l)(l,e);p=t&&Object(Qe.c)(t,Object(m.mb)(e.id)?2:1)}else p=c.a.createElement("div",{className:"spinner-wrapper"},c.a.createElement(me.a,{color:"white"}));const I=Object(X.a)("ProfilePhoto","color-bg-"+Object(m.Y)(t||e),n&&"saved-messages",d&&"deleted-account",!n&&!g&&"no-photo");return c.a.createElement("div",{className:I,onClick:g?o:void 0},f&&g&&f!==g&&c.a.createElement("img",{src:f,className:"prev-avatar-media",alt:"",decoding:"async"}),"string"==typeof p?Object(tt.a)(p,["hq_emoji"]):p)});a(246);var sn=Object(c.h)(Object(s.h)((e,{userId:t,forceShowSelf:a})=>{const{lastSyncTime:s}=e,n=Object(o.Gb)(e,t),c=Object(o.f)(e,t),r=!a&&n&&n.isSelf,{animationLevel:i}=e.settings.byKey;return{lastSyncTime:s,user:n,chat:c,isSavedMessages:r,animationLevel:i}},(e,t)=>Object(d.l)(t,["loadFullUser","openMediaViewer"]))(({user:e,chat:t,isSavedMessages:a,lastSyncTime:s,animationLevel:n,loadFullUser:r,openMediaViewer:o})=>{const{id:d}=e||{},{id:b}=t||{},u=e?Object(m.ab)(e):t?t.title:"",O=(e?e.photos:t?t.photos:void 0)||[],j=n>=1?"slide":"none",[g,f]=Object(c.r)(0),p=a||O.length<=1||0===g,I=a||O.length<=1||g===O.length-1;Object(c.n)(()=>{g>O.length&&f(Math.max(0,O.length-1))},[g,O.length]);const v=Object(ne.a)();Object(c.n)(()=>{s&&d&&r({userId:d})},[d,r,s]),function(e,t,a){Object(c.n)(()=>{t.slice(a,a+4).forEach(e=>{bt.c(`photo${e.id}?size=c`)||bt.b(`photo${e.id}?size=c`,i.ApiMediaFormat.BlobUrl)})},[a,t])}(0,O,g);const y=Object(c.m)(()=>{o({avatarOwnerId:d||b,profilePhotoIndex:g,origin:l.h.ProfileAvatar})},[o,d,b,g]),C=Object(c.m)(()=>{p||f(g-1)},[g,p]),E=Object(c.m)(()=>{I||f(g+1)},[g,I]);if(Object(c.n)(()=>{const e=document.querySelector(".profile-slide-container > .active, .profile-slide-container > .to");if(e)return Object(Oe.b)(e,{excludedClosestSelector:".navigation",onSwipe:h.l?(e,t)=>{t===Oe.a.Right?C():t===Oe.a.Left&&E()}:void 0})},[E,C]),!e&&!t)return;function w(){const s=!a&&O&&O.length>0?O[g]:void 0;return c.a.createElement(an,{key:g,user:e,chat:t,photo:s,isSavedMessages:a,isFirstPhoto:p,onClick:y})}const M=e&&e.isVerified||t&&t.isVerified;return c.a.createElement("div",{className:"ProfileInfo",dir:v.isRtl?"rtl":void 0},c.a.createElement("div",{className:"photo-wrapper"},function(){if(!(a||!O||O.length<=1))return c.a.createElement("div",{className:"photo-dashes"},O.map((e,t)=>c.a.createElement("span",{className:"photo-dash "+(t===g?"current":"")})))}(),c.a.createElement(ae.a,{activeKey:g,name:j,className:"profile-slide-container"},w),!p&&c.a.createElement("button",{type:"button",className:"navigation prev","aria-label":v("AccDescrPrevious"),onClick:C}),!I&&c.a.createElement("button",{type:"button",className:"navigation next","aria-label":v("Next"),onClick:E})),c.a.createElement("div",{className:"info",dir:v.isRtl?"rtl":"auto"},a?c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},v("SavedMessages"))):c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},u&&Object(tt.a)(u)),M&&c.a.createElement(en.a,null)),!a&&(e?c.a.createElement("div",{className:"status "+(Object(m.yb)(e)?"online":"")},c.a.createElement("span",{className:"user-status",dir:"auto"},Object(m.bb)(v,e))):c.a.createElement("span",{className:"status",dir:"auto"},Object(m.kb)(t)?v("Subscribers",t.membersCount,"i"):v("Members",t.membersCount,"i")))))}));var nn=Object(c.h)(Object(s.h)((e,{chatOrUserId:t})=>{const{lastSyncTime:a}=e,s=t?Object(o.f)(e,t):void 0;return{lastSyncTime:a,chat:s,user:Object(m.mb)(t)?Object(o.Gb)(e,t):void 0,canInviteUsers:s&&(!Object(m.kb)(s)&&!Object(m.zb)(s,"inviteUsers")||Object(m.q)(s,"inviteUsers"))}},(e,t)=>Object(d.l)(t,["loadFullUser","updateChatMutedState","showNotification"]))(({lastSyncTime:e,user:t,chat:a,forceShowSelf:s,canInviteUsers:n,loadFullUser:r,showNotification:o,updateChatMutedState:i})=>{const{id:l,fullInfo:d,username:b,phoneNumber:u,isSelf:h}=t||{},{id:O,isMuted:j,username:g}=a||{},f=Object(ne.a)();Object(c.n)(()=>{e&&l&&r({userId:l})},[r,l,e]);const p=Object(c.m)(()=>{i({chatId:O,isMuted:!j})},[O,j,i]);if(!a||a.isRestricted||h&&!s)return;function I(e,t){Object(E.c)(e),o({message:t+" was copied"})}const v=u&&Object(Oa.c)(u),y=Object(m.h)(a),C=0===y.indexOf("http")?y:"http://"+y,w=b||g,M=d&&d.bio||Object(m.g)(a);return c.a.createElement("div",{className:"ChatExtra"},v&&!!v.length&&c.a.createElement(Zs.a,{icon:"phone",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(v,f("Phone"))},c.a.createElement("span",{className:"title",dir:"auto"},v),c.a.createElement("span",{className:"subtitle"},f("Phone"))),w&&c.a.createElement(Zs.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I("@"+w,f("Username"))},c.a.createElement("span",{className:"title",dir:"auto"},Object(tt.a)(w)),c.a.createElement("span",{className:"subtitle"},f("Username"))),M&&!!M.length&&c.a.createElement(Zs.a,{icon:"info",multiline:!0,narrow:!0,isStatic:!0},c.a.createElement("span",{className:"title",dir:"auto"},Object(tt.a)(M,["br","links","emoji"])),c.a.createElement("span",{className:"subtitle"},f(l?"UserBio":"Info"))),n&&!w&&!!y.length&&c.a.createElement(Zs.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(y,f("SetUrlPlaceholder"))},c.a.createElement("div",{className:"title"},c.a.createElement(wa.a,{url:C,className:"title",text:y})),c.a.createElement("span",{className:"subtitle"},f("SetUrlPlaceholder"))),c.a.createElement(Zs.a,{icon:"unmute",ripple:!0,onClick:p},c.a.createElement("span",null,f("Notifications")),c.a.createElement(de,{id:"group-notifications",label:l?"Toggle User Notifications":"Toggle Chat Notifications",checked:!j,inactive:!0})))})),cn=a(165),rn=a(186),on=a(118);a(250);const ln=[{type:"media",title:"SharedMediaTab2"},{type:"documents",title:"SharedFilesTab2"},{type:"links",title:"SharedLinksTab2"},{type:"audio",title:"SharedMusicTab2"}];function dn(e){return[`.shared-media-transition > div:only-child > .${e}-list > .scroll-item`,`.shared-media-transition > div.active > .${e}-list > .scroll-item`].join(", ")}var bn=Object(c.h)(Object(s.h)((e,{chatId:t,userId:a})=>{const s=Object(o.f)(e,t),n=Object(o.m)(e,a||t),{currentType:c,resultsByType:r}=Object(o.v)(e)||{},{foundIds:i}=r&&c&&r[c]||{},{byId:l}=e.users,d=s&&Object(m.lb)(s),b=s&&Object(m.kb)(s),u=d||b&&Object(m.hb)(s),h=s&&s.fullInfo&&s.fullInfo.members,O=u&&s&&s.fullInfo&&!s.fullInfo.canViewMembers;let j;return a?j=a:Object(m.mb)(t)&&(j=t),{isChannel:b,resolvedUserId:j,chatMessages:n,foundIds:i,mediaSearchType:c,hasMembersTab:u,areMembersHidden:O,...u&&h&&{members:h,usersById:l},isRightColumnShown:Object(o.W)(e),isRestricted:s&&s.isRestricted,lastSyncTime:e.lastSyncTime}},(e,t)=>Object(d.l)(t,["setLocalMediaSearchType","loadMoreMembers","searchMediaMessagesLocal","openMediaViewer","openAudioPlayer","openUserInfo","focusMessage","loadProfilePhotos"]))(({chatId:e,profileState:t,onProfileStateChange:a,isChannel:s,resolvedUserId:r,chatMessages:o,foundIds:d,mediaSearchType:b,hasMembersTab:u,areMembersHidden:m,members:O,usersById:j,isRightColumnShown:g,isRestricted:f,lastSyncTime:p,setLocalMediaSearchType:I,loadMoreMembers:v,searchMediaMessagesLocal:y,openMediaViewer:C,openAudioPlayer:E,openUserInfo:w,focusMessage:M,loadProfilePhotos:S})=>{const k=Object(c.q)(null),N=Object(c.q)(null),P=Object(ne.a)(),[T,A]=Object(c.r)(0),x=Object(c.p)(()=>[...u?[{type:"members",title:s?"ChannelSubscribers":"GroupMembers"}]:[],...ln],[u,s]),R=x[T].type,[L,F,D,B]=zs(0,v,y,R,b,O,j,o,d,0,p),U=x.findIndex(({type:e})=>e===L),{handleScroll:H}=function(e,t,a,s){Object(Qs.a)(([a])=>{if(a&&a!==t){const a=e.current,n=a.querySelector(".TabList");a.scrollTop{Js=!1},350))}},[t,s]),Object(Qs.a)(([t])=>{if(a!==l.k.Profile||a===t)return;const n=e.current;if(!n)return;const c=n.querySelector(".TabList");!c||c.offsetTop>n.scrollTop||(Js=!0,Object(vt.a)(n,n.firstElementChild,"start",void 0,2*n.offsetHeight),setTimeout(()=>{Js=!1},350),s(a))},[a]);const n=Object(c.m)(()=>{const a=e.current;if(!a)return;const n=a.querySelector(".TabList");if(!n)return;let c=l.k.Profile;a.scrollTop>=n.offsetTop&&(c="members"===t?l.k.MemberList:l.k.SharedMedia),s(c)},[e,s,t]);return Object(c.n)(()=>{Js||n()},[n,t]),{handleScroll:Object(c.m)(()=>{Js||Ys(n)},[n])}}(k,R,t,a),{applyTransitionFix:G,releaseTransitionFix:q}=function(e,t=".Transition.shared-media-transition"){return Object(c.n)(()=>{function a(){const a=e.current,s=a.querySelector(t),n=a.querySelector(".TabList");s&&n&&(s.style.minHeight=a.offsetHeight-n.offsetHeight+"px")}return a(),window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[e,t]),{applyTransitionFix:Object(c.m)(()=>{const t=e.current;if("hidden"!==t.style.overflowY){const e=t.offsetWidth-t.clientWidth;t.style.overflowY="hidden",t.style.marginRight=e+"px"}},[e]),releaseTransitionFix:Object(c.m)(()=>{const t=e.current;t.style.overflowY="scroll",t.style.marginRight="0"},[e])}}(k),[_,V]=(()=>{const[e,t]=Object(c.r)(!1);return[e,Object(c.m)(()=>{t(e=>!e)},[])]})(),$=Object(c.m)(()=>{q(),V()},[q,V]);Object(c.n)(()=>{I({mediaType:R})},[I,R]);const W=r||e;Object(c.n)(()=>{p&&S({profileId:W})},[S,W,p]);const z=Object(c.m)(e=>{C({chatId:W,threadId:i.MAIN_THREAD_ID,messageId:e,origin:l.h.SharedMedia})},[W,C]),K=Object(c.m)(e=>{E({chatId:W,messageId:e})},[W,E]),Q=Object(c.m)(e=>{w({id:e})},[w]),Y=Object(c.m)(e=>{M({chatId:W,messageId:e})},[W,M]);let J;Object(c.n)(()=>{if(N.current&&h.l)return Object(Oe.b)(N.current,{onSwipe:(e,t)=>{t===Oe.a.Left?A(Math.min(T+1,x.length-1)):t===Oe.a.Right&&A(Math.max(0,T-1))}})},[T,x.length]);const X="members"===L||!u&&"media"===L;X?J=g?0:1e3:F||(J=n.pb);const Z=Object(Es.a)([e,L],J);function ee(){if(!F||!Z||!o){const e=X&&F&&!Z;return c.a.createElement("div",{className:"content empty-list"},!e&&c.a.createElement(me.a,null))}if(!F.length){let e;switch(L){case"members":e=m?"You have no access to group members list.":"No members found";break;case"documents":e=P("lng_media_file_empty_search");break;case"links":e=P("lng_media_link_empty_search");break;case"audio":e=P("lng_media_song_empty_search");break;default:e=P("SharedMedia.EmptyTitle")}return c.a.createElement("div",{className:"content empty-list"},c.a.createElement(on.a,{text:e}))}return c.a.createElement("div",{className:`content ${L}-list`,dir:P.isRtl&&"media"===L?"rtl":void 0,teactFastList:!0},"media"===L?F.map(e=>o[e]&&c.a.createElement(cn.a,{key:e,message:o[e],onClick:z})):"documents"===L?F.map(e=>o[e]&&c.a.createElement(Wt.a,{key:e,message:o[e],withDate:!0,smaller:!0,className:"scroll-item",onDateClick:Y})):"links"===L?F.map(e=>o[e]&&c.a.createElement(rn.a,{key:e,message:o[e],onMessageClick:Y})):"audio"===L?F.map(e=>o[e]&&c.a.createElement(zt.a,{key:e,renderingFor:"sharedMedia",message:o[e],date:o[e].date,lastSyncTime:p,className:"scroll-item",onPlay:K,onDateClick:Y})):"members"===L?F.map((e,t)=>c.a.createElement(Zs.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>Q(e)},c.a.createElement(Ye.a,{userId:e,forceShowSelf:!0}))):void 0)}return c.a.createElement(Xs.a,{ref:k,className:"Profile custom-scroll",itemSelector:dn(L),items:Z?F:void 0,cacheBuster:_,sensitiveArea:n.fb,preloadBackwards:Z?"members"===L?n.R:n.ob:0,noScrollRestoreOnTop:!0,noFastList:!0,onLoadMore:D,onScroll:H},!B&&function(e,t){return c.a.createElement("div",{className:"profile-info"},c.a.createElement(sn,{userId:t||e,forceShowSelf:t!==e}),c.a.createElement(nn,{chatOrUserId:t||e,forceShowSelf:t!==e}))}(e,r),!f&&c.a.createElement("div",{className:"shared-media"},c.a.createElement(ae.a,{ref:N,name:P.isRtl?"slide-reversed":"slide",activeKey:U,renderCount:x.length,shouldRestoreHeight:!0,className:"shared-media-transition",onStart:G,onStop:$},ee),c.a.createElement(pe.a,{big:!0,activeTab:T,tabs:x,onSwitchTab:A})))}));var un=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"RightSearch");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});var mn=Object(c.h)(e=>{const t=Object(Ce.a)(ye.a.Extra,"Management");return t?c.a.createElement(t,e):c.a.createElement(Ee.a,null)});var hn=Object(c.h)(()=>{const e=Object(Ce.a)(ye.a.Extra,"StickerSearch");return e?c.a.createElement(e,null):c.a.createElement(Ee.a,null)});var On=Object(c.h)(()=>{const e=Object(Ce.a)(ye.a.Extra,"GifSearch");return e?c.a.createElement(e,null):c.a.createElement(Ee.a,null)});var jn=Object(c.h)(()=>{const e=Object(Ce.a)(ye.a.Extra,"PollResults");return e?c.a.createElement(e,null):c.a.createElement(Ee.a,null)});a(251);const gn=Object.keys(l.l).length/2,fn=Object.keys(l.g).length/2;function pn(){const e=document.querySelector(".RightHeader .SearchInput input");e&&e.blur()}var In=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a}=Object(o.y)(e)||{},s=Object(o.d)(e);return{contentKey:Object(o.nb)(e),chatId:t,threadId:a,currentProfileUserId:e.users.selectedId,isChatSelected:Boolean(t&&s)}},(e,t)=>Object(d.l)(t,["openUserInfo","toggleChatInfo","toggleManagement","closeLocalTextSearch","setStickerSearchQuery","setGifSearchQuery","closePollResults"]))(({contentKey:e,chatId:t,threadId:a,currentProfileUserId:s,isChatSelected:r,toggleChatInfo:o,toggleManagement:i,openUserInfo:d,closeLocalTextSearch:b,setStickerSearchQuery:u,setGifSearchQuery:m,closePollResults:h})=>{var O;const{width:j}=_e(),[g,f]=Object(c.r)(l.k.Profile),[p,I]=Object(c.r)(l.g.Initial),[v,y]=Object(c.r)(),[C,E]=Object(c.r)(),w=g!==l.k.Profile,M=void 0!==e,S=e===l.l.ChatInfo||e===l.l.UserInfo,k=e===l.l.Search,N=e===l.l.Management,P=e===l.l.StickerSearch,T=e===l.l.GifSearch,A=e===l.l.PollResults,x=j<=n.ab,[R,L]=Object(c.r)(!M),F=null!==(O=Object(Ke.a)(e,!0,!r))&&void 0!==O?O:-1,D=Object(c.m)(()=>{switch(e){case l.l.ChatInfo:if(w){f(l.k.Profile);break}o();break;case l.l.UserInfo:if(w){f(l.k.Profile);break}d({id:void 0});break;case l.l.Management:switch(p){case l.g.Initial:i();break;case l.g.ChatPrivacyType:case l.g.Discussion:case l.g.GroupPermissions:case l.g.GroupType:case l.g.ChatAdministrators:case l.g.ChannelSubscribers:case l.g.GroupMembers:I(l.g.Initial);break;case l.g.GroupUserPermissionsCreate:case l.g.GroupRemovedUsers:case l.g.GroupUserPermissions:I(l.g.GroupPermissions),y(void 0),E(void 0);break;case l.g.ChatAdminRights:case l.g.GroupRecentActions:I(l.g.ChatAdministrators)}break;case l.l.Search:pn(),b();break;case l.l.StickerSearch:case l.l.GifSearch:pn(),u({query:void 0}),m({query:void 0});break;case l.l.PollResults:h()}},[e,w,o,d,h,p,i,b,u,m]),B=Object(c.m)((e,t)=>{y(e),E(t)},[]);function U(){if(-1!==F)switch(F){case l.l.ChatInfo:case l.l.UserInfo:return c.a.createElement(bn,{key:s||t,chatId:t,userId:s,profileState:g,onProfileStateChange:f});case l.l.Search:return c.a.createElement(un,{chatId:t,threadId:a});case l.l.Management:return c.a.createElement(mn,{chatId:t,currentScreen:p,isPromotedByCurrentUser:C,selectedChatMemberId:v,onScreenSelect:I,onChatMemberSelect:B});case l.l.StickerSearch:return c.a.createElement(hn,null);case l.l.GifSearch:return c.a.createElement(On,null);case l.l.PollResults:return c.a.createElement(jn,null)}}return Object(c.n)(()=>M?Object(te.a)(D):void 0,[M,D]),Object(c.n)(()=>{setTimeout(()=>{L(!M)},300)},[M]),Object(c.n)(()=>{M&&x&&D()},[x]),Object(Ot.a)(([a,s])=>{(a===l.l.ChatInfo&&e===l.l.UserInfo||a===l.l.UserInfo&&e===l.l.ChatInfo||s!==t)&&(f(l.k.Profile),I(l.g.Initial))},[e,t]),c.a.createElement("div",{id:"RightColumn-wrapper",className:r?void 0:"is-hidden"},x&&c.a.createElement("div",{className:"overlay-backdrop",onClick:D}),c.a.createElement("div",{id:"RightColumn"},c.a.createElement($s,{chatId:t,isColumnOpen:M,isProfile:S,isSearch:k,isManagement:N,isStickerSearch:P,isGifSearch:T,isPollResults:A,profileState:g,managementScreen:p,onClose:D}),c.a.createElement(ae.a,{name:R?"none":"zoom-fade",renderCount:gn+fn,activeKey:N?gn+p:F},U)))}));var vn=Object(c.h)(({isOpen:e})=>{const t=Object(Ce.a)(ye.a.Extra,"MediaViewer",!e);return t?c.a.createElement(t,null):void 0});var yn=Object(c.h)(({isOpen:e})=>{const t=Object(Ce.a)(ye.a.Extra,"Notifications",!e);return t?c.a.createElement(t,null):void 0});var Cn=Object(c.h)(({isOpen:e})=>{const t=Object(Ce.a)(ye.a.Extra,"Errors",!e);return t?c.a.createElement(t,null):void 0});var En=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"ForwardPicker",!t);return a?c.a.createElement(a,e):void 0});var wn=Object(c.h)(e=>{const{url:t}=e,a=Object(Ce.a)(ye.a.Extra,"SafeLinkModal",!t);return a?c.a.createElement(a,e):void 0});var Mn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Ce.a)(ye.a.Extra,"HistoryCalendar",!t);return a?c.a.createElement(a,e):void 0});a(252);let Sn,kn,Nn=!1;function Pn(e){document.querySelectorAll('link[rel="icon"]').forEach(t=>{e?t.href.includes("favicon-unread")||(t.href=t.href.replace("favicon","favicon-unread")):t.href=t.href.replace("favicon-unread","favicon")})}var Tn=Object(c.h)(Object(s.h)(e=>{const{chatId:t,messageId:a}=e.audioPlayer,s=t&&a?Object(o.k)(e,t,a):void 0;return{animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime,isLeftColumnShown:e.isLeftColumnShown,isRightColumnShown:Object(o.W)(e),isMediaViewerOpen:Object(o.T)(e),isForwardModalOpen:Object(o.R)(e),hasNotifications:Boolean(e.notifications.length),hasErrors:Boolean(e.errors.length),audioMessage:s,safeLinkModalUrl:e.safeLinkModalUrl,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}},(e,t)=>Object(d.l)(t,["loadAnimatedEmojis","loadNotificationSettings","loadNotificationExceptions"]))(({lastSyncTime:e,isLeftColumnShown:t,isRightColumnShown:a,isMediaViewerOpen:r,isForwardModalOpen:i,animationLevel:l,hasNotifications:d,hasErrors:b,audioMessage:u,safeLinkModalUrl:m,isHistoryCalendarOpen:h,loadAnimatedEmojis:O,loadNotificationSettings:j,loadNotificationExceptions:g})=>{n.p&&!Nn&&(Nn=!0,console.log(">>> RENDER MAIN")),Object(c.n)(()=>{e&&(O(),j(),g())},[e,O,g,j]);const{transitionClassNames:f}=Object(Z.a)(!t,void 0,!0),{transitionClassNames:p}=Object(Z.a)(a,void 0,!0),I=Object(X.a)(f.replace(/([\w-]+)/g,"middle-column-$1"),p.replace(/([\w-]+)/g,"right-column-$1"));function v(e){e.preventDefault(),e.stopPropagation()}return Object(c.n)(()=>{document.body.classList.toggle("is-middle-column-open",I.includes("middle-column-open")),document.body.classList.toggle("is-right-column-shown",I.includes("right-column-open"))},[I]),Object(c.n)(()=>{l>0&&(document.body.classList.add("animating-right-column"),Object(J.b)(350+n.c),Sn&&(clearTimeout(Sn),Sn=void 0),Sn=window.setTimeout(()=>{document.body.classList.remove("animating-right-column"),Sn=void 0},350+n.c))},[l,a]),Object(ee.a)(()=>{const e=Object(o.q)(Object(s.e)());let t=0;clearInterval(kn),kn=window.setInterval(()=>{if(document.title.includes(n.D))Pn(!1);else{if(t%2==0){const t=Object(o.q)(Object(s.e)())-e;t>0&&(document.title=`${t} notification${t>1?"s":""}`,Pn(!0))}else document.title=n.eb,Pn(!1);t++}},1e3)},()=>{clearInterval(kn),kn=void 0,document.title.includes(n.D)||(document.title=n.eb),Pn(!1)}),c.a.createElement("div",{id:"Main",className:I,onDrop:v,onDragOver:v},c.a.createElement(Be,null),c.a.createElement(qs,null),c.a.createElement(In,null),c.a.createElement(vn,{isOpen:r}),c.a.createElement(En,{isOpen:i}),c.a.createElement(yn,{isOpen:d}),c.a.createElement(Cn,{isOpen:b}),u&&c.a.createElement(mt,{key:u.id,message:u,noUi:!0}),c.a.createElement(wn,{url:m}),c.a.createElement(Mn,{isOpen:h}))}));n.p&&console.log(">>> FINISH LOAD MAIN BUNDLE"),Object(s.e)().connectionState||Object(s.d)().initApi()},198:function(e,t,a){},199:function(e,t,a){},200:function(e,t,a){},211:function(e,t,a){},212:function(e,t,a){},213:function(e,t,a){},216:function(e,t,a){},217:function(e,t,a){},218:function(e,t,a){},222:function(e,t,a){},223:function(e,t,a){},225:function(e,t,a){},228:function(e,t,a){},229:function(e,t,a){},230:function(e,t,a){},231:function(e,t,a){},232:function(e,t,a){},233:function(e,t,a){},234:function(e,t,a){},235:function(e,t,a){},236:function(e,t,a){},237:function(e,t,a){},238:function(e,t,a){},240:function(e,t,a){},241:function(e,t,a){},242:function(e,t,a){},243:function(e,t,a){},244:function(e,t,a){},245:function(e,t,a){},246:function(e,t,a){},250:function(e,t,a){},251:function(e,t,a){},252:function(e,t,a){}}]); +//# sourceMappingURL=4.456420358e011b532a42.js.map \ No newline at end of file diff --git a/dist/4.7d611cd5e39f10293bca.js.map b/dist/4.456420358e011b532a42.js.map similarity index 99% rename from dist/4.7d611cd5e39f10293bca.js.map rename to dist/4.456420358e011b532a42.js.map index 77ae58270..9ddf5f3cd 100644 --- a/dist/4.7d611cd5e39f10293bca.js.map +++ b/dist/4.456420358e011b532a42.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/modules/actions/ui/chats.ts","webpack:///./src/modules/actions/ui/messages.ts","webpack:///./src/modules/actions/ui/globalSearch.ts","webpack:///./src/modules/actions/ui/localSearch.ts","webpack:///./src/modules/actions/ui/stickerSearch.ts","webpack:///./src/modules/actions/ui/users.ts","webpack:///./src/modules/actions/ui/settings.ts","webpack:///./src/modules/actions/ui/misc.ts","webpack:///./src/modules/actions/ui/payments.ts","webpack:///./src/modules/actions/api/chats.ts","webpack:///./src/modules/actions/api/messages.ts","webpack:///./src/modules/actions/api/symbols.ts","webpack:///./src/modules/actions/api/globalSearch.ts","webpack:///./src/modules/actions/api/sync.ts","webpack:///./src/modules/actions/api/localSearch.ts","webpack:///./src/modules/actions/api/management.ts","webpack:///./src/modules/actions/api/users.ts","webpack:///./src/modules/actions/api/settings.ts","webpack:///./src/modules/actions/api/bots.ts","webpack:///./src/modules/actions/api/twoFaSettings.ts","webpack:///./src/modules/actions/api/payments.ts","webpack:///./src/util/requestQuery.ts","webpack:///./src/modules/actions/apiUpdaters/chats.ts","webpack:///./src/modules/actions/apiUpdaters/messages.ts","webpack:///./src/modules/actions/apiUpdaters/users.ts","webpack:///./src/modules/actions/apiUpdaters/symbols.ts","webpack:///./src/modules/actions/apiUpdaters/misc.ts","webpack:///./src/modules/actions/apiUpdaters/settings.ts","webpack:///./src/modules/actions/apiUpdaters/twoFaSettings.ts","webpack:///./src/components/ui/Switcher.tsx","webpack:///./src/components/left/main/LeftMainHeader.tsx","webpack:///./src/components/left/ConnectionState.tsx","webpack:///./src/hooks/useThrottledMemo.ts","webpack:///./src/hooks/useThrottle.ts","webpack:///./src/components/left/main/ChatFolders.tsx","webpack:///./src/components/left/search/LeftSearch.async.tsx","webpack:///./src/components/left/main/ContactList.async.tsx","webpack:///./src/components/left/NewChatButton.tsx","webpack:///./src/components/left/main/LeftMain.tsx","webpack:///./src/components/left/settings/Settings.async.tsx","webpack:///./src/components/left/newChat/NewChat.async.tsx","webpack:///./src/components/left/ArchivedChats.async.tsx","webpack:///./src/components/left/LeftColumn.tsx","webpack:///./src/hooks/useWindowSize.ts","webpack:///./src/components/middle/helpers/calculateMiddleFooterTransforms.ts","webpack:///./src/components/middle/HeaderMenuContainer.async.tsx","webpack:///./src/components/middle/HeaderActions.tsx","webpack:///./src/hooks/useWebpThumbnail.ts","webpack:///./src/components/middle/PinnedMessageNavigation.tsx","webpack:///./src/components/middle/HeaderPinnedMessage.tsx","webpack:///./src/components/middle/AudioPlayer.tsx","webpack:///./src/components/middle/MiddleHeader.tsx","webpack:///./src/components/middle/helpers/groupMessages.ts","webpack:///./src/components/middle/hooks/useStickyDates.ts","webpack:///./src/hooks/useDebounce.ts","webpack:///./src/components/middle/MessageScroll.tsx","webpack:///./src/components/middle/message/helpers/buildContentClassName.ts","webpack:///./src/components/middle/message/helpers/mediaDimensions.ts","webpack:///./src/components/middle/message/helpers/calculateAlbumLayout.ts","webpack:///./src/components/middle/message/helpers/calculateAuthorWidth.ts","webpack:///./src/components/middle/message/hooks/useFocusMessage.ts","webpack:///./src/components/middle/message/ContextMenuContainer.async.tsx","webpack:///./src/components/middle/ActionMessage.tsx","webpack:///./src/components/common/EmbeddedMessage.tsx","webpack:///./src/components/middle/message/MessageMeta.tsx","webpack:///./src/components/middle/message/Sticker.tsx","webpack:///./src/components/middle/message/hooks/useBlurredMediaThumbRef.ts","webpack:///./src/components/middle/message/helpers/getCustomAppendixBg.ts","webpack:///./src/components/middle/message/Photo.tsx","webpack:///./src/hooks/useHeavyAnimationCheckForVideo.ts","webpack:///./src/components/middle/message/hooks/usePauseOnInactive.ts","webpack:///./src/components/middle/message/Video.tsx","webpack:///./src/components/middle/message/Contact.tsx","webpack:///./src/components/ui/CheckboxGroup.tsx","webpack:///./src/components/middle/message/PollOption.tsx","webpack:///./src/components/middle/message/Poll.tsx","webpack:///./src/components/middle/message/WebPage.tsx","webpack:///./src/components/middle/message/Invoice.tsx","webpack:///./src/components/middle/message/hocs/withSelectControl.tsx","webpack:///./src/components/middle/message/Album.tsx","webpack:///./src/components/middle/message/RoundVideo.tsx","webpack:///./src/components/middle/message/InlineButtons.tsx","webpack:///./src/components/middle/message/CommentButton.tsx","webpack:///./src/components/middle/message/Message.tsx","webpack:///./src/components/middle/MessageList.tsx","webpack:///./src/components/middle/ScrollDownButton.tsx","webpack:///./src/components/middle/composer/helpers/buildAttachment.ts","webpack:///./node_modules/opus-recorder/dist/encoderWorker.min.js","webpack:///./src/util/voiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useClipboardPaste.ts","webpack:///./src/components/middle/composer/helpers/getMessageTextAsHtml.ts","webpack:///./src/components/middle/composer/hooks/useDraft.ts","webpack:///./src/components/common/DeleteMessageModal.async.tsx","webpack:///./src/components/ui/ResponsiveHoverButton.tsx","webpack:///./src/components/middle/composer/AttachMenu.async.tsx","webpack:///./src/components/middle/composer/SymbolMenu.async.tsx","webpack:///./src/components/middle/composer/MentionTooltip.async.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.async.tsx","webpack:///./src/components/middle/composer/StickerTooltip.async.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.async.tsx","webpack:///./src/components/middle/composer/ComposerEmbeddedMessage.tsx","webpack:///./src/components/middle/composer/AttachmentModal.async.tsx","webpack:///./src/components/middle/composer/PollModal.async.tsx","webpack:///./src/components/middle/composer/DropArea.async.tsx","webpack:///./src/components/middle/composer/WebPagePreview.tsx","webpack:///./src/components/common/CalendarModal.async.tsx","webpack:///./src/components/payment/PaymentModal.async.tsx","webpack:///./src/components/payment/ReceiptModal.async.tsx","webpack:///./src/components/middle/composer/Composer.tsx","webpack:///./src/components/middle/composer/hooks/useVoiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useStickerTooltip.ts","webpack:///./src/util/insertHtmlInSelection.ts","webpack:///./src/util/deleteLastCharacterOutsideSelection.ts","webpack:///./src/components/middle/composer/hooks/useEditing.ts","webpack:///./src/components/middle/MobileSearch.async.tsx","webpack:///./src/components/middle/MessageSelectToolbar.async.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.async.tsx","webpack:///./src/components/middle/MiddleColumn.tsx","webpack:///./src/hooks/useCustomBackground.ts","webpack:///./src/components/right/RightHeader.tsx","webpack:///./src/components/right/hooks/useProfileViewportIds.ts","webpack:///./src/components/right/hooks/useProfileState.ts","webpack:///./src/components/right/ProfilePhoto.tsx","webpack:///./src/components/right/ProfileInfo.tsx","webpack:///./src/components/right/hooks/usePhotosPreload.ts","webpack:///./src/components/right/ChatExtra.tsx","webpack:///./src/components/right/Profile.tsx","webpack:///./src/components/right/hooks/useTransitionFixes.ts","webpack:///./src/hooks/useCacheBuster.ts","webpack:///./src/components/right/RightSearch.async.tsx","webpack:///./src/components/right/management/Management.async.tsx","webpack:///./src/components/right/StickerSearch.async.tsx","webpack:///./src/components/right/GifSearch.async.tsx","webpack:///./src/components/right/PollResults.async.tsx","webpack:///./src/components/right/RightColumn.tsx","webpack:///./src/components/mediaViewer/MediaViewer.async.tsx","webpack:///./src/components/main/Notifications.async.tsx","webpack:///./src/components/main/Errors.async.tsx","webpack:///./src/components/main/ForwardPicker.async.tsx","webpack:///./src/components/main/SafeLinkModal.async.tsx","webpack:///./src/components/main/HistoryCalendar.async.tsx","webpack:///./src/components/main/Main.tsx","webpack:///./src/bundles/main.ts"],"names":["window","addEventListener","e","state","chatId","id","threadId","messageListType","type","getDispatch","openChat","noPushState","addReducer","global","actions","payload","currentMessageList","selectCurrentMessageList","exitMessageSelectMode","messages","contentToBeScheduled","undefined","forwardMessages","toChatId","setGlobal","history","pushState","updateCurrentMessageList","isChatInfoShown","chatCreation","blurTimeout","scrollOffset","replaceThreadParam","messageId","paramName","chatMessages","selectChatMessages","viewportIds","selectViewportIds","lastOwnEditableMessageId","findLast","Boolean","selectAllowedMessageActions","canEdit","targetIndexDelta","replyingToId","selectReplyingToId","selectIsViewportNewest","chatMessageKeys","Object","keys","newIndex","indexOf","toString","length","Number","MAIN_THREAD_ID","chat","selectChat","lastMessage","threadInfo","selectThreadInfo","lastMessageId","setReplyingToId","focusMessage","avatarOwnerId","profilePhotoIndex","origin","mediaViewer","audioPlayer","selectIsRightColumnShown","pollResults","voters","setTimeout","newGlobal","getGlobal","noHighlight","groupedId","groupedChatId","ids","selectForwardedMessageIdsByGroupId","shouldSwitchChat","clearTimeout","updateFocusedMessage","updateFocusDirection","FocusDirection","Static","includes","direction","Down","Up","loadViewportMessages","fromChatId","messageIds","groupedMessageIds","selectMessageIdsByGroupId","isModalShown","closeMediaViewer","selectedMessages","openForwardMenu","selectCurrentChat","enterMessageSelectMode","childMessageIds","withShift","toggleMessageSelection","isPollModalOpen","query","globalSearch","updateGlobalSearch","globalResults","localResults","resultsByType","fetchingStatus","chats","recentlyFoundChatIds","newRecentIds","filter","unshift","pop","content","updateGlobalSearchContent","updateLocalTextSearch","replaceLocalTextSearchResults","chatThreadKey","buildChatThreadKey","currentQuery","localTextSearch","byChatThreadKey","MEMO_EMPTY_ARRAY","mediaType","updateLocalMediaSearchType","stickers","search","resultIds","gifs","offsetId","results","updateSelectedUserId","replaceSettings","theme","settings","replaceThemeSettings","management","byChatId","isActive","IS_MOBILE_SCREEN","isLeftColumnShown","action","emoji","recentEmojis","newEmojis","sticker","recent","hash","newStickers","s","notification","newNotifications","notifications","existingNotificationIndex","findIndex","n","message","splice","push","error","getReadableErrorText","newErrors","errors","existingErrorIndex","err","url","safeLinkModalUrl","selectedAt","historyCalendarSelectedAt","payment","isPaymentModalOpen","clearPayment","closeInvoice","runThrottledForLoadChats","throttle","cb","runThrottledForLoadTopChats","runDebouncedForLoadFullChat","debounce","async","loadChats","listType","offsetDate","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","orderedPinnedIds","chatIds","shift","addUsers","buildCollectionByKey","users","updateChats","updateChatListIds","updateChatListSecondaryInfo","draftsById","map","forEach","replyingToById","isFullyLoaded","loadFullChat","fullInfo","updateChat","openChatByUsername","username","channelPostId","localChat","selectChatByUsername","isMin","previousChat","showNotification","preloadedChatIds","i","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","pause","byId","listIds","active","currentChatId","pinnedChats","otherChats","prepareChatList","chatToPreload","find","currentUserId","hasUnreadMark","toggleChatUnread","isChatSummaryOnly","requestChatUpdate","user","selectUser","selectThreadTopMessageId","requestThreadInfoUpdate","selectSupportChat","TIPS_USERNAME","oldestChat","selectIsChatPinned","sort","chat1","chat2","date","force","isMuted","title","about","photo","memberIds","progress","ChatCreationProgress","InProgress","createdChannel","channelId","accessHash","Complete","Error","createChannel","createdChat","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","emoticon","orderedIds","maxId","recommendedId","description","newFolder","createChatFolder","Math","max","apply","deleteChatFolder","unreadCount","match","RE_TME_INVITE_LINK","exec","RE_TME_LINK","isEnabled","isChatBasicGroup","bannedRights","userId","chatAfterUpdate","members","kickedMembers","isBanned","viewMessages","isUnblocked","m","adminRights","customTitle","adminMembers","isDismissed","updateManagementProgress","ManagementProgress","Promise","all","groups","addedById","reduce","group","addChats","forDiscussionIds","channel","fullChat","isPreHistoryHidden","linkedChatId","activeChatFolder","offset","uploadProgressCallbacks","Map","runThrottledForMarkRead","isOutlying","isBudgetPreload","addOffset","LoadMoreDirection","Backwards","Around","round","MESSAGE_LIST_SLICE","Forwards","selectThreadOriginChat","threadInfos","addChatMessagesById","updateOutlyingIds","updateListedIds","updateThreadInfos","listedIds","selectListedIds","outlyingIds","selectOutlyingIds","areSortedArraysIntersecting","historyIds","newViewportIds","getViewportSlice","safeReplaceViewportIds","sourceIds","index","findClosestIndex","indexForDirection","from","to","slice","areSomeLocal","areAllLocal","sendMessage","params","localId","progressCallback","attachment","messageLocalId","has","set","fileUploads","byMessageLocalId","replyingTo","rafPromise","delete","isRestricted","resolve","loadWithBudget","selectFocusedMessageId","selectRealLastReadId","replyOriginForId","MESSAGE_DELETED","replyMessage","selectChatMessage","updateChatMessage","replyToMessageId","loadMessage","scheduledAt","clearWebPagePreview","value","noWebPage","selectNoWebPage","isSingle","attachments","isGrouped","restParams","text","entities","commonParams","groupedAttachments","split","MAX_MEDIA_FILES_FOR_ALBUM","firstAttachment","restAttachments","Date","now","selectEditingMessage","setEditingId","get","previousLocalId","cancelApiProgress","apiUpdate","draft","replyToMsgId","localOnly","selectDraft","isUnpin","isOneSide","isSilent","unpinAllMessages","shouldDeleteForAll","editingId","selectEditingId","selectEditingScheduledId","webPagePreview","loadWebPagePreview","options","option","shouldResetVoters","v","a","offsets","nextOffset","loadPollOptionResults","fromChat","toChat","b","scheduledMessages","historyHash","replaceScheduledMessages","loadScheduledHistory","selectScheduledMessage","loadPinnedMessages","copyTextToClipboard","link","searchThrottled","searchGifs","updateGifSearch","added","addedStickers","updateStickerSets","sets","loadStickerSets","setIds","addedSetIds","loadStickers","stickerSetId","recentStickers","loadRecentStickers","favorite","favoriteStickers","loadFavoriteStickers","featured","featuredStickers","loadFeaturedStickers","stickerSetAccessHash","stickerSet","selectStickerSet","packs","updateStickerSet","currentEmoji","forEmoji","rebuildStickersForEmoji","replaceAnimatedEmojis","loadAnimatedEmojis","saved","savedGifs","loadSavedGifs","unfave","unfaveSticker","installedDate","language","currentEmojiKeywords","selectEmojiKeywords","isLoading","emojiKeywords","fromVersion","version","keywords","setsById","searchWords","searchStickers","updateStickersForEmoji","loadStickersForEmoji","searchMessagesGlobal","offsetRate","maxDate","minDate","localResult","chatOrUser","GLOBAL_SEARCH_SLICE","totalCount","nextOffsetId","nextRate","currentSearchQuery","selectCurrentGlobalSearchQuery","updateGlobalSearchFetchingStatus","addMessages","updateGlobalSearchResults","loadAndReplaceArchivedChats","updateUsers","replaceChatListIds","loadAndUpdateUsers","userIds","contactIds","contactList","updatedUsers","localChats","localUsers","globalChats","globalUsers","searchChats","timestampPlusDay","foundIds","currentSearch","selectCurrentTextSearch","topMessageId","MESSAGE_SEARCH_SLICE","newFoundIds","updateLocalTextSearchResults","searchTextMessages","peerId","selectCurrentMediaSearchPeerId","selectCurrentMediaSearch","currentType","currentResults","SHARED_MEDIA_SLICE","updateLocalMediaSearchResults","searchSharedMedia","timestamp","searchMessagesByDate","updateManagement","isUsernameAvailable","afterSyncCallback","DEBUG","console","log","savedUsers","savedPrivateChatIds","savedChats","selectedChat","isChatPrivate","selectedChatUser","replaceChats","loadAndReplaceChats","areMessagesLoaded","draftsByChatId","acc","lastReadInboxMessageId","newCurrentChatId","currentMessageListInfo","threadsById","Array","prototype","concat","replaceUsers","audioChatId","audioMessageId","closeAudioPlayer","loadAndReplaceMessages","lastSyncTime","sync","afterSync","runDebouncedForFetchFullUser","buildInputPrivacyRules","visibility","allowedIds","deniedIds","usersById","chatsById","rules","collectUsers","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","lastRequestedAt","topPeers","usersHash","loadTopUsers","getCompareString","lastName","firstName","collator","Intl","Collator","sortedUsers","compare","isSelf","loadContactList","updateChatMutedState","phone","phoneNumber","updateUser","updateContact","deleteUser","profileId","isPrivate","photos","button","sendBotCommand","command","openTelegramLink","toggleSafeLinkModal","data","alert","isError","showError","answerCallbackButton","openPollModal","getReceipt","receiptMessageId","getPaymentForm","setInvoiceMessageInfo","openPaymentModal","bio","profileEdit","ProfileEditProgress","currentUser","Idle","loadedWallpapers","wallpapers","file","previewBlobUrl","URL","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","document","fileName","size","mimeType","wallpaper","firstWallpaper","withLocalMedia","blocked","blockedIds","contactId","addBlockedContact","removeBlockedContact","activeSessions","session","isCurrent","peerType","shouldShowPreviews","updateNotifySettings","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","hasPassword","updateTwoFaSettings","hint","currentPassword","onSuccess","isSuccess","password","email","waitingEmailCodeLength","code","requestInfo","saveInfo","selectPaymentMessageId","shouldSave","shippingOptions","setRequestInfoId","updateShippingOptions","setPaymentStep","PaymentStep","Shipping","PaymentInfo","validateRequestedInfo","setPaymentForm","step","invoice","shippingAddressRequested","nameRequested","phoneRequested","emailRequested","ShippingInfo","setReceipt","receipt","publishableKey","selectProviderPublishableKey","credentials","k","join","buildQueryString","cardNumber","expiryMonth","expiryYear","cvv","zip","country","response","fetch","method","headers","Authorization","json","getStripeError","setStripeCardInfo","Checkout","sendStipeCredentials","shippingOptionId","saveCredentials","requestInfoId","selectPaymentRequestId","stripeCredentials","selectStripeCredentials","requestedInfoId","sendPaymentForm","save","runThrottledForUpdateAppBadge","update","noTopChatsRequest","selectIsChatListed","loadTopChats","newProfilePhoto","selectCountNotMutedUnread","updateAppBadge","isNotJoined","listId","typingStatus","senderId","isFromScheduled","isActiveChat","hasUnreadMention","unreadMentionsCount","showNewMessageNotification","messageUpdate","selectCommonBoxChatId","targetChat","newOrderedPinnedIds","MAX_ACTIVE_PINNED_CHATS","updateChatListType","chatFoldersById","newChatFoldersById","pick","newOrderedIds","orderedId","folders","replacedMembers","addedMember","deletedMemberId","shouldUpdate","some","deleteIndex","isOwner","isAdmin","membersCount","formattedText","updateWithLocalMedia","isScheduled","currentMessage","video","getMessageContent","blobUrl","thumbnail","isPreloadedGlobally","updateScheduledMessage","updateListedAndViewportIds","firstUnreadId","selectFirstUnreadId","addViewportId","firstMessageId","selectThreadByMessage","isMessageLocal","updateChatLastMessage","currentLastMessage","findLastMessage","isDeleting","deleteMessages","newLastMessage","threadIdsToUpdate","unique","deleteChatMessages","chatsIdsToUpdate","commonBoxChatId","updateThreadInfo","newMessage","isMessageInCurrentMessageList","isOutgoing","scheduledIds","selectScheduledIds","selectScheduledMessages","deleteChatScheduledMessages","currentPinnedIds","selectPinnedIds","newTheadInfo","messagesById","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","poll","updatedPoll","updatedResults","isChosen","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","newResults","targetOption","targetOptionIndex","updatedOption","votersCount","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","key","addNotifyException","twoFaSettings","memo","name","label","checked","disabled","inactive","noAnimation","onChange","onCheck","handleChange","useCallback","currentTarget","className","buildClassName","ANIMATION_LEVEL_OPTIONS","withGlobal","searchQuery","animationLevel","byKey","globalSearchChatId","searchDate","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","setGlobalSearchChatId","onReset","openTipsChat","setGlobalSearchDate","setSettingOption","lang","useLang","hasMenu","LeftColumnContent","ChatList","clearedDateSearchParam","clearedChatSearchParam","selectedSearchDate","useMemo","formatDateToString","archivedUnreadChatsCount","values","total","MainButton","onTrigger","isOpen","Button","ripple","color","onClick","ariaLabel","handleSearchFocus","handleSelectSaved","handleDarkModeToggle","stopPropagation","newTheme","switchTheme","handleAnimationLevelChange","newLevel","_","body","classList","toggle","isSearchFocused","GlobalSearch","Contacts","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_NAME","APP_VERSION","MenuItem","icon","toLowerCase","href","FEEDBACK_URL","localStorage","setItem","JSON","stringify","SearchInput","inputId","parentContainerClassName","focused","placeholder","autoComplete","canClose","onFocus","PickerSelectedItem","isMinimized","clickArg","chatOrUserId","connectionState","dir","isRtl","Spinner","resolverFn","ms","dependencies","valueRef","useRef","runThrottled","useThrottle","forceUpdate","useForceUpdate","useOnChange","isSync","current","orderedFolderIds","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","setActiveChatFolder","transitionRef","useEffect","displayedFolders","folderCountersById","useThrottledMemo","counters","unreadDialogsCount","hasActiveDialogs","getFolderUnreadDialogs","badgeCount","isBadgeActive","folderTabs","handleSwitchTab","IS_TOUCH_ENV","captureEvents","onSwipe","SwipeDirection","Left","min","Right","isNotInAllTabRef","captureEscKeyListener","handleKeyDown","metaKey","startsWith","digit","preventDefault","removeEventListener","shouldRender","shouldRenderPlaceholder","transitionClassNames","useShowTransition","renderCurrentTab","activeFolder","folderType","noChatsText","TabList","tabs","activeTab","onSwitchTab","Transition","ref","activeKey","renderCount","props","LeftSearch","useModuleLoader","Bundles","Extra","Loading","ContactList","closeTimeout","isShown","onNewPrivateChat","onNewChannel","onNewGroup","isMenuOpen","setIsMenuOpen","useState","fabClassName","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","tabIndex","Menu","positionX","positionY","autoClose","onClose","TRANSITION_RENDER_COUNT","onContentChange","isNewChatButtonShown","setIsNewChatButtonShown","isMouseInside","handleSelectSettings","Settings","handleSelectContacts","handleSelectNewChannel","NewChannelStep1","handleSelectNewGroup","NewGroupStep1","handleSelectArchived","Archived","autoCloseTimeout","NewChat","ContentType","ArchivedChats","RENDER_COUNT","setGlobalSearchQuery","resetChatCreation","loadPasswordInfo","clearTwoFaError","setContent","settingsScreen","setSettingsScreen","SettingsScreens","Main","setContactsFilter","lastResetTime","setLastResetTime","contentType","NewChannelStep2","NewChannel","NewGroupStep2","NewGroup","handleReset","forceReturnToChatList","pickerSearchInput","getElementById","blur","EditProfile","Folders","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaCongratulations","PrivacyPhoneNumberAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenAllowedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingAllowedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsAllowedContacts","PrivacyGroupChatsDeniedContacts","TwoFaNewPassword","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaNewPasswordEmail","TwoFaNewPasswordEmailCode","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaChangePasswordHint","TwoFaRecoveryEmail","TwoFaRecoveryEmailCode","FoldersCreateFolder","FoldersEditFolder","handleSearchQuery","currentScreen","onScreenSelect","isChannel","setSize","windowSize","handleResize","calculateMiddleFooterTransforms","windowWidth","canPost","sidePadding","MOBILE_SCREEN_MAX_WIDTH","messageListWidth","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","leftColumnWidth","rightColumnWidth","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","getMessageListWidth","sendButtonWidth","composerWidth","toolbarWidth","composerHiddenScale","toolbarHiddenScale","composerTranslateX","toolbarTranslateX","unpinHiddenScale","toolbarForUnpinHiddenScale","HeaderMenuContainer","isChatChannel","noMenu","isChatWithSelf","selectIsChatWithSelf","isMainThread","isDiscussionThread","isRightColumnShown","canStartBot","selectIsChatBotNotStarted","canSubscribe","isChatSuperGroup","canSearch","canMute","canSelect","selectIsInSelectMode","canLeave","joinChannel","openLocalTextSearch","menuButtonRef","menuPosition","setMenuPosition","handleHeaderMenuOpen","rect","getBoundingClientRect","x","right","y","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleSearchClick","querySelector","focus","searchInput","fluid","anchor","onSubscribeChannel","onSearchClick","onCloseAnimationEnd","useWebpThumbnail","getMessageMediaThumbDataUri","shouldDecodeThumbnail","isWebpSupported","thumbnailDecoded","setThumbnailDecoded","EMPTY_IMAGE_DATA_URI","useLayoutEffect","webpToPngBase64","then","catch","drawRect","width","height","radius","count","containerRef","markupParams","reverseIndex","barHeight","getBarHeight","markHeight","getMarkHeight","trackHeight","getTrackHeight","clipPathId","clipPath","d","getClipPath","markTranslateY","getMarkTranslateY","trackTranslateY","getTrackTranslateY","calculateMarkup","firstChild","firstElementChild","currentElement","style","transform","svg","div","defs","innerHTML","onUnpinMessage","onAllPinnedClick","mediaThumbnail","mediaBlobUrl","useMedia","getMessageMediaHash","getMessageSummaryText","isUnpinDialogOpen","openUnpinDialog","closeUnpinDialog","useFlag","handleUnpinMessage","ConfirmDialog","confirmLabel","confirmHandler","thumbDataUri","getPictogramDimensions","src","alt","renderPictogram","renderText","RippleEffect","sender","selectSender","noUi","senderName","getSenderTitle","mediaData","mediaLoader","playPause","isPlaying","useAudioPlayer","getMessageKey","getMediaDuration","handleClick","handleClose","audio","getMessageAudio","performer","renderAudio","subtitle","renderVoice","audioMessage","originChat","messagesCount","pinnedIds","isSelectModeActive","originChatId","isChatWithBot","selectIsChatWithBot","assign","pinnedMessageId","topMessageSender","selectForwardedSender","pinnedMessageIds","canUnpin","firstPinnedMessage","openChatWithInfo","pinMessage","toggleLeftColumn","pinnedMessageIndex","setPinnedMessageIndex","isArray","pinnedMessage","pinnedMessagesCount","chatTitleLength","getChatTitle","topMessageTitle","useEnsureMessage","useWindowSize","isLeftColumnHideable","shouldShowCloseButton","componentRef","shouldAnimateTools","handleHeaderClick","handlePinnedMessageClick","cycleRestrict","handleAllPinnedClick","handleBackClick","messageInput","EDITABLE_INPUT_ID","currentChat","selectIsChatMuted","canToolsCollideWithChatInfo","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","shouldUseStackedToolsClass","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","shouldRenderAudioPlayer","audioPlayerClassNames","renderingAudioMessage","useCurrentOrPrev","shouldRenderPinnedMessage","pinnedMessageClassNames","renderingPinnedMessage","renderingPinnedMessageTitle","canRevealTools","renderInfo","renderBackButton","PrivateChatInfo","withFullInfo","withMediaViewer","withUpdatingStatus","noRtl","GroupChatInfo","asClose","unreadCountInfo","formatIntegerCompact","componentEl","add","remove","isAlbum","messageOrAlbum","groupMessages","currentAlbum","currentSenderGroup","currentDateGroup","originalDate","datetime","getDayStart","senderGroups","dateGroups","isInAlbum","mainMessage","albumId","nextMessage","nextMessageDatetime","isActionMessage","forwardInfo","senderUserId","hiddenUserName","inlineButtons","useStickyDates","isScrolled","markIsScrolled","runDebounced","shouldRunFirst","shouldRunLast","updateStickyDates","container","hasTools","contains","fastRaf","currentStuck","stuckDateEl","allElements","querySelectorAll","containerTop","scrollTop","el","offsetTop","offsetHeight","top","findStuckDate","areToolsFrozen","MessageScroll","focusingId","loadMoreForwards","loadMoreBackwards","isViewportNewest","onFabToggle","onNotchToggle","children","backwardsTriggerRef","forwardsTriggerRef","fabTriggerRef","toggleScrollTools","scrollHeight","scrollBottom","isAtBottom","observe","observeIntersection","freeze","freezeForLoadMore","unfreeze","unfreezeForLoadMore","useIntersectionObserver","rootRef","margin","MESSAGE_LIST_SENSITIVE_AREA","entries","triggerEntry","isIntersecting","target","resetScroll","useOnIntersect","observeIntersectionForFab","freezeForFab","unfreezeForFab","observeIntersectionForNotch","teactFastList","isEmojiOnlyMessage","customShape","getMinMediaWidth","hasText","hasCommentButton","calculateMediaDimensions","isOwn","isOwnMessage","isForwarded","isForwardedMessage","getMessagePhoto","getMessageWebPagePhoto","getMessageVideo","isWebPagePhoto","calculateInlineImageDimensions","calculateVideoDimensions","minMediaWidth","getMessageText","stretchFactor","finalWidth","finalHeight","isSmall","AlbumRectPart","accumulate","list","initValue","accumulator","item","clamp","num","low","high","calculateContainerSize","layout","styles","dimensions","sides","calculateAlbumLayout","album","ratios","proportions","ratio","getProportions","averageRatio","getAverageRatio","albumCount","forceCalc","maxWidth","REM","getMaxWidth","minWidth","maxHeight","spacing","originalRatios","cropRatios","attempts","pushAttempt","lineCounts","heights","currentCount","attemptCount","sum","multiHeight","first","second","third","fourth","optimalAttempt","optimalDiff","lineCount","totalHeight","bad1","bad2","line","diff","abs","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","layoutWithComplexLayouter","layoutTwoTopBottom","layoutTwoLeftRightEqual","minimalWidth","secondWidth","firstWidth","layoutTwoLeftRight","layoutTwo","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutThree","w","h0","h","w0","w2","w1","h1","layoutFourTopAndOther","h2","layoutFourLeftAndOther","layoutFour","containerStyle","element","calculateAuthorWidth","createElement","font","whiteSpace","position","left","opacity","appendChild","offsetWidth","useFocusMessage","elementRef","isFocused","focusDirection","noFocusHighlight","messagesContainer","closest","fastSmoothScroll","ContextMenuContainer","targetUserId","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","isEmbedded","appearanceOrder","isLastInList","noAppearanceAnimation","markShown","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","isContextMenuShown","data-message-id","onMouseDown","onContextMenu","EmbeddedMessage","customText","useIsIntersecting","pictogramId","isRoundVideo","getMessageRoundVideo","senderTitle","outgoingStatus","signature","views","isEdited","formatTime","MessageOutgoingStatus","Sticker","observeIntersectionForPlaying","shouldLoop","isModalOpen","openModal","closeModal","isAnimated","isMemojiSticker","MEMOJI_STICKER_ID","shouldLoad","shouldPlay","mediaHash","getMessageMediaFormat","isMediaLoaded","isAnimationLoaded","markAnimationLoaded","isMediaReady","shouldRenderFullMedia","useTransitionForMedia","getStickerDimensions","thumbClassName","stickerClassName","AnimatedSticker","animationData","play","noLoop","onLoad","fromSticker","useBlurredMediaThumbRef","fullMediaData","useCanvasBlur","IS_CANVAS_FILTER_SUPPORTED","inSelectMode","isSelected","img","Image","onload","canvas","ctx","getContext","drawImage","getImageData","getAppendixColorFromImage","Photo","shouldAutoLoad","isInSelectMode","uploadProgress","nonInteractive","shouldAffectAppendix","onCancelUpload","localBlobUrl","isDownloadAllowed","setIsDownloadAllowed","shouldDownload","downloadProgress","useMediaWithDownloadProgress","thumbRef","isUploading","isTransferring","transferProgress","getMediaTransferState","wasDownloadDisabled","usePrevious","shouldRenderSpinner","spinnerClassNames","shouldRenderThumb","isAllowed","contentEl","getCustomAppendixBg","appendixBg","setProperty","setAttribute","ProgressSpinner","useHeavyAnimationCheckForVideo","playerRef","shouldPlayRef","safePlay","useHeavyAnimationCheck","isPlayAllowed","wasPlaying","isFrozen","freezePlaying","paused","unfreezePlaying","unfreezePlayingOnRaf","hasFocus","useBackgroundMode","Video","shouldAutoPlay","videoRef","canPlayInline","canMessagePlayVideoInline","setIsPlayAllowed","isInline","isBuffered","bufferingHandlers","useBuffering","playProgress","setPlayProgress","handleTimeUpdate","currentTime","usePauseOnInactive","useVideoCleanup","videoClassName","shouldRenderInlineVideo","shouldRenderHqPreview","shouldRenderPlayButton","shouldRenderDownloadButton","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","duration","contact","openUserInfo","Avatar","formatPhoneNumberWithCode","selected","loadingOptions","setValues","event","newValues","Checkbox","subLabel","getPercentage","toFixed","PollOption","answer","voteResults","maxVotersCount","correctResults","shouldAnimate","r","correctAnswer","showIcon","answerPercent","finalPercent","setFinalPercent","lineRef","lineWidth","isAnimationDoesNotStart","lineEl","svgEl","lineStyle","onSendVote","openPollResults","summary","isSubmitting","setIsSubmitting","chosenOptions","setChosenOptions","isSolutionShown","setIsSolutionShown","wasSubmitted","setWasSubmitted","closePeriod","setClosePeriod","closed","closeDate","floor","countdownRef","hasVoted","canVote","canViewResult","isPublic","isMultiple","multipleChoice","answers","isCorrect","hidden","quiz","countdownEl","circumference","PI","lastElementChild","timerEl","strokeDashOffset","textContent","timer","recentVoters","handleRadioChange","handleCheckboxChange","handleVoteClick","handleViewResultsClick","handleSolutionShow","handleSolutionHide","solution","Notification","renderTextWithEntities","solutionEntities","onDismiss","containerId","question","getPollTypeString","RadioGroup","loadingOption","isQuiz","getReadableVotersCount","isText","inPreview","onMediaClick","onCancelMediaTransfer","webPage","getMessageWebPage","isSquarePhoto","handleMediaClick","siteName","displayUrl","isMediaInteractive","hasDocument","truncatedDescription","trimText","data-initial","SafeLink","getMessageInvoice","photoUrl","withSelectControl","WrapedComponent","ownProps","selectIsMessageSelected","handleMessageSelect","shiftKey","newProps","PhotoWithSelect","VideoWithSelect","uploadsById","hasCustomAppendix","albumLayout","cancelSendingMessage","mediaCount","handleCancelUpload","containerWidth","containerHeight","fileUpload","currentOnRelease","RoundVideo","playingProgressRef","shouldSpinnerRender","isActivated","setIsActivated","setProgress","playerEl","playingProgressEl","stopPlaying","requestAnimationFrame","capturePlaying","onRelease","ROUND_VIDEO_DIMENSIONS","onEnded","InlineButtons","recentReplierIds","recentRepliers","hasUnread","data-cnt","handleDocumentGroupMouseEnter","lastGroupElement","getLastElementInDocumentGroup","handleDocumentGroupMouseLeave","removeAttribute","nextElementSibling","withSenderName","withAvatar","viaBotId","forceSenderName","isAnonymousOwnMessage","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","selectOutgoingStatus","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","shouldAutoLoadMedia","selectShouldAutoLoadMedia","shouldAutoPlayMedia","selectShouldAutoPlayMedia","shouldLoopStickers","selectShouldLoopStickers","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","isLastInDocumentGroup","openMediaViewer","openAudioPlayer","markMessagesRead","sendPollVote","clickInlineButton","bottomMarkerRef","appendixRef","hasReply","isReplyMessage","hasThread","asForwarded","isLinkedChannelPost","isInDocumentGroup","voice","getMessageCustomShape","textParts","renderMessageText","containerClassName","contentClassName","hasComments","classNames","isMediaWithNoText","isViaBot","isRound","buildContentClassName","avatarPeer","senderPeer","adminTitle","withCommentButton","withAppendix","handleGroupDocumentMessagesSelect","handleContainerDoubleClick","handleContentDoubleClick","handleAvatarClick","handleSenderClick","handleViaBotClick","handleReplyClick","MediaViewerOrigin","ScheduledInline","Inline","handleAudioPlay","handleAlbumMediaClick","albumMessageId","ScheduledAlbum","Album","handleReadMedia","handleVoteSend","handleGroupForward","handleForward","handleFocus","handleFocusForwarded","fromMessageId","calculatedWidth","noMediaCorners","extraPadding","metaSafeAuthorWidth","canShowActionButton","canForward","canFocus","isChannelPost","onDoubleClick","data-last-message-id","data-has-unread-mention","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","shouldInlineMeta","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","Audio","isSelectable","onPlay","onReadMedia","Document","renderContent","INTERSECTION_THROTTLE_FOR_MEDIA","IS_ANDROID","INTERSECTION_MARGIN_FOR_MEDIA","runDebouncedForScroll","selectCurrentMessageIds","restrictionReason","withLastMessageWhenPreloading","botDescription","chatBot","selectChatBot","isChatLoaded","isChannelChat","threadFirstMessageId","selectFirstMessageId","hasLinkedChat","markMessageListRead","setScrollOffset","openHistoryCalendar","scrollOffsetRef","selectScrollOffset","anchorIdRef","anchorTopRef","listItemElementsRef","memoUnreadDividerBeforeIdRef","memoFirstUnreadIdRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","hasFocusing","setHasFocusing","onTickEnd","freezeForMedia","unfreezeForMedia","throttleMs","observeIntersectionForReading","freezeForReading","unfreezeForReading","mentionIds","entry","dataset","messageGroups","listedMessages","orderBy","loadMoreAround","handleScroll","parentElement","observer","ResizeObserver","offsetParent","contentRect","disconnect","windowHeight","normalHeight","String","clientHeight","preservedItemElements","useLayoutEffectWithPrevDeps","prevMessageIds","prevIsViewportNewest","prevContainerHeight","shouldForceScroll","lastItemElement","lastItemHeight","newScrollTop","hasFirstMessageChanged","hasLastMessageChanged","isAlreadyFocusing","isResized","unreadDivider","isAnimatingScroll","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","withUsers","onScroll","currentAnchorIdRef","isSchedule","messageCountToAnimate","messageGroup","flatten","appearanceIndex","dateGroup","dateGroupIndex","dateGroupsArray","senderGroup","senderGroupIndex","senderGroupsArray","compact","currentDocumentGroupId","messageIndex","isMessageAlbum","documentGroupId","nextDocumentGroupId","originalId","getMessageOriginalId","SCHEDULED_WHEN_ONLINE","formatHumanDate","renderMessages","focusLastMessage","messageElements","lastMessageElement","buildAttachment","filename","blob","isQuick","quick","preloadImage","newBlob","toBlob","squeezeImage","revokeObjectURL","videoWidth","videoHeight","preloadVideo","createPosterForVideo","POLYFILL_OPTIONS","encoderPath","reuseWorker","BLOB_PARAMS","opusRecorderPromise","OpusRecorder","mediaRecorder","init","default","start","analyzerCallback","startMediaRecorder","startedAt","pausedAt","chunks","waveform","ondataavailable","typedArray","releaseAnalyzer","recorder","source","sourceNode","analyser","context","createAnalyser","fftSize","connect","dataLength","frequencyBinCount","dataArray","Uint8Array","isDestroyed","tick","getByteFrequencyData","volume","subscribeToAnalyzer","stop","reject","onstop","Blob","onerror","delayStop","CLIPBOARD_ACCEPTED_TYPES","getMessageTextAsHtml","currentThreadId","DeleteMessageModal","openTimeout","isFirstTimeActivation","onActivate","buttonProps","AttachMenu","SymbolMenu","MentionTooltip","CustomSend","StickerTooltipAsync","StickerTooltip","BotKeyboardMenu","forwardMessageIds","forwardedMessagesCount","exitForwardMode","canAnimate","useAsyncRendering","clearEmbedded","handleMessageClick","AttachmentModal","PollModal","DropArea","RE_LINK","RegExp","RE_LINK_TEMPLATE","messageText","toggleMessageWebPage","parseMessageInput","linkEntity","ApiMessageEntityTypes","TextUrl","textMatch","renderingWebPage","webPageWithoutPhoto","messageStub","CalendarModal","PaymentModal","MainButtonState","ReceiptModal","chatUser","selectChatUser","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","editingMessage","canScheduleUntilOnline","wasOnline","withScheduledButton","shouldSchedule","botKeyboardMessageId","canSuggestMembers","isChatGroup","stickersForEmoji","groupChatMembers","isReceiptModalOpen","shouldSuggestStickers","dropAreaState","onDropHide","editMessage","saveDraft","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","closePaymentModal","clearReceipt","addRecentEmoji","loadEmojiKeywords","html","setHtml","lastMessageSendTimeSeconds","prevDropAreaState","isCalendarOpen","openCalendar","closeCalendar","scheduledMessageArgs","setScheduledMessageArgs","htmlRef","setAttachments","isBotKeyboardOpen","openBotKeyboard","closeBotKeyboard","isAttachMenuOpen","openAttachMenu","closeAttachMenu","isSymbolMenuOpen","openSymbolMenu","closeSymbolMenu","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isSymbolMenuLoaded","onSymbolMenuLoadingComplete","isHoverDisabled","disableHover","enableHover","startRecordingVoice","stopRecordingVoice","pauseRecordingVoice","activeVoiceRecording","currentRecordTime","recordButtonRef","mainButtonRef","startRecordTimeRef","setActiveVoiceRecording","setCurrentRecordTime","IS_IOS","voiceRecording","tickVolume","boxShadow","useVoiceRecording","mainButtonState","Edit","IS_VOICE_RECORDING_SUPPORTED","Send","Record","canShowCustomSendMenu","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredMembers","useMentionTooltip","isCustomSendMenuOpen","allowedAttachmentOptions","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isStickerTooltipOpen","closeStickerTooltip","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useStickerTooltip","canSendStickers","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","insertTextAndUpdateCursor","selection","getSelection","newHtml","replace","rangeCount","selectionRange","getRangeAt","isSelectionInsideInput","execCommand","range","deleteContents","fragment","createContextualFragment","lastInsertedNode","lastChild","insertNode","setStartAfter","setEndAfter","removeAllRanges","addRange","insertHtmlInSelection","dispatchEvent","Event","bubbles","focusEditableElement","removeSymbol","tempInput","contentEditable","textLength","createRange","setStart","setEnd","removeChild","deleteLastCharacterOutsideSelection","resetComposer","prevChatId","handleEditComplete","editedMessage","hasMessageMedia","useEditing","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","prevThreadId","prevHtml","handleBlur","useDraft","handlePaste","clipboardData","input","activeElement","tagName","EDITABLE_INPUT_MODAL_ID","items","media","getAsFile","pastedText","getData","substring","useClipboardPaste","handleFileSelect","files","handleAppendFiles","handleClearAttachment","handleSend","currentAttachments","record","extraLength","textParams","nowSeconds","secondsSinceLastMessage","nextSendDateNotReached","nextSendDate","seconds","secondsRemaining","isSlowMode","handleStickerSelect","handleGifSelect","gif","handlePollSend","handleSilentSend","handleMessageSchedule","restArgs","getTime","handleMessageScheduleUntilOnline","handleCloseCalendar","handleSearchOpen","handleSymbolMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","Portal","DropAreaState","None","withQuick","QuickFile","onHide","onFileSelect","caption","onCaptionUpdate","onSend","onFileAppend","onClear","onInsertUserName","filteredChatMembers","canAttachEmbedLinks","faded","MessageInput","innerWidth","shouldSetFocus","shouldSupressFocus","shouldSupressTextFormatter","onUpdate","onSupressedFocus","formatVoiceRecordDuration","onStickerSelect","emojis","onEmojiSelect","onPollCreate","onGifSelect","onRemoveSymbol","onSearchOpen","onSilentSend","onScheduleSend","withTimePicker","maxAt","getDayStartAt","isFutureMode","secondButtonLabel","onSubmit","onSecondButtonClick","MobileSearch","MessageSelectToolbar","UnpinAllMessagesModal","CLOSE_ANIMATION_DURATION","canBeQuicklyUploaded","kind","CONTENT_TYPES_FOR_QUICK_UPLOAD","isBlurred","isBackgroundBlurred","background","customBackground","backgroundColor","patternColor","themes","isMobileSearchActive","getCanPostInChat","isBotNotStarted","isPinnedMessageList","messageSendingRestrictionReason","getMessageSendingRestrictionReason","hasPinnedOrAudioMessage","loadUser","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanPost","renderingHasTools","renderingIsFabShown","handleDragEnter","dataTransfer","shouldDrawQuick","handleHideDropArea","handleOpenUnpinModal","closeUnpinModal","handleUnpinAllMessages","customBackgroundValue","settingValue","setValue","cacheApi","CUSTOM_BG_CACHE_NAME","useCustomBackground","MASK_IMAGE_DISABLED","messagingDisabledClassName","footerClassName","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","ANIMATION_LEVEL_MAX","shouldCleanup","onUnpin","runDebouncedForSearch","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canManage","isCreator","isColumnOpen","isSearch","isStickerSearch","isGifSearch","isPollResults","profileState","managementScreen","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","backButtonRef","handleMessageSearchQueryChange","handleStickerSearchQueryChange","handleGifSearchQueryChange","shouldSkipTransition","setShouldSkipTransition","contentKey","ProfileState","Profile","SharedMedia","MemberList","Search","PollResults","StickerSearch","GifSearch","ManagementScreens","Initial","ManageInitial","ChatPrivacyType","ManageChatPrivacyType","Discussion","ManageDiscussion","ChannelSubscribers","ManageChannelSubscribers","GroupPermissions","ManageGroupPermissions","ChatAdministrators","ManageChatAdministrators","GroupRemovedUsers","ManageGroupRemovedUsers","GroupUserPermissionsCreate","ManageGroupUserPermissionsCreate","GroupUserPermissions","ManageGroupUserPermissions","GroupRecentActions","ManageGroupRecentActions","ChatAdminRights","ManageGroupAdminRights","GroupMembers","ManageGroupMembers","renderingContentKey","renderHeaderContent","isBackButton","buttonClassName","useProfileViewportIds","loadMoreMembers","searchMessages","tabType","mediaSearchType","resultType","sortUserIds","memberViewportIds","getMoreMembers","noProfileInfoForMembers","currentResultType","handleLoadMore","getMore","useInfiniteScroll","MEMBERS_SLICE","isOnTop","useInfiniteScrollForMembers","mediaViewportIds","getMoreMedia","noProfileInfoForMedia","useInfiniteScrollForSharedMedia","documentViewportIds","getMoreDocuments","noProfileInfoForDocuments","linkViewportIds","getMoreLinks","noProfileInfoForLinks","audioViewportIds","getMoreAudio","noProfileInfoForAudio","noProfileInfo","forSharedMediaType","messageIdsRef","getMessageContentIds","reverse","runThrottledForScroll","isScrollingProgrammatically","isFirstPhoto","isSavedMessages","isDeleted","isDeletedUser","getMediaHash","forceAvatar","getChatAvatarHash","imageHash","ApiMediaFormat","BlobUrl","avatarThumbnailData","useBlurSync","dataUri","imageSrc","prevImageSrc","decoding","userFullName","getUserFullName","getFirstLetters","fullClassName","forceShowSelf","loadFullUser","fullName","slideAnimation","currentPhotoIndex","setCurrentPhotoIndex","isFirst","isLast","profile","currentIndex","usePhotosPreload","handleProfilePhotoClick","ProfileAvatar","selectPreviousMedia","selectNextMedia","excludedClosestSelector","renderPhoto","isVerifiedIconShown","isVerified","renderPhotoTabs","aria-label","VerifiedIcon","isUserOnline","getUserStatus","canInviteUsers","isUserRightBanned","getHasAdminRight","currentIsMuted","chatUsername","handleNotificationChange","copy","entity","formattedNumber","getChatLink","printedUsername","getChatDescription","ListItem","multiline","narrow","isStatic","TABS","buildInfiniteScrollItemSelector","isGroup","hasMembersTab","areMembersHidden","canViewMembers","resolvedUserId","onProfileStateChange","setLocalMediaSearchType","searchMediaMessagesLocal","loadProfilePhotos","setActiveTab","useEffectWithPrevDeps","prevTabType","tabsEl","prevProfileState","tabListEl","determineProfileState","useProfileState","applyTransitionFix","releaseTransitionFix","transitionElSelector","setMinHeight","transitionEl","minHeight","overflowY","scrollBarWidth","clientWidth","marginRight","useTransitionFixes","cacheBuster","resetCacheBuster","setCacheBuster","useCacheBuster","handleTransitionStop","handleSelectMedia","handlePlayAudio","handleMemberClick","handleMessageFocus","renderingDelay","isFirstTab","SLIDE_TRANSITION_DURATION","canRenderContents","renderSharedMedia","noSpinner","NothingFound","Media","withDate","smaller","onDateClick","WebLink","onMessageClick","renderingFor","teactOrderKey","InfiniteScroll","itemSelector","sensitiveArea","PROFILE_SENSITIVE_AREA","preloadBackwards","noScrollRestoreOnTop","noFastList","onLoadMore","renderProfileInfo","shouldRestoreHeight","onStart","onStop","big","RightSearch","Management","MAIN_SCREENS_COUNT","RightColumnContent","MANAGEMENT_SCREENS_COUNT","blurSearchInput","areActiveChatsLoaded","selectAreActiveChatsLoaded","selectRightColumnContentKey","currentProfileUserId","selectedId","isChatSelected","toggleChatInfo","closeLocalTextSearch","closePollResults","setProfileState","setManagementScreen","selectedChatMemberId","setSelectedChatMemberId","isPromotedByCurrentUser","setIsPromotedByCurrentUser","isScrolledDown","ChatInfo","UserInfo","isOverlaying","close","GroupType","handleSelectChatMember","memberId","isPromoted","onChatMemberSelect","prevContentKey","MediaViewer","Errors","ForwardPicker","SafeLinkModal","HistoryCalendar","rightColumnAnimationTimeout","notificationInterval","DEBUG_isLogged","updateIcon","asUnread","isMediaViewerOpen","selectIsMediaViewerOpen","isForwardModalOpen","selectIsForwardModalOpen","hasNotifications","hasErrors","isHistoryCalendarOpen","loadNotificationSettings","loadNotificationExceptions","middleColumnTransitionClassNames","rightColumnTransitionClassNames","stopEvent","initialUnread","clearInterval","setInterval","INACTIVE_MARKER","newUnread","PAGE_TITLE","onDrop","onDragOver","initApi"],"mappings":"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","file":"4.7d611cd5e39f10293bca.js","sourcesContent":["import { addReducer, getDispatch, setGlobal } from '../../../lib/teact/teactn';\nimport {\n exitMessageSelectMode,\n updateCurrentMessageList,\n} from '../../reducers';\nimport { selectCurrentMessageList } from '../../selectors';\n\nwindow.addEventListener('popstate', (e) => {\n if (!e.state) {\n return;\n }\n\n const { chatId: id, threadId, messageListType: type } = e.state;\n\n getDispatch().openChat({\n id, threadId, type, noPushState: true,\n });\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const {\n id, threadId = -1, type = 'thread', noPushState,\n } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList\n || (\n currentMessageList.chatId !== id\n || currentMessageList.threadId !== threadId\n || currentMessageList.type !== type\n )) {\n global = exitMessageSelectMode(global);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: undefined,\n },\n ...(id !== global.forwardMessages.toChatId && {\n forwardMessages: {},\n }),\n };\n\n setGlobal(global);\n\n if (!noPushState) {\n window.history.pushState({ chatId: id, threadId, messageListType: type }, '');\n }\n }\n\n return updateCurrentMessageList(global, id, threadId, type);\n});\n\naddReducer('openChatWithInfo', (global, actions, payload) => {\n setGlobal({\n ...global,\n isChatInfoShown: true,\n });\n\n actions.openChat(payload);\n});\n\naddReducer('resetChatCreation', (global) => {\n return {\n ...global,\n chatCreation: undefined,\n };\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../../api/types';\nimport { FocusDirection } from '../../../types';\n\nimport {\n enterMessageSelectMode,\n toggleMessageSelection,\n exitMessageSelectMode,\n replaceThreadParam,\n updateFocusDirection,\n updateFocusedMessage,\n} from '../../reducers';\nimport {\n selectCurrentChat,\n selectViewportIds,\n selectIsRightColumnShown,\n selectCurrentMessageList,\n selectChat,\n selectThreadInfo,\n selectChatMessages,\n selectAllowedMessageActions,\n selectMessageIdsByGroupId,\n selectForwardedMessageIdsByGroupId, selectIsViewportNewest, selectReplyingToId,\n} from '../../selectors';\nimport { findLast } from '../../../util/iteratees';\n\nconst FOCUS_DURATION = 2000;\nconst POLL_RESULT_OPEN_DELAY_MS = 450;\n\nlet blurTimeout: number | undefined;\n\naddReducer('setScrollOffset', (global, actions, payload) => {\n const { chatId, threadId, scrollOffset } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'scrollOffset', scrollOffset);\n});\n\naddReducer('setReplyingToId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n const { chatId, threadId } = currentMessageList;\n\n return replaceThreadParam(global, chatId, threadId, 'replyingToId', messageId);\n});\n\naddReducer('setEditingId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n const paramName = type === 'scheduled' ? 'editingScheduledId' : 'editingId';\n\n return replaceThreadParam(global, chatId, threadId, paramName, messageId);\n});\n\naddReducer('editLastMessage', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const lastOwnEditableMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId).canEdit);\n });\n\n if (!lastOwnEditableMessageId) {\n return undefined;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'editingId', lastOwnEditableMessageId);\n});\n\naddReducer('replyToNextMessage', (global, actions, payload) => {\n const { targetIndexDelta } = payload;\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return;\n }\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const isLatest = selectIsViewportNewest(global, chatId, threadId);\n\n let messageId: number | undefined;\n\n if (!isLatest || !replyingToId) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n messageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n messageId = threadInfo ? threadInfo.lastMessageId : undefined;\n }\n } else {\n const chatMessageKeys = Object.keys(chatMessages);\n const indexOfCurrent = chatMessageKeys.indexOf(replyingToId.toString());\n const newIndex = indexOfCurrent + targetIndexDelta;\n messageId = newIndex <= chatMessageKeys.length + 1 && newIndex >= 0\n ? Number(chatMessageKeys[newIndex])\n : undefined;\n }\n actions.setReplyingToId({ messageId });\n actions.focusMessage({\n chatId, threadId, messageId,\n });\n});\n\naddReducer('openMediaViewer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = payload!;\n\n return {\n ...global,\n mediaViewer: {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n profilePhotoIndex,\n origin,\n },\n forwardMessages: {},\n };\n});\n\naddReducer('closeMediaViewer', (global) => {\n return {\n ...global,\n mediaViewer: {},\n };\n});\n\naddReducer('openAudioPlayer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n chatId,\n threadId,\n messageId,\n },\n };\n});\n\naddReducer('closeAudioPlayer', (global) => {\n return {\n ...global,\n audioPlayer: {},\n };\n});\n\naddReducer('openPollResults', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n\n const shouldOpenInstantly = selectIsRightColumnShown(global);\n\n if (!shouldOpenInstantly) {\n window.setTimeout(() => {\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }, POLL_RESULT_OPEN_DELAY_MS);\n } else if (chatId !== global.pollResults.chatId || messageId !== global.pollResults.messageId) {\n setGlobal({\n ...global,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }\n});\n\naddReducer('closePollResults', (global) => {\n setGlobal({\n ...global,\n pollResults: {},\n });\n});\n\naddReducer('focusLastMessage', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n let lastMessageId: number | undefined;\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n lastMessageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n lastMessageId = threadInfo ? threadInfo.lastMessageId : undefined;\n }\n\n if (!lastMessageId) {\n return;\n }\n\n actions.focusMessage({\n chatId, threadId, messageId: lastMessageId, noHighlight: true,\n });\n});\n\naddReducer('focusMessage', (global, actions, payload) => {\n const {\n chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId,\n } = payload!;\n\n let { messageId } = payload!;\n\n if (groupedId !== undefined) {\n const ids = selectForwardedMessageIdsByGroupId(global, groupedChatId, groupedId);\n if (ids && ids.length) {\n ([messageId] = ids);\n }\n }\n\n const currentMessageList = selectCurrentMessageList(global);\n const shouldSwitchChat = !currentMessageList || (\n chatId !== currentMessageList.chatId\n || threadId !== currentMessageList.threadId\n || messageListType !== currentMessageList.type\n );\n\n if (blurTimeout) {\n clearTimeout(blurTimeout);\n blurTimeout = undefined;\n }\n blurTimeout = window.setTimeout(() => {\n let newGlobal = getGlobal();\n newGlobal = updateFocusedMessage(newGlobal);\n newGlobal = updateFocusDirection(newGlobal);\n setGlobal(newGlobal);\n }, FOCUS_DURATION);\n\n global = updateFocusedMessage(global, chatId, messageId, noHighlight);\n global = updateFocusDirection(global, undefined);\n\n if (shouldSwitchChat) {\n global = updateFocusDirection(global, FocusDirection.Static);\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (viewportIds && viewportIds.includes(messageId)) {\n setGlobal(global);\n actions.openChat({ id: chatId, threadId });\n return undefined;\n }\n\n if (shouldSwitchChat) {\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', undefined);\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n\n if (viewportIds && !shouldSwitchChat) {\n const direction = messageId > viewportIds[0] ? FocusDirection.Down : FocusDirection.Up;\n global = updateFocusDirection(global, direction);\n }\n\n setGlobal(global);\n\n actions.openChat({ id: chatId, threadId });\n actions.loadViewportMessages();\n return undefined;\n});\n\naddReducer('openForwardMenu', (global, actions, payload) => {\n const { fromChatId, messageIds, groupedId } = payload!;\n let groupedMessageIds;\n if (groupedId) {\n groupedMessageIds = selectMessageIdsByGroupId(global, fromChatId, groupedId);\n }\n return {\n ...global,\n forwardMessages: {\n fromChatId,\n messageIds: groupedMessageIds || messageIds,\n isModalShown: true,\n },\n };\n});\n\naddReducer('exitForwardMode', (global) => {\n setGlobal({\n ...global,\n forwardMessages: {},\n });\n});\n\naddReducer('setForwardChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n setGlobal({\n ...global,\n forwardMessages: {\n ...global.forwardMessages,\n toChatId: id,\n isModalShown: false,\n },\n });\n\n actions.openChat({ id });\n actions.closeMediaViewer();\n actions.exitMessageSelectMode();\n});\n\naddReducer('openForwardMenuForSelectedMessages', (global, actions) => {\n if (!global.selectedMessages) {\n return;\n }\n\n const { chatId: fromChatId, messageIds } = global.selectedMessages;\n\n actions.openForwardMenu({ fromChatId, messageIds });\n});\n\naddReducer('enterMessageSelectMode', (global, actions, payload) => {\n const { messageId } = payload || {};\n const openChat = selectCurrentChat(global);\n if (!openChat) {\n return global;\n }\n\n return enterMessageSelectMode(global, openChat.id, messageId);\n});\n\naddReducer('toggleMessageSelection', (global, actions, payload) => {\n const {\n messageId,\n groupedId,\n childMessageIds,\n withShift,\n } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n\n return toggleMessageSelection(\n global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift,\n );\n});\n\n\naddReducer('exitMessageSelectMode', exitMessageSelectMode);\n\naddReducer('openPollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: true,\n };\n});\n\naddReducer('closePollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: false,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { updateGlobalSearch, updateGlobalSearchContent } from '../../reducers';\n\nconst MAX_RECENTLY_FOUND_IDS = 10;\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n const { chatId } = global.globalSearch;\n\n return updateGlobalSearch(global, {\n globalResults: {},\n localResults: {},\n resultsByType: undefined,\n ...(query ? { fetchingStatus: { chats: !chatId, messages: true } } : { fetchingStatus: undefined }),\n query,\n });\n});\n\naddReducer('addRecentlyFoundChatId', (global, actions, payload) => {\n const { id } = payload!;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n if (!recentlyFoundChatIds) {\n return updateGlobalSearch(global, { recentlyFoundChatIds: [id] });\n }\n\n const newRecentIds = recentlyFoundChatIds.filter((chatId) => chatId !== id);\n newRecentIds.unshift(id);\n if (newRecentIds.length > MAX_RECENTLY_FOUND_IDS) {\n newRecentIds.pop();\n }\n\n return updateGlobalSearch(global, { recentlyFoundChatIds: newRecentIds });\n});\n\naddReducer('clearRecentlyFoundChats', (global) => {\n return updateGlobalSearch(global, { recentlyFoundChatIds: undefined });\n});\n\naddReducer('setGlobalSearchContent', (global, actions, payload) => {\n const { content } = payload!;\n\n return updateGlobalSearchContent(global, content);\n});\n\naddReducer('setGlobalSearchChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n return updateGlobalSearch(global, { chatId: id, query: undefined, resultsByType: undefined });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n updateLocalTextSearch,\n replaceLocalTextSearchResults,\n updateLocalMediaSearchType,\n} from '../../reducers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { buildChatThreadKey } from '../../helpers';\n\naddReducer('openLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n return updateLocalTextSearch(global, chatId, threadId, true);\n});\n\naddReducer('closeLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, false);\n global = replaceLocalTextSearchResults(global, chatId, threadId, undefined);\n return global;\n});\n\naddReducer('setLocalTextSearchQuery', (global, actions, payload) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const { query } = payload!;\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { query: currentQuery } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n\n if (query !== currentQuery) {\n global = replaceLocalTextSearchResults(global, chatId, threadId, MEMO_EMPTY_ARRAY);\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, true, query);\n\n return global;\n});\n\naddReducer('setLocalMediaSearchType', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return undefined;\n }\n\n const { mediaType } = payload!;\n return updateLocalMediaSearchType(global, chatId, mediaType);\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n search: {\n query,\n resultIds: undefined,\n },\n },\n };\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n query,\n offsetId: undefined,\n results: undefined,\n },\n },\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { updateSelectedUserId } from '../../reducers';\n\naddReducer('openUserInfo', (global, actions, payload) => {\n const { id } = payload!;\n\n actions.openChat({ id });\n});\n\nconst clearSelectedUserId = (global: GlobalState) => updateSelectedUserId(global, undefined);\n\naddReducer('openChat', clearSelectedUserId);\n","import { addReducer } from '../../../lib/teact/teactn';\nimport { ISettings, IThemeSettings, ThemeKey } from '../../../types';\nimport { replaceSettings, replaceThemeSettings } from '../../reducers';\n\naddReducer('setSettingOption', (global, actions, payload?: Partial) => {\n return replaceSettings(global, payload);\n});\n\naddReducer('setThemeSettings', (global, actions, payload: { theme: ThemeKey } & Partial) => {\n const { theme, ...settings } = payload;\n\n return replaceThemeSettings(global, theme, settings);\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport getReadableErrorText from '../../../util/getReadableErrorText';\nimport { selectCurrentMessageList } from '../../selectors';\n\nconst MAX_STORED_EMOJIS = 18; // Represents two rows of recent emojis\n\naddReducer('toggleChatInfo', (global) => {\n return {\n ...global,\n isChatInfoShown: !global.isChatInfoShown,\n };\n});\n\naddReducer('toggleManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: !(global.management.byChatId[chatId] || {}).isActive,\n },\n },\n },\n };\n});\n\naddReducer('closeManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: false,\n },\n },\n },\n };\n});\n\naddReducer('openChat', (global, actions, payload) => {\n if (!IS_MOBILE_SCREEN) {\n return undefined;\n }\n\n const { id } = payload!;\n\n return {\n ...global,\n isLeftColumnShown: id === undefined,\n };\n});\n\naddReducer('toggleLeftColumn', (global) => {\n return {\n ...global,\n isLeftColumnShown: !global.isLeftColumnShown,\n };\n});\n\naddReducer('addRecentEmoji', (global, action, payload) => {\n const { emoji } = payload!;\n const { recentEmojis } = global;\n if (!recentEmojis) {\n return {\n ...global,\n recentEmojis: [emoji],\n };\n }\n\n const newEmojis = recentEmojis.filter((e) => e !== emoji);\n newEmojis.unshift(emoji);\n if (newEmojis.length > MAX_STORED_EMOJIS) {\n newEmojis.pop();\n }\n\n return {\n ...global,\n recentEmojis: newEmojis,\n };\n});\n\naddReducer('addRecentSticker', (global, action, payload) => {\n const { sticker } = payload!;\n const { recent } = global.stickers;\n if (!recent) {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n hash: 0,\n stickers: [sticker],\n },\n },\n };\n }\n\n const newStickers = recent.stickers.filter((s) => s.id !== sticker.id);\n newStickers.unshift(sticker);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n ...recent,\n stickers: newStickers,\n },\n },\n };\n});\n\naddReducer('showNotification', (global, actions, payload) => {\n const notification = payload!;\n\n const newNotifications = [...global.notifications];\n const existingNotificationIndex = newNotifications.findIndex((n) => n.message === notification.message);\n if (existingNotificationIndex !== -1) {\n newNotifications.splice(existingNotificationIndex, 1);\n }\n\n newNotifications.push(notification);\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('dismissNotification', (global) => {\n const newNotifications = [...global.notifications];\n\n newNotifications.pop();\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('showError', (global, actions, payload) => {\n const { error } = payload!;\n\n // Filter out errors that we don't want to show to the user\n if (!getReadableErrorText(error)) {\n return global;\n }\n\n const newErrors = [...global.errors];\n const existingErrorIndex = newErrors.findIndex((err) => err.message === error.message);\n if (existingErrorIndex !== -1) {\n newErrors.splice(existingErrorIndex, 1);\n }\n\n newErrors.push(error);\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n\naddReducer('dismissError', (global) => {\n const newErrors = [...global.errors];\n\n newErrors.pop();\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n\naddReducer('toggleSafeLinkModal', (global, actions, payload) => {\n const { url: safeLinkModalUrl } = payload;\n\n return {\n ...global,\n safeLinkModalUrl,\n };\n});\n\naddReducer('openHistoryCalendar', (global, actions, payload) => {\n const { selectedAt } = payload;\n\n return {\n ...global,\n historyCalendarSelectedAt: selectedAt,\n };\n});\n\naddReducer('closeHistoryCalendar', (global) => {\n return {\n ...global,\n historyCalendarSelectedAt: undefined,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\nimport {\n clearPayment, closeInvoice,\n} from '../../reducers';\n\naddReducer('openPaymentModal', (global, actions, payload) => {\n const { messageId } = payload;\n return {\n ...global,\n payment: {\n ...global.payment,\n messageId,\n isPaymentModalOpen: true,\n },\n };\n});\n\naddReducer('closePaymentModal', (global) => {\n const newGlobal = clearPayment(global);\n return closeInvoice(newGlobal);\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiUser, ApiChatFolder, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { ChatCreationProgress, ManagementProgress } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n ARCHIVED_FOLDER_ID,\n TOP_CHAT_MESSAGES_PRELOAD_LIMIT,\n CHAT_LIST_LOAD_SLICE,\n RE_TME_INVITE_LINK,\n RE_TME_LINK,\n TIPS_USERNAME,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n addChats,\n addUsers,\n replaceThreadParam,\n updateChatListIds,\n updateChats,\n updateChat,\n updateChatListSecondaryInfo,\n updateManagementProgress,\n} from '../../reducers';\nimport {\n selectChat,\n selectCurrentChat,\n selectUser,\n selectChatListType,\n selectIsChatPinned,\n selectChatFolder,\n selectSupportChat,\n selectChatByUsername,\n selectThreadTopMessageId,\n selectCurrentMessageList,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { debounce, pause, throttle } from '../../../util/schedulers';\nimport {\n isChatSummaryOnly, isChatArchived, prepareChatList, isChatBasicGroup,\n} from '../../helpers';\n\nconst TOP_CHATS_PRELOAD_PAUSE = 100;\n// We expect this ID does not exist\nconst TMP_CHAT_ID = -1;\n\nconst runThrottledForLoadChats = throttle((cb) => cb(), 1000, true);\nconst runThrottledForLoadTopChats = throttle((cb) => cb(), 3000, true);\nconst runDebouncedForLoadFullChat = debounce((cb) => cb(), 500, false, true);\n\naddReducer('preloadTopChatMessages', (global, actions) => {\n (async () => {\n const preloadedChatIds: number[] = [];\n\n for (let i = 0; i < TOP_CHAT_MESSAGES_PRELOAD_LIMIT; i++) {\n await pause(TOP_CHATS_PRELOAD_PAUSE);\n\n const {\n byId,\n listIds: { active: listIds },\n orderedPinnedIds: { active: orderedPinnedIds },\n } = getGlobal().chats;\n if (!listIds) {\n return;\n }\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const { pinnedChats, otherChats } = prepareChatList(byId, listIds, orderedPinnedIds);\n const topChats = [...pinnedChats, ...otherChats];\n const chatToPreload = topChats.find(({ id }) => id !== currentChatId && !preloadedChatIds.includes(id));\n if (!chatToPreload) {\n return;\n }\n\n preloadedChatIds.push(chatToPreload.id);\n\n actions.loadViewportMessages({ chatId: chatToPreload.id, threadId: MAIN_THREAD_ID });\n }\n })();\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const { id, threadId } = payload!;\n const { currentUserId } = global;\n const chat = selectChat(global, id);\n\n if (chat && chat.hasUnreadMark) {\n actions.toggleChatUnread({ id });\n }\n\n if (!chat) {\n if (id === currentUserId) {\n void callApi('fetchChat', { type: 'self' });\n } else {\n const user = selectUser(global, id);\n if (user) {\n void callApi('fetchChat', { type: 'user', user });\n }\n }\n } else if (isChatSummaryOnly(chat) && !chat.isMin) {\n actions.requestChatUpdate({ chatId: id });\n }\n\n if (threadId !== MAIN_THREAD_ID) {\n const topMessageId = selectThreadTopMessageId(global, id, threadId);\n if (!topMessageId) {\n actions.requestThreadInfoUpdate({ chatId: id, threadId });\n }\n }\n});\n\naddReducer('openSupportChat', (global, actions) => {\n const chat = selectSupportChat(global);\n\n actions.openChat({ id: chat ? chat.id : TMP_CHAT_ID });\n\n if (chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchChat', { type: 'support' });\n if (result) {\n actions.openChat({ id: result.chatId });\n }\n })();\n});\n\naddReducer('openTipsChat', (global, actions) => {\n actions.openChatByUsername({ username: TIPS_USERNAME });\n});\n\naddReducer('loadMoreChats', (global, actions, payload) => {\n const { listType = 'active' } = payload!;\n const listIds = global.chats.listIds[listType as ('active' | 'archived')];\n const isFullyLoaded = global.chats.isFullyLoaded[listType as ('active' | 'archived')];\n\n if (isFullyLoaded) {\n return;\n }\n\n const oldestChat = listIds\n ? listIds\n .map((id) => global.chats.byId[id])\n .filter((chat) => Boolean(chat && chat.lastMessage) && !selectIsChatPinned(global, chat.id))\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n if (oldestChat) {\n runThrottledForLoadChats(() => loadChats(listType, oldestChat.id, oldestChat.lastMessage!.date));\n } else {\n runThrottledForLoadChats(() => loadChats(listType));\n }\n});\n\naddReducer('loadFullChat', (global, actions, payload) => {\n const { chatId, force } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n if (force) {\n loadFullChat(chat);\n } else {\n runDebouncedForLoadFullChat(() => loadFullChat(chat));\n }\n});\n\naddReducer('loadTopChats', () => {\n runThrottledForLoadTopChats(() => loadChats('active'));\n});\n\naddReducer('requestChatUpdate', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', chat);\n});\n\naddReducer('updateChatMutedState', (global, actions, payload) => {\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('updateChatMutedState', { chat, isMuted });\n});\n\naddReducer('createChannel', (global, actions, payload) => {\n const {\n title, about, photo, memberIds,\n } = payload!;\n\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createChannel(title, members, about, photo);\n});\n\naddReducer('joinChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('joinChannel', { channelId, accessHash });\n }\n});\n\naddReducer('leaveChannel', (global, actions, payload) => {\n (async () => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n await callApi('leaveChannel', { channelId, accessHash });\n }\n\n actions.openChat({ id: undefined });\n })();\n});\n\naddReducer('deleteChannel', (global, actions, payload) => {\n (async () => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n await callApi('deleteChannel', { channelId, accessHash });\n }\n\n actions.openChat({ id: undefined });\n })();\n});\n\naddReducer('createGroupChat', (global, actions, payload) => {\n const { title, memberIds, photo } = payload!;\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createGroupChat(title, members, photo);\n});\n\naddReducer('toggleChatPinned', (global, actions, payload) => {\n const { id, folderId } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n if (folderId) {\n const folder = selectChatFolder(global, folderId);\n if (folder) {\n const shouldBePinned = !selectIsChatPinned(global, id, folderId);\n\n const { pinnedChatIds, includedChatIds } = folder;\n const newPinnedIds = shouldBePinned\n ? [id, ...(pinnedChatIds || [])]\n : (pinnedChatIds || []).filter((pinnedId) => pinnedId !== id);\n\n // With both Pin and Unpin we need to re-add a user to the included group\n const newIncludedChatIds = [id, ...includedChatIds];\n\n void callApi('editChatFolder', {\n id: folderId,\n folderUpdate: {\n ...folder,\n pinnedChatIds: newPinnedIds,\n includedChatIds: newIncludedChatIds,\n },\n });\n }\n } else {\n const listType = selectChatListType(global, id);\n const isPinned = selectIsChatPinned(global, id, listType === 'archived' ? ARCHIVED_FOLDER_ID : undefined);\n void callApi('toggleChatPinned', { chat, shouldBePinned: !isPinned });\n }\n});\n\naddReducer('toggleChatArchived', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n void callApi('toggleChatArchived', {\n chat,\n folderId: isChatArchived(chat) ? 0 : ARCHIVED_FOLDER_ID,\n });\n }\n});\n\naddReducer('loadChatFolders', () => {\n void loadChatFolders();\n});\n\naddReducer('loadRecommendedChatFolders', () => {\n void loadRecommendedChatFolders();\n});\n\naddReducer('editChatFolder', (global, actions, payload) => {\n const { id, folderUpdate } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void callApi('editChatFolder', {\n id,\n folderUpdate: {\n id,\n emoticon: folder.emoticon,\n pinnedChatIds: folder.pinnedChatIds,\n ...folderUpdate,\n },\n });\n }\n});\n\naddReducer('addChatFolder', (global, actions, payload) => {\n const { folder } = payload!;\n const { orderedIds } = global.chatFolders;\n const maxId = orderedIds && orderedIds.length ? Math.max.apply(Math.max, orderedIds) : ARCHIVED_FOLDER_ID;\n\n void createChatFolder(folder, maxId);\n});\n\naddReducer('deleteChatFolder', (global, actions, payload) => {\n const { id } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void deleteChatFolder(id);\n }\n});\n\naddReducer('toggleChatUnread', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { chat, threadId: MAIN_THREAD_ID });\n } else {\n void callApi('toggleDialogUnread', {\n chat,\n hasUnreadMark: !chat.hasUnreadMark,\n });\n }\n }\n});\n\naddReducer('openTelegramLink', (global, actions, payload) => {\n const { url } = payload!;\n let match = RE_TME_INVITE_LINK.exec(url);\n\n if (match) {\n const hash = match[1];\n\n (async () => {\n const chat = await callApi('openChatByInvite', hash);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n })();\n } else {\n match = RE_TME_LINK.exec(url)!;\n\n const username = match[1];\n const channelPostId = match[2] ? Number(match[2]) : undefined;\n\n void openChatByUsername(actions, username, channelPostId);\n }\n});\n\naddReducer('openChatByUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n void openChatByUsername(actions, username);\n});\n\naddReducer('togglePreHistoryHidden', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n let chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n void callApi('togglePreHistoryHidden', { chat, isEnabled });\n })();\n});\n\naddReducer('updateChatDefaultBannedRights', (global, actions, payload) => {\n const { chatId, bannedRights } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('updateChatDefaultBannedRights', { chat, bannedRights });\n});\n\naddReducer('updateChatMemberBannedRights', (global, actions, payload) => {\n const { chatId, userId, bannedRights } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatMemberBannedRights', { chat, user, bannedRights });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { members, kickedMembers } = chatAfterUpdate.fullInfo;\n\n const isBanned = !!bannedRights.viewMessages;\n const isUnblocked = !Object.keys(bannedRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(members && isBanned && {\n members: members.filter((m) => m.userId !== userId),\n }),\n ...(members && !isBanned && {\n members: members.map((m) => (\n m.userId === userId\n ? { ...m, bannedRights }\n : m\n )),\n }),\n ...(isUnblocked && kickedMembers && {\n kickedMembers: kickedMembers.filter((m) => m.userId !== userId),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChatAdmin', (global, actions, payload) => {\n const {\n chatId, userId, adminRights, customTitle,\n } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatAdmin', {\n chat, user, adminRights, customTitle,\n });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { adminMembers } = chatAfterUpdate.fullInfo;\n\n const isDismissed = !Object.keys(adminRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(adminMembers && isDismissed && {\n adminMembers: adminMembers.filter((m) => m.userId !== userId),\n }),\n ...(adminMembers && !isDismissed && {\n adminMembers: adminMembers.map((m) => (\n m.userId === userId\n ? { ...m, adminRights, customTitle }\n : m\n )),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChat', (global, actions, payload) => {\n const {\n chatId, title, about, photo,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n await Promise.all([\n chat.title !== title\n ? callApi('updateChatTitle', chat, title)\n : undefined,\n chat.fullInfo && chat.fullInfo.about !== about\n ? callApi('updateChatAbout', chat, about)\n : undefined,\n photo\n ? callApi('editChatPhoto', { chatId, accessHash: chat.accessHash, photo })\n : undefined,\n ]);\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n })();\n});\n\naddReducer('toggleSignatures', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleSignatures', { chat, isEnabled });\n});\n\naddReducer('loadGroupsForDiscussion', () => {\n (async () => {\n const groups = await callApi('fetchGroupsForDiscussion');\n if (!groups) {\n return;\n }\n\n const addedById = groups.reduce((result, group) => {\n if (group) {\n result[group.id] = group;\n }\n\n return result;\n }, {} as Record);\n\n const global = addChats(getGlobal(), addedById);\n setGlobal({\n ...global,\n chats: {\n ...global.chats,\n forDiscussionIds: Object.keys(addedById).map(Number),\n },\n });\n })();\n});\n\naddReducer('linkDiscussionGroup', (global, actions, payload) => {\n const { channelId, chatId } = payload!;\n\n const channel = selectChat(global, channelId);\n let chat = selectChat(global, chatId);\n if (!channel || !chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n let { fullInfo } = chat;\n if (!fullInfo) {\n const fullChat = await callApi('fetchFullChat', chat);\n if (!fullChat) {\n return;\n }\n\n fullInfo = fullChat.fullInfo;\n }\n\n if (fullInfo.isPreHistoryHidden) {\n await callApi('togglePreHistoryHidden', { chat, isEnabled: false });\n }\n\n void callApi('setDiscussionGroup', { channel, chat });\n })();\n});\n\naddReducer('unlinkDiscussionGroup', (global, actions, payload) => {\n const { channelId } = payload!;\n\n const channel = selectChat(global, channelId);\n if (!channel) {\n return;\n }\n\n let chat: ApiChat | undefined;\n if (channel.fullInfo && channel.fullInfo.linkedChatId) {\n chat = selectChat(global, channel.fullInfo.linkedChatId);\n }\n\n (async () => {\n await callApi('setDiscussionGroup', { channel });\n if (chat) {\n loadFullChat(chat);\n }\n })();\n});\n\n\naddReducer('setActiveChatFolder', (global, actions, payload) => {\n return {\n ...global,\n chatFolders: {\n ...global.chatFolders,\n activeChatFolder: payload,\n },\n };\n});\n\naddReducer('loadMoreMembers', (global) => {\n (async () => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n if (!chat || isChatBasicGroup(chat)) {\n return;\n }\n\n const offset = (chat.fullInfo && chat.fullInfo.members && chat.fullInfo.members.length) || undefined;\n const result = await callApi('fetchMembers', chat.id, chat.accessHash!, 'recent', offset);\n if (!result) {\n return;\n }\n\n const { members, users } = result;\n if (!members || !members.length) {\n return;\n }\n\n global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateChat(global, chat.id, {\n fullInfo: {\n ...chat.fullInfo,\n members: [\n ...((chat.fullInfo || {}).members || []),\n ...(members || []),\n ],\n },\n });\n setGlobal(global);\n })();\n});\n\nasync function loadChats(listType: 'active' | 'archived', offsetId?: number, offsetDate?: number) {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n offsetDate,\n archived: listType === 'archived',\n withPinned: getGlobal().chats.orderedPinnedIds[listType] === undefined,\n });\n\n if (!result) {\n return;\n }\n\n const { chatIds } = result;\n\n if (chatIds.length > 0 && chatIds[0] === offsetId) {\n chatIds.shift();\n }\n\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateChatListIds(global, listType, chatIds);\n global = updateChatListSecondaryInfo(global, listType, result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n\n if (chatIds.length === 0 && !global.chats.isFullyLoaded[listType]) {\n global = {\n ...global,\n chats: {\n ...global.chats,\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [listType]: true,\n },\n },\n };\n }\n\n setGlobal(global);\n}\n\nasync function loadFullChat(chat: ApiChat) {\n const result = await callApi('fetchFullChat', chat);\n if (!result) {\n return;\n }\n\n const { users, fullInfo } = result;\n\n let global = getGlobal();\n if (users) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n global = updateChat(global, chat.id, { fullInfo });\n\n setGlobal(global);\n}\n\nasync function createChannel(title: string, users: ApiUser[], about?: string, photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChannel = await callApi('createChannel', { title, about, users });\n if (!createdChannel) {\n return;\n }\n\n const { id: channelId, accessHash } = createdChannel;\n\n let global = getGlobal();\n global = updateChat(global, channelId, createdChannel);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChannel ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: channelId });\n\n if (channelId && accessHash && photo) {\n await callApi('editChatPhoto', { chatId: channelId, accessHash, photo });\n }\n}\n\nasync function createGroupChat(title: string, users: ApiUser[], photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChat = await callApi('createGroupChat', { title, users });\n if (!createdChat) {\n return;\n }\n\n const { id: chatId } = createdChat;\n\n let global = getGlobal();\n global = updateChat(global, chatId, createdChat);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChat ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: chatId });\n\n if (chatId && photo) {\n await callApi('editChatPhoto', { chatId, photo });\n }\n}\n\nasync function loadChatFolders() {\n const chatFolders = await callApi('fetchChatFolders');\n\n if (chatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n ...chatFolders,\n },\n });\n }\n}\n\nasync function loadRecommendedChatFolders() {\n const recommendedChatFolders = await callApi('fetchRecommendedChatFolders');\n\n if (recommendedChatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommendedChatFolders,\n },\n });\n }\n}\n\nasync function createChatFolder(folder: ApiChatFolder, maxId: number) {\n // Clear fields from recommended folders\n const { id: recommendedId, description, ...newFolder } = folder;\n\n await callApi('editChatFolder', {\n id: maxId + 1,\n folderUpdate: {\n id: maxId + 1,\n ...newFolder,\n },\n });\n\n if (!description) {\n return;\n }\n\n const global = getGlobal();\n const { recommended } = global.chatFolders;\n\n if (recommended) {\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommended.filter(({ id }) => id !== recommendedId),\n },\n });\n }\n}\n\nasync function deleteChatFolder(id: number) {\n await callApi('deleteChatFolder', id);\n}\n\nasync function openChatByUsername(\n actions: GlobalActions,\n username: string,\n channelPostId?: number,\n) {\n const global = getGlobal();\n const localChat = selectChatByUsername(global, username);\n if (localChat && !localChat.isMin) {\n if (channelPostId) {\n actions.focusMessage({ chatId: localChat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: localChat.id });\n }\n return;\n }\n\n const previousChat = selectCurrentChat(global);\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await callApi('getChatByUsername', username);\n if (!chat) {\n if (previousChat) {\n actions.openChat({ id: previousChat.id });\n }\n\n actions.showNotification({ message: 'User does not exist' });\n\n return;\n }\n\n setGlobal(updateChat(getGlobal(), chat.id, chat));\n\n if (channelPostId) {\n actions.focusMessage({ chatId: chat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: chat.id });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiChat,\n ApiMessage,\n ApiMessageEntity,\n ApiNewPoll,\n ApiOnProgress,\n ApiSticker,\n ApiVideo,\n MAIN_THREAD_ID,\n MESSAGE_DELETED,\n} from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { MAX_MEDIA_FILES_FOR_ALBUM, MESSAGE_LIST_SLICE } from '../../../config';\nimport { callApi, cancelApiProgress } from '../../../api/gramjs';\nimport { areSortedArraysIntersecting, buildCollectionByKey, split } from '../../../util/iteratees';\nimport {\n addUsers,\n addChatMessagesById,\n replaceThreadParam,\n safeReplaceViewportIds,\n updateChatMessage,\n addChats,\n updateListedIds,\n updateOutlyingIds,\n replaceScheduledMessages,\n updateThreadInfos,\n} from '../../reducers';\nimport {\n selectChat,\n selectChatMessage,\n selectCurrentMessageList,\n selectFocusedMessageId,\n selectCurrentChat,\n selectListedIds,\n selectOutlyingIds,\n selectViewportIds,\n selectRealLastReadId,\n selectReplyingToId,\n selectEditingId,\n selectDraft,\n selectThreadOriginChat,\n selectThreadTopMessageId,\n selectEditingScheduledId,\n selectEditingMessage,\n selectScheduledMessage,\n selectNoWebPage,\n} from '../../selectors';\nimport { rafPromise, throttle } from '../../../util/schedulers';\nimport { copyTextToClipboard } from '../../../util/clipboard';\n\nconst uploadProgressCallbacks = new Map();\n\nconst runThrottledForMarkRead = throttle((cb) => cb(), 1000, true);\n\naddReducer('loadViewportMessages', (global, actions, payload) => {\n const {\n direction = LoadMoreDirection.Around,\n isBudgetPreload = false,\n } = payload || {};\n\n let { chatId, threadId } = payload || {};\n\n if (!chatId) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n chatId = currentMessageList.chatId;\n threadId = currentMessageList.threadId;\n }\n\n const chat = selectChat(global, chatId);\n // TODO Revise if `chat.isRestricted` check is needed\n if (!chat || chat.isRestricted) {\n return undefined;\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (!viewportIds || !viewportIds.length || direction === LoadMoreDirection.Around) {\n const offsetId = selectFocusedMessageId(global, chatId) || selectRealLastReadId(global, chatId, threadId);\n const isOutlying = Boolean(offsetId && listedIds && !listedIds.includes(offsetId));\n const historyIds = (isOutlying ? outlyingIds : listedIds) || [];\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, LoadMoreDirection.Around);\n\n if (areSomeLocal && newViewportIds.length >= MESSAGE_LIST_SLICE) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n if (!areAllLocal) {\n void loadViewportMessages(chat, threadId, offsetId, LoadMoreDirection.Around, isOutlying, isBudgetPreload);\n }\n } else {\n const offsetId = direction === LoadMoreDirection.Backwards ? viewportIds[0] : viewportIds[viewportIds.length - 1];\n const isOutlying = Boolean(outlyingIds);\n const historyIds = (isOutlying ? outlyingIds : listedIds)!;\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, direction);\n\n if (areSomeLocal) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n void loadWithBudget(actions, areAllLocal, isOutlying, isBudgetPreload, chat, threadId, direction, offsetId);\n\n if (isBudgetPreload) {\n return undefined;\n }\n }\n\n return global;\n});\n\nasync function loadWithBudget(\n actions: GlobalActions,\n areAllLocal: boolean, isOutlying: boolean, isBudgetPreload: boolean,\n chat: ApiChat, threadId: number, direction: LoadMoreDirection, offsetId?: number,\n) {\n if (!areAllLocal) {\n await loadViewportMessages(\n chat, threadId, offsetId, direction, isOutlying, isBudgetPreload,\n );\n }\n\n if (!isBudgetPreload) {\n // Let reducer return and update global\n await Promise.resolve();\n actions.loadViewportMessages({\n chatId: chat.id, threadId, direction, isBudgetPreload: true,\n });\n }\n}\n\naddReducer('loadMessage', (global, actions, payload) => {\n const { chatId, messageId, replyOriginForId } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void loadMessage(chat, messageId, replyOriginForId);\n});\n\naddReducer('sendMessage', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n\n if (type === 'scheduled' && !payload.scheduledAt) {\n return {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: payload,\n },\n };\n }\n\n const chat = selectChat(global, chatId)!;\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n const params = {\n ...payload,\n chat,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n noWebPage: selectNoWebPage(global, chatId, threadId),\n };\n\n const isSingle = !payload.attachments || payload.attachments.length <= 1;\n const isGrouped = !isSingle && payload.attachments && payload.attachments.length > 1;\n\n if (isSingle) {\n const { attachments, ...restParams } = params;\n sendMessage({\n ...restParams,\n attachment: attachments ? attachments[0] : undefined,\n });\n } else if (isGrouped) {\n const {\n text, entities, attachments, ...commonParams\n } = params;\n const groupedAttachments = split(attachments, MAX_MEDIA_FILES_FOR_ALBUM);\n for (let i = 0; i < groupedAttachments.length; i++) {\n const [firstAttachment, ...restAttachments] = groupedAttachments[i];\n const groupedId = `${Date.now()}${i}`;\n\n sendMessage({\n ...commonParams,\n text: i === 0 ? text : undefined,\n entities: i === 0 ? entities : undefined,\n attachment: firstAttachment,\n groupedId: restAttachments.length > 0 ? groupedId : undefined,\n });\n\n restAttachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n groupedId,\n });\n });\n }\n } else {\n const {\n text, entities, attachments, replyingTo, ...commonParams\n } = params;\n\n if (text) {\n sendMessage({\n ...commonParams,\n text,\n entities,\n replyingTo,\n });\n }\n\n attachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n });\n });\n }\n\n return undefined;\n});\n\naddReducer('editMessage', (global, actions, payload) => {\n const { text, entities } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const message = selectEditingMessage(global, chatId, threadId, messageListType);\n if (!chat || !message) {\n return;\n }\n\n void callApi('editMessage', {\n chat, message, text, entities, noWebPage: selectNoWebPage(global, chatId, threadId),\n });\n\n actions.setEditingId({ messageId: undefined });\n});\n\naddReducer('cancelSendingMessage', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n const message = selectChatMessage(global, chatId, messageId);\n const progressCallback = message && uploadProgressCallbacks.get(message.previousLocalId || message.id);\n if (progressCallback) {\n cancelApiProgress(progressCallback);\n }\n\n actions.apiUpdate({\n '@type': 'deleteMessages',\n ids: [messageId],\n chatId,\n });\n});\n\naddReducer('saveDraft', (global, actions, payload) => {\n const { chatId, threadId, draft } = payload!;\n if (!draft) {\n return undefined;\n }\n\n const { text, entities } = draft;\n const chat = selectChat(global, chatId)!;\n\n if (threadId === MAIN_THREAD_ID) {\n void callApi('saveDraft', {\n chat,\n text,\n entities,\n replyToMsgId: selectReplyingToId(global, chatId, threadId),\n });\n }\n\n return replaceThreadParam(global, chatId, threadId, 'draft', draft);\n});\n\naddReducer('clearDraft', (global, actions, payload) => {\n const { chatId, threadId, localOnly } = payload!;\n if (!selectDraft(global, chatId, threadId)) {\n return undefined;\n }\n\n const chat = selectChat(global, chatId)!;\n\n if (!localOnly && threadId === MAIN_THREAD_ID) {\n void callApi('clearDraft', chat);\n }\n\n return replaceThreadParam(global, chatId, threadId, 'draft', undefined);\n});\n\naddReducer('toggleMessageWebPage', (global, actions, payload) => {\n const { chatId, threadId, noWebPage } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'noWebPage', noWebPage);\n});\n\naddReducer('pinMessage', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const {\n messageId, isUnpin, isOneSide, isSilent,\n } = payload!;\n\n void callApi('pinMessage', {\n chat, messageId, isUnpin, isOneSide, isSilent,\n });\n});\n\naddReducer('unpinAllMessages', (global, actions, payload) => {\n const chat = selectChat(global, payload.chatId);\n if (!chat) {\n return;\n }\n\n void unpinAllMessages(chat);\n});\n\nasync function unpinAllMessages(chat: ApiChat) {\n await callApi('unpinAllMessages', { chat });\n let global = getGlobal();\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', []);\n setGlobal(global);\n}\n\naddReducer('deleteMessages', (global, actions, payload) => {\n const { messageIds, shouldDeleteForAll } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { chatId, threadId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteMessages', { chat, messageIds, shouldDeleteForAll });\n\n const editingId = selectEditingId(global, chatId, threadId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteScheduledMessages', (global, actions, payload) => {\n const { messageIds } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteScheduledMessages', { chat, messageIds });\n\n const editingId = selectEditingScheduledId(global, chatId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteHistory', (global, actions, payload) => {\n (async () => {\n const { chatId, shouldDeleteForAll } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const maxId = chat.lastMessage && chat.lastMessage.id;\n\n await callApi('deleteHistory', { chat, shouldDeleteForAll, maxId });\n\n actions.openChat({ id: undefined });\n })();\n});\n\naddReducer('markMessageListRead', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n const { maxId } = payload!;\n\n runThrottledForMarkRead(() => {\n void callApi('markMessageListRead', { chat, threadId, maxId });\n });\n});\n\naddReducer('markMessagesRead', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { messageIds } = payload!;\n\n void callApi('markMessagesRead', { chat, messageIds });\n});\n\naddReducer('loadWebPagePreview', (global, actions, payload) => {\n const { text } = payload!;\n void loadWebPagePreview(text);\n});\n\naddReducer('clearWebPagePreview', (global) => {\n if (!global.webPagePreview) {\n return undefined;\n }\n\n return {\n ...global,\n webPagePreview: undefined,\n };\n});\n\naddReducer('sendPollVote', (global, actions, payload) => {\n const { chatId, messageId, options } = payload!;\n const chat = selectChat(global, chatId);\n\n if (chat) {\n void callApi('sendPollVote', { chat, messageId, options });\n }\n});\n\naddReducer('loadPollOptionResults', (global, actions, payload) => {\n const {\n chat, messageId, option, offset, limit, shouldResetVoters,\n } = payload!;\n\n void loadPollOptionResults(chat, messageId, option, offset, limit, shouldResetVoters);\n});\n\naddReducer('forwardMessages', (global) => {\n const { fromChatId, messageIds, toChatId } = global.forwardMessages;\n const fromChat = fromChatId ? selectChat(global, fromChatId) : undefined;\n const toChat = toChatId ? selectChat(global, toChatId) : undefined;\n const messages = fromChatId && messageIds\n ? messageIds\n .sort((a, b) => a - b)\n .map((id) => selectChatMessage(global, fromChatId, id)).filter(Boolean as any)\n : undefined;\n\n if (fromChat && toChat && messages && messages.length) {\n void forwardMessages(fromChat, toChat, messages);\n }\n});\n\naddReducer('loadScheduledHistory', (global) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { hash } = global.scheduledMessages.byChatId[chat.id] || {};\n\n void loadScheduledHistory(chat, hash);\n});\n\naddReducer('sendScheduledMessages', (global, actions, payload) => {\n const {\n chatId, id,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('sendScheduledMessages', {\n chat,\n ids: [id],\n });\n});\n\naddReducer('rescheduleMessage', (global, actions, payload) => {\n const {\n chatId, messageId, scheduledAt,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n const message = chat && selectScheduledMessage(global, chat.id, messageId);\n if (!chat || !message) {\n return;\n }\n\n void callApi('rescheduleMessage', {\n chat,\n message,\n scheduledAt,\n });\n});\n\naddReducer('requestThreadInfoUpdate', (global, actions, payload) => {\n const { chatId, threadId } = payload;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n void callApi('requestThreadInfoUpdate', { chat, threadId });\n});\n\nasync function loadWebPagePreview(message: string) {\n const webPagePreview = await callApi('fetchWebPagePreview', { message });\n\n setGlobal({\n ...getGlobal(),\n webPagePreview,\n });\n}\n\nasync function loadViewportMessages(\n chat: ApiChat,\n threadId: number,\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n isOutlying = false,\n isBudgetPreload = false,\n) {\n const chatId = chat.id;\n\n let addOffset: number | undefined;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n addOffset = undefined;\n break;\n case LoadMoreDirection.Around:\n addOffset = -(Math.round(MESSAGE_LIST_SLICE / 2) + 1);\n break;\n case LoadMoreDirection.Forwards:\n addOffset = -(MESSAGE_LIST_SLICE + 1);\n break;\n }\n\n const result = await callApi('fetchMessages', {\n chat: selectThreadOriginChat(getGlobal(), chatId, threadId)!,\n offsetId,\n addOffset,\n limit: MESSAGE_LIST_SLICE,\n threadId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, chats, threadInfos,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n global = addChatMessagesById(global, chatId, byId);\n global = isOutlying\n ? updateOutlyingIds(global, chatId, threadId, ids)\n : updateListedIds(global, chatId, threadId, ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n global = updateThreadInfos(global, chatId, threadInfos);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (isOutlying && listedIds && outlyingIds) {\n if (areSortedArraysIntersecting(listedIds, outlyingIds)) {\n global = updateListedIds(global, chatId, threadId, outlyingIds);\n listedIds = selectListedIds(global, chatId, threadId);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n isOutlying = false;\n }\n }\n\n if (!isBudgetPreload) {\n const historyIds = isOutlying ? outlyingIds! : listedIds!;\n const { newViewportIds } = getViewportSlice(historyIds, offsetId, direction);\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds!);\n }\n\n setGlobal(global);\n}\n\nasync function loadMessage(chat: ApiChat, messageId: number, replyOriginForId: number) {\n const result = await callApi('fetchMessage', { chat, messageId });\n if (!result) {\n return;\n }\n\n if (result === MESSAGE_DELETED) {\n if (replyOriginForId) {\n let global = getGlobal();\n const replyMessage = selectChatMessage(global, chat.id, replyOriginForId);\n global = updateChatMessage(global, chat.id, replyOriginForId, {\n ...replyMessage,\n replyToMessageId: undefined,\n });\n setGlobal(global);\n }\n\n return;\n }\n\n let global = getGlobal();\n global = updateChatMessage(global, chat.id, messageId, result.message);\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n setGlobal(global);\n}\n\nfunction findClosestIndex(sourceIds: number[], offsetId: number) {\n if (offsetId < sourceIds[0]) {\n return 0;\n }\n\n if (offsetId > sourceIds[sourceIds.length - 1]) {\n return sourceIds.length - 1;\n }\n\n return sourceIds.findIndex((id, i) => (\n id === offsetId\n || (id < offsetId && sourceIds[i + 1] > offsetId)\n ));\n}\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n) {\n const { length } = sourceIds;\n const index = offsetId ? findClosestIndex(sourceIds, offsetId) : -1;\n const isBackwards = direction === LoadMoreDirection.Backwards;\n const indexForDirection = isBackwards ? index : (index + 1) || length;\n const from = indexForDirection - MESSAGE_LIST_SLICE;\n const to = indexForDirection + MESSAGE_LIST_SLICE - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n case LoadMoreDirection.Around:\n default:\n areSomeLocal = newViewportIds.length > 0;\n areAllLocal = newViewportIds.length === MESSAGE_LIST_SLICE;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n\nasync function sendMessage(params: {\n chat: ApiChat;\n text: string;\n entities: ApiMessageEntity[];\n replyingTo: number;\n attachment: ApiAttachment;\n sticker: ApiSticker;\n gif: ApiVideo;\n poll: ApiNewPoll;\n}) {\n let localId: number | undefined;\n const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => {\n if (!uploadProgressCallbacks.has(messageLocalId)) {\n localId = messageLocalId;\n uploadProgressCallbacks.set(messageLocalId, progressCallback!);\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n fileUploads: {\n byMessageLocalId: {\n ...global.fileUploads.byMessageLocalId,\n [messageLocalId]: { progress },\n },\n },\n });\n } : undefined;\n\n // @optimization\n if (params.replyingTo) {\n await rafPromise();\n }\n\n const global = getGlobal();\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { threadId } = currentMessageList;\n\n if (!params.replyingTo && threadId !== MAIN_THREAD_ID) {\n params.replyingTo = selectThreadTopMessageId(global, params.chat.id, threadId)!;\n }\n\n await callApi('sendMessage', params, progressCallback);\n\n if (progressCallback && localId) {\n uploadProgressCallbacks.delete(localId);\n }\n}\n\nfunction forwardMessages(\n fromChat: ApiChat,\n toChat: ApiChat,\n messages: ApiMessage[],\n) {\n callApi('forwardMessages', {\n fromChat,\n toChat,\n messages,\n });\n\n setGlobal({\n ...getGlobal(),\n forwardMessages: {},\n });\n}\n\nasync function loadPollOptionResults(\n chat: ApiChat,\n messageId: number,\n option: string,\n offset?: string,\n limit?: number,\n shouldResetVoters?: boolean,\n) {\n const result = await callApi('loadPollOptionResults', {\n chat, messageId, option, offset, limit,\n });\n\n if (!result) {\n return;\n }\n\n const isUnique = (v: number, i: number, a: number[]) => a.indexOf(v) === i;\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n const { voters } = global.pollResults;\n\n setGlobal({\n ...global,\n pollResults: {\n ...global.pollResults,\n voters: {\n ...voters,\n [option]: [\n ...(!shouldResetVoters && voters && voters[option] ? voters[option] : []),\n ...(result && result.users.map((user) => user.id)),\n ].filter(isUnique),\n },\n offsets: {\n ...(global.pollResults.offsets ? global.pollResults.offsets : {}),\n [option]: result.nextOffset || '',\n },\n },\n });\n}\n\naddReducer('loadPinnedMessages', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void loadPinnedMessages(chat);\n});\n\naddReducer('loadMessageLink', (global, actions, payload) => {\n const { messageId, chatId } = payload;\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n if (!chat || !message) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchMessageLink', { chat, message });\n\n if (result) {\n copyTextToClipboard(result.link);\n }\n })();\n});\n\nasync function loadPinnedMessages(chat: ApiChat) {\n const result = await callApi('fetchPinnedMessages', { chat });\n if (!result) {\n return;\n }\n\n const { messages, chats, users } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = addChatMessagesById(global, chat.id, byId);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n setGlobal(global);\n}\n\nasync function loadScheduledHistory(chat: ApiChat, historyHash?: number) {\n const result = await callApi('fetchScheduledHistory', { chat, hash: historyHash });\n if (!result) {\n return;\n }\n\n const { hash, messages } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = replaceScheduledMessages(global, chat.id, byId, hash);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { LangCode } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { pause, throttle } from '../../../util/schedulers';\nimport {\n updateStickerSets,\n updateStickerSet,\n replaceAnimatedEmojis,\n updateGifSearch,\n updateStickersForEmoji,\n rebuildStickersForEmoji,\n} from '../../reducers';\nimport searchWords from '../../../util/searchWords';\nimport { selectEmojiKeywords, selectStickerSet } from '../../selectors';\n\nconst ADDED_SETS_THROTTLE = 500;\nconst ADDED_SETS_THROTTLE_CHUNK = 50;\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('loadStickerSets', (global) => {\n const { hash } = global.stickers.added || {};\n void loadStickerSets(hash);\n});\n\naddReducer('loadAddedStickers', (global, actions) => {\n const { setIds: addedSetIds } = global.stickers.added;\n if (!addedSetIds || !addedSetIds.length) {\n return;\n }\n\n (async () => {\n for (let i = 0; i < addedSetIds.length; i++) {\n actions.loadStickers({ stickerSetId: addedSetIds[i] });\n\n if (i % ADDED_SETS_THROTTLE_CHUNK === 0 && i > 0) {\n await pause(ADDED_SETS_THROTTLE);\n }\n }\n })();\n});\n\naddReducer('loadRecentStickers', (global) => {\n const { hash } = global.stickers.recent || {};\n void loadRecentStickers(hash);\n});\n\naddReducer('loadFavoriteStickers', (global) => {\n const { hash } = global.stickers.favorite || {};\n void loadFavoriteStickers(hash);\n});\n\naddReducer('loadFeaturedStickers', (global) => {\n const { hash } = global.stickers.featured || {};\n void loadFeaturedStickers(hash);\n});\n\naddReducer('loadStickers', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n let { stickerSetAccessHash } = payload!;\n\n if (!stickerSetAccessHash) {\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n stickerSetAccessHash = stickerSet.accessHash;\n }\n\n void loadStickers(stickerSetId, stickerSetAccessHash);\n});\n\naddReducer('loadAnimatedEmojis', () => {\n void loadAnimatedEmojis();\n});\n\naddReducer('loadSavedGifs', (global) => {\n const { hash } = global.gifs.saved;\n void loadSavedGifs(hash);\n});\n\naddReducer('faveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void callApi('faveSticker', { sticker });\n }\n});\n\naddReducer('unfaveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void unfaveSticker(sticker);\n }\n});\n\naddReducer('toggleStickerSet', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n const { accessHash, installedDate } = stickerSet;\n\n void callApi(!installedDate ? 'installStickerSet' : 'uninstallStickerSet', { stickerSetId, accessHash });\n});\n\naddReducer('loadEmojiKeywords', (global, actions, payload: { language: LangCode }) => {\n const { language } = payload;\n let currentEmojiKeywords = selectEmojiKeywords(global, language);\n\n if (currentEmojiKeywords && currentEmojiKeywords.isLoading) {\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: true,\n },\n },\n });\n\n (async () => {\n const emojiKeywords = await callApi('fetchEmojiKeywords', {\n language,\n fromVersion: currentEmojiKeywords ? currentEmojiKeywords.version : 0,\n });\n\n global = getGlobal();\n currentEmojiKeywords = selectEmojiKeywords(global, language);\n\n if (!emojiKeywords) {\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: false,\n },\n },\n });\n\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n isLoading: false,\n version: emojiKeywords.version,\n keywords: {\n ...(currentEmojiKeywords && currentEmojiKeywords.keywords),\n ...emojiKeywords.keywords,\n },\n },\n },\n });\n })();\n});\n\nasync function loadStickerSets(hash = 0) {\n const addedStickers = await callApi('fetchStickerSets', { hash });\n if (!addedStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'added',\n addedStickers.hash,\n addedStickers.sets,\n ));\n}\n\nasync function loadRecentStickers(hash = 0) {\n const recentStickers = await callApi('fetchRecentStickers', { hash });\n if (!recentStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n recent: recentStickers,\n },\n });\n}\n\nasync function loadFavoriteStickers(hash = 0) {\n const favoriteStickers = await callApi('fetchFavoriteStickers', { hash });\n if (!favoriteStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: favoriteStickers,\n },\n });\n}\n\nasync function loadFeaturedStickers(hash = 0) {\n const featuredStickers = await callApi('fetchFeaturedStickers', { hash });\n if (!featuredStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'featured',\n featuredStickers.hash,\n featuredStickers.sets,\n ));\n}\n\nasync function loadStickers(stickerSetId: string, accessHash: string) {\n const stickerSet = await callApi('fetchStickers', { stickerSetId, accessHash });\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers, packs } = stickerSet;\n\n let global = getGlobal();\n\n global = updateStickerSet(global, set.id, { ...set, stickers, packs });\n\n const currentEmoji = global.stickers.forEmoji.emoji;\n if (currentEmoji && packs[currentEmoji]) {\n global = rebuildStickersForEmoji(global);\n }\n\n setGlobal(global);\n}\n\nasync function loadAnimatedEmojis() {\n const stickerSet = await callApi('fetchAnimatedEmojis');\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers } = stickerSet;\n\n setGlobal(replaceAnimatedEmojis(getGlobal(), { ...set, stickers }));\n}\n\nfunction unfaveSticker(sticker: ApiSticker) {\n const global = getGlobal();\n\n // Remove sticker preemptively to get instant feedback when user removes sticker\n // from favorites while in Sticker Picker\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: {\n ...global.stickers.favorite,\n stickers: global.stickers.favorite.stickers.filter(({ id }) => id !== sticker.id),\n },\n },\n });\n\n void callApi('faveSticker', { sticker, unfave: true });\n}\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (query) {\n void searchThrottled(() => {\n searchStickers(query);\n });\n }\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query);\n });\n }\n});\n\naddReducer('searchMoreGifs', (global) => {\n const { query, offset } = global.gifs.search;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query, offset);\n });\n }\n});\n\naddReducer('loadStickersForEmoji', (global, actions, payload) => {\n const { emoji } = payload!;\n const { hash } = global.stickers.forEmoji;\n\n void searchThrottled(() => {\n loadStickersForEmoji(emoji, hash);\n });\n});\n\naddReducer('clearStickersForEmoji', (global) => {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {},\n },\n };\n});\n\nasync function searchStickers(query: string, hash = 0) {\n const result = await callApi('searchStickers', { query, hash });\n\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n const { setsById, added } = global.stickers;\n\n const resultIds = result.sets.map(({ id }) => id);\n\n if (added.setIds) {\n added.setIds.forEach((id) => {\n if (!resultIds.includes(id)) {\n const { title } = setsById[id] || {};\n if (title && searchWords(title, query)) {\n resultIds.unshift(id);\n }\n }\n });\n }\n\n setGlobal(updateStickerSets(\n global,\n 'search',\n result.hash,\n result.sets,\n resultIds,\n ));\n}\n\nasync function searchGifs(query: string, offset?: string) {\n const result = await callApi('searchGifs', { query, offset });\n if (!result) {\n return;\n }\n\n setGlobal(updateGifSearch(getGlobal(), !offset, result.gifs, result.nextOffset));\n}\n\nasync function loadSavedGifs(hash = 0) {\n const savedGifs = await callApi('fetchSavedGifs', { hash });\n if (!savedGifs) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n gifs: {\n ...global.gifs,\n saved: savedGifs,\n },\n });\n}\n\nasync function loadStickersForEmoji(emoji: string, hash = 0) {\n let global = getGlobal();\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n ...global.stickers.forEmoji,\n emoji,\n },\n },\n });\n\n const result = await callApi('fetchStickersForEmoji', { emoji, hash });\n\n global = getGlobal();\n\n if (!result || global.stickers.forEmoji.emoji !== emoji) {\n return;\n }\n\n global = updateStickersForEmoji(global, emoji, result.stickers, result.hash);\n\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { ApiChat, ApiGlobalMessageSearchType } from '../../../api/types';\n\nimport {\n addChats,\n addMessages,\n addUsers,\n updateGlobalSearch,\n updateGlobalSearchFetchingStatus,\n updateGlobalSearchResults,\n} from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\nimport { selectChat, selectCurrentGlobalSearchQuery } from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { GLOBAL_SEARCH_SLICE } from '../../../config';\nimport { timestampPlusDay } from '../../../util/dateFormat';\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { chatId } = global.globalSearch;\n const { query } = payload!;\n\n if (query && !chatId) {\n void searchThrottled(() => {\n searchChats(query);\n });\n }\n});\n\naddReducer('setGlobalSearchDate', (global, actions, payload) => {\n const { date } = payload!;\n const maxDate = date ? timestampPlusDay(date) : date;\n const newGlobal = updateGlobalSearch(global, {\n date,\n query: '',\n resultsByType: {\n ...global.globalSearch.resultsByType,\n text: {\n totalCount: undefined,\n foundIds: [],\n nextOffsetId: 0,\n },\n },\n });\n setGlobal(newGlobal);\n const { chatId } = global.globalSearch;\n const chat = chatId ? selectChat(global, chatId) : undefined;\n searchMessagesGlobal('', 'text', undefined, chat, maxDate, date);\n});\n\naddReducer('searchMessagesGlobal', (global, actions, payload) => {\n const {\n query, resultsByType, chatId, date,\n } = global.globalSearch;\n const maxDate = date ? timestampPlusDay(date) : date;\n const { type } = payload;\n const { nextOffsetId } = (resultsByType && resultsByType[type as ApiGlobalMessageSearchType]) || {};\n\n const chat = chatId ? selectChat(global, chatId) : undefined;\n\n searchMessagesGlobal(query, type, nextOffsetId, chat, maxDate, date);\n});\n\nasync function searchChats(query: string) {\n const result = await callApi('searchChats', { query });\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { chats: false }));\n return;\n }\n\n const {\n localChats, localUsers, globalChats, globalUsers,\n } = result;\n\n if (localChats.length || globalChats.length) {\n global = addChats(global, buildCollectionByKey([...localChats, ...globalChats], 'id'));\n }\n\n if (localUsers.length || globalUsers.length) {\n global = addUsers(global, buildCollectionByKey([...localUsers, ...globalUsers], 'id'));\n }\n\n global = updateGlobalSearchFetchingStatus(global, { chats: false });\n global = updateGlobalSearch(global, {\n localResults: {\n chatIds: localChats.map(({ id }) => id),\n userIds: localUsers.map(({ id }) => id),\n },\n globalResults: {\n ...global.globalSearch.globalResults,\n chatIds: globalUsers.map(({ id }) => id),\n userIds: globalChats.map(({ id }) => id),\n },\n });\n\n setGlobal(global);\n}\n\nasync function searchMessagesGlobal(\n query = '', type: ApiGlobalMessageSearchType, offsetRate?: number, chat?: ApiChat, maxDate?: number, minDate?: number,\n) {\n let result;\n\n if (chat) {\n const localResult = await callApi('searchMessagesLocal', {\n chatOrUser: chat,\n query,\n type,\n limit: GLOBAL_SEARCH_SLICE,\n offsetId: offsetRate,\n minDate,\n maxDate,\n });\n\n if (localResult) {\n const {\n messages, users, totalCount, nextOffsetId,\n } = localResult;\n\n result = {\n messages,\n users,\n chats: [],\n totalCount,\n nextRate: nextOffsetId,\n };\n }\n } else {\n result = await callApi('searchMessagesGlobal', {\n query,\n offsetRate,\n limit: GLOBAL_SEARCH_SLICE,\n type,\n maxDate,\n minDate,\n });\n }\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || (query !== '' && query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { messages: false }));\n return;\n }\n\n const {\n messages, users, chats, totalCount, nextRate,\n } = result;\n\n if (chats.length) {\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n }\n\n if (users.length) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (messages.length) {\n global = addMessages(global, messages);\n }\n\n global = updateGlobalSearchResults(\n global,\n messages,\n totalCount,\n type,\n nextRate,\n );\n\n setGlobal(global);\n}\n","import {\n addReducer, getGlobal, setGlobal, getDispatch,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiFormattedText, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n CHAT_LIST_LOAD_SLICE, DEBUG, MESSAGE_LIST_SLICE,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n replaceChatListIds,\n replaceChats,\n replaceUsers,\n updateUsers,\n updateChats,\n updateChatListSecondaryInfo,\n updateThreadInfos,\n replaceThreadParam,\n} from '../../reducers';\nimport {\n selectUser, selectChat, selectCurrentMessageList, selectDraft, selectChatMessage,\n} from '../../selectors';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('sync', (global, actions) => {\n void sync(actions.afterSync);\n});\n\naddReducer('afterSync', (global, actions) => {\n void afterSync(actions);\n});\n\nasync function sync(afterSyncCallback: () => void) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START SYNC');\n }\n\n await callApi('fetchCurrentUser');\n\n // This fetches only active chats and clears archived chats, which will be fetched in `afterSync`\n const savedUsers = await loadAndReplaceChats();\n await loadAndReplaceMessages(savedUsers);\n\n setGlobal({\n ...getGlobal(),\n lastSyncTime: Date.now(),\n });\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH SYNC');\n }\n\n afterSyncCallback();\n}\n\nasync function afterSync(actions: GlobalActions) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START AFTER-SYNC');\n }\n\n actions.loadFavoriteStickers();\n\n await Promise.all([\n loadAndUpdateUsers(),\n loadAndReplaceArchivedChats(),\n ]);\n\n await callApi('fetchCurrentUser');\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH AFTER-SYNC');\n }\n}\n\nasync function loadAndReplaceChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n withPinned: true,\n });\n if (!result) {\n return undefined;\n }\n\n let global = getGlobal();\n\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n const { currentUserId } = global;\n\n const savedPrivateChatIds = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ...(currentUserId ? [currentUserId] : []),\n ];\n\n const savedUsers = savedPrivateChatIds\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n const savedChats = savedPrivateChatIds\n .map((id) => selectChat(global, id))\n .filter(Boolean as any);\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n if (currentChatId) {\n const selectedChat = selectChat(global, currentChatId);\n if (selectedChat && !savedPrivateChatIds.includes(currentChatId)) {\n savedChats.push(selectedChat);\n }\n\n if (isChatPrivate(currentChatId)) {\n const selectedChatUser = selectUser(global, currentChatId);\n if (selectedChatUser && !savedPrivateChatIds.includes(currentChatId)) {\n savedUsers.push(selectedChatUser);\n }\n }\n }\n\n savedUsers.push(...result.users);\n savedChats.push(...result.chats);\n\n global = replaceChats(global, buildCollectionByKey(savedChats, 'id'));\n global = replaceChatListIds(global, 'active', result.chatIds);\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n },\n };\n\n global = updateChatListSecondaryInfo(global, 'active', result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n setGlobal(global);\n\n if (currentChatId && !global.chats.byId[currentChatId]) {\n getDispatch().openChat({ id: undefined });\n }\n\n return savedUsers;\n}\n\nasync function loadAndReplaceArchivedChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n archived: true,\n withPinned: true,\n });\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = replaceChatListIds(global, 'archived', result.chatIds);\n global = updateChatListSecondaryInfo(global, 'archived', result);\n setGlobal(global);\n}\n\nasync function loadAndReplaceMessages(savedUsers?: ApiUser[]) {\n let areMessagesLoaded = false;\n let users = savedUsers || [];\n\n let global = getGlobal();\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n // Memoize drafts\n const draftChatIds = Object.keys(global.messages.byChatId).map(Number);\n const draftsByChatId = draftChatIds.reduce>((acc, chatId) => {\n const draft = selectDraft(global, chatId, MAIN_THREAD_ID);\n return draft ? { ...acc, [chatId]: draft } : acc;\n }, {});\n\n if (currentChatId) {\n const result = await loadTopMessages(global.chats.byId[currentChatId]);\n global = getGlobal();\n const { chatId: newCurrentChatId } = selectCurrentMessageList(global) || {};\n\n if (result && newCurrentChatId === currentChatId) {\n const currentMessageListInfo = global.messages.byChatId[currentChatId];\n const byId = buildCollectionByKey(result.messages, 'id');\n const listedIds = Object.keys(byId).map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n [currentChatId]: {\n byId,\n threadsById: {\n [MAIN_THREAD_ID]: {\n ...(currentMessageListInfo && currentMessageListInfo.threadsById[MAIN_THREAD_ID]),\n listedIds,\n viewportIds: listedIds,\n outlyingIds: undefined,\n },\n },\n },\n },\n },\n };\n\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateThreadInfos(global, currentChatId, result.threadInfos);\n\n areMessagesLoaded = true;\n users = Array.prototype.concat(users, result.users);\n }\n }\n\n if (!areMessagesLoaded) {\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {},\n },\n };\n }\n\n // Restore drafts\n Object.keys(draftsByChatId).map(Number).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', draftsByChatId[chatId]);\n });\n\n if (savedUsers) {\n global = replaceUsers(global, buildCollectionByKey(users, 'id'));\n } else if (users) {\n // If `fetchChats` has failed for some reason, we don't have saved chats, thus we can not replace\n global = updateUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n setGlobal(global);\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n if (audioChatId && audioMessageId && !selectChatMessage(global, audioChatId, audioMessageId)) {\n getDispatch().closeAudioPlayer();\n }\n}\n\nasync function loadAndUpdateUsers() {\n let global = getGlobal();\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n if (\n (!contactIds || !contactIds.length)\n && (!recentlyFoundChatIds || !recentlyFoundChatIds.length)\n ) {\n return;\n }\n\n const users = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ].map((id) => selectUser(global, id)).filter(Boolean as any);\n\n const updatedUsers = await callApi('fetchUsers', { users });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n}\n\nfunction loadTopMessages(chat: ApiChat) {\n return callApi('fetchMessages', {\n chat,\n threadId: MAIN_THREAD_ID,\n offsetId: chat.lastReadInboxMessageId,\n addOffset: -(Math.round(MESSAGE_LIST_SLICE / 2) + 1),\n limit: MESSAGE_LIST_SLICE,\n });\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectCurrentTextSearch,\n selectCurrentMediaSearchPeerId,\n selectCurrentMediaSearch, selectCurrentMessageList, selectChat, selectThreadInfo,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n addChatMessagesById,\n addUsers,\n updateLocalMediaSearchResults,\n updateLocalTextSearchResults,\n} from '../../reducers';\nimport { SharedMediaType } from '../../../types';\n\naddReducer('searchTextMessagesLocal', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const currentSearch = selectCurrentTextSearch(global);\n if (!chat || !currentSearch || !threadId) {\n return;\n }\n\n const { query, results } = currentSearch;\n const offsetId = results ? results.nextOffsetId : undefined;\n\n let topMessageId: number | undefined;\n if (threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId!, threadId);\n topMessageId = threadInfo ? threadInfo.topMessageId : undefined;\n }\n\n void searchTextMessages(chat, threadId, topMessageId, query, offsetId);\n});\n\naddReducer('searchMediaMessagesLocal', (global) => {\n const peerId = selectCurrentMediaSearchPeerId(global);\n const chatOrUser = peerId\n ? global.users.byId[peerId] || global.chats.byId[peerId]\n : undefined;\n const currentSearch = selectCurrentMediaSearch(global);\n\n if (!chatOrUser || !currentSearch) {\n return;\n }\n\n const { currentType: type, resultsByType } = currentSearch;\n const currentResults = type && resultsByType && resultsByType[type];\n const offsetId = currentResults ? currentResults.nextOffsetId : undefined;\n\n if (!type) {\n return;\n }\n\n void searchSharedMedia(chatOrUser, type, offsetId);\n});\n\naddReducer('searchMessagesByDate', (global, actions, payload) => {\n const { timestamp } = payload!;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void searchMessagesByDate(chat, timestamp);\n});\n\nasync function searchTextMessages(\n chatOrUser: ApiChat,\n threadId: number,\n topMessageId?: number,\n query?: string,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type: 'text',\n query,\n topMessageId,\n limit: MESSAGE_SEARCH_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentTextSearch(global);\n if (!currentSearch || (query && query !== currentSearch.query)) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalTextSearchResults(global, chatOrUser.id, threadId, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\nasync function searchSharedMedia(\n chatOrUser: ApiChat | ApiUser,\n type: SharedMediaType,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type,\n limit: SHARED_MEDIA_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentMediaSearch(global);\n if (!currentSearch) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalMediaSearchResults(global, chatOrUser.id, type, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\n/**\n * @param timestamp start of target date in seconds\n */\nasync function searchMessagesByDate(chat: ApiChat, timestamp: number) {\n const messageId = await callApi('findFirstMessageIdAfterDate', {\n chat,\n timestamp,\n });\n\n if (!messageId) {\n return;\n }\n\n getDispatch().focusMessage({\n chatId: chat.id,\n messageId,\n });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementProgress } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { updateManagement, updateManagementProgress } from '../../reducers';\nimport { selectChat, selectCurrentMessageList } from '../../selectors';\nimport { isChatBasicGroup } from '../../helpers';\n\naddReducer('checkPublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n // No need to check the username if already in progress\n if (global.management.progress === ManagementProgress.InProgress) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n\n const isUsernameAvailable = await callApi('checkChatUsername', { username })!;\n\n global = getGlobal();\n global = updateManagementProgress(\n global, isUsernameAvailable ? ManagementProgress.Complete : ManagementProgress.Error,\n );\n global = updateManagement(global, chatId, { isUsernameAvailable });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n let chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n setGlobal(global);\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n const result = await callApi('setChatUsername', { chat, username });\n\n global = getGlobal();\n global = updateManagementProgress(global, result ? ManagementProgress.Complete : ManagementProgress.Error);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePrivateLink', (global) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n callApi('updatePrivateLink', { chat });\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { debounce } from '../../../util/schedulers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { isChatPrivate } from '../../helpers';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat, selectUser } from '../../selectors';\nimport {\n addChats, addUsers, updateChat, updateManagementProgress, updateUser, updateUsers,\n} from '../../reducers';\n\nconst runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);\nconst TOP_PEERS_REQUEST_COOLDOWN = 60000; // 1 min\n\naddReducer('loadFullUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n runDebouncedForFetchFullUser(() => callApi('fetchFullUser', { id, accessHash }));\n});\n\naddReducer('loadUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n (async () => {\n const updatedUsers = await callApi('fetchUsers', { users: [user] });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n })();\n});\n\naddReducer('loadTopUsers', (global) => {\n const { hash, lastRequestedAt } = global.topPeers;\n\n if (!lastRequestedAt || Date.now() - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) {\n void loadTopUsers(hash);\n }\n});\n\naddReducer('loadContactList', (global) => {\n const { hash } = global.contactList || {};\n void loadContactList(hash);\n});\n\naddReducer('loadCurrentUser', () => {\n void callApi('fetchCurrentUser');\n});\n\naddReducer('updateContact', (global, actions, payload) => {\n const {\n userId, isMuted, firstName, lastName,\n } = payload!;\n\n void updateContact(userId, isMuted, firstName, lastName);\n});\n\naddReducer('deleteUser', (global, actions, payload) => {\n const { userId } = payload!;\n\n void deleteUser(userId);\n});\n\nasync function loadTopUsers(usersHash?: number) {\n const result = await callApi('fetchTopUsers', { hash: usersHash });\n if (!result) {\n return;\n }\n\n const { hash, ids, users } = result;\n\n let global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = {\n ...global,\n topPeers: {\n ...global.topPeers,\n hash,\n userIds: ids,\n lastRequestedAt: Date.now(),\n },\n };\n setGlobal(global);\n}\n\nasync function loadContactList(hash?: number) {\n const contactList = await callApi('fetchContactList', { hash });\n if (!contactList) {\n return;\n }\n\n let global = addUsers(getGlobal(), buildCollectionByKey(contactList.users, 'id'));\n global = addChats(global, buildCollectionByKey(contactList.chats, 'id'));\n\n // Sort contact list by Last Name (or First Name), with latin names being placed first\n const getCompareString = (user: ApiUser) => (user.lastName || user.firstName || '');\n const collator = new Intl.Collator('en-US');\n\n const sortedUsers = contactList.users.sort((a, b) => (\n collator.compare(getCompareString(a), getCompareString(b))\n )).filter((user) => !user.isSelf);\n\n setGlobal({\n ...global,\n contactList: {\n hash: contactList.hash,\n userIds: sortedUsers.map((user) => user.id),\n },\n });\n}\n\nasync function updateContact(\n userId: number,\n isMuted: boolean,\n firstName: string,\n lastName?: string,\n) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n getDispatch().updateChatMutedState({ chatId: userId, isMuted });\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n const result = await callApi('updateContact', { phone: user.phoneNumber, firstName, lastName });\n\n if (result) {\n setGlobal(updateUser(\n getGlobal(),\n user.id,\n {\n firstName,\n lastName,\n },\n ));\n }\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n}\n\nasync function deleteUser(userId: number) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n await callApi('deleteUser', { id, accessHash });\n}\n\naddReducer('loadProfilePhotos', (global, actions, payload) => {\n const { profileId } = payload!;\n const isPrivate = isChatPrivate(profileId);\n const user = isPrivate ? selectUser(global, profileId) : undefined;\n const chat = !isPrivate ? selectChat(global, profileId) : undefined;\n\n (async () => {\n const result = await callApi('fetchProfilePhotos', user, chat);\n if (!result || !result.photos) {\n return;\n }\n\n let newGlobal = getGlobal();\n if (isPrivate) {\n newGlobal = updateUser(newGlobal, profileId, { photos: result.photos });\n } else {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users!, 'id'));\n newGlobal = updateChat(newGlobal, profileId, { photos: result.photos });\n }\n\n setGlobal(newGlobal);\n })();\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, IInputPrivacyRules, IInputPrivacyContact,\n UPLOADING_WALLPAPER_SLUG,\n} from '../../../types';\n\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n} from '../../reducers';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('updateProfile', (global, actions, payload) => {\n const {\n photo, firstName, lastName, bio: about, username,\n } = payload!;\n\n (async () => {\n const { currentUserId } = global;\n if (!currentUserId) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.InProgress,\n },\n });\n\n if (photo) {\n await callApi('updateProfilePhoto', photo);\n }\n\n if (firstName || lastName || about) {\n const result = await callApi('updateProfile', { firstName, lastName, about });\n if (result) {\n global = getGlobal();\n const currentUser = currentUserId && selectUser(global, currentUserId);\n\n if (currentUser) {\n setGlobal(updateUser(\n global,\n currentUser.id,\n {\n firstName,\n lastName,\n fullInfo: {\n ...currentUser.fullInfo,\n bio: about,\n },\n },\n ));\n }\n }\n }\n\n if (username) {\n const result = await callApi('updateUsername', username);\n if (result && currentUserId) {\n setGlobal(updateUser(getGlobal(), currentUserId, { username }));\n }\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.Complete,\n },\n });\n })();\n});\n\naddReducer('checkUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n (async () => {\n // No need to check the username if profile update is already in progress\n if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) {\n return;\n }\n\n setGlobal({\n ...global,\n profileEdit: {\n progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle,\n isUsernameAvailable: undefined,\n },\n });\n\n const isUsernameAvailable = await callApi('checkUsername', username);\n\n global = getGlobal();\n setGlobal({\n ...global,\n profileEdit: {\n ...global.profileEdit!,\n isUsernameAvailable,\n },\n });\n })();\n});\n\naddReducer('loadWallpapers', () => {\n (async () => {\n const result = await callApi('fetchWallpapers', 0);\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: result.wallpapers,\n },\n });\n })();\n});\n\naddReducer('uploadWallpaper', (global, actions, payload) => {\n const file = payload;\n const previewBlobUrl = URL.createObjectURL(file);\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n {\n slug: UPLOADING_WALLPAPER_SLUG,\n document: {\n fileName: '',\n size: file.size,\n mimeType: file.type,\n previewBlobUrl,\n },\n },\n ...(global.settings.loadedWallpapers || []),\n ],\n },\n });\n\n (async () => {\n const result = await callApi('uploadWallpaper', file);\n if (!result) {\n return;\n }\n\n const { wallpaper } = result;\n\n global = getGlobal();\n if (!global.settings.loadedWallpapers) {\n return;\n }\n\n const firstWallpaper = global.settings.loadedWallpapers[0];\n if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) {\n return;\n }\n\n const withLocalMedia = {\n ...wallpaper,\n document: {\n ...wallpaper.document,\n previewBlobUrl,\n },\n };\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n withLocalMedia,\n ...global.settings.loadedWallpapers.slice(1),\n ],\n },\n });\n })();\n});\n\naddReducer('loadBlockedContacts', () => {\n (async () => {\n const result = await callApi('fetchBlockedContacts');\n\n if (!result) {\n return;\n }\n\n let newGlobal = getGlobal();\n\n if (result.users && result.users.length) {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n }\n if (result.chats && result.chats.length) {\n newGlobal = updateChats(newGlobal, buildCollectionByKey(result.chats, 'id'));\n }\n\n newGlobal = {\n ...newGlobal,\n blocked: {\n ...newGlobal.blocked,\n ids: [...(newGlobal.blocked.ids || []), ...result.blockedIds],\n totalCount: result.totalCount,\n },\n };\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('blockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(addBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('unblockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n let accessHash: string | undefined;\n const isPrivate = isChatPrivate(contactId);\n\n if (isPrivate) {\n const user = selectUser(global, contactId);\n if (!user) {\n return;\n }\n\n accessHash = user.accessHash;\n }\n\n (async () => {\n const result = await callApi('unblockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(removeBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('loadAuthorizations', () => {\n (async () => {\n const result = await callApi('fetchAuthorizations');\n if (!result) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n activeSessions: result,\n });\n })();\n});\n\naddReducer('terminateAuthorization', (global, actions, payload) => {\n const { hash } = payload!;\n\n (async () => {\n const result = await callApi('terminateAuthorization', hash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n activeSessions: newGlobal.activeSessions.filter((session) => session.hash !== hash),\n });\n })();\n});\n\naddReducer('terminateAllAuthorizations', () => {\n (async () => {\n const result = await callApi('terminateAllAuthorizations');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n activeSessions: global.activeSessions.filter((session) => session.isCurrent),\n });\n })();\n});\n\naddReducer('loadNotificationExceptions', () => {\n callApi('fetchNotificationExceptions');\n});\n\naddReducer('loadNotificationSettings', () => {\n (async () => {\n const result = await callApi('fetchNotificationSettings');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateNotificationSettings', (global, actions, payload) => {\n const { peerType, isSilent, shouldShowPreviews } = payload!;\n\n (async () => {\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, shouldShowPreviews });\n\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, shouldShowPreviews));\n })();\n});\n\naddReducer('updateContactSignUpNotification', (global, actions, payload) => {\n const { isSilent } = payload!;\n\n (async () => {\n const result = await callApi('updateContactSignUpNotification', isSilent);\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent }));\n })();\n});\n\naddReducer('loadLanguages', () => {\n (async () => {\n const result = await callApi('fetchLanguages');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { languages: result }));\n })();\n});\n\naddReducer('loadPrivacySettings', () => {\n (async () => {\n const [\n phoneNumberSettings, lastSeenSettings, profilePhotoSettings, forwardsSettings, chatInviteSettings,\n ] = await Promise.all([\n callApi('fetchPrivacySettings', 'phoneNumber'),\n callApi('fetchPrivacySettings', 'lastSeen'),\n callApi('fetchPrivacySettings', 'profilePhoto'),\n callApi('fetchPrivacySettings', 'forwards'),\n callApi('fetchPrivacySettings', 'chatInvite'),\n ]);\n\n if (\n !phoneNumberSettings || !lastSeenSettings || !profilePhotoSettings || !forwardsSettings || !chatInviteSettings\n ) {\n return;\n }\n\n const global = getGlobal();\n\n global.settings.privacy.phoneNumber = phoneNumberSettings;\n global.settings.privacy.lastSeen = lastSeenSettings;\n global.settings.privacy.profilePhoto = profilePhotoSettings;\n global.settings.privacy.forwards = forwardsSettings;\n global.settings.privacy.chatInvite = chatInviteSettings;\n\n setGlobal(global);\n })();\n});\n\naddReducer('setPrivacyVisibility', (global, actions, payload) => {\n const { privacyKey, visibility } = payload!;\n\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility,\n allowedIds: [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\naddReducer('setPrivacySettings', (global, actions, payload) => {\n const { privacyKey, isAllowList, contactsIds } = payload!;\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility: settings.visibility,\n allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\nfunction buildInputPrivacyRules(global: GlobalState, {\n visibility,\n allowedIds,\n deniedIds,\n}: {\n visibility: PrivacyVisibility;\n allowedIds: number[];\n deniedIds: number[];\n}): IInputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: IInputPrivacyRules = {\n visibility,\n };\n let users: IInputPrivacyContact[];\n let chats: IInputPrivacyContact[];\n\n const collectUsers = (userId: number) => {\n if (!isChatPrivate(userId)) {\n return undefined;\n }\n const { id, accessHash } = usersById[userId] || {};\n if (!id) {\n return undefined;\n }\n\n return { id, accessHash };\n };\n\n const collectChats = (userId: number) => {\n if (isChatPrivate(userId)) {\n return undefined;\n }\n const chat = chatsById[userId];\n\n return chat ? { id: chat.id } : undefined;\n };\n\n if (visibility === 'contacts' || visibility === 'nobody') {\n users = allowedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.allowedUsers = users;\n }\n if (chats.length > 0) {\n rules.allowedChats = chats;\n }\n }\n\n if (visibility === 'everybody' || visibility === 'contacts') {\n users = deniedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.blockedUsers = users;\n }\n if (chats.length > 0) {\n rules.blockedChats = chats;\n }\n }\n\n return rules;\n}\n","import { addReducer, getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { RE_TME_INVITE_LINK, RE_TME_LINK } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChatMessage, selectCurrentChat } from '../../selectors';\n\naddReducer('clickInlineButton', (global, actions, payload) => {\n const { button } = payload;\n\n switch (button.type) {\n case 'command':\n actions.sendBotCommand({ command: button.value });\n break;\n case 'url':\n if (button.value.match(RE_TME_INVITE_LINK) || button.value.match(RE_TME_LINK)) {\n actions.openTelegramLink({ url: button.value });\n } else {\n actions.toggleSafeLinkModal({ url: button.value });\n }\n break;\n case 'callback': {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n void answerCallbackButton(chat, button.messageId, button.value);\n break;\n }\n case 'requestPoll':\n actions.openPollModal();\n break;\n case 'buy': {\n const chat = selectCurrentChat(global);\n const { messageId, value } = button;\n if (!chat) {\n return;\n }\n\n if (value) {\n actions.getReceipt({ receiptMessageId: value, chatId: chat.id, messageId });\n } else {\n actions.getPaymentForm({ messageId });\n actions.setInvoiceMessageInfo(selectChatMessage(global, chat.id, messageId));\n actions.openPaymentModal({ messageId });\n }\n break;\n }\n }\n});\n\naddReducer('sendBotCommand', (global, actions, payload) => {\n const { command } = payload;\n const { currentUserId } = global;\n const chat = selectCurrentChat(global);\n if (!currentUserId || !chat) {\n return;\n }\n\n void sendBotCommand(chat, currentUserId, command);\n});\n\nasync function sendBotCommand(chat: ApiChat, currentUserId: number, command: string) {\n await callApi('sendMessage', {\n chat,\n text: command,\n });\n}\n\nasync function answerCallbackButton(chat: ApiChat, messageId: number, data: string) {\n const result = await callApi('answerCallbackButton', {\n chatId: chat.id,\n accessHash: chat.accessHash,\n messageId,\n data,\n });\n\n if (!result || !result.message) {\n return;\n }\n\n const { message, alert: isError } = result;\n\n if (isError) {\n getDispatch().showError({ error: { message } });\n } else {\n getDispatch().showNotification({ message });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { replaceSettings, updateTwoFaSettings } from '../../reducers';\n\naddReducer('loadPasswordInfo', () => {\n (async () => {\n const result = await callApi('getPasswordInfo');\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = replaceSettings(global, { hasPassword: result.hasPassword });\n global = updateTwoFaSettings(global, { hint: result.hint });\n setGlobal(global);\n })();\n});\n\naddReducer('checkPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('checkPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('clearPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('clearPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updatePassword', (global, actions, payload) => {\n const {\n currentPassword, password, hint, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updatePassword', currentPassword, password, hint, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updateRecoveryEmail', (global, actions, payload) => {\n const {\n currentPassword, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updateRecoveryEmail', currentPassword, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false, waitingEmailCodeLength: undefined }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('provideTwoFaEmailCode', (global, actions, payload) => {\n const { code } = payload;\n\n void callApi('provideRecoveryEmailCode', code);\n});\n\naddReducer('clearTwoFaError', (global) => {\n return updateTwoFaSettings(global, { error: undefined });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { PaymentStep } from '../../../types/index';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectPaymentMessageId,\n selectPaymentRequestId,\n selectProviderPublishableKey,\n selectStripeCredentials,\n selectChatMessage,\n} from '../../selectors';\n\nimport { getStripeError } from '../../helpers/payments';\nimport { buildQueryString } from '../../../util/requestQuery';\n\nimport {\n updateShippingOptions,\n setPaymentStep,\n setRequestInfoId,\n setPaymentForm,\n setStripeCardInfo,\n setInvoiceMessageInfo,\n setReceipt,\n clearPayment,\n closeInvoice,\n} from '../../reducers';\n\naddReducer('validateRequestedInfo', (global, actions, payload) => {\n const { requestInfo, saveInfo } = payload;\n const messageId = selectPaymentMessageId(global);\n if (!messageId) {\n return;\n }\n validateRequestedInfo(messageId, requestInfo, saveInfo);\n});\n\nasync function validateRequestedInfo(messageId: number, requestInfo: any, shouldSave?: true) {\n const result = await callApi('validateRequestedInfo', { messageId, requestInfo, shouldSave });\n if (!result) {\n return;\n }\n const { id, shippingOptions } = result;\n if (!id) {\n return;\n }\n let global = setRequestInfoId(getGlobal(), id);\n if (shippingOptions) {\n global = updateShippingOptions(global, shippingOptions);\n global = setPaymentStep(global, PaymentStep.Shipping);\n } else {\n global = setPaymentStep(global, PaymentStep.PaymentInfo);\n }\n setGlobal(global);\n}\n\naddReducer('getPaymentForm', (global, actions, payload) => {\n const { messageId } = payload;\n if (!messageId) {\n return;\n }\n getPaymentForm(messageId);\n});\n\n\nasync function getPaymentForm(messageId: number) {\n const result = await callApi('getPaymentForm', { messageId });\n if (!result) {\n return;\n }\n let global = setPaymentForm(getGlobal(), result);\n let step = PaymentStep.PaymentInfo;\n if (global.payment.invoice\n && (global.payment.invoice.shippingAddressRequested\n || global.payment.invoice.nameRequested\n || global.payment.invoice.phoneRequested\n || global.payment.invoice.emailRequested)) {\n step = PaymentStep.ShippingInfo;\n }\n global = setPaymentStep(global, step);\n setGlobal(global);\n}\n\naddReducer('getReceipt', (global, actions, payload) => {\n const { receiptMessageId, chatId, messageId } = payload;\n if (!messageId || !receiptMessageId || !chatId) {\n return;\n }\n getReceipt(messageId, receiptMessageId, chatId);\n});\n\nasync function getReceipt(messageId: number, receiptMessageId: number, chatId: number) {\n const result = await callApi('getReceipt', receiptMessageId);\n if (!result) {\n return;\n }\n let global = getGlobal();\n const message = selectChatMessage(global, chatId, messageId);\n global = setReceipt(global, result, message);\n setGlobal(global);\n}\n\naddReducer('clearPaymentError', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: undefined,\n },\n });\n});\n\naddReducer('clearReceipt', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n });\n});\n\naddReducer('sendCredentialsInfo', (global, actions, payload) => {\n const publishableKey = selectProviderPublishableKey(global);\n if (!publishableKey) {\n return;\n }\n const { credentials } = payload;\n const { data } = credentials;\n sendStipeCredentials(data, publishableKey);\n});\n\naddReducer('sendPaymentForm', (global, actions, payload) => {\n const { shippingOptionId, saveCredentials } = payload;\n const messageId = selectPaymentMessageId(global);\n const requestInfoId = selectPaymentRequestId(global);\n const publishableKey = selectProviderPublishableKey(global);\n const stripeCredentials = selectStripeCredentials(global);\n if (!messageId || !publishableKey) {\n return;\n }\n sendPaymentForm(messageId, {\n save: saveCredentials,\n data: stripeCredentials,\n }, requestInfoId, shippingOptionId);\n});\n\nasync function sendStipeCredentials(data: {\n cardNumber: string;\n cardholder?: string;\n expiryMonth: string;\n expiryYear: string;\n cvv: string;\n country: string;\n zip: string;\n},\npublishableKey: string) {\n const query = buildQueryString({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvv,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n });\n\n const response = await fetch(`https://api.stripe.com/v1/tokens${query}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Bearer ${publishableKey}`,\n },\n });\n const result = await response.json();\n if (result.error) {\n const error = getStripeError(result.error);\n const global = getGlobal();\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: {\n ...error,\n },\n },\n });\n return;\n }\n let global = setStripeCardInfo(getGlobal(), {\n type: result.type,\n id: result.id,\n });\n global = setPaymentStep(global, PaymentStep.Checkout);\n setGlobal(global);\n}\n\nasync function sendPaymentForm(\n messageId: number,\n credentials: any,\n requestedInfoId?: string,\n shippingOptionId?: string,\n) {\n const result = await callApi('sendPaymentForm', {\n messageId, credentials, requestedInfoId, shippingOptionId,\n });\n if (result) {\n const global = clearPayment(getGlobal());\n setGlobal(closeInvoice(global));\n }\n}\n\naddReducer('setPaymentStep', (global, actions, payload = {}) => {\n return setPaymentStep(global, payload.step || PaymentStep.ShippingInfo);\n});\n\naddReducer('setInvoiceMessageInfo', (global, actions, payload) => {\n return setInvoiceMessageInfo(global, payload);\n});\n","export function buildQueryString(data: Record) {\n const query = Object.keys(data).map((k) => `${k}=${data[k]}`).join('&');\n return query.length > 0 ? `?${query}` : '';\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { ARCHIVED_FOLDER_ID, MAX_ACTIVE_PINNED_CHATS } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { showNewMessageNotification } from '../../../util/notifications';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n updateChat,\n replaceChatListIds,\n updateChatListIds,\n updateChatListType,\n replaceThreadParam,\n} from '../../reducers';\nimport {\n selectChat,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectChatListType,\n selectCurrentMessageList,\n selectCountNotMutedUnread,\n} from '../../selectors';\nimport { throttle } from '../../../util/schedulers';\n\nconst TYPING_STATUS_CLEAR_DELAY = 6000; // 6 seconds\n\n// Enough to animate and mark as read in Message List\nconst CURRENT_CHAT_UNREAD_DELAY = 1000;\nconst runThrottledForUpdateAppBadge = throttle((cb) => cb(), CURRENT_CHAT_UNREAD_DELAY, true);\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateChat': {\n if (!update.noTopChatsRequest && !selectIsChatListed(global, update.id)) {\n // Chat can appear in dialogs list.\n actions.loadTopChats();\n }\n\n const newGlobal = updateChat(global, update.id, update.chat, update.newProfilePhoto);\n setGlobal(newGlobal);\n\n const unreadCount = selectCountNotMutedUnread(newGlobal);\n runThrottledForUpdateAppBadge(() => updateAppBadge(unreadCount));\n break;\n }\n\n case 'updateChatJoin': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n global = updateChatListIds(global, listType, [update.id]);\n global = updateChat(global, update.id, { isNotJoined: false });\n setGlobal(global);\n\n const chat = selectChat(global, update.id);\n if (chat) {\n actions.requestChatUpdate({ chatId: chat.id });\n }\n break;\n }\n\n case 'updateChatLeave': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== update.id));\n }\n\n global = updateChat(global, update.id, { isNotJoined: true });\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatInbox': {\n setGlobal(updateChat(global, update.id, update.chat));\n\n break;\n }\n\n case 'updateChatTypingStatus': {\n const { id, typingStatus } = update;\n setGlobal(updateChat(global, id, { typingStatus }));\n\n setTimeout(() => {\n const newGlobal = getGlobal();\n const chat = selectChat(newGlobal, id);\n if (chat && typingStatus && chat.typingStatus && chat.typingStatus.timestamp === typingStatus.timestamp) {\n setGlobal(updateChat(newGlobal, id, { typingStatus: undefined }));\n }\n }, TYPING_STATUS_CLEAR_DELAY);\n\n break;\n }\n\n case 'newMessage': {\n const { message } = update;\n const { chatId: currentChatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n\n if (message.senderId === global.currentUserId && !message.isFromScheduled) {\n return;\n }\n\n const chat = selectChat(global, update.chatId);\n if (!chat) {\n return;\n }\n\n const isActiveChat = (\n messageListType === 'thread'\n && threadId === MAIN_THREAD_ID\n && update.chatId === currentChatId\n );\n\n if (isActiveChat) {\n setTimeout(() => {\n actions.requestChatUpdate({ chatId: update.chatId });\n }, CURRENT_CHAT_UNREAD_DELAY);\n } else {\n setGlobal(updateChat(global, update.chatId, {\n unreadCount: chat.unreadCount ? chat.unreadCount + 1 : 1,\n ...(update.message.hasUnreadMention && {\n unreadMentionsCount: chat.unreadMentionsCount ? chat.unreadMentionsCount + 1 : 1,\n }),\n }));\n }\n\n const unreadCount = selectCountNotMutedUnread(getGlobal());\n updateAppBadge(unreadCount);\n showNewMessageNotification({ chat, message, isActiveChat });\n\n break;\n }\n\n case 'updateCommonBoxMessages':\n case 'updateChannelMessages': {\n const { ids, messageUpdate } = update;\n if (messageUpdate.hasUnreadMention !== false) {\n return;\n }\n\n ids.forEach((id) => {\n const chatId = 'channelId' in update ? update.channelId : selectCommonBoxChatId(global, id);\n const chat = selectChat(global, chatId);\n if (chat && chat.unreadMentionsCount) {\n global = updateChat(global, chatId, {\n unreadMentionsCount: chat.unreadMentionsCount - 1,\n });\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatFullInfo': {\n const { fullInfo } = update;\n const targetChat = global.chats.byId[update.id];\n if (!targetChat) {\n return;\n }\n\n setGlobal(updateChat(global, update.id, {\n fullInfo: {\n ...targetChat.fullInfo,\n ...fullInfo,\n },\n }));\n\n break;\n }\n\n case 'updatePinnedChatIds': {\n const { ids, folderId } = update;\n\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: ids.length ? ids : undefined,\n },\n },\n };\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatPinned': {\n const { id, isPinned } = update;\n const listType = selectChatListType(global, id);\n if (listType) {\n const { [listType]: orderedPinnedIds } = global.chats.orderedPinnedIds;\n\n let newOrderedPinnedIds = orderedPinnedIds || [];\n if (!isPinned) {\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => pinnedId !== id);\n } else if (!newOrderedPinnedIds.includes(id)) {\n // When moving pinned chats to archive, active ordered pinned ids don't get updated\n // (to preserve chat pinned state when it returns from archive)\n // If user already has max pinned chats, we should check for orderedIds\n // that don't point to listed chats\n if (listType === 'active' && newOrderedPinnedIds.length >= MAX_ACTIVE_PINNED_CHATS) {\n const listIds = global.chats.listIds.active;\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => listIds && listIds.includes(pinnedId));\n }\n\n newOrderedPinnedIds = [id, ...newOrderedPinnedIds];\n }\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: newOrderedPinnedIds.length ? newOrderedPinnedIds : undefined,\n },\n },\n };\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatListType': {\n const { id, folderId } = update;\n\n setGlobal(updateChatListType(global, id, folderId));\n\n break;\n }\n\n case 'updateChatFolder': {\n const { id, folder } = update;\n const { byId: chatFoldersById, orderedIds } = global.chatFolders;\n\n const newChatFoldersById = folder\n ? { ...chatFoldersById, [id]: folder }\n : pick(\n chatFoldersById,\n Object.keys(chatFoldersById).map(Number).filter((folderId) => folderId !== id),\n );\n\n const newOrderedIds = folder\n ? orderedIds && orderedIds.includes(id) ? orderedIds : [...(orderedIds || []), id]\n : orderedIds ? orderedIds.filter((orderedId) => orderedId !== id) : undefined;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n byId: newChatFoldersById,\n orderedIds: newOrderedIds,\n },\n });\n\n break;\n }\n\n case 'updateChatFoldersOrder': {\n const { orderedIds } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n orderedIds,\n },\n });\n\n break;\n }\n\n case 'updateRecommendedChatFolders': {\n const { folders } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: folders,\n },\n });\n\n break;\n }\n\n case 'updateChatMembers': {\n const targetChat = global.chats.byId[update.id];\n const { replacedMembers, addedMember, deletedMemberId } = update;\n if (!targetChat) {\n return;\n }\n\n let shouldUpdate = false;\n let members = targetChat.fullInfo && targetChat.fullInfo.members\n ? [...targetChat.fullInfo.members]\n : [];\n\n if (replacedMembers) {\n members = replacedMembers;\n shouldUpdate = true;\n } else if (addedMember) {\n if (\n !members.length\n || !members.some((m) => m.userId === addedMember.userId)\n ) {\n members.push(addedMember);\n shouldUpdate = true;\n }\n } else if (members.length && deletedMemberId) {\n const deleteIndex = members.findIndex((m) => m.userId === deletedMemberId);\n if (deleteIndex > -1) {\n members.slice(deleteIndex, 1);\n shouldUpdate = true;\n }\n }\n\n if (shouldUpdate) {\n const adminMembers = members.filter(({ isOwner, isAdmin }) => isOwner || isAdmin);\n // TODO Kicked members?\n\n setGlobal(updateChat(global, update.id, {\n membersCount: members.length,\n fullInfo: {\n ...targetChat.fullInfo,\n members,\n adminMembers,\n },\n }));\n }\n\n break;\n }\n\n case 'deleteProfilePhotos': {\n const { chatId, ids } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat && chat.photos) {\n setGlobal(updateChat(global, chatId, {\n photos: chat.photos.filter((photo) => !ids.includes(photo.id)),\n }));\n }\n break;\n }\n\n case 'draftMessage': {\n const { chatId, formattedText, replyingToId } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat) {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', formattedText);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'replyingToId', replyingToId);\n\n setGlobal(global);\n }\n }\n }\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiUpdate, ApiMessage, ApiPollResult, ApiThreadInfo, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { unique } from '../../../util/iteratees';\nimport {\n updateChat,\n deleteChatMessages,\n updateChatMessage,\n updateListedIds,\n addViewportId,\n updateThreadInfo,\n replaceThreadParam,\n updateScheduledMessage,\n deleteChatScheduledMessages,\n} from '../../reducers';\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport {\n selectChatMessage,\n selectChatMessages,\n selectIsViewportNewest,\n selectListedIds,\n selectChatMessageByPollId,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectThreadInfo,\n selectThreadByMessage,\n selectPinnedIds,\n selectScheduledMessage,\n selectScheduledMessages,\n isMessageInCurrentMessageList,\n selectScheduledIds,\n selectCurrentMessageList,\n selectViewportIds,\n selectFirstUnreadId,\n selectChat,\n} from '../../selectors';\nimport { getMessageContent, isChatPrivate, isMessageLocal } from '../../helpers';\n\nconst ANIMATION_DELAY = 350;\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'newMessage': {\n const { chatId, id, message } = update;\n global = updateWithLocalMedia(global, chatId, id, message);\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n\n setGlobal(global);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n\n if (isMessageInCurrentMessageList(global, chatId, message as ApiMessage)) {\n if (message.isOutgoing && !(message.content && message.content.action)) {\n const currentMessageList = selectCurrentMessageList(global);\n if (currentMessageList) {\n // We do not use `actions.focusLastMessage` as it may be set with a delay (see below)\n actions.focusMessage({\n chatId,\n threadId: currentMessageList.threadId,\n messageId: message.id,\n noHighlight: true,\n });\n }\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message as ApiMessage) || {};\n if (threadInfo) {\n actions.requestThreadInfoUpdate({ chatId, threadId: threadInfo.threadId });\n }\n\n // @perf Wait until scroll animation finishes or simply rely on delivery status update (which is itself delayed)\n if (!isMessageLocal(message as ApiMessage)) {\n setTimeout(() => {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }, ANIMATION_DELAY);\n }\n } else {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }\n\n // Edge case: New message in an old (not loaded) chat.\n if (!selectIsChatListed(global, chatId)) {\n actions.loadTopChats();\n }\n\n break;\n }\n\n case 'newScheduledMessage': {\n const { chatId, id, message } = update;\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', unique([...scheduledIds, id]));\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectChatMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectScheduledMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n const ids = Object.keys(selectScheduledMessages(global, chatId) || {}).map(Number).sort((a, b) => b - a);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n const currentMessage = selectChatMessage(global, chatId, localId);\n\n global = deleteChatMessages(global, chatId, [localId]);\n\n // Edge case for \"Send When Online\"\n if (message.isScheduled) {\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n }\n\n global = updateChatMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n const newMessage = selectChatMessage(global, chatId, message.id)!;\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', [...scheduledIds, message.id]);\n\n const currentMessage = selectScheduledMessage(global, chatId, localId);\n\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n global = updateScheduledMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n setGlobal(global);\n break;\n }\n\n case 'updatePinnedIds': {\n const { chatId, isPinned, messageIds } = update;\n\n const currentPinnedIds = selectPinnedIds(global, chatId) || [];\n const newPinnedIds = isPinned\n ? [...currentPinnedIds, ...messageIds].sort((a, b) => b - a)\n : currentPinnedIds.filter((id) => !messageIds.includes(id));\n\n setGlobal(replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds', newPinnedIds));\n\n break;\n }\n\n case 'updateThreadInfo': {\n const {\n chatId, threadId, threadInfo, firstMessageId,\n } = update;\n\n const currentThreadInfo = selectThreadInfo(global, chatId, threadId);\n const newTheadInfo = {\n ...currentThreadInfo,\n ...threadInfo,\n };\n\n if (!newTheadInfo.threadId) {\n return;\n }\n\n global = updateThreadInfo(global, chatId, threadId, newTheadInfo as ApiThreadInfo);\n\n if (firstMessageId) {\n global = replaceThreadParam(global, chatId, threadId, 'firstMessageId', firstMessageId);\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'resetMessages': {\n const { id: chatId } = update;\n const messagesById = selectChatMessages(global, chatId);\n\n if (messagesById && !isChatPrivate(chatId)) {\n global = deleteChatMessages(global, chatId, Object.keys(messagesById).map(Number));\n setGlobal(global);\n actions.loadFullChat({ chatId, force: true });\n }\n\n break;\n }\n\n case 'deleteMessages': {\n const { ids, chatId } = update;\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteScheduledMessages': {\n const { ids, chatId } = update;\n\n deleteScheduledMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteHistory': {\n const { chatId } = update;\n const ids = Object.keys(global.messages.byChatId[chatId].byId).map(Number);\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'updateCommonBoxMessages': {\n const { ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n const chatId = selectCommonBoxChatId(global, id);\n if (chatId) {\n global = updateChatMessage(global, chatId, id, messageUpdate);\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChannelMessages': {\n const { channelId, ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n global = updateChatMessage(global, channelId, id, messageUpdate);\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessagePoll': {\n const { pollId, pollUpdate } = update;\n\n const message = selectChatMessageByPollId(global, pollId);\n\n if (message && message.content.poll) {\n const updatedPoll = { ...message.content.poll, ...pollUpdate };\n\n // Workaround for poll update bug: `chosen` option gets reset when someone votes after current user\n const { results: updatedResults } = updatedPoll.results || {};\n if (updatedResults && !updatedResults.some(((result) => result.isChosen))) {\n const { results } = message.content.poll.results;\n const chosenAnswers = results && results.filter((result) => result.isChosen);\n if (chosenAnswers) {\n chosenAnswers.forEach((chosenAnswer) => {\n const chosenAnswerIndex = updatedResults.findIndex((result) => result.option === chosenAnswer.option);\n if (chosenAnswerIndex >= 0) {\n updatedPoll.results.results![chosenAnswerIndex].isChosen = true;\n }\n });\n }\n }\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: updatedPoll,\n },\n },\n ));\n }\n break;\n }\n\n case 'updateMessagePollVote': {\n const { pollId, userId, options } = update;\n const message = selectChatMessageByPollId(global, pollId);\n if (!message || !message.content.poll || !message.content.poll.results) {\n break;\n }\n\n const { poll } = message.content;\n\n const { recentVoterIds, totalVoters, results } = poll.results;\n const newRecentVoterIds = recentVoterIds ? [...recentVoterIds] : [];\n const newTotalVoters = totalVoters ? totalVoters + 1 : 1;\n const newResults = results ? [...results] : [];\n\n newRecentVoterIds.push(userId);\n\n options.forEach((option) => {\n const targetOption = newResults.find((result) => result.option === option);\n const targetOptionIndex = newResults.findIndex((result) => result.option === option);\n const updatedOption: ApiPollResult = targetOption ? { ...targetOption } : { option, votersCount: 0 };\n\n updatedOption.votersCount += 1;\n if (userId === global.currentUserId) {\n updatedOption.isChosen = true;\n }\n\n if (targetOptionIndex) {\n newResults[targetOptionIndex] = updatedOption;\n } else {\n newResults.push(updatedOption);\n }\n });\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: {\n ...poll,\n results: {\n ...poll.results,\n recentVoterIds: newRecentVoterIds,\n totalVoters: newTotalVoters,\n results: newResults,\n },\n },\n },\n },\n ));\n\n break;\n }\n }\n});\n\nfunction updateWithLocalMedia(\n global: GlobalState, chatId: number, id: number, message: Partial, isScheduled = false,\n) {\n // Preserve locally uploaded media.\n const currentMessage = isScheduled\n ? selectScheduledMessage(global, chatId, id)\n : selectChatMessage(global, chatId, id);\n if (currentMessage && message.content) {\n const {\n photo, video, sticker, document,\n } = getMessageContent(currentMessage);\n if (photo && message.content.photo) {\n message.content.photo.blobUrl = photo.blobUrl;\n message.content.photo.thumbnail = photo.thumbnail;\n } else if (video && message.content.video) {\n message.content.video.blobUrl = video.blobUrl;\n } else if (sticker && message.content.sticker) {\n message.content.sticker.isPreloadedGlobally = sticker.isPreloadedGlobally;\n } else if (document && message.content.document) {\n message.content.document.previewBlobUrl = document.previewBlobUrl;\n }\n }\n\n return isScheduled\n ? updateScheduledMessage(global, chatId, id, message)\n : updateChatMessage(global, chatId, id, message);\n}\n\nfunction updateListedAndViewportIds(global: GlobalState, message: ApiMessage) {\n const { id, chatId } = message;\n\n const chat = selectChat(global, chatId);\n const isUnreadChatNotLoaded = chat && chat.unreadCount && !selectListedIds(global, chatId, MAIN_THREAD_ID);\n if (isUnreadChatNotLoaded) {\n return global;\n }\n\n global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]);\n\n if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) {\n // Always keep the first uread message in the viewport list\n const firstUnreadId = selectFirstUnreadId(global, chatId, MAIN_THREAD_ID);\n const newGlobal = addViewportId(global, chatId, MAIN_THREAD_ID, id);\n const newViewportIds = selectViewportIds(newGlobal, chatId, MAIN_THREAD_ID);\n\n if (!firstUnreadId || newViewportIds!.includes(firstUnreadId)) {\n global = newGlobal;\n }\n }\n\n const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {};\n\n if (!firstMessageId && isMessageLocal(message)) {\n return global;\n }\n\n if (threadInfo) {\n global = updateListedIds(global, chatId, threadInfo.threadId, [id]);\n\n if (selectIsViewportNewest(global, chatId, threadInfo.threadId)) {\n global = addViewportId(global, chatId, threadInfo.threadId, id);\n\n if (!firstMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'firstMessageId', message.id);\n }\n\n if (!threadInfo.lastMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', {\n ...threadInfo,\n lastMessageId: message.id,\n });\n }\n }\n }\n\n return global;\n}\n\nfunction updateChatLastMessage(\n global: GlobalState,\n chatId: number,\n message: ApiMessage,\n force = false,\n) {\n const { chats } = global;\n const currentLastMessage = chats.byId[chatId] && chats.byId[chatId].lastMessage;\n\n if (currentLastMessage && !force) {\n const isSameOrNewer = (\n currentLastMessage.id === message.id || currentLastMessage.id === message.previousLocalId\n ) || message.id > currentLastMessage.id;\n\n if (!isSameOrNewer) {\n return global;\n }\n }\n\n return updateChat(global, chatId, { lastMessage: message });\n}\n\nfunction findLastMessage(global: GlobalState, chatId: number) {\n const byId = selectChatMessages(global, chatId);\n const listedIds = selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n if (!byId || !listedIds) {\n return undefined;\n }\n\n let i = listedIds.length;\n while (i--) {\n const message = byId[listedIds[i]];\n if (!message.isDeleting) {\n return message;\n }\n }\n\n return undefined;\n}\n\nfunction deleteMessages(chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState) {\n // Channel update\n\n if (chatId) {\n ids.forEach((id) => {\n global = updateChatMessage(global, chatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, chatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, chatId, newLastMessage, true);\n }\n });\n\n setGlobal(global);\n\n actions.requestChatUpdate({ chatId });\n\n const threadIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const message = selectChatMessage(global, chatId, id);\n if (!message) {\n return;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n if (threadInfo) {\n threadIdsToUpdate.push(threadInfo.threadId);\n }\n });\n\n unique(threadIdsToUpdate).forEach((threadId) => {\n actions.requestThreadInfoUpdate({ chatId, threadId });\n });\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), chatId, ids));\n }, ANIMATION_DELAY);\n\n return;\n }\n\n // Common box update\n\n const chatsIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const commonBoxChatId = selectCommonBoxChatId(global, id);\n if (commonBoxChatId) {\n chatsIdsToUpdate.push(commonBoxChatId);\n\n global = updateChatMessage(global, commonBoxChatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, commonBoxChatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, commonBoxChatId, newLastMessage, true);\n }\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), commonBoxChatId, [id]));\n }, ANIMATION_DELAY);\n }\n });\n\n setGlobal(global);\n\n unique(chatsIdsToUpdate).forEach((id) => {\n actions.requestChatUpdate({ chatId: id });\n });\n}\n\nfunction deleteScheduledMessages(\n chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState,\n) {\n if (!chatId) {\n return;\n }\n\n ids.forEach((id) => {\n global = updateScheduledMessage(global, chatId, id, {\n isDeleting: true,\n });\n });\n\n setGlobal(global);\n\n setTimeout(() => {\n global = deleteChatScheduledMessages(getGlobal(), chatId, ids);\n const scheduledMessages = selectScheduledMessages(global, chatId);\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'scheduledIds', Object.keys(scheduledMessages || {}).map(Number),\n );\n setGlobal(global);\n }, ANIMATION_DELAY);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, ApiUserStatus } from '../../../api/types';\n\nimport { deleteUser, updateUser } from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\n\nconst STATUS_UPDATE_THROTTLE = 3000;\n\nconst flushStatusUpdatesThrottled = throttle(flushStatusUpdates, STATUS_UPDATE_THROTTLE, true);\n\nlet pendingStatusUpdates: [number, ApiUserStatus][] = [];\n\nfunction scheduleStatusUpdate(userId: number, statusUpdate: ApiUserStatus) {\n pendingStatusUpdates.push([userId, statusUpdate]);\n flushStatusUpdatesThrottled();\n}\n\nfunction flushStatusUpdates() {\n let global = getGlobal();\n pendingStatusUpdates.forEach(([userId, statusUpdate]) => {\n global = updateUser(global, userId, {\n status: statusUpdate,\n });\n });\n setGlobal(global);\n\n pendingStatusUpdates = [];\n}\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'deleteUser': {\n return deleteUser(global, update.id);\n }\n\n case 'updateUser': {\n return updateUser(global, update.id, update.user);\n }\n\n case 'updateUserStatus': {\n // Status updates come very often so we throttle them\n scheduleStatusUpdate(update.userId, update.status);\n return undefined;\n }\n\n case 'updateUserFullInfo': {\n const { id, fullInfo } = update;\n const targetUser = global.users.byId[id];\n if (!targetUser) {\n return undefined;\n }\n\n return updateUser(global, id, {\n fullInfo: {\n ...targetUser.fullInfo,\n ...fullInfo,\n },\n });\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\n\nimport { updateStickerSet } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateStickerSet': {\n return updateStickerSet(global, update.id, update.stickerSet);\n }\n }\n\n return undefined;\n});\n","import {\n addReducer, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { ApiPrivacyKey } from '../../../types';\n\nimport { addBlockedContact, removeBlockedContact } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updatePeerBlocked':\n if (update.isBlocked) {\n return addBlockedContact(getGlobal(), update.id);\n } else {\n return removeBlockedContact(getGlobal(), update.id);\n }\n\n case 'updateResetContactList':\n setGlobal({\n ...getGlobal(),\n contactList: {\n hash: 0,\n userIds: [],\n },\n });\n break;\n\n case 'updateFavoriteStickers':\n actions.loadFavoriteStickers();\n break;\n\n case 'updatePrivacy':\n global.settings.privacy[update.key as ApiPrivacyKey] = update.rules;\n break;\n }\n\n return undefined;\n});\n","import { addReducer, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\nimport { addNotifyException, updateChat, updateNotifySettings } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateNotifySettings': {\n return updateNotifySettings(global, update.peerType, update.isSilent, update.shouldShowPreviews);\n }\n\n case 'updateNotifyExceptions': {\n const {\n id, isMuted, isSilent, shouldShowPreviews,\n } = update;\n const chat = global.chats.byId[id];\n\n if (chat) {\n global = updateChat(global, id, { isMuted });\n }\n\n setGlobal(addNotifyException(global, id, { isMuted, isSilent, shouldShowPreviews }));\n break;\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateTwoFaStateWaitCode': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n isLoading: false,\n waitingEmailCodeLength: update.length,\n },\n };\n }\n\n case 'updateTwoFaError': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n error: update.message,\n },\n };\n }\n }\n\n return undefined;\n});\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Switcher.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n checked?: boolean;\n disabled?: boolean;\n inactive?: boolean;\n noAnimation?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Switcher: FC = ({\n id,\n name,\n value,\n label,\n checked = false,\n disabled,\n inactive,\n noAnimation,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((e: ChangeEvent) => {\n if (onChange) {\n onChange(e);\n }\n\n if (onCheck) {\n onCheck(e.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Switcher',\n disabled && 'disabled',\n inactive && 'inactive',\n noAnimation && 'no-animation',\n );\n\n return (\n \n );\n};\n\nexport default memo(Switcher);\n","import React, {\n FC, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LeftColumnContent, ISettings } from '../../../types';\nimport { ApiChat } from '../../../api/types';\n\nimport { APP_NAME, APP_VERSION, FEEDBACK_URL } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { isChatArchived } from '../../../modules/helpers';\nimport { formatDateToString } from '../../../util/dateFormat';\nimport switchTheme from '../../../util/switchTheme';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport SearchInput from '../../ui/SearchInput';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\nimport Switcher from '../../ui/Switcher';\n\nimport './LeftMainHeader.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n contactsFilter: string;\n onSearchQuery: (query: string) => void;\n onSelectSettings: () => void;\n onSelectContacts: () => void;\n onSelectArchived: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n searchQuery?: string;\n isLoading: boolean;\n currentUserId?: number;\n globalSearchChatId?: number;\n searchDate?: number;\n theme: ISettings['theme'];\n animationLevel: 0 | 1 | 2;\n chatsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [0, 1, 2];\n\nconst LEGACY_VERSION_URL = 'https://web.telegram.org/?legacy=1';\nconst WEBK_VERSION_URL = 'https://web.telegram.org/k/';\nconst PERMANENT_VERSION_KEY = 'kz_version';\n\nconst LeftMainHeader: FC = ({\n content,\n contactsFilter,\n onSearchQuery,\n onSelectSettings,\n onSelectContacts,\n onSelectArchived,\n setGlobalSearchChatId,\n onReset,\n searchQuery,\n isLoading,\n currentUserId,\n globalSearchChatId,\n searchDate,\n theme,\n animationLevel,\n chatsById,\n openChat,\n openTipsChat,\n setGlobalSearchDate,\n setSettingOption,\n}) => {\n const lang = useLang();\n const hasMenu = content === LeftColumnContent.ChatList;\n const clearedDateSearchParam = { date: undefined };\n const clearedChatSearchParam = { id: undefined };\n const selectedSearchDate = useMemo(() => {\n return searchDate\n ? formatDateToString(new Date(searchDate * 1000))\n : undefined;\n }, [searchDate]);\n const archivedUnreadChatsCount = useMemo(() => {\n if (!hasMenu || !chatsById) {\n return 0;\n }\n\n return Object.values(chatsById).reduce((total, chat) => {\n if (!isChatArchived(chat)) {\n return total;\n }\n\n return chat.unreadCount ? total + 1 : total;\n }, 0);\n }, [hasMenu, chatsById]);\n\n const MainButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n onReset()}\n ariaLabel={hasMenu ? lang('AccDescrOpenMenu2') : 'Return to chat list'}\n >\n
\n \n );\n }, [hasMenu, lang, onReset]);\n\n const handleSearchFocus = useCallback(() => {\n if (!searchQuery) {\n onSearchQuery('');\n }\n }, [searchQuery, onSearchQuery]);\n\n const handleSelectSaved = useCallback(() => {\n openChat({ id: currentUserId });\n }, [currentUserId, openChat]);\n\n const handleDarkModeToggle = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n const newTheme = theme === 'light' ? 'dark' : 'light';\n\n setSettingOption({ theme: newTheme });\n switchTheme(newTheme, animationLevel > 0);\n }, [animationLevel, setSettingOption, theme]);\n\n const handleAnimationLevelChange = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n\n const newLevel = animationLevel === 0 ? 2 : 0;\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [animationLevel, setSettingOption]);\n\n const handleSwitchToWebK = () => {\n localStorage.setItem(PERMANENT_VERSION_KEY, JSON.stringify('K'));\n };\n\n const isSearchFocused = (\n Boolean(globalSearchChatId)\n || content === LeftColumnContent.GlobalSearch\n || content === LeftColumnContent.Contacts\n );\n\n const searchInputPlaceholder = content === LeftColumnContent.Contacts\n ? lang('SearchFriends')\n : lang('Search');\n\n return (\n
\n
\n \n \n {lang('SavedMessages')}\n \n \n {lang('ArchivedChats')}\n {archivedUnreadChatsCount > 0 && (\n
{archivedUnreadChatsCount}
\n )}\n \n \n {lang('Contacts')}\n \n \n {lang('Settings')}\n \n \n {lang('lng_menu_night_mode')}\n \n \n \n {lang('Appearance.Animations').toLowerCase()}\n 0}\n />\n \n \n {lang('TelegramFeatures')}\n \n \n Report Bug\n \n \n Switch to K Version\n \n \n Switch to Old Version\n \n \n \n {selectedSearchDate && (\n \n )}\n {globalSearchChatId && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n query: searchQuery, fetchingStatus, chatId, date,\n } = global.globalSearch;\n const { currentUserId } = global;\n const { byId: chatsById } = global.chats;\n const { theme, animationLevel } = global.settings.byKey;\n\n return {\n searchQuery,\n isLoading: fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false,\n currentUserId,\n chatsById,\n globalSearchChatId: chatId,\n searchDate: date,\n theme,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'openTipsChat',\n 'setGlobalSearchDate',\n 'setGlobalSearchChatId',\n 'setSettingOption',\n ]),\n)(LeftMainHeader));\n","import React, { FC } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ConnectionState.scss';\n\ntype StateProps = Pick;\n\nconst ConnectionState: FC = ({ connectionState }) => {\n const lang = useLang();\n\n const isConnecting = connectionState === 'connectionStateConnecting';\n\n return isConnecting && (\n
\n \n
{lang('WaitingForNetwork')}
\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['connectionState']),\n)(ConnectionState);\n","import { useRef } from '../lib/teact/teact';\n\nimport useThrottle from './useThrottle';\nimport useOnChange from './useOnChange';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (resolverFn: () => R, ms: number, dependencies: D) => {\n const valueRef = useRef();\n const runThrottled = useThrottle(ms);\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n let isSync = true;\n runThrottled(() => {\n valueRef.current = resolverFn();\n\n if (!isSync) {\n forceUpdate();\n }\n });\n isSync = false;\n }, dependencies);\n\n return valueRef.current;\n};\n","import { useMemo } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (ms: number) => {\n return useMemo(() => {\n return throttle((cb) => cb(), ms);\n }, [ms]);\n};\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatFolder, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { NotifyException, NotifySettings } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { buildCollectionByKey, pick } from '../../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../../util/captureEvents';\nimport { getFolderUnreadDialogs } from '../../../modules/helpers';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../modules/selectors';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport useThrottledMemo from '../../../hooks/useThrottledMemo';\nimport useLang from '../../../hooks/useLang';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\n\nimport Transition from '../../ui/Transition';\nimport TabList from '../../ui/TabList';\nimport ChatList from './ChatList';\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFoldersById: Record;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n orderedFolderIds?: number[];\n activeChatFolder: number;\n currentUserId?: number;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst INFO_THROTTLE = 3000;\nconst SAVED_MESSAGES_HOTKEY = '0';\n\nconst ChatFolders: FC = ({\n chatsById,\n usersById,\n chatFoldersById,\n notifySettings,\n notifyExceptions,\n orderedFolderIds,\n activeChatFolder,\n currentUserId,\n lastSyncTime,\n loadChatFolders,\n setActiveChatFolder,\n openChat,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime) {\n loadChatFolders();\n }\n }, [lastSyncTime, loadChatFolders]);\n\n const displayedFolders = useMemo(() => {\n return orderedFolderIds\n ? orderedFolderIds.map((id) => chatFoldersById[id] || {}).filter(Boolean)\n : undefined;\n }, [chatFoldersById, orderedFolderIds]);\n\n const folderCountersById = useThrottledMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n const counters = displayedFolders.map((folder) => {\n const {\n unreadDialogsCount, hasActiveDialogs,\n } = getFolderUnreadDialogs(chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions) || {};\n\n return {\n id: folder.id,\n badgeCount: unreadDialogsCount,\n isBadgeActive: hasActiveDialogs,\n };\n });\n\n return buildCollectionByKey(counters, 'id');\n }, INFO_THROTTLE, [displayedFolders, chatsById, usersById, notifySettings, notifyExceptions]);\n\n const folderTabs = useMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n return [\n { title: lang('FilterAllChats') },\n ...displayedFolders.map((folder) => ({\n title: folder.title,\n ...(folderCountersById && folderCountersById[folder.id]),\n })),\n ];\n }, [displayedFolders, folderCountersById, lang]);\n\n const handleSwitchTab = useCallback((index: number) => {\n setActiveChatFolder(index);\n }, [setActiveChatFolder]);\n\n // Prevent `activeTab` pointing at non-existing folder after update\n useEffect(() => {\n if (!folderTabs || !folderTabs.length) {\n return;\n }\n\n if (activeChatFolder >= folderTabs.length) {\n setActiveChatFolder(0);\n }\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV || !folderTabs || !folderTabs.length) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveChatFolder(Math.min(activeChatFolder + 1, folderTabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveChatFolder(Math.max(0, activeChatFolder - 1));\n }\n }),\n });\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n const isNotInAllTabRef = useRef();\n isNotInAllTabRef.current = activeChatFolder !== 0;\n useEffect(() => (isNotInAllTabRef.current ? captureEscKeyListener(() => {\n if (isNotInAllTabRef.current) {\n setActiveChatFolder(0);\n }\n }) : undefined), [activeChatFolder, setActiveChatFolder]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.metaKey && e.code.startsWith('Digit') && folderTabs) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n if (digit === SAVED_MESSAGES_HOTKEY) {\n openChat({ id: currentUserId });\n return;\n }\n\n const folder = Number(digit) - 1;\n if (folder > folderTabs.length - 1) return;\n\n setActiveChatFolder(folder);\n e.preventDefault();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n };\n });\n\n const {\n shouldRender: shouldRenderPlaceholder, transitionClassNames,\n } = useShowTransition(!orderedFolderIds, undefined, true);\n\n function renderCurrentTab(isActive: boolean) {\n const activeFolder = Object.values(chatFoldersById)\n .find(({ title }) => title === folderTabs![activeChatFolder].title);\n\n if (!activeFolder || activeChatFolder === 0) {\n return ;\n }\n\n return (\n \n );\n }\n\n return (\n
\n {folderTabs && folderTabs.length ? (\n \n ) : shouldRenderPlaceholder ? (\n
\n ) : undefined}\n \n {renderCurrentTab}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n chatFolders: {\n byId: chatFoldersById,\n orderedIds: orderedFolderIds,\n activeChatFolder,\n },\n currentUserId,\n lastSyncTime,\n } = global;\n\n return {\n chatsById,\n usersById,\n chatFoldersById,\n orderedFolderIds,\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n activeChatFolder,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadChatFolders',\n 'setActiveChatFolder',\n 'openChat',\n ]),\n)(ChatFolders));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './LeftSearch';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst LeftSearchAsync: FC = (props) => {\n const LeftSearch = useModuleLoader(Bundles.Extra, 'LeftSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return LeftSearch ? : ;\n};\n\nexport default memo(LeftSearchAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './ContactList';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst ContactListAsync: FC = (props) => {\n const ContactList = useModuleLoader(Bundles.Extra, 'ContactList');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContactList ? : ;\n};\n\nexport default memo(ContactListAsync);\n","import React, {\n FC, useCallback, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\n\nimport './NewChatButton.scss';\n\nconst MENU_CLOSE_DELAY_MS = 750;\nlet closeTimeout: number | undefined;\n\ntype OwnProps = {\n isShown: boolean;\n onNewPrivateChat: () => void;\n onNewChannel: () => void;\n onNewGroup: () => void;\n};\n\nconst NewChatButton: FC = ({\n isShown,\n onNewPrivateChat,\n onNewChannel,\n onNewGroup,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n useEffect(() => {\n if (!isShown) {\n setIsMenuOpen(false);\n }\n }, [isShown]);\n\n const lang = useLang();\n\n const fabClassName = buildClassName(\n 'NewChatButton',\n isShown && 'revealed',\n isMenuOpen && 'menu-is-open',\n );\n\n const toggleIsMenuOpen = () => {\n setIsMenuOpen(!isMenuOpen);\n };\n\n const handleClose = () => {\n setIsMenuOpen(false);\n };\n\n const handleMouseEnter = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n setIsMenuOpen(false);\n }, MENU_CLOSE_DELAY_MS);\n }, []);\n\n return (\n \n \n \n \n \n \n {lang('NewChannel')}\n {lang('NewGroup')}\n {lang('NewMessageTitle')}\n \n
\n );\n};\n\nexport default memo(NewChatButton);\n","import React, {\n FC, memo, useState, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport LeftMainHeader from './LeftMainHeader';\nimport ConnectionState from '../ConnectionState';\nimport ChatFolders from './ChatFolders';\nimport LeftSearch from '../search/LeftSearch.async';\nimport ContactList from './ContactList.async';\nimport NewChatButton from '../NewChatButton';\n\nimport './LeftMain.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n searchQuery?: string;\n searchDate?: number;\n contactsFilter: string;\n onSearchQuery: (query: string) => void;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\ntype StateProps = {};\n\nconst TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\nconst BUTTON_CLOSE_DELAY_MS = 250;\nlet closeTimeout: number | undefined;\n\nconst LeftMain: FC = ({\n content,\n searchQuery,\n searchDate,\n contactsFilter,\n onSearchQuery,\n onContentChange,\n onReset,\n}) => {\n const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV);\n\n const isMouseInside = useRef(false);\n\n const handleSelectSettings = useCallback(() => {\n onContentChange(LeftColumnContent.Settings);\n }, [onContentChange]);\n\n const handleSelectContacts = useCallback(() => {\n onContentChange(LeftColumnContent.Contacts);\n }, [onContentChange]);\n\n const handleSelectNewChannel = useCallback(() => {\n onContentChange(LeftColumnContent.NewChannelStep1);\n }, [onContentChange]);\n\n const handleSelectNewGroup = useCallback(() => {\n onContentChange(LeftColumnContent.NewGroupStep1);\n }, [onContentChange]);\n\n const handleSelectArchived = useCallback(() => {\n onContentChange(LeftColumnContent.Archived);\n }, [onContentChange]);\n\n const handleMouseEnter = useCallback(() => {\n if (content !== LeftColumnContent.ChatList) {\n return;\n }\n isMouseInside.current = true;\n setIsNewChatButtonShown(true);\n }, [content]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n setIsNewChatButtonShown(false);\n }\n }, BUTTON_CLOSE_DELAY_MS);\n }, []);\n\n useEffect(() => {\n let autoCloseTimeout: number | undefined;\n if (content !== LeftColumnContent.ChatList) {\n autoCloseTimeout = window.setTimeout(() => {\n setIsNewChatButtonShown(false);\n }, BUTTON_CLOSE_DELAY_MS);\n } else if (isMouseInside.current || IS_TOUCH_ENV) {\n setIsNewChatButtonShown(true);\n }\n\n return () => {\n if (autoCloseTimeout) {\n clearTimeout(autoCloseTimeout);\n autoCloseTimeout = undefined;\n }\n };\n }, [content]);\n\n return (\n \n \n \n \n {(isActive) => {\n switch (content) {\n case LeftColumnContent.ChatList:\n return ;\n case LeftColumnContent.GlobalSearch:\n return (\n \n );\n case LeftColumnContent.Contacts:\n return ;\n default:\n return undefined;\n }\n }}\n \n \n
\n );\n};\n\nexport default memo(LeftMain);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Settings';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst SettingsAsync: FC = (props) => {\n const Settings = useModuleLoader(Bundles.Extra, 'Settings');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Settings ? : ;\n};\n\nexport default memo(SettingsAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './NewChat';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst NewChatAsync: FC = (props) => {\n const NewChat = useModuleLoader(Bundles.Extra, 'NewChat');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return NewChat ? : ;\n};\n\nexport default memo(NewChatAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ArchivedChats';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst ArchivedChatsAsync: FC = (props) => {\n const ArchivedChats = useModuleLoader(Bundles.Extra, 'ArchivedChats');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ArchivedChats ? : ;\n};\n\nexport default memo(ArchivedChatsAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { LeftColumnContent, SettingsScreens } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\n\nimport Transition from '../ui/Transition';\nimport LeftMain from './main/LeftMain';\nimport Settings from './settings/Settings.async';\nimport NewChat from './newChat/NewChat.async';\nimport ArchivedChats from './ArchivedChats.async';\n\nimport './LeftColumn.scss';\n\ntype StateProps = {\n searchQuery?: string;\n searchDate?: number;\n activeChatFolder: number;\n};\n\ntype DispatchProps = Pick;\n\nenum ContentType {\n Main,\n // eslint-disable-next-line no-shadow\n Settings,\n Archived,\n // eslint-disable-next-line no-shadow\n NewGroup,\n // eslint-disable-next-line no-shadow\n NewChannel\n}\n\nconst RENDER_COUNT = Object.keys(ContentType).length / 2;\nconst RESET_TRANSITION_DELAY_MS = 250;\n\nconst LeftColumn: FC = ({\n searchQuery,\n searchDate,\n activeChatFolder,\n setGlobalSearchQuery,\n setGlobalSearchChatId,\n resetChatCreation,\n setGlobalSearchDate,\n loadPasswordInfo,\n clearTwoFaError,\n}) => {\n const [content, setContent] = useState(LeftColumnContent.ChatList);\n const [settingsScreen, setSettingsScreen] = useState(SettingsScreens.Main);\n const [contactsFilter, setContactsFilter] = useState('');\n\n // Used to reset child components in background.\n const [lastResetTime, setLastResetTime] = useState(0);\n\n let contentType: ContentType = ContentType.Main;\n switch (content) {\n case LeftColumnContent.Archived:\n contentType = ContentType.Archived;\n break;\n case LeftColumnContent.Settings:\n contentType = ContentType.Settings;\n break;\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewChannelStep2:\n contentType = ContentType.NewChannel;\n break;\n case LeftColumnContent.NewGroupStep1:\n case LeftColumnContent.NewGroupStep2:\n contentType = ContentType.NewGroup;\n break;\n }\n\n const handleReset = useCallback((forceReturnToChatList?: boolean) => {\n if (\n content === LeftColumnContent.NewGroupStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewGroupStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewGroupStep1) {\n const pickerSearchInput = document.getElementById('new-group-picker-search');\n if (pickerSearchInput) {\n pickerSearchInput.blur();\n }\n }\n\n if (content === LeftColumnContent.Settings) {\n switch (settingsScreen) {\n case SettingsScreens.EditProfile:\n case SettingsScreens.Folders:\n case SettingsScreens.General:\n case SettingsScreens.Notifications:\n case SettingsScreens.Privacy:\n case SettingsScreens.Language:\n setSettingsScreen(SettingsScreens.Main);\n return;\n\n case SettingsScreens.GeneralChatBackground:\n setSettingsScreen(SettingsScreens.General);\n return;\n case SettingsScreens.GeneralChatBackgroundColor:\n setSettingsScreen(SettingsScreens.GeneralChatBackground);\n return;\n\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyActiveSessions:\n case SettingsScreens.PrivacyBlockedUsers:\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaCongratulations:\n setSettingsScreen(SettingsScreens.Privacy);\n return;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyPhoneNumber);\n return;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyLastSeen);\n return;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyProfilePhoto);\n return;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyForwarding);\n return;\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyGroupChats);\n return;\n case SettingsScreens.TwoFaNewPassword:\n setSettingsScreen(SettingsScreens.TwoFaDisabled);\n return;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaNewPassword);\n return;\n case SettingsScreens.TwoFaNewPasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordConfirm);\n return;\n case SettingsScreens.TwoFaNewPasswordEmail:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordHint);\n return;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordEmail);\n return;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n setSettingsScreen(SettingsScreens.TwoFaEnabled);\n return;\n case SettingsScreens.TwoFaChangePasswordNew:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordCurrent);\n return;\n case SettingsScreens.TwoFaChangePasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordNew);\n return;\n case SettingsScreens.TwoFaChangePasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordConfirm);\n return;\n case SettingsScreens.TwoFaRecoveryEmail:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmailCurrentPassword);\n return;\n case SettingsScreens.TwoFaRecoveryEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmail);\n return;\n\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n setSettingsScreen(SettingsScreens.Folders);\n return;\n default:\n break;\n }\n }\n\n if (content === LeftColumnContent.ChatList && activeChatFolder === 0) {\n setContent(LeftColumnContent.GlobalSearch);\n return;\n }\n\n setContent(LeftColumnContent.ChatList);\n setContactsFilter('');\n setGlobalSearchQuery({ query: '' });\n setGlobalSearchDate({ date: undefined });\n setGlobalSearchChatId({ id: undefined });\n resetChatCreation();\n setTimeout(() => {\n setLastResetTime(Date.now());\n }, RESET_TRANSITION_DELAY_MS);\n }, [\n content, activeChatFolder, setGlobalSearchQuery, setGlobalSearchDate, setGlobalSearchChatId, resetChatCreation,\n settingsScreen,\n ]);\n\n const handleSearchQuery = useCallback((query: string) => {\n if (content === LeftColumnContent.Contacts) {\n setContactsFilter(query);\n return;\n }\n\n setContent(LeftColumnContent.GlobalSearch);\n\n if (query !== searchQuery) {\n setGlobalSearchQuery({ query });\n }\n }, [content, setGlobalSearchQuery, searchQuery]);\n\n useEffect(\n () => (content !== LeftColumnContent.ChatList || activeChatFolder === 0\n ? captureEscKeyListener(() => handleReset())\n : undefined),\n [activeChatFolder, content, handleReset],\n );\n\n useEffect(() => {\n clearTwoFaError();\n\n if (settingsScreen === SettingsScreens.Privacy) {\n loadPasswordInfo();\n }\n }, [clearTwoFaError, loadPasswordInfo, settingsScreen]);\n\n return (\n \n {(isActive) => {\n switch (contentType) {\n case ContentType.Archived:\n return (\n \n );\n case ContentType.Settings:\n return (\n \n );\n case ContentType.NewChannel:\n return (\n \n );\n case ContentType.NewGroup:\n return (\n \n );\n default:\n return (\n \n );\n }\n }}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n globalSearch: {\n query,\n date,\n },\n chatFolders: {\n activeChatFolder,\n },\n } = global;\n return { searchQuery: query, searchDate: date, activeChatFolder };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setGlobalSearchQuery', 'setGlobalSearchChatId', 'resetChatCreation', 'setGlobalSearchDate',\n 'loadPasswordInfo', 'clearTwoFaError',\n ]),\n)(LeftColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { IDimensions } from '../modules/helpers';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\n\nconst THROTTLE = 250;\n\nexport default () => {\n const [size, setSize] = useState(windowSize.get());\n\n useEffect(() => {\n const handleResize = throttle(() => {\n setSize(windowSize.get());\n }, THROTTLE, false);\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return size;\n};\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../../../config';\n\nconst REM = 16; // px\nconst MAX_TOOLBAR_WIDTH = 32 * REM;\nconst MAX_MESSAGES_LIST_WIDTH = 45.5 * REM;\nconst SIDE_COLUMN_MAX_WIDTH = 26.5 * REM;\nconst MIN_LEFT_COLUMN_WIDTH = 18 * REM;\nconst UNPIN_BUTTON_WIDTH = 16.125 * REM;\n\nexport default function calculateMiddleFooterTransforms(windowWidth: number, canPost?: boolean) {\n const sidePadding = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? REM\n : 2 * REM;\n const messageListWidth = getMessageListWidth(windowWidth);\n const sendButtonWidth = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? 3.375 * REM\n : 4 * REM;\n\n const composerWidth = canPost\n ? messageListWidth - sidePadding - sendButtonWidth\n : messageListWidth - sidePadding;\n const toolbarWidth = windowWidth > MOBILE_SCREEN_MAX_WIDTH\n ? Math.min(messageListWidth - sidePadding, MAX_TOOLBAR_WIDTH)\n : messageListWidth - sidePadding;\n\n const composerHiddenScale = toolbarWidth / composerWidth;\n const toolbarHiddenScale = composerWidth / toolbarWidth;\n const unpinHiddenScale = toolbarWidth / UNPIN_BUTTON_WIDTH;\n const toolbarForUnpinHiddenScale = UNPIN_BUTTON_WIDTH / toolbarWidth;\n\n const composerTranslateX = canPost\n ? (sendButtonWidth / 2) * toolbarHiddenScale\n : 0;\n\n const toolbarTranslateX = canPost\n ? (sendButtonWidth / 2) * -1 * composerHiddenScale\n : 0;\n\n return {\n composerHiddenScale,\n toolbarHiddenScale,\n composerTranslateX,\n toolbarTranslateX,\n unpinHiddenScale,\n toolbarForUnpinHiddenScale,\n };\n}\n\nfunction getMessageListWidth(windowWidth: number) {\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.25, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n const rightColumnWidth = Math.min(\n windowWidth * 0.25,\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth - rightColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.4, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MAX_MESSAGES_LIST_WIDTH) {\n return MAX_MESSAGES_LIST_WIDTH;\n }\n\n return windowWidth;\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './HeaderMenuContainer';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HeaderMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const HeaderMenuContainer = useModuleLoader(Bundles.Extra, 'HeaderMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HeaderMenuContainer ? : undefined;\n};\n\nexport default memo(HeaderMenuContainerAsync);\n","import React, {\n FC,\n memo,\n useRef,\n useCallback,\n useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport { isChatChannel, isChatSuperGroup } from '../../modules/helpers';\nimport {\n selectChat,\n selectIsChatBotNotStarted, selectIsChatWithSelf,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport HeaderMenuContainer from './HeaderMenuContainer.async';\n\ninterface OwnProps {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n}\n\ninterface StateProps {\n noMenu?: boolean;\n isChannel?: boolean;\n isRightColumnShown?: boolean;\n canStartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n}\n\ntype DispatchProps = Pick;\n\n// Chrome breaks layout when focusing input during transition\nconst SEARCH_FOCUS_DELAY_MS = 400;\n\nconst HeaderActions: FC = ({\n chatId,\n threadId,\n noMenu,\n isChannel,\n canStartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n isRightColumnShown,\n joinChannel,\n sendBotCommand,\n openLocalTextSearch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuButtonRef = useRef(null);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState(undefined);\n\n const handleHeaderMenuOpen = useCallback(() => {\n setIsMenuOpen(true);\n const rect = menuButtonRef.current!.getBoundingClientRect();\n setMenuPosition({ x: rect.right, y: rect.bottom });\n }, []);\n\n const handleHeaderMenuClose = useCallback(() => {\n setIsMenuOpen(false);\n }, []);\n\n const handleHeaderMenuHide = useCallback(() => {\n setMenuPosition(undefined);\n }, []);\n\n const handleSubscribeClick = useCallback(() => {\n joinChannel({ chatId });\n }, [joinChannel, chatId]);\n\n const handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleSearchClick = useCallback(() => {\n openLocalTextSearch();\n\n if (IS_MOBILE_SCREEN) {\n // iOS requires synchronous focus on user event.\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.focus();\n } else {\n setTimeout(() => {\n const searchInput = document.querySelector('.RightHeader .SearchInput input');\n if (searchInput) {\n searchInput.focus();\n }\n }, SEARCH_FOCUS_DELAY_MS);\n }\n }, [openLocalTextSearch]);\n\n const lang = useLang();\n\n return (\n
\n {!IS_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {!IS_MOBILE_SCREEN && canStartBot && (\n \n {lang('Start')}\n \n )}\n {!IS_MOBILE_SCREEN && canSearch && (\n \n \n \n )}\n {(IS_MOBILE_SCREEN || !canSubscribe) && (\n \n \n \n )}\n {menuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const isChannel = Boolean(chat && isChatChannel(chat));\n\n if (chat && chat.isRestricted) {\n return {\n noMenu: true,\n };\n }\n\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isMainThread = messageListType === 'thread' && threadId === MAIN_THREAD_ID;\n const isDiscussionThread = messageListType === 'thread' && threadId !== MAIN_THREAD_ID;\n const isRightColumnShown = selectIsRightColumnShown(global);\n\n const canStartBot = Boolean(selectIsChatBotNotStarted(global, chatId));\n const canSubscribe = Boolean(\n isMainThread && chat && (isChannel || isChatSuperGroup(chat)) && chat.isNotJoined,\n );\n const canSearch = isMainThread || isDiscussionThread;\n const canMute = isMainThread && !isChatWithSelf && !canSubscribe;\n const canSelect = !selectIsInSelectMode(global);\n const canLeave = isMainThread && !canSubscribe;\n\n const noMenu = !(\n (IS_MOBILE_SCREEN && canSubscribe)\n || (IS_MOBILE_SCREEN && canSearch)\n || canMute\n || canSelect\n || canLeave\n );\n\n return {\n noMenu,\n isChannel,\n isRightColumnShown,\n canStartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'joinChannel', 'sendBotCommand', 'openLocalTextSearch',\n ]),\n)(HeaderActions));\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\n\nimport { ApiMessage } from '../api/types';\n\nimport { DEBUG } from '../config';\nimport { isWebpSupported } from '../util/environment';\nimport { EMPTY_IMAGE_DATA_URI, webpToPngBase64 } from '../util/webpToPng';\nimport { getMessageMediaThumbDataUri } from '../modules/helpers';\n\nexport default function useWebpThumbnail(message?: ApiMessage) {\n const thumbnail = message && getMessageMediaThumbDataUri(message);\n const { sticker } = (message && message.content) || {};\n const shouldDecodeThumbnail = thumbnail && sticker && !isWebpSupported() && thumbnail.includes('image/webp');\n const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI);\n const messageId = message && message.id;\n\n useLayoutEffect(() => {\n if (!shouldDecodeThumbnail) {\n return;\n }\n\n webpToPngBase64(`b64-${messageId}`, thumbnail!)\n .then(setThumbnailDecoded)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n }, [messageId, shouldDecodeThumbnail, thumbnail]);\n\n return shouldDecodeThumbnail ? thumbnailDecoded : thumbnail;\n}\n","import React, {\n FC,\n useRef,\n useEffect,\n useMemo,\n memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n count: number;\n index: number;\n};\n\nconst BORDER_MASK_LEVEL = 4;\n\nconst PinnedMessageNavigation: FC = ({\n count, index,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const markupParams = useMemo(() => {\n return calculateMarkup(count, index);\n }, [count, index]);\n\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n const {\n trackHeight,\n trackTranslateY,\n markHeight,\n markTranslateY,\n clipPathId,\n clipPath,\n } = markupParams;\n\n const firstChild = containerRef.current.firstElementChild;\n if (containerRef && containerRef.current) {\n const currentElement = containerRef.current;\n const { style } = currentElement;\n style.height = `${trackHeight}px`;\n style.transform = `translateY(-${trackTranslateY}px)`;\n style.clipPath = `url(\"#${clipPathId}\")`;\n const svg = currentElement.querySelector('svg');\n const div = currentElement.querySelector('div');\n const defs = currentElement.querySelector('defs');\n if (!svg) {\n if (firstChild) {\n firstChild.innerHTML = ` ${clipPath} `;\n }\n }\n if (defs) {\n defs.innerHTML = clipPath;\n }\n if (div) {\n div.style.height = `${markHeight}px`;\n div.style.transform = `translateY(${markTranslateY}px)`;\n }\n }\n }, [markupParams]);\n\n if (count === 1) {\n return (\n
\n \n
\n );\n }\n\n const {\n trackHeight, trackTranslateY, markHeight, markTranslateY, clipPathId,\n } = markupParams;\n\n return (\n
BORDER_MASK_LEVEL && 'pinned-message-border-mask')}>\n \n \n \n
\n \n );\n};\n\nfunction calculateMarkup(count: number, index: number) {\n const reverseIndex = count - index - 1;\n const barHeight = getBarHeight(count);\n const markHeight = getMarkHeight(count, reverseIndex);\n const trackHeight = getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath${count}`;\n const clipPath = getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = getMarkTranslateY(reverseIndex, barHeight, count);\n const trackTranslateY = getTrackTranslateY(reverseIndex, count, barHeight, trackHeight);\n return {\n markHeight,\n clipPath,\n markTranslateY,\n trackTranslateY,\n trackHeight,\n clipPathId,\n };\n}\n\nfunction getBarHeight(count: number): number {\n let barHeight = 8;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getMarkHeight(count: number, index: number) {\n let barHeight = 36;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = index === 1 ? 12 : 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getTrackHeight(count: number, barHeight: number) {\n return count <= 3 ? 36 : barHeight * count + 2 * (count - 1);\n}\n\nfunction getClipPath(id: string, barHeight: number, count: number) {\n const radius = 1;\n\n let d = '';\n if (count === 3) {\n d = drawRect(0, 0, 2, barHeight, radius)\n + drawRect(0, 12, 2, barHeight + 1, radius)\n + drawRect(0, 25, 2, barHeight, radius);\n } else {\n for (let i = 0; i < count; i++) {\n d += drawRect(0, (barHeight + 2) * i, 2, barHeight, radius);\n }\n }\n\n return (\n `\n \n `\n );\n}\n\nfunction drawRect(x: number, y: number, width: number, height: number, radius: number) {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,\n ${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n}\n\nfunction getMarkTranslateY(index: number, barHeight: number, count: number) {\n if (count === 1) {\n return 0;\n } else if (count === 2) {\n return index === 0 ? 0 : barHeight + 2;\n }\n\n if (count === 3) {\n if (index === 0) {\n return 0;\n } else if (index === 1) {\n return 12;\n }\n\n return 25;\n } else {\n return (barHeight + 2) * index;\n }\n}\n\nfunction getTrackTranslateY(index: number, count: number, barHeight: number, trackHeight: number) {\n if (count <= 4) {\n return 0;\n }\n\n if (index <= 1) {\n return 0;\n } else if (index >= count - 2) {\n return trackHeight - 36;\n }\n\n return (barHeight + 4) / 2 + (index - 2) * (barHeight + 2);\n}\n\nexport default memo(PinnedMessageNavigation);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getPictogramDimensions } from '../common/helpers/mediaDimensions';\nimport { getMessageMediaHash, getMessageSummaryText } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\nimport Button from '../ui/Button';\nimport RippleEffect from '../ui/RippleEffect';\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport PinnedMessageNavigation from './PinnedMessageNavigation';\n\ntype OwnProps = {\n message: ApiMessage;\n index: number;\n count: number;\n customTitle?: string;\n className?: string;\n onUnpinMessage?: (id: number) => void;\n onClick?: () => void;\n onAllPinnedClick?: () => void;\n};\n\nconst HeaderPinnedMessage: FC = ({\n message, count, index, customTitle, className, onUnpinMessage, onClick, onAllPinnedClick,\n}) => {\n const lang = useLang();\n const mediaThumbnail = useWebpThumbnail(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n\n const text = getMessageSummaryText(lang, message, Boolean(mediaThumbnail));\n const [isUnpinDialogOpen, openUnpinDialog, closeUnpinDialog] = useFlag();\n\n const handleUnpinMessage = useCallback(() => {\n closeUnpinDialog();\n\n if (onUnpinMessage) {\n onUnpinMessage(message.id);\n }\n }, [closeUnpinDialog, onUnpinMessage, message.id]);\n\n return (\n
\n {count > 1 && (\n \n \n \n )}\n {onUnpinMessage && (\n \n \n \n )}\n \n
\n \n {mediaThumbnail && renderPictogram(mediaThumbnail, mediaBlobUrl)}\n
\n
\n {customTitle || `${lang('PinnedMessage')} ${index > 0 ? `#${count - index}` : ''}`}\n
\n

{renderText(text)}

\n
\n\n \n
\n
\n );\n};\n\nfunction renderPictogram(thumbDataUri: string, blobUrl?: string) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \"\"\n );\n}\n\nexport default memo(HeaderPinnedMessage);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiAudio, ApiChat, ApiMessage, ApiUser,\n} from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport {\n getMediaDuration, getMessageAudio, getMessageKey, getMessageMediaHash, getSenderTitle,\n} from '../../modules/helpers';\nimport { selectSender } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from '../ui/RippleEffect';\nimport Button from '../ui/Button';\n\nimport './AudioPlayer.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n className?: string;\n noUi?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiChat | ApiUser;\n};\n\ntype DispatchProps = Pick;\n\nconst AudioPlayer: FC = ({\n message, className, noUi, sender, focusMessage, closeAudioPlayer,\n}) => {\n const lang = useLang();\n\n const senderName = sender ? getSenderTitle(lang, sender) : undefined;\n const mediaData = mediaLoader.getFromMemory(getMessageMediaHash(message, 'inline')!) as (string | undefined);\n const { playPause, isPlaying } = useAudioPlayer(\n getMessageKey(message), getMediaDuration(message)!, mediaData, undefined, undefined, true,\n );\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }, [focusMessage, message.chatId, message.id]);\n\n const handleClose = useCallback(() => {\n if (isPlaying) {\n playPause();\n }\n closeAudioPlayer();\n }, [closeAudioPlayer, isPlaying, playPause]);\n\n if (noUi) {\n return undefined;\n }\n\n const audio = getMessageAudio(message);\n\n return (\n
\n \n \n \n \n\n
\n {audio ? renderAudio(audio) : renderVoice(lang('AttachAudio'), senderName)}\n \n
\n\n \n \n \n
\n );\n};\n\nfunction renderAudio(audio: ApiAudio) {\n const { title, performer, fileName } = audio;\n\n return (\n <>\n
{renderText(title || fileName)}
\n {performer && (\n
{renderText(performer)}
\n )}\n \n );\n}\n\nfunction renderVoice(subtitle: string, senderName?: string) {\n return (\n <>\n
{senderName && renderText(senderName)}
\n
{subtitle}
\n \n );\n}\n\nexport default withGlobal(\n (global, { message }): StateProps => {\n const sender = selectSender(global, message);\n\n return { sender };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage', 'closeAudioPlayer']),\n)(AudioPlayer);\n","import React, {\n FC, useCallback, useMemo, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport cycleRestrict from '../../util/cycleRestrict';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport {\n ApiMessage,\n ApiChat,\n ApiTypingStatus,\n MAIN_THREAD_ID, ApiUser,\n} from '../../api/types';\nimport { NotifyException, NotifySettings } from '../../types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n EDITABLE_INPUT_ID,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n} from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport {\n isChatPrivate,\n isChatArchived,\n getMessageKey,\n getChatTitle,\n getSenderTitle,\n selectIsChatMuted,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatMessage,\n selectAllowedMessageActions,\n selectIsRightColumnShown,\n selectThreadTopMessageId,\n selectThreadOriginChat,\n selectThreadInfo,\n selectChatMessages,\n selectPinnedIds,\n selectIsChatWithSelf,\n selectForwardedSender,\n selectScheduledIds,\n selectIsInSelectMode,\n selectIsChatWithBot,\n selectNotifySettings,\n selectNotifyExceptions,\n} from '../../modules/selectors';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport { pick } from '../../util/iteratees';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport HeaderActions from './HeaderActions';\nimport HeaderPinnedMessage from './HeaderPinnedMessage';\nimport AudioPlayer from './AudioPlayer';\n\nimport './MiddleHeader.scss';\n\nconst ANIMATION_DURATION = 350;\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n pinnedMessageIds?: number[] | number;\n messagesById?: Record;\n canUnpin?: boolean;\n topMessageSender?: ApiChat | ApiUser;\n typingStatus?: ApiTypingStatus;\n isSelectModeActive?: boolean;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n audioMessage?: ApiMessage;\n chatsById?: Record;\n originChatId: number;\n messagesCount?: number;\n isChatWithSelf?: boolean;\n isChatWithBot?: boolean;\n lastSyncTime?: number;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst MiddleHeader: FC = ({\n chatId,\n threadId,\n messageListType,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n topMessageSender,\n typingStatus,\n isSelectModeActive,\n isLeftColumnShown,\n isRightColumnShown,\n audioMessage,\n chat,\n chatsById,\n originChatId,\n messagesCount,\n isChatWithSelf,\n isChatWithBot,\n lastSyncTime,\n notifySettings,\n notifyExceptions,\n openChatWithInfo,\n pinMessage,\n focusMessage,\n openChat,\n loadPinnedMessages,\n toggleLeftColumn,\n exitMessageSelectMode,\n}) => {\n const lang = useLang();\n\n const [pinnedMessageIndex, setPinnedMessageIndex] = useState(0);\n const pinnedMessageId = Array.isArray(pinnedMessageIds) ? pinnedMessageIds[pinnedMessageIndex] : pinnedMessageIds;\n const pinnedMessage = messagesById && pinnedMessageId ? messagesById[pinnedMessageId] : undefined;\n const pinnedMessagesCount = Array.isArray(pinnedMessageIds) ? pinnedMessageIds.length : (pinnedMessageIds ? 1 : 0);\n const chatTitleLength = chat && getChatTitle(lang, chat).length;\n const topMessageTitle = topMessageSender ? getSenderTitle(lang, topMessageSender) : undefined;\n\n useEffect(() => {\n if (threadId === MAIN_THREAD_ID && lastSyncTime) {\n loadPinnedMessages({ chatId });\n }\n }, [chatId, loadPinnedMessages, lastSyncTime, threadId]);\n\n // Reset pinned index when switching chats and pinning/unpinning\n useEffect(() => {\n setPinnedMessageIndex(0);\n }, [pinnedMessageIds]);\n\n useEnsureMessage(chatId, pinnedMessageId, pinnedMessage);\n\n const { width: windowWidth } = useWindowSize();\n\n const isLeftColumnHideable = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN;\n const shouldShowCloseButton = windowWidth >= MOBILE_SCREEN_MAX_WIDTH && isLeftColumnShown;\n\n // eslint-disable-next-line no-null/no-null\n const componentRef = useRef(null);\n const shouldAnimateTools = useRef(true);\n\n const handleHeaderClick = useCallback(() => {\n openChatWithInfo({ id: chatId });\n }, [openChatWithInfo, chatId]);\n\n const handleUnpinMessage = useCallback((messageId: number) => {\n pinMessage({ chatId, messageId, isUnpin: true });\n }, [pinMessage, chatId]);\n\n const handlePinnedMessageClick = useCallback((): void => {\n if (pinnedMessage) {\n focusMessage({ chatId: pinnedMessage.chatId, threadId, messageId: pinnedMessage.id });\n\n const newIndex = cycleRestrict(pinnedMessagesCount, pinnedMessageIndex + 1);\n setPinnedMessageIndex(newIndex);\n }\n }, [pinnedMessage, focusMessage, threadId, pinnedMessagesCount, pinnedMessageIndex]);\n\n const handleAllPinnedClick = useCallback(() => {\n openChat({ id: chatId, threadId: MAIN_THREAD_ID, type: 'pinned' });\n }, [openChat, chatId]);\n\n const handleBackClick = useCallback(() => {\n if (IS_MOBILE_SCREEN) {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID);\n if (messageInput) {\n messageInput.blur();\n }\n }\n if (threadId === MAIN_THREAD_ID && messageListType === 'thread') {\n if (IS_MOBILE_SCREEN) {\n openChat({ id: undefined });\n } else {\n toggleLeftColumn();\n }\n\n return;\n }\n\n if (messageListType === 'scheduled' && isSelectModeActive) {\n exitMessageSelectMode();\n }\n openChat({ id: originChatId, threadId: MAIN_THREAD_ID });\n }, [openChat, originChatId, threadId, messageListType, toggleLeftColumn, isSelectModeActive, exitMessageSelectMode]);\n\n const unreadCount = useMemo(() => {\n if (!isLeftColumnHideable || !chatsById) {\n return undefined;\n }\n\n let isActive = false;\n\n const totalCount = Object.values(chatsById).reduce((total, currentChat) => {\n if (isChatArchived(currentChat)) {\n return total;\n }\n\n const count = currentChat.unreadCount || 0;\n if (\n count && (!selectIsChatMuted(currentChat, notifySettings, notifyExceptions) || currentChat.unreadMentionsCount)\n ) {\n isActive = true;\n }\n\n return total + count;\n }, 0);\n\n if (!totalCount) {\n return undefined;\n }\n\n return {\n isActive,\n totalCount,\n };\n }, [isLeftColumnHideable, chatsById, notifySettings, notifyExceptions]);\n\n const canToolsCollideWithChatInfo = (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n ) || (\n windowWidth > MOBILE_SCREEN_MAX_WIDTH\n && windowWidth < MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && (!chatTitleLength || chatTitleLength > 30)\n );\n const shouldUseStackedToolsClass = canToolsCollideWithChatInfo || (\n windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n );\n\n const {\n shouldRender: shouldRenderAudioPlayer,\n transitionClassNames: audioPlayerClassNames,\n } = useShowTransition(Boolean(audioMessage));\n\n const renderingAudioMessage = useCurrentOrPrev(audioMessage);\n\n const {\n shouldRender: shouldRenderPinnedMessage,\n transitionClassNames: pinnedMessageClassNames,\n } = useShowTransition(pinnedMessage && !shouldRenderAudioPlayer);\n\n const renderingPinnedMessage = useCurrentOrPrev(pinnedMessage);\n const renderingPinnedMessageTitle = useCurrentOrPrev(topMessageTitle);\n\n const canRevealTools = (shouldRenderPinnedMessage && renderingPinnedMessage)\n || (shouldRenderAudioPlayer && renderingAudioMessage);\n\n // Logic for transition to and from custom display of AudioPlayer/PinnedMessage on smaller screens\n useEffect(() => {\n const componentEl = componentRef.current;\n if (!componentEl) {\n return;\n }\n\n if (!shouldUseStackedToolsClass || !canRevealTools) {\n componentEl.classList.remove('tools-stacked', 'animated');\n shouldAnimateTools.current = true;\n return;\n }\n\n if (isRightColumnShown || canToolsCollideWithChatInfo) {\n if (shouldAnimateTools.current) {\n componentEl.classList.add('tools-stacked', 'animated');\n shouldAnimateTools.current = false;\n }\n\n // Remove animation class to prevent it messing up the show transitions\n setTimeout(() => {\n componentEl.classList.remove('animated');\n }, ANIMATION_DURATION);\n } else {\n componentEl.classList.remove('tools-stacked');\n shouldAnimateTools.current = true;\n }\n }, [shouldUseStackedToolsClass, canRevealTools, canToolsCollideWithChatInfo, isRightColumnShown]);\n\n function renderInfo() {\n return (\n messageListType === 'thread' && threadId === MAIN_THREAD_ID ? (\n renderMainThreadInfo()\n ) : messageListType === 'thread' ? (\n <>\n {renderBackButton()}\n

\n {lang('CommentsCount', messagesCount)}\n

\n \n ) : messageListType === 'pinned' ? (\n <>\n {renderBackButton()}\n

\n {lang('PinnedMessagesCount', messagesCount)}\n

\n \n ) : messageListType === 'scheduled' ? (\n <>\n {renderBackButton()}\n

\n {isChatWithSelf ? lang('Reminders') : lang('messages', messagesCount)}\n

\n \n ) : undefined\n );\n }\n\n function renderMainThreadInfo() {\n return (\n <>\n {isLeftColumnHideable && renderBackButton(shouldShowCloseButton, unreadCount)}\n
\n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n
\n \n );\n }\n\n function renderBackButton(asClose = false, unreadCountInfo?: typeof unreadCount) {\n return (\n
\n \n
\n \n {unreadCountInfo && (\n
\n {formatIntegerCompact(unreadCountInfo.totalCount)}\n
\n )}\n
\n );\n }\n\n return (\n
\n \n {renderInfo}\n \n\n
\n {shouldRenderPinnedMessage && renderingPinnedMessage && !shouldRenderAudioPlayer && (\n \n )}\n {shouldRenderAudioPlayer && renderingAudioMessage && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const { isLeftColumnShown, lastSyncTime } = global;\n const { byId: chatsById } = global.chats;\n const chat = selectChat(global, chatId);\n\n const { typingStatus } = chat || {};\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n const originChat = selectThreadOriginChat(global, chatId, threadId);\n\n let messagesCount: number | undefined;\n if (messageListType === 'pinned') {\n const pinnedIds = selectPinnedIds(global, chatId);\n messagesCount = pinnedIds && pinnedIds.length;\n } else if (messageListType === 'scheduled') {\n const scheduledIds = selectScheduledIds(global, chatId);\n messagesCount = scheduledIds && scheduledIds.length;\n } else if (messageListType === 'thread' && threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (threadInfo) {\n messagesCount = threadInfo.messagesCount;\n }\n }\n\n const state: StateProps = {\n typingStatus,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n audioMessage,\n chat,\n chatsById,\n originChatId: originChat ? originChat.id : chatId,\n messagesCount,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isChatWithBot: chat && selectIsChatWithBot(global, chat),\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n\n const messagesById = selectChatMessages(global, chatId);\n if (messageListType !== 'thread' || !messagesById) {\n return state;\n }\n\n Object.assign(state, { messagesById });\n\n if (threadId !== MAIN_THREAD_ID) {\n const pinnedMessageId = selectThreadTopMessageId(global, chatId, threadId);\n const message = pinnedMessageId ? selectChatMessage(global, chatId, pinnedMessageId) : undefined;\n const topMessageSender = message ? selectForwardedSender(global, message) : undefined;\n\n return {\n ...state,\n pinnedMessageIds: pinnedMessageId,\n canUnpin: false,\n topMessageSender,\n };\n }\n\n const pinnedMessageIds = selectPinnedIds(global, chatId);\n if (pinnedMessageIds && pinnedMessageIds.length) {\n const firstPinnedMessage = messagesById[pinnedMessageIds[0]];\n const {\n canUnpin,\n } = (firstPinnedMessage && selectAllowedMessageActions(global, firstPinnedMessage, threadId)) || {};\n\n return {\n ...state,\n pinnedMessageIds,\n canUnpin,\n };\n }\n\n return state;\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChatWithInfo',\n 'pinMessage',\n 'focusMessage',\n 'openChat',\n 'loadPinnedMessages',\n 'toggleLeftColumn',\n 'exitMessageSelectMode',\n ]),\n)(MiddleHeader));\n","import { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\n\nimport { getDayStart } from '../../../util/dateFormat';\nimport { isActionMessage } from '../../../modules/helpers';\n\ntype SenderGroup = (ApiMessage | IAlbum)[];\n\nexport type MessageDateGroup = {\n originalDate: number;\n datetime: number;\n senderGroups: SenderGroup[];\n};\n\nexport function isAlbum(messageOrAlbum: ApiMessage | IAlbum): messageOrAlbum is IAlbum {\n return 'albumId' in messageOrAlbum;\n}\n\nexport function groupMessages(messages: ApiMessage[], firstUnreadId?: number) {\n let currentSenderGroup: SenderGroup = [];\n let currentDateGroup = {\n originalDate: messages[0].date,\n datetime: Number(getDayStart(messages[0].date * 1000)),\n senderGroups: [currentSenderGroup],\n };\n let currentAlbum: IAlbum | undefined;\n\n const dateGroups: MessageDateGroup[] = [currentDateGroup];\n\n messages.forEach((message, index) => {\n if (message.isInAlbum) {\n if (!currentAlbum) {\n currentAlbum = {\n albumId: message.groupedId!,\n messages: [message],\n mainMessage: message,\n };\n } else {\n currentAlbum.messages.push(message);\n if (message.content.text) {\n currentAlbum.mainMessage = message;\n }\n }\n } else {\n currentSenderGroup.push(message);\n }\n\n const nextMessage = messages[index + 1];\n\n if (\n currentAlbum\n && (!nextMessage || !nextMessage.groupedId || nextMessage.groupedId !== currentAlbum.albumId)\n ) {\n currentSenderGroup.push(currentAlbum);\n currentAlbum = undefined;\n }\n if (nextMessage) {\n const nextMessageDatetime = Number(getDayStart(nextMessage.date * 1000));\n if (currentDateGroup.datetime !== nextMessageDatetime) {\n currentDateGroup = {\n originalDate: nextMessage.date,\n datetime: nextMessageDatetime,\n senderGroups: [],\n };\n dateGroups.push(currentDateGroup);\n\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n } else if (\n nextMessage.id === firstUnreadId\n || message.senderId !== nextMessage.senderId\n || message.isOutgoing !== nextMessage.isOutgoing\n || isActionMessage(message)\n || isActionMessage(nextMessage)\n || (\n message.forwardInfo && nextMessage.forwardInfo\n && (\n message.forwardInfo.senderUserId !== nextMessage.forwardInfo.senderUserId\n || message.forwardInfo.fromChatId !== nextMessage.forwardInfo.fromChatId\n || message.forwardInfo.hiddenUserName !== nextMessage.forwardInfo.hiddenUserName\n )\n )\n || message.inlineButtons\n || nextMessage.inlineButtons\n ) {\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n }\n }\n });\n\n return dateGroups;\n}\n","import { useCallback } from '../../../lib/teact/teact';\n\nimport { fastRaf } from '../../../util/schedulers';\nimport useDebounce from '../../../hooks/useDebounce';\nimport useFlag from '../../../hooks/useFlag';\n\nconst DEBOUNCE = 1000;\nconst STICKY_TOP = 10;\nconst STICKY_TOP_WITH_TOOLS = 60;\n\nexport default function useStickyDates() {\n // For some reason we can not synchronously hide a sticky element (from `useLayoutEffect`) when chat opens\n // so we will add `position: sticky` only after first scroll. There would be no animation on the first show though.\n const [isScrolled, markIsScrolled] = useFlag(false);\n\n const runDebounced = useDebounce(DEBOUNCE, false);\n\n const updateStickyDates = useCallback((container: HTMLDivElement, hasTools?: boolean) => {\n markIsScrolled();\n\n if (!document.body.classList.contains('is-scrolling-messages')) {\n fastRaf(() => {\n document.body.classList.add('is-scrolling-messages');\n });\n }\n\n runDebounced(() => {\n fastRaf(() => {\n const currentStuck = document.querySelector('.stuck');\n if (currentStuck) {\n currentStuck.classList.remove('stuck');\n }\n\n const stuckDateEl = findStuckDate(container, hasTools);\n if (stuckDateEl) {\n stuckDateEl.classList.add('stuck');\n }\n\n document.body.classList.remove('is-scrolling-messages');\n });\n });\n }, [markIsScrolled, runDebounced]);\n\n return {\n isScrolled,\n updateStickyDates,\n };\n}\n\nfunction findStuckDate(container: HTMLElement, hasTools?: boolean) {\n const allElements = container.querySelectorAll('.sticky-date');\n const containerTop = container.scrollTop;\n\n return Array.from(allElements).find((el) => {\n const { offsetTop, offsetHeight } = el;\n const top = offsetTop - containerTop;\n return -offsetHeight <= top && top <= (hasTools ? STICKY_TOP_WITH_TOOLS : STICKY_TOP);\n });\n}\n","import { useMemo } from '../lib/teact/teact';\n\nimport { debounce } from '../util/schedulers';\n\nexport default function useDebounce(ms: number, shouldRunFirst?: boolean, shouldRunLast?: boolean) {\n return useMemo(() => {\n return debounce((cb) => cb(), ms, shouldRunFirst, shouldRunLast);\n }, [ms, shouldRunFirst, shouldRunLast]);\n}\n","import { MutableRefObject } from 'react';\nimport React, {\n FC, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { MESSAGE_LIST_SENSITIVE_AREA } from '../../config';\nimport resetScroll from '../../util/resetScroll';\nimport { useIntersectionObserver, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useOnChange from '../../hooks/useOnChange';\n\ntype OwnProps = {\n containerRef: MutableRefObject;\n className: string;\n messageIds: number[];\n focusingId?: number;\n loadMoreForwards?: NoneToVoidFunction;\n loadMoreBackwards?: NoneToVoidFunction;\n isViewportNewest?: boolean;\n firstUnreadId?: number;\n onFabToggle: AnyToVoidFunction;\n onNotchToggle: AnyToVoidFunction;\n children: any;\n};\n\nconst FAB_THRESHOLD = 50;\nconst TOOLS_FREEZE_TIMEOUT = 100;\n\n// Local flag is used because `freeze/unfreeze` methods are controlled by heavy animation\nlet areToolsFrozen = false;\n\nconst MessageScroll: FC = ({\n containerRef,\n className,\n messageIds,\n focusingId,\n loadMoreForwards,\n loadMoreBackwards,\n isViewportNewest,\n firstUnreadId,\n onFabToggle,\n onNotchToggle,\n children,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const forwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const fabTriggerRef = useRef(null);\n\n const toggleScrollTools = useCallback(() => {\n if (areToolsFrozen) {\n return;\n }\n\n if (!messageIds || !messageIds.length) {\n onFabToggle(false);\n onNotchToggle(false);\n return;\n }\n\n if (!isViewportNewest) {\n onFabToggle(true);\n onNotchToggle(true);\n return;\n }\n\n const { offsetHeight, scrollHeight, scrollTop } = containerRef.current!;\n const scrollBottom = scrollHeight - scrollTop - offsetHeight;\n const isNearBottom = scrollBottom <= FAB_THRESHOLD;\n const isAtBottom = scrollBottom <= 0;\n\n onFabToggle(firstUnreadId ? !isAtBottom : !isNearBottom);\n onNotchToggle(!isAtBottom);\n }, [messageIds, isViewportNewest, containerRef, onFabToggle, firstUnreadId, onNotchToggle]);\n\n const {\n observe: observeIntersection,\n freeze: freezeForLoadMore,\n unfreeze: unfreezeForLoadMore,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: MESSAGE_LIST_SENSITIVE_AREA,\n }, (entries) => {\n if (!loadMoreForwards || !loadMoreBackwards) {\n return;\n }\n\n const triggerEntry = entries.find(({ isIntersecting }) => isIntersecting);\n if (!triggerEntry) {\n return;\n }\n\n const { target } = triggerEntry;\n\n if (target.className === 'backwards-trigger') {\n resetScroll(containerRef.current!);\n loadMoreBackwards();\n } else if (target.className === 'forwards-trigger') {\n resetScroll(containerRef.current!);\n loadMoreForwards();\n }\n });\n\n useOnIntersect(backwardsTriggerRef, observeIntersection);\n useOnIntersect(forwardsTriggerRef, observeIntersection);\n\n const {\n observe: observeIntersectionForFab,\n freeze: freezeForFab,\n unfreeze: unfreezeForFab,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: FAB_THRESHOLD,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForFab);\n\n const {\n observe: observeIntersectionForNotch,\n } = useIntersectionObserver({\n rootRef: containerRef,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForNotch);\n\n // Do not load more and show FAB when focusing\n useOnChange(() => {\n if (focusingId) {\n freezeForLoadMore();\n freezeForFab();\n } else {\n unfreezeForFab();\n unfreezeForLoadMore();\n }\n }, [focusingId]);\n\n // Workaround for FAB and notch flickering with tall incoming message\n useOnChange(() => {\n areToolsFrozen = true;\n\n setTimeout(() => {\n areToolsFrozen = false;\n }, TOOLS_FREEZE_TIMEOUT);\n }, [messageIds]);\n\n // Workaround for stuck FAB when many unread messages\n useEffect(toggleScrollTools, [firstUnreadId]);\n\n return (\n
\n
\n {children}\n \n \n
\n );\n};\n\nexport default MessageScroll;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { getMessageContent } from '../../../../modules/helpers';\n\nexport function isEmojiOnlyMessage(customShape?: boolean | number) {\n return typeof customShape === 'number';\n}\n\nexport function buildContentClassName(\n message: ApiMessage,\n {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments,\n }: {\n hasReply?: boolean;\n customShape?: boolean | number;\n isLastInGroup?: boolean;\n asForwarded?: boolean;\n hasThread?: boolean;\n forceSenderName?: boolean;\n hasComments?: boolean;\n } = {},\n) {\n const {\n text, photo, video, audio, voice, document, poll, webPage, contact,\n } = getMessageContent(message);\n\n const classNames = ['message-content'];\n const isMediaWithNoText = (photo || video) && !text;\n const isViaBot = Boolean(message.viaBotId);\n\n if (isEmojiOnlyMessage(customShape)) {\n classNames.push(`emoji-only emoji-only-${customShape}`);\n } else if (text) {\n classNames.push('text');\n }\n\n if (customShape) {\n classNames.push('custom-shape');\n if (video && video.isRound) {\n classNames.push('round');\n }\n\n if (hasComments) {\n classNames.push('has-comments');\n }\n }\n if (photo || video) {\n classNames.push('media');\n } else if (audio) {\n classNames.push('audio');\n } else if (voice) {\n classNames.push('voice');\n } else if (document) {\n classNames.push('document');\n } else if (contact) {\n classNames.push('contact');\n } else if (poll) {\n classNames.push('poll');\n } else if (webPage) {\n classNames.push('web-page');\n\n if (webPage.photo) {\n classNames.push('media');\n }\n }\n\n if (asForwarded && !customShape) {\n classNames.push('is-forwarded');\n }\n\n if (hasReply) {\n classNames.push('is-reply');\n }\n\n if (hasThread) {\n classNames.push('has-replies');\n }\n\n if (isViaBot) {\n classNames.push('is-via-bot');\n }\n\n if (forceSenderName) {\n classNames.push('force-sender-name');\n }\n\n if (!customShape) {\n classNames.push('has-shadow');\n\n if (hasReply || asForwarded || !isMediaWithNoText || isViaBot || forceSenderName) {\n classNames.push('has-solid-background');\n }\n\n if (isLastInGroup && (photo || !isMediaWithNoText)) {\n classNames.push('has-appendix');\n }\n }\n\n return classNames.join(' ');\n}\n","import { ApiMessage } from '../../../../api/types';\nimport { calculateInlineImageDimensions, calculateVideoDimensions } from '../../../common/helpers/mediaDimensions';\nimport {\n getMessageText,\n getMessagePhoto,\n getMessageWebPagePhoto,\n isForwardedMessage,\n isOwnMessage,\n getMessageVideo,\n} from '../../../../modules/helpers';\n\nconst MIN_MEDIA_WIDTH = 100;\nconst MIN_MEDIA_WIDTH_WITH_TEXT = 175;\nconst MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS = 238;\nconst MIN_MEDIA_HEIGHT = 90;\nconst SMALL_IMAGE_THRESHOLD = 12;\n\nexport function getMinMediaWidth(hasText?: boolean, hasCommentButton?: boolean) {\n return hasText\n ? (hasCommentButton ? MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS : MIN_MEDIA_WIDTH_WITH_TEXT)\n : MIN_MEDIA_WIDTH;\n}\n\nexport function calculateMediaDimensions(message: ApiMessage) {\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const photo = getMessagePhoto(message) || getMessageWebPagePhoto(message);\n const video = getMessageVideo(message);\n\n const isWebPagePhoto = Boolean(getMessageWebPagePhoto(message));\n const { width, height } = photo\n ? calculateInlineImageDimensions(photo, isOwn, isForwarded, isWebPagePhoto)\n : calculateVideoDimensions(video!, isOwn, isForwarded);\n\n const hasText = Boolean(getMessageText(message));\n const minMediaWidth = getMinMediaWidth(hasText);\n\n let stretchFactor = 1;\n if (width < minMediaWidth && minMediaWidth - width < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = minMediaWidth / width;\n }\n if (height * stretchFactor < MIN_MEDIA_HEIGHT && MIN_MEDIA_HEIGHT - height * stretchFactor < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = MIN_MEDIA_HEIGHT / height;\n }\n\n const finalWidth = Math.round(width * stretchFactor);\n const finalHeight = Math.round(height * stretchFactor);\n\n return {\n width: finalWidth,\n height: finalHeight,\n isSmall: finalWidth < minMediaWidth || finalHeight < MIN_MEDIA_HEIGHT,\n };\n}\n","/* eslint-disable no-bitwise */\n// Based on\n// https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/SourceFiles/ui/grouped_layout.cpp\n// https://github.com/overtake/TelegramSwift/blob/master/Telegram-Mac/GroupedLayout.swift#L83\n\nimport { IAlbum } from '../../../../types';\nimport { ApiMessage } from '../../../../api/types';\nimport { IDimensions } from '../../../../modules/helpers';\n\nimport { MOBILE_SCREEN_MAX_WIDTH } from '../../../../config';\nimport { REM } from '../../../common/helpers/mediaDimensions';\nimport { calculateMediaDimensions } from './mediaDimensions';\n\nconst MAX_WIDTH_MOBILE_VW = 69;\nconst MAX_WIDTH_DESK_OWN_REM = 30;\nconst MAX_WIDTH_DESK_REM = 29;\nexport const AlbumRectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8,\n};\n\ntype IAttempt = {\n lineCounts: number[];\n heights: number[];\n};\nexport type IMediaDimensions = {\n width: number;\n height: number;\n x: number;\n y: number;\n};\ntype IMediaLayout = {\n dimensions: IMediaDimensions;\n sides: number;\n};\ntype ILayoutParams = {\n ratios: number[];\n proportions: string;\n averageRatio: number;\n maxWidth: number;\n minWidth: number;\n maxHeight: number;\n spacing: number;\n};\nexport type IAlbumLayout = {\n layout: IMediaLayout[];\n containerStyle: IDimensions;\n};\n\nfunction getMaxWidth(isOwn: boolean, isForwarded: boolean, windowWidth: number) {\n if (windowWidth <= MOBILE_SCREEN_MAX_WIDTH) {\n return (windowWidth / 100) * MAX_WIDTH_MOBILE_VW - (isForwarded ? 1.625 : 0) * REM;\n }\n\n const maxWidth = isOwn ? MAX_WIDTH_DESK_OWN_REM : MAX_WIDTH_DESK_REM;\n\n return (maxWidth - (isForwarded ? 1.625 : 0)) * REM;\n}\n\nfunction getRatios(messages: ApiMessage[]) {\n return messages.map(\n (message) => {\n const dimensions = calculateMediaDimensions(message) as IDimensions;\n\n return dimensions.width / dimensions.height;\n },\n );\n}\n\nfunction getProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2 ? 'w' : (ratio < 0.8 ? 'n' : 'q'))).join('');\n}\n\nfunction getAverageRatio(ratios: number[]) {\n return ratios.reduce((result, ratio) => ratio + result, 1) / ratios.length;\n}\n\nfunction accumulate(list: number[], initValue: number) {\n return list.reduce((accumulator, item) => accumulator + item, initValue);\n}\n\nfunction clamp(num: number, low: number, high: number) {\n return num < low ? low : (num > high ? high : num);\n}\n\nfunction cropRatios(ratios: number[], averageRatio: number) {\n return ratios.map((ratio) => (averageRatio > 1.1 ? clamp(ratio, 1, 2.75) : clamp(ratio, 0.6667, 1)));\n}\n\nfunction calculateContainerSize(layout: IMediaLayout[]) {\n const styles: IDimensions = { width: 0, height: 0 };\n layout.forEach(({\n dimensions,\n sides,\n }) => {\n if (sides & AlbumRectPart.Right) {\n styles.width = dimensions.width + dimensions.x;\n }\n if (sides & AlbumRectPart.Bottom) {\n styles.height = dimensions.height + dimensions.y;\n }\n });\n\n return styles;\n}\n\nexport function calculateAlbumLayout(\n isOwn: boolean,\n isForwarded: boolean,\n album: IAlbum,\n windowWidth: number,\n): IAlbumLayout {\n const spacing = 2;\n const ratios = getRatios(album.messages);\n const proportions = getProportions(ratios);\n const averageRatio = getAverageRatio(ratios);\n const albumCount = ratios.length;\n const forceCalc = ratios.some((ratio) => ratio > 2);\n const maxWidth = getMaxWidth(isOwn, isForwarded, windowWidth);\n const maxHeight = maxWidth;\n\n let layout;\n\n const params = {\n ratios,\n proportions,\n averageRatio,\n maxWidth,\n minWidth: 100,\n maxHeight,\n spacing,\n };\n\n if (albumCount >= 5 || forceCalc) {\n layout = layoutWithComplexLayouter(params);\n } else if (albumCount === 2) {\n layout = layoutTwo(params);\n } else if (albumCount === 3) {\n layout = layoutThree(params);\n } else {\n layout = layoutFour(params);\n }\n\n return {\n layout,\n containerStyle: calculateContainerSize(layout),\n };\n}\n\nfunction layoutWithComplexLayouter({\n ratios: originalRatios,\n averageRatio,\n maxWidth,\n minWidth,\n spacing,\n maxHeight = (4 * maxWidth) / 3,\n}: ILayoutParams) {\n const ratios = cropRatios(originalRatios, averageRatio);\n const count = originalRatios.length;\n const result = new Array(count);\n const attempts: IAttempt[] = [];\n\n const multiHeight = (offset: number, attemptCount: number) => {\n const attemptRatios = ratios.slice(offset, offset + attemptCount);\n const sum = accumulate(attemptRatios, 0);\n\n return (maxWidth - (attemptCount - 1) * spacing) / sum;\n };\n\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n lineCounts.forEach((currentCount) => {\n heights.push(multiHeight(offset, currentCount));\n offset += currentCount;\n });\n\n attempts.push({\n lineCounts,\n heights,\n });\n };\n\n for (let first = 1; first !== count; ++first) {\n const second = count - first;\n if (first <= 3 && second <= 3) {\n pushAttempt([first, second]);\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n const third = count - first - second;\n if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) {\n pushAttempt([first, second, third]);\n }\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n for (let third = 1; third !== count - first - second; ++third) {\n const fourth = count - first - second - third;\n if (first <= 3 && second <= 3 && third <= 3 && fourth <= 4) {\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n }\n\n let optimalAttempt: IAttempt | undefined;\n let optimalDiff = 0;\n for (let i = 0; i < attempts.length; i++) {\n const {\n heights,\n lineCounts,\n } = attempts[i];\n const lineCount = lineCounts.length;\n const totalHeight = accumulate(heights, 0) + spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const bad1 = minLineHeight < minWidth ? 1.5 : 1;\n const bad2 = (() => {\n for (let line = 1; line !== lineCount; ++line) {\n if (lineCounts[line - 1] > lineCounts[line]) {\n return 1.5;\n }\n }\n\n return 1;\n })();\n const diff = Math.abs(totalHeight - maxHeight) * bad1 * bad2;\n\n if (!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempts[i];\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt!.lineCounts;\n const optimalHeights = optimalAttempt!.heights;\n const rowCount = optimalCounts.length;\n let index = 0;\n let y = 0;\n for (let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n let x = 0;\n\n for (let col = 0; col !== colCount; ++col) {\n const sides = AlbumRectPart.None\n | (row === 0 ? AlbumRectPart.Top : AlbumRectPart.None)\n | (row === rowCount - 1 ? AlbumRectPart.Bottom : AlbumRectPart.None)\n | (col === 0 ? AlbumRectPart.Left : AlbumRectPart.None)\n | (col === colCount - 1 ? AlbumRectPart.Right : AlbumRectPart.None);\n const ratio = ratios[index];\n const width = col === colCount - 1 ? maxWidth - x : Math.round(ratio * lineHeight);\n result[index] = {\n dimensions: {\n x,\n y,\n width,\n height,\n },\n sides,\n };\n x += width + spacing;\n ++index;\n }\n y += height + spacing;\n }\n\n return result;\n}\n\n\nfunction layoutTwo(params: ILayoutParams) {\n const {\n ratios,\n proportions,\n averageRatio,\n } = params;\n return proportions === 'ww' && averageRatio > 1.4 && ratios[1] - ratios[0] < 0.2\n ? layoutTwoTopBottom(params)\n : proportions === 'ww' || proportions === 'qq'\n ? layoutTwoLeftRightEqual(params)\n : layoutTwoLeftRight(params);\n}\n\nfunction layoutTwoTopBottom(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const height = Math.round(Math.min(maxWidth / ratios[0], Math.min(maxWidth / ratios[1], (maxHeight - spacing) / 2)));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: height + spacing,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutTwoLeftRightEqual(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const width = (maxWidth - spacing) / 2;\n const height = Math.round(Math.min(width / ratios[0], Math.min(width / ratios[1], maxHeight)));\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: width + spacing,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutTwoLeftRight(params: ILayoutParams) {\n const {\n ratios,\n minWidth,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const minimalWidth = Math.round(1.5 * minWidth);\n const secondWidth = Math.min(\n Math.round(\n Math.max(\n 0.4 * (maxWidth - spacing),\n (maxWidth - spacing) / ratios[0] / (1 / ratios[0] + 1 / ratios[1]),\n ),\n ),\n maxWidth - spacing - minimalWidth,\n );\n const firstWidth = maxWidth - secondWidth - spacing;\n const height = Math.min(maxHeight, Math.round(Math.min(firstWidth / ratios[0], secondWidth / ratios[1])));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: firstWidth + spacing,\n y: 0,\n width: secondWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutThree(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'n'\n ? layoutThreeLeftAndOther(params)\n : layoutThreeTopAndOther(params);\n}\n\nfunction layoutThreeLeftAndOther(params: ILayoutParams) {\n const {\n maxHeight,\n spacing,\n ratios,\n maxWidth,\n minWidth,\n } = params;\n const firstHeight = maxHeight;\n const thirdHeight = Math.round(\n Math.min(\n (maxHeight - spacing) / 2,\n (ratios[1] * (maxWidth - spacing)) / (ratios[2] + ratios[1]),\n ),\n );\n const secondHeight = firstHeight - thirdHeight - spacing;\n const rightWidth = Math.max(\n minWidth,\n Math.round(\n Math.min(\n (maxWidth - spacing) / 2,\n Math.min(\n thirdHeight * ratios[2],\n secondHeight * ratios[1],\n ),\n ),\n ),\n );\n const leftWidth = Math.min(Math.round(firstHeight * ratios[0]), maxWidth - spacing - rightWidth);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: leftWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: 0,\n width: rightWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: secondHeight + spacing,\n width: rightWidth,\n height: thirdHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutThreeTopAndOther(params: ILayoutParams) {\n const {\n maxWidth,\n ratios,\n maxHeight,\n spacing,\n } = params;\n const firstWidth = maxWidth;\n const firstHeight = Math.round(Math.min(firstWidth / ratios[0], 0.66 * (maxHeight - spacing)));\n const secondWidth = (maxWidth - spacing) / 2;\n const secondHeight = Math.min(\n maxHeight - firstHeight - spacing,\n Math.round(Math.min(\n secondWidth / ratios[1],\n secondWidth / ratios[2],\n )),\n );\n const thirdWidth = firstWidth - secondWidth - spacing;\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: firstHeight + spacing,\n width: secondWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: secondWidth + spacing,\n y: firstHeight + spacing,\n width: thirdWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutFour(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'w'\n ? layoutFourTopAndOther(params)\n : layoutFourLeftAndOther(params);\n}\n\nfunction layoutFourTopAndOther({\n maxWidth,\n ratios,\n spacing,\n maxHeight,\n minWidth,\n}: ILayoutParams) {\n const w = maxWidth;\n const h0 = Math.round(Math.min(w / ratios[0], 0.66 * (maxHeight - spacing)));\n const h = Math.round((maxWidth - 2 * spacing) / (ratios[1] + ratios[2] + ratios[3]));\n const w0 = Math.max(minWidth, Math.round(Math.min(0.4 * (maxWidth - 2 * spacing), h * ratios[1])));\n const w2 = Math.round(Math.max(Math.max(minWidth, 0.33 * (maxWidth - 2 * spacing)), h * ratios[3]));\n const w1 = w - w0 - w2 - 2 * spacing;\n const h1 = Math.min(maxHeight - h0 - spacing, h);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w,\n height: h0,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: h0 + spacing,\n width: w0,\n height: h1,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing + w1 + spacing,\n y: h0 + spacing,\n width: w2,\n height: h1,\n },\n sides: AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutFourLeftAndOther({\n maxHeight,\n ratios,\n maxWidth,\n spacing,\n minWidth,\n}: ILayoutParams) {\n const h = maxHeight;\n const w0 = Math.round(Math.min(h * ratios[0], 0.6 * (maxWidth - spacing)));\n const w = Math.round((maxHeight - 2 * spacing) / (1 / ratios[1] + 1 / ratios[2] + 1 / ratios[3]));\n const h0 = Math.round(w / ratios[1]);\n const h1 = Math.round(w / ratios[2]);\n const h2 = h - h0 - h1 - 2 * spacing;\n const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - spacing, w));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w0,\n height: h,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: 0,\n width: w1,\n height: h0,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + h1 + 2 * spacing,\n width: w1,\n height: h2,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n","let element: HTMLSpanElement | undefined;\n\nexport default function calculateAuthorWidth(text: string) {\n if (!element) {\n element = document.createElement('span');\n element.style.font = '400 12px Roboto, \"Helvetica Neue\", \"Apple Color Emoji\", sans-serif';\n element.style.whiteSpace = 'nowrap';\n element.style.position = 'absolute';\n element.style.left = '-999px';\n element.style.opacity = '.01';\n document.body.appendChild(element);\n }\n\n element.innerHTML = text;\n\n return element.offsetWidth;\n}\n","import { useLayoutEffect } from '../../../../lib/teact/teact';\nimport fastSmoothScroll from '../../../../util/fastSmoothScroll';\nimport { FocusDirection } from '../../../../types';\n\n// This is the max scroll offset within existing viewport.\nconst FOCUS_MAX_OFFSET = 1500;\n// This is used when the viewport was replaced.\nconst RELOCATED_FOCUS_OFFSET = 1000;\nconst FOCUS_MARGIN = 20;\n\nexport default function useFocusMessage(\n elementRef: { current: HTMLDivElement | null },\n chatId: number,\n isFocused?: boolean,\n focusDirection?: FocusDirection,\n noFocusHighlight?: boolean,\n) {\n useLayoutEffect(() => {\n if (isFocused && elementRef.current) {\n const messagesContainer = elementRef.current.closest('.MessageList')!;\n\n fastSmoothScroll(\n messagesContainer,\n elementRef.current,\n // `noFocusHighlight` always called from “scroll-to-bottom” buttons\n noFocusHighlight ? 'end' : 'center',\n FOCUS_MARGIN,\n focusDirection === undefined ? FOCUS_MAX_OFFSET : RELOCATED_FOCUS_OFFSET,\n focusDirection,\n );\n }\n }, [elementRef, chatId, isFocused, focusDirection, noFocusHighlight]);\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './ContextMenuContainer';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst ContextMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const ContextMenuContainer = useModuleLoader(Bundles.Extra, 'ContextMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContextMenuContainer ? : undefined;\n};\n\nexport default memo(ContextMenuContainerAsync);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport {\n selectUser,\n selectChatMessage,\n selectIsMessageFocused,\n selectChat,\n} from '../../modules/selectors';\nimport { isChatChannel } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport { renderActionMessageText } from '../common/helpers/renderActionMessageText';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport { ObserveFn, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useFocusMessage from './message/hooks/useFocusMessage';\nimport useLang from '../../hooks/useLang';\n\nimport ContextMenuContainer from './message/ContextMenuContainer.async';\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n isEmbedded?: boolean;\n appearanceOrder?: number;\n isLastInList?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n targetUser?: ApiUser;\n targetMessage?: ApiMessage;\n targetChatId?: number;\n isFocused: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n};\n\nconst APPEARANCE_DELAY = 10;\n\nconst ActionMessage: FC = ({\n message,\n observeIntersection,\n isEmbedded,\n appearanceOrder = 0,\n isLastInList,\n sender,\n targetUser,\n targetMessage,\n targetChatId,\n isFocused,\n focusDirection,\n noFocusHighlight,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n useEnsureMessage(message.chatId, message.replyToMessageId, targetMessage);\n useFocusMessage(ref, message.chatId, isFocused, focusDirection, noFocusHighlight);\n\n const lang = useLang();\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const content = renderActionMessageText(\n lang,\n message,\n sender,\n targetUser,\n targetMessage,\n targetChatId,\n isEmbedded ? { isEmbedded: true, asPlain: true } : undefined,\n );\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref);\n const isContextMenuShown = contextMenuPosition !== undefined;\n\n if (isEmbedded) {\n return {renderText(content as string)};\n }\n\n const className = buildClassName(\n 'ActionMessage message-list-item',\n isFocused && !noFocusHighlight && 'focused',\n isContextMenuShown && 'has-menu-open',\n isLastInList && 'last-in-list',\n transitionClassNames,\n );\n\n return (\n \n {content}\n {contextMenuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message }): StateProps => {\n const userId = message.senderId;\n const { targetUserId, targetChatId } = message.content.action || {};\n const targetMessageId = message.replyToMessageId;\n const targetMessage = targetMessageId\n ? selectChatMessage(global, message.chatId, targetMessageId)\n : undefined;\n\n const isFocused = selectIsMessageFocused(global, message);\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && global.focusedMessage) || {};\n\n const chat = selectChat(global, message.chatId);\n const sender = chat && (isChatChannel(chat) || userId === message.chatId)\n ? chat\n : userId ? selectUser(global, userId) : undefined;\n\n return {\n sender,\n ...(targetUserId && { targetUser: selectUser(global, targetUserId) }),\n targetChatId,\n targetMessage,\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n };\n },\n)(ActionMessage));\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\n\nimport {\n getMessageMediaHash,\n isActionMessage,\n getMessageSummaryText,\n getSenderTitle,\n getMessageRoundVideo,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { getPictogramDimensions } from './helpers/mediaDimensions';\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\nimport useLang from '../../hooks/useLang';\n\nimport ActionMessage from '../middle/ActionMessage';\n\nimport './EmbeddedMessage.scss';\n\ntype OwnProps = {\n observeIntersection?: ObserveFn;\n className?: string;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n title?: string;\n customText?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst NBSP = '\\u00A0';\n\nconst EmbeddedMessage: FC = ({\n className,\n message,\n sender,\n title,\n customText,\n observeIntersection,\n onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaBlobUrl = useMedia(message && getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n const pictogramId = message && `sticker-reply-thumb${message.id}`;\n const mediaThumbnail = useWebpThumbnail(message);\n const isRoundVideo = Boolean(message && getMessageRoundVideo(message));\n\n const lang = useLang();\n\n const senderTitle = sender && getSenderTitle(lang, sender);\n\n return (\n \n {mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl, isRoundVideo)}\n
\n

\n {!message ? (\n customText || NBSP\n ) : isActionMessage(message) ? (\n \n ) : (\n renderText(getMessageSummaryText(lang, message, Boolean(mediaThumbnail)))\n )}\n

\n
{renderText(senderTitle || title || NBSP)}
\n
\n
\n );\n};\n\nfunction renderPictogram(\n id: string | undefined,\n thumbDataUri: string,\n blobUrl?: string,\n isRoundVideo?: boolean,\n) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \n );\n}\n\nexport default EmbeddedMessage;\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../../api/types';\n\nimport { formatTime } from '../../../util/dateFormat';\nimport { formatIntegerCompact } from '../../../util/textFormat';\n\nimport MessageOutgoingStatus from '../../common/MessageOutgoingStatus';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\n\nimport './MessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n signature?: string;\n onClick: () => void;\n};\n\nconst MessageMeta: FC = ({\n message, outgoingStatus, signature, onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n {Boolean(message.views) && (\n <>\n \n {formatIntegerCompact(message.views!)}\n \n \n \n )}\n {signature && (\n {renderText(signature)}\n )}\n \n {message.isEdited && `${lang('EditedMessage')} `}\n {formatTime(message.date * 1000)}\n \n {outgoingStatus && (\n \n )}\n \n );\n};\n\nexport default memo(MessageMeta);\n","import React, { FC, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { MEMOJI_STICKER_ID } from '../../../config';\nimport { getStickerDimensions } from '../../common/helpers/mediaDimensions';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useFlag from '../../../hooks/useFlag';\nimport useWebpThumbnail from '../../../hooks/useWebpThumbnail';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\nimport './Sticker.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n observeIntersectionForPlaying: ObserveFn;\n shouldLoop?: boolean;\n lastSyncTime?: number;\n};\n\nconst Sticker: FC = ({\n message, observeIntersection, observeIntersectionForPlaying, shouldLoop, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n const sticker = message.content.sticker!;\n const { isAnimated, stickerSetId } = sticker;\n const isMemojiSticker = stickerSetId === MEMOJI_STICKER_ID;\n\n const shouldLoad = useIsIntersecting(ref, observeIntersection);\n const shouldPlay = useIsIntersecting(ref, observeIntersectionForPlaying);\n\n const mediaHash = sticker.isPreloadedGlobally ? `sticker${sticker.id}` : getMessageMediaHash(message, 'inline')!;\n const thumbDataUri = useWebpThumbnail(message);\n const mediaData = useMedia(\n mediaHash,\n !shouldLoad,\n getMessageMediaFormat(message, 'inline', true),\n lastSyncTime,\n );\n\n const isMediaLoaded = Boolean(mediaData);\n const [isAnimationLoaded, markAnimationLoaded] = useFlag(isMediaLoaded);\n const isMediaReady = isAnimated ? isAnimationLoaded : isMediaLoaded;\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(isMediaReady, 'slow');\n\n const { width, height } = getStickerDimensions(sticker);\n const thumbClassName = buildClassName('thumbnail', !thumbDataUri && 'empty');\n\n const stickerClassName = buildClassName(\n 'Sticker media-inner',\n isMemojiSticker && 'inactive',\n );\n\n return (\n
\n {!isMediaReady && (\n \n )}\n {!isAnimated && shouldRenderFullMedia && (\n \n )}\n {isAnimated && isMediaLoaded && (\n \n )}\n \n
\n );\n};\n\nexport default Sticker;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { IS_CANVAS_FILTER_SUPPORTED, IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport { getMessageMediaThumbDataUri } from '../../../../modules/helpers';\nimport useCanvasBlur from '../../../../hooks/useCanvasBlur';\n\nexport default function useBlurredMediaThumbRef(message: ApiMessage, fullMediaData?: string) {\n return useCanvasBlur(\n getMessageMediaThumbDataUri(message),\n Boolean(fullMediaData),\n IS_MOBILE_SCREEN && !IS_CANVAS_FILTER_SUPPORTED,\n );\n}\n","const SELECTED_APPENDIX_BACKGROUND = 'rgba(255,255,255,1)';\n\nexport default async (src: string, isOwn: boolean, inSelectMode?: boolean, isSelected?: boolean) => {\n return isSelected ? SELECTED_APPENDIX_BACKGROUND : getAppendixColorFromImage(src, isOwn);\n};\n\nasync function getAppendixColorFromImage(src: string, isOwn: boolean) {\n const img = new Image();\n img.src = src;\n\n if (!img.width) {\n await new Promise((resolve) => {\n img.onload = resolve;\n });\n }\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n canvas.width = img.width;\n canvas.height = img.height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height);\n\n const x = isOwn ? img.width - 1 : 0;\n const y = img.height - 1;\n\n const pixel = Array.from(ctx.getImageData(x, y, 1, 1).data);\n return `rgba(${pixel.join(',')})`;\n}\n","import React, {\n FC, useCallback, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport {\n getMessagePhoto,\n getMessageWebPagePhoto,\n getMessageMediaHash,\n getMediaTransferState,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\nimport usePrevious from '../../../hooks/usePrevious';\nimport buildClassName from '../../../util/buildClassName';\nimport getCustomAppendixBg from './helpers/getCustomAppendixBg';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n shouldAutoLoad?: boolean;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n uploadProgress?: number;\n size?: 'inline' | 'pictogram';\n shouldAffectAppendix?: boolean;\n dimensions?: IMediaDimensions & { isSmall?: boolean };\n nonInteractive?: boolean;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\n\nconst Photo: FC = ({\n id,\n message,\n observeIntersection,\n shouldAutoLoad,\n isInSelectMode,\n isSelected,\n uploadProgress,\n size = 'inline',\n dimensions,\n nonInteractive,\n shouldAffectAppendix,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const photo = (getMessagePhoto(message) || getMessageWebPagePhoto(message))!;\n const localBlobUrl = photo.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = isDownloadAllowed && isIntersecting;\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, size), !shouldDownload);\n const fullMediaData = localBlobUrl || mediaData;\n const thumbRef = useBlurredMediaThumbRef(message, fullMediaData);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, shouldDownload && !fullMediaData);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled, 'slow');\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(fullMediaData, 'slow');\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (!fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (onClick) {\n onClick(message.id);\n }\n }, [fullMediaData, isUploading, message, onCancelUpload, onClick]);\n\n const isOwn = isOwnMessage(message);\n useLayoutEffect(() => {\n if (!shouldAffectAppendix) {\n return;\n }\n\n const contentEl = ref.current!.closest('.message-content')!;\n\n if (fullMediaData) {\n getCustomAppendixBg(fullMediaData, isOwn, isInSelectMode, isSelected).then((appendixBg) => {\n contentEl.style.setProperty('--appendix-bg', appendixBg);\n contentEl.setAttribute(CUSTOM_APPENDIX_ATTRIBUTE, '');\n });\n } else {\n contentEl.classList.add('has-appendix-thumb');\n }\n }, [fullMediaData, isOwn, shouldAffectAppendix, isInSelectMode, isSelected]);\n\n const { width, height, isSmall } = dimensions || calculateMediaDimensions(message);\n\n const className = buildClassName(\n 'media-inner',\n !isUploading && !nonInteractive && 'interactive',\n isSmall && 'small-image',\n width === height && 'square-image',\n );\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n return (\n \n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {!fullMediaData && !isDownloadAllowed && (\n \n )}\n {isTransferring && (\n {Math.round(transferProgress * 100)}%\n )}\n \n );\n};\n\nexport default Photo;\n","import { RefObject } from 'react';\nimport { useCallback, useRef } from '../lib/teact/teact';\n\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport safePlay from '../util/safePlay';\n\nexport default function useHeavyAnimationCheckForVideo(playerRef: RefObject, shouldPlay: boolean) {\n const shouldPlayRef = useRef();\n shouldPlayRef.current = shouldPlay;\n\n const pause = useCallback(() => {\n if (playerRef.current) {\n playerRef.current.pause();\n }\n }, [playerRef]);\n\n const play = useCallback(() => {\n if (playerRef.current && shouldPlayRef.current) {\n safePlay(playerRef.current);\n }\n }, [playerRef]);\n\n useHeavyAnimationCheck(pause, play);\n}\n","import { useCallback, useRef } from '../../../../lib/teact/teact';\nimport { fastRaf } from '../../../../util/schedulers';\nimport useBackgroundMode from '../../../../hooks/useBackgroundMode';\nimport safePlay from '../../../../util/safePlay';\n\nexport default (playerRef: { current: HTMLVideoElement | null }, isPlayAllowed = false) => {\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const freezePlaying = useCallback(() => {\n isFrozen.current = true;\n\n if (!isPlayAllowed || !playerRef.current) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = !playerRef.current.paused;\n }\n\n playerRef.current.pause();\n }, [isPlayAllowed, playerRef]);\n\n const unfreezePlaying = useCallback(() => {\n // At this point HTMLVideoElement can be unmounted from the DOM\n if (isPlayAllowed && playerRef.current && wasPlaying.current && document.body.contains(playerRef.current)) {\n safePlay(playerRef.current);\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [isPlayAllowed, playerRef]);\n\n const unfreezePlayingOnRaf = useCallback(() => {\n fastRaf(unfreezePlaying);\n }, [unfreezePlaying]);\n\n if (!document.hasFocus()) {\n freezePlaying();\n }\n\n useBackgroundMode(freezePlaying, unfreezePlayingOnRaf);\n};\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { calculateVideoDimensions } from '../../common/helpers/mediaDimensions';\nimport {\n canMessagePlayVideoInline,\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n isForwardedMessage,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../../hooks/useMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport usePauseOnInactive from './hooks/usePauseOnInactive';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n uploadProgress?: number;\n dimensions?: IMediaDimensions;\n lastSyncTime?: number;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst Video: FC = ({\n id,\n message,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n uploadProgress,\n lastSyncTime,\n dimensions,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const video = message.content.video!;\n const localBlobUrl = video.blobUrl;\n const canPlayInline = Boolean(localBlobUrl) || canMessagePlayVideoInline(video);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const [isPlayAllowed, setIsPlayAllowed] = useState(shouldAutoPlay);\n\n const previewBlobUrl = useMedia(\n getMessageMediaHash(message, 'pictogram'),\n !(isIntersecting && lastSyncTime),\n getMessageMediaFormat(message, 'pictogram'),\n lastSyncTime,\n );\n const thumbRef = useBlurredMediaThumbRef(message);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n\n const fullMediaData = localBlobUrl || mediaData;\n const isInline = Boolean(canPlayInline && isIntersecting && fullMediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering(!shouldAutoLoad);\n const { isUploading, isTransferring, transferProgress } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n shouldDownload && (canPlayInline && !isBuffered),\n );\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(fullMediaData, 'slow');\n\n const [playProgress, setPlayProgress] = useState(0);\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setPlayProgress(Math.max(0, e.currentTarget.currentTime - 1));\n }, []);\n\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded);\n\n useHeavyAnimationCheckForVideo(videoRef, Boolean(isInline && shouldAutoPlay));\n\n usePauseOnInactive(videoRef, isPlayAllowed);\n\n useVideoCleanup(videoRef, [isInline]);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (canPlayInline && !fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (canPlayInline && fullMediaData && !isPlayAllowed) {\n setIsPlayAllowed(true);\n videoRef.current!.play();\n } else if (onClick) {\n onClick(message.id);\n }\n }, [isUploading, canPlayInline, fullMediaData, isPlayAllowed, onClick, onCancelUpload, message]);\n\n const className = buildClassName('media-inner dark', !isUploading && 'interactive');\n const videoClassName = buildClassName('full-media', transitionClassNames);\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n const shouldRenderInlineVideo = isInline;\n const shouldRenderHqPreview = !canPlayInline && mediaData;\n const shouldRenderPlayButton = !canPlayInline || (isDownloadAllowed && !isPlayAllowed && !shouldRenderSpinner);\n const shouldRenderDownloadButton = canPlayInline && !isDownloadAllowed;\n\n return (\n \n {(!isInline || shouldRenderThumb)\n && (\n \n )}\n {previewBlobUrl && (\n \n )}\n\n {shouldRenderInlineVideo && (\n \n \n \n )}\n {shouldRenderHqPreview && (\n \n )}\n {shouldRenderPlayButton && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {shouldRenderDownloadButton && (\n \n )}\n {isTransferring && !canPlayInline ? (\n {Math.round(transferProgress * 100)}%\n ) : isTransferring && canPlayInline ? (\n ...\n ) : (\n
\n {video.isGif ? 'GIF' : formatMediaDuration(video.duration - playProgress)}\n
\n )}\n \n );\n};\n\nexport default Video;\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser, ApiContact } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\n\nimport Avatar from '../../common/Avatar';\n\nimport './Contact.scss';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n contact: ApiContact;\n};\n\ntype StateProps = {\n user?: ApiUser;\n};\n\ntype DispatchProps = Pick;\n\nconst Contact: FC = ({\n contact, user, openUserInfo,\n}) => {\n const {\n firstName,\n lastName,\n phoneNumber,\n userId,\n } = contact;\n\n const handleClick = useCallback(() => {\n openUserInfo({ id: userId });\n }, [openUserInfo, userId]);\n\n return (\n \n \n
\n
{firstName} {lastName}
\n
{formatPhoneNumberWithCode(phoneNumber)}
\n
\n \n );\n};\n\nexport default withGlobal(\n (global, { contact }): StateProps => {\n return {\n user: selectUser(global, contact.userId),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(Contact);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, memo, useState,\n} from '../../lib/teact/teact';\n\nimport Checkbox from './Checkbox';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n};\n\ntype OwnProps = {\n id?: string;\n options: IRadioOption[];\n selected?: string[];\n disabled?: boolean;\n round?: boolean;\n loadingOptions?: string[];\n onChange: (value: string[]) => void;\n};\n\nconst CheckboxGroup: FC = ({\n id,\n options,\n selected = [],\n disabled,\n round,\n loadingOptions,\n onChange,\n}) => {\n const [values, setValues] = useState([]);\n\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value, checked } = event.currentTarget;\n let newValues: string[];\n if (checked) {\n newValues = [...values, value];\n } else {\n newValues = values.filter((v) => v !== value);\n }\n\n setValues(newValues);\n onChange(newValues);\n }, [onChange, values]);\n\n return (\n
\n {options.map((option) => (\n \n ))}\n
\n );\n};\n\nexport default memo(CheckboxGroup);\n","import React, {\n FC, useState, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiPollAnswer, ApiPollResult } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport renderText from '../../common/helpers/renderText';\n\nimport './PollOption.scss';\n\ntype OwnProps = {\n answer: ApiPollAnswer;\n voteResults?: ApiPollResult[];\n totalVoters?: number;\n maxVotersCount?: number;\n correctResults: string[];\n shouldAnimate: boolean;\n};\n\nconst PollOption: FC = ({\n answer,\n voteResults,\n totalVoters,\n maxVotersCount,\n correctResults,\n shouldAnimate,\n}) => {\n const result = voteResults && voteResults.find((r) => r.option === answer.option);\n const correctAnswer = correctResults.length === 0 || correctResults.indexOf(answer.option) !== -1;\n const showIcon = (correctResults.length > 0 && correctAnswer) || (result && result.isChosen);\n const answerPercent = result ? getPercentage(result.votersCount, totalVoters || 0) : 0;\n const [finalPercent, setFinalPercent] = useState(shouldAnimate ? 0 : answerPercent);\n // eslint-disable-next-line no-null/no-null\n const lineRef = useRef(null);\n const lineWidth = result ? getPercentage(result.votersCount, maxVotersCount || 0) : 0;\n const isAnimationDoesNotStart = finalPercent < answerPercent;\n\n useEffect(() => {\n if (shouldAnimate) {\n setFinalPercent(answerPercent);\n }\n }, [shouldAnimate, answerPercent]);\n\n useEffect(() => {\n const lineEl = lineRef.current;\n\n if (lineEl && shouldAnimate) {\n const svgEl = lineEl.firstElementChild;\n\n const style = isAnimationDoesNotStart ? '' : 'stroke-dasharray: 100% 200%; stroke-dashoffset: -44';\n if (!svgEl) {\n lineEl.innerHTML = `\n \n \n `;\n } else {\n svgEl.setAttribute('style', style);\n }\n }\n }, [isAnimationDoesNotStart, shouldAnimate]);\n\n if (!voteResults || !result) {\n return undefined;\n }\n\n const lineStyle = `width: ${lineWidth}%; transform:scaleX(${isAnimationDoesNotStart ? 0 : 1})`;\n\n return (\n
\n
\n {answerPercent}%\n {showIcon && (\n \n \n \n )}\n
\n
\n
\n {renderText(answer.text)}\n
\n
\n
\n \n
\n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default PollOption;\n","import React, {\n FC,\n useCallback,\n useEffect,\n useState,\n memo,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiMessage, ApiPoll, ApiUser, ApiPollAnswer,\n} from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\nimport { renderTextWithEntities } from '../../common/helpers/renderMessageText';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport CheckboxGroup from '../../ui/CheckboxGroup';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport Notification from '../../ui/Notification';\nimport PollOption from './PollOption';\n\nimport './Poll.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n poll: ApiPoll;\n onSendVote: (options: string[]) => void;\n};\n\ntype StateProps = {\n recentVoterIds?: number[];\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SOLUTION_CONTAINER_ID = '#middle-column-portals';\nconst SOLUTION_DURATION = 5000;\nconst NBSP = '\\u00A0';\n\nconst Poll: FC = ({\n message,\n poll,\n recentVoterIds,\n usersById,\n loadMessage,\n onSendVote,\n openPollResults,\n}) => {\n const { id: messageId, chatId } = message;\n const { summary, results } = poll;\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [chosenOptions, setChosenOptions] = useState([]);\n const [isSolutionShown, setIsSolutionShown] = useState(false);\n const [wasSubmitted, setWasSubmitted] = useState(false);\n const [closePeriod, setClosePeriod] = useState(\n !summary.closed && summary.closeDate && summary.closeDate > 0\n ? Math.min(summary.closeDate - Math.floor(Date.now() / 1000), summary.closePeriod!)\n : 0,\n );\n // eslint-disable-next-line no-null/no-null\n const countdownRef = useRef(null);\n const { results: voteResults, totalVoters } = results;\n const hasVoted = voteResults && voteResults.some((r) => r.isChosen);\n const canVote = !summary.closed && !hasVoted;\n const canViewResult = !canVote && summary.isPublic && Number(results.totalVoters) > 0;\n const isMultiple = canVote && summary.multipleChoice;\n const maxVotersCount = voteResults ? Math.max(...voteResults.map((r) => r.votersCount)) : totalVoters;\n const correctResults = voteResults ? voteResults.reduce((answers: string[], r) => {\n if (r.isCorrect) {\n answers.push(r.option);\n }\n\n return answers;\n }, []) : [];\n const answers = summary.answers.map((a) => ({\n label: a.text,\n value: a.option,\n hidden: Boolean(summary.quiz && summary.closePeriod && closePeriod <= 0),\n }));\n\n useEffect(() => {\n if (\n isSubmitting\n && poll.results.results\n && poll.results.results.some((result) => result.isChosen)\n ) {\n setIsSubmitting(false);\n }\n }, [isSubmitting, poll.results.results]);\n\n useEffect(() => {\n if (closePeriod > 0) {\n setTimeout(() => setClosePeriod(closePeriod - 1), 1000);\n }\n\n const countdownEl = countdownRef.current;\n\n if (countdownEl) {\n const circumference = 6 * 2 * Math.PI;\n const svgEl = countdownEl.lastElementChild;\n const timerEl = countdownEl.firstElementChild;\n if (closePeriod <= 5) {\n countdownEl.classList.add('hurry-up');\n }\n\n if (!svgEl || !timerEl) {\n countdownEl.innerHTML = `\n ${formatMediaDuration(closePeriod)}\n \n \n `;\n } else {\n const strokeDashOffset = ((summary.closePeriod! - closePeriod) / summary.closePeriod!) * circumference;\n timerEl.textContent = formatMediaDuration(closePeriod);\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', `-${strokeDashOffset}`);\n }\n }\n }, [closePeriod, summary.closePeriod]);\n\n useEffect(() => {\n if (summary.quiz && (closePeriod <= 0 || (hasVoted && !summary.closed))) {\n loadMessage({ chatId, messageId });\n }\n }, [chatId, closePeriod, hasVoted, loadMessage, messageId, summary.closed, summary.quiz]);\n\n // If the client time is not synchronized, the poll must be updated after the closePeriod time has expired.\n useEffect(() => {\n let timer: number | undefined;\n\n if (summary.quiz && !summary.closed && summary.closePeriod && summary.closePeriod > 0) {\n timer = window.setTimeout(() => {\n loadMessage({ chatId, messageId });\n }, summary.closePeriod * 1000);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [canVote, chatId, loadMessage, messageId, summary.closePeriod, summary.closed, summary.quiz]);\n\n const recentVoters = useMemo(() => {\n return recentVoterIds ? recentVoterIds.reduce((result: ApiUser[], id) => {\n const user = usersById[id];\n if (user) {\n result.push(user);\n }\n\n return result;\n }, []) : [];\n }, [usersById, recentVoterIds]);\n\n const handleRadioChange = useCallback(\n (option: string) => {\n setChosenOptions([option]);\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote([option]);\n }, [onSendVote],\n );\n\n const handleCheckboxChange = useCallback(\n (options: string[]) => {\n setChosenOptions(options);\n }, [],\n );\n\n const handleVoteClick = useCallback(\n () => {\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote(chosenOptions);\n }, [onSendVote, chosenOptions],\n );\n\n const handleViewResultsClick = useCallback(\n () => {\n openPollResults({ chatId, messageId });\n }, [chatId, messageId, openPollResults],\n );\n\n const handleSolutionShow = useCallback(() => {\n setIsSolutionShown(true);\n }, []);\n\n const handleSolutionHide = useCallback(() => {\n setIsSolutionShown(false);\n setWasSubmitted(false);\n }, []);\n\n // Show the solution to quiz if the answer was incorrect\n useEffect(() => {\n if (wasSubmitted && hasVoted && summary.quiz && results.results && poll.results.solution) {\n const correctResult = results.results.find((r) => r.isChosen && r.isCorrect);\n if (!correctResult) {\n setIsSolutionShown(true);\n }\n }\n }, [hasVoted, wasSubmitted, results.results, summary.quiz, poll.results.solution]);\n\n const lang = useLang();\n\n function renderResultOption(answer: ApiPollAnswer) {\n return (\n \n );\n }\n\n function renderRecentVoters() {\n return (\n recentVoters.length > 0 && (\n
\n {recentVoters.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n function renderSolution() {\n return (\n isSolutionShown && poll.results.solution && (\n \n )\n );\n }\n\n return (\n
\n {renderSolution()}\n
{renderText(summary.question)}
\n
\n {lang(getPollTypeString(summary))}\n {renderRecentVoters()}\n {closePeriod > 0 && canVote &&
}\n {summary.quiz && poll.results.solution && !canVote && (\n \n \n \n )}\n
\n {canVote && (\n
\n {isMultiple\n ? (\n \n )\n : (\n \n )}\n
\n )}\n {!canVote && (\n
\n {summary.answers.map(renderResultOption)}\n
\n )}\n {!canViewResult && !isMultiple && (\n
{getReadableVotersCount(lang, summary.quiz, results.totalVoters)}
\n )}\n {isMultiple && (\n \n {lang('PollSubmitVotes')}\n \n )}\n {canViewResult && (\n \n {lang('PollViewResults')}\n \n )}\n
\n );\n};\n\nfunction getPollTypeString(summary: ApiPoll['summary']) {\n // When we just created the poll, some properties don't exist.\n if (typeof summary.isPublic === 'undefined') {\n return NBSP;\n }\n\n if (summary.quiz) {\n return summary.isPublic ? 'QuizPoll' : 'AnonymousQuizPoll';\n }\n\n if (summary.closed) {\n return 'FinalResults';\n }\n\n return summary.isPublic ? 'PublicPoll' : 'AnonymousPoll';\n}\n\nfunction getReadableVotersCount(lang: LangFn, isQuiz: true | undefined, count?: number) {\n if (!count) {\n return lang(isQuiz ? 'Chat.Quiz.TotalVotesEmpty' : 'Chat.Poll.TotalVotesResultEmpty');\n }\n\n return lang(isQuiz ? 'Answer' : 'Vote', count, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { poll }) => {\n const { recentVoterIds } = poll.results;\n const { byId: usersById } = global.users;\n if (!recentVoterIds || recentVoterIds.length === 0) {\n return {};\n }\n\n return {\n recentVoterIds,\n usersById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMessage', 'openPollResults']),\n)(Poll));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport { getMessageWebPage } from '../../../modules/helpers';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\nimport renderText from '../../common/helpers/renderText';\nimport trimText from '../../../util/trimText';\nimport buildClassName from '../../../util/buildClassName';\n\nimport SafeLink from '../../common/SafeLink';\nimport Photo from './Photo';\n\nimport './WebPage.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n shouldAutoLoad?: boolean;\n inPreview?: boolean;\n onMediaClick?: () => void;\n onCancelMediaTransfer?: () => void;\n};\n\nconst WebPage: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n inPreview,\n onMediaClick,\n onCancelMediaTransfer,\n}) => {\n const webPage = getMessageWebPage(message);\n\n let isSquarePhoto = false;\n if (webPage && webPage.photo) {\n const { width, height } = calculateMediaDimensions(message);\n isSquarePhoto = width === height;\n }\n\n const handleMediaClick = useCallback(() => {\n onMediaClick!();\n }, [onMediaClick]);\n\n if (!webPage) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n } = webPage;\n\n const isMediaInteractive = photo && onMediaClick && !isSquarePhoto && !webPage.hasDocument;\n const truncatedDescription = trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebPage',\n photo\n ? (isSquarePhoto && 'with-square-photo')\n : (!inPreview && 'without-photo'),\n );\n\n return (\n \n {photo && (\n \n )}\n
\n \n {!inPreview && title && (\n

{renderText(title)}

\n )}\n {truncatedDescription && (\n

{renderText(truncatedDescription, ['emoji', 'br'])}

\n )}\n
\n
\n );\n};\n\nexport default memo(WebPage);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { getMessageInvoice } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\n\nimport './Invoice.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n};\n\nconst Invoice: FC = ({\n message,\n}) => {\n const invoice = getMessageInvoice(message);\n\n const {\n title,\n text,\n description,\n photoUrl,\n } = invoice!;\n\n return (\n \n {title && (\n

{renderText(title)}

\n )}\n {text && (\n

{renderText(text, ['emoji', 'br'])}

\n )}\n
\n {photoUrl && (\n \n )}\n {description && (\n

{renderText(description, ['emoji', 'br'])}

\n )}\n
\n
\n );\n};\n\nexport default memo(Invoice);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC,\n useCallback,\n useMemo,\n memo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { OwnProps as PhotoProps } from '../Photo';\nimport { OwnProps as VideoProps } from '../Video';\n\nimport buildClassName from '../../../../util/buildClassName';\nimport { GlobalActions } from '../../../../global/types';\nimport {\n selectIsInSelectMode,\n selectIsMessageSelected,\n} from '../../../../modules/selectors';\n\nimport { pick } from '../../../../util/iteratees';\n\ntype OwnProps = PhotoProps & VideoProps;\n\ntype StateProps = {\n isInSelectMode?: boolean;\n isSelected?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nexport default function withSelectControl(WrapedComponent: FC) {\n const Component: FC = (props) => {\n const {\n isInSelectMode,\n isSelected,\n message,\n toggleMessageSelection,\n dimensions,\n } = props;\n\n const handleMessageSelect = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n toggleMessageSelection({ messageId: message.id, withShift: e && e.shiftKey });\n }, [toggleMessageSelection, message]);\n\n const newProps = useMemo(() => {\n return {\n ...props,\n isInSelectMode,\n isSelected,\n dimensions: {\n ...props.dimensions,\n x: 0,\n y: 0,\n },\n onClick: isInSelectMode ? undefined : props.onClick,\n };\n }, [props, isInSelectMode, isSelected]);\n\n return (\n \n {isInSelectMode && (\n
\n {isSelected && (\n \n )}\n
\n )}\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n \n \n );\n };\n\n return memo(withGlobal(\n (global, ownProps) => {\n const { message } = ownProps;\n return {\n isInSelectMode: selectIsInSelectMode(global),\n isSelected: selectIsMessageSelected(global, message.id),\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'toggleMessageSelection',\n ]),\n )(Component));\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\nimport { AlbumRectPart, IAlbumLayout } from './helpers/calculateAlbumLayout';\n\nimport { getMessageContent } from '../../../modules/helpers';\nimport { withGlobal } from '../../../lib/teact/teactn';\nimport { pick } from '../../../util/iteratees';\nimport withSelectControl from './hocs/withSelectControl';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport Photo from './Photo';\nimport Video from './Video';\n\nimport './Album.scss';\n\nconst PhotoWithSelect = withSelectControl(Photo);\nconst VideoWithSelect = withSelectControl(Video);\n\ntype OwnProps = {\n album: IAlbum;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n hasCustomAppendix?: boolean;\n lastSyncTime?: number;\n isOwn: boolean;\n albumLayout: IAlbumLayout;\n onMediaClick: (messageId: number) => void;\n};\n\ntype StateProps = {\n uploadsById: GlobalState['fileUploads']['byMessageLocalId'];\n};\n\ntype DispatchProps = Pick;\n\nconst Album: FC = ({\n album,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n hasCustomAppendix,\n lastSyncTime,\n isOwn,\n albumLayout,\n onMediaClick,\n uploadsById,\n cancelSendingMessage,\n}) => {\n const mediaCount = album.messages.length;\n\n const handleCancelUpload = useCallback((message: ApiMessage) => {\n cancelSendingMessage({ chatId: message.chatId, messageId: message.id });\n }, [cancelSendingMessage]);\n\n function renderAlbumMessage(message: ApiMessage, index: number) {\n const { photo, video } = getMessageContent(message);\n const fileUpload = uploadsById[message.previousLocalId || message.id];\n const uploadProgress = fileUpload ? fileUpload.progress : undefined;\n const { dimensions, sides } = albumLayout.layout[index];\n\n if (photo) {\n const shouldAffectAppendix = hasCustomAppendix && (\n // eslint-disable-next-line no-bitwise\n isOwn ? index === mediaCount - 1 : Boolean(sides & AlbumRectPart.Left && sides & AlbumRectPart.Bottom)\n );\n\n return (\n \n );\n } else if (video) {\n return (\n \n );\n }\n\n return undefined;\n }\n\n const { width: containerWidth, height: containerHeight } = albumLayout.containerStyle;\n\n return (\n \n {album.messages.map(renderAlbumMessage)}\n \n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n uploadsById: global.fileUploads.byMessageLocalId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'cancelSendingMessage',\n ]),\n)(Album);\n","import React, {\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport buildClassName from '../../../util/buildClassName';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport usePauseOnInactive from './hooks/usePauseOnInactive';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\nimport safePlay from '../../../util/safePlay';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './RoundVideo.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n lastSyncTime?: number;\n};\n\nlet currentOnRelease: NoneToVoidFunction;\n\nfunction createCapture(onRelease: NoneToVoidFunction) {\n return () => {\n if (currentOnRelease) {\n currentOnRelease();\n }\n\n currentOnRelease = onRelease;\n };\n}\n\nconst RoundVideo: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playingProgressRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playerRef = useRef(null);\n\n const video = message.content.video!;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad && shouldAutoPlay);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n const thumbRef = useBlurredMediaThumbRef(message, mediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering();\n const isTransferring = isDownloadAllowed && !isBuffered;\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring || !isBuffered, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n const [isActivated, setIsActivated] = useState(false);\n const [progress, setProgress] = useState(0);\n\n useEffect(() => {\n if (!isActivated) {\n return;\n }\n\n const circumference = 94 * 2 * Math.PI;\n const strokeDashOffset = circumference - progress * circumference;\n\n const playerEl = playerRef.current!;\n const playingProgressEl = playingProgressRef.current!;\n const svgEl = playingProgressEl.firstElementChild;\n\n if (!svgEl) {\n playingProgressEl.innerHTML = `\n \n `;\n } else {\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, [isActivated, progress]);\n\n const shouldPlay = Boolean(mediaData && isIntersecting);\n\n const stopPlaying = () => {\n setIsActivated(false);\n setProgress(0);\n safePlay(playerRef.current!);\n\n requestAnimationFrame(() => {\n playingProgressRef.current!.innerHTML = '';\n });\n };\n\n const capturePlaying = createCapture(stopPlaying);\n\n useEffect(() => {\n if (!playerRef.current) {\n return;\n }\n\n if (shouldPlay) {\n safePlay(playerRef.current);\n } else {\n playerRef.current.pause();\n }\n }, [shouldPlay]);\n\n useHeavyAnimationCheckForVideo(playerRef, shouldPlay);\n\n usePauseOnInactive(playerRef, Boolean(mediaData));\n\n useVideoCleanup(playerRef, [mediaData]);\n\n const handleClick = useCallback(() => {\n if (!mediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n\n return;\n }\n\n const playerEl = playerRef.current!;\n if (isActivated) {\n if (playerEl.paused) {\n safePlay(playerEl);\n } else {\n playerEl.pause();\n }\n } else {\n capturePlaying();\n playerEl.currentTime = 0;\n setIsActivated(true);\n }\n }, [capturePlaying, isActivated, mediaData]);\n\n const handleTimeUpdate = useCallback((e: React.UIEvent) => {\n const playerEl = e.currentTarget;\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, []);\n\n const videoClassName = buildClassName('full-media', transitionClassNames);\n\n return (\n \n {shouldRenderThumb && (\n
\n \n
\n )}\n {mediaData && (\n
\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n \n \n
\n )}\n
\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {!mediaData && !isDownloadAllowed && (\n \n )}\n
\n {isActivated ? formatMediaDuration(playerRef.current!.currentTime) : formatMediaDuration(video.duration)}\n {(!isActivated || playerRef.current!.paused) && }\n
\n
\n );\n};\n\nexport default RoundVideo;\n","import React, { FC } from '../../../lib/teact/teact';\n\nimport { ApiKeyboardButton, ApiMessage } from '../../../api/types';\n\nimport Button from '../../ui/Button';\n\nimport './InlineButtons.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n onClick: ({ button }: { button: ApiKeyboardButton }) => void;\n};\n\nconst InlineButtons: FC = ({ message, onClick }) => {\n return (\n
\n {message.inlineButtons!.map((row) => (\n
\n {row.map((button) => (\n onClick({ button })}\n >\n {button.text}\n {button.type === 'url' && }\n \n ))}\n
\n ))}\n
\n );\n};\n\nexport default InlineButtons;\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiMessage, ApiThreadInfo, ApiUser,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { isChatPrivate } from '../../../modules/helpers';\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { selectThreadInfo } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\n\nimport './CommentButton.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n disabled?: boolean;\n};\n\ntype StateProps = {\n threadInfo: ApiThreadInfo;\n usersById?: Record;\n chatsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst CommentButton: FC = ({\n disabled, threadInfo, usersById, chatsById, openChat,\n}) => {\n const lang = useLang();\n const {\n threadId, chatId, messagesCount, lastMessageId, lastReadInboxMessageId, recentReplierIds,\n } = threadInfo;\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId, threadId });\n }, [openChat, chatId, threadId]);\n\n if (messagesCount === undefined) {\n return undefined;\n }\n\n const recentRepliers = recentReplierIds && recentReplierIds.map((peerId) => {\n return isChatPrivate(peerId) ? usersById![peerId] : chatsById![peerId];\n }).filter(Boolean);\n\n function renderRecentRepliers() {\n return (\n recentRepliers && recentRepliers.length > 0 && (\n
\n {recentRepliers.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n const hasUnread = Boolean(lastReadInboxMessageId && lastMessageId && lastReadInboxMessageId < lastMessageId);\n\n return (\n \n \n {(!recentRepliers || recentRepliers.length === 0) && }\n {renderRecentRepliers()}\n
\n {messagesCount ? lang('Comments', messagesCount, 'i') : lang('LeaveAComment')}\n
\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message }) => {\n const { threadId, chatId } = message.threadInfo!;\n\n const threadInfo = selectThreadInfo(global, chatId, threadId) || message.threadInfo!;\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n\n return {\n threadInfo,\n usersById,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n ]),\n)(CommentButton));\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport {\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n ApiChat,\n ApiSticker,\n MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { FocusDirection, IAlbum, MediaViewerOrigin } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n selectChat,\n selectChatMessage,\n selectUploadProgress,\n selectIsChatWithSelf,\n selectOutgoingStatus,\n selectUser,\n selectIsMessageFocused,\n selectCurrentTextSearch,\n selectAnimatedEmoji,\n selectIsInSelectMode,\n selectIsMessageSelected,\n selectIsDocumentGroupSelected,\n selectSender,\n selectForwardedSender,\n selectThreadTopMessageId,\n selectShouldAutoLoadMedia,\n selectShouldAutoPlayMedia, selectShouldLoopStickers,\n} from '../../../modules/selectors';\nimport {\n getMessageContent,\n isOwnMessage,\n isReplyMessage,\n isAnonymousOwnMessage,\n isChatPrivate,\n getMessageCustomShape,\n isChatChannel,\n getMessageSingleEmoji, getSenderTitle, getUserColorKey,\n} from '../../../modules/helpers';\nimport buildClassName from '../../../util/buildClassName';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport { renderMessageText } from '../../common/helpers/renderMessageText';\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { buildContentClassName, isEmojiOnlyMessage } from './helpers/buildContentClassName';\nimport { getMinMediaWidth, calculateMediaDimensions } from './helpers/mediaDimensions';\nimport { calculateAlbumLayout } from './helpers/calculateAlbumLayout';\nimport renderText from '../../common/helpers/renderText';\nimport calculateAuthorWidth from './helpers/calculateAuthorWidth';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useFocusMessage from './hooks/useFocusMessage';\nimport useWindowSize from '../../../hooks/useWindowSize';\nimport useLang from '../../../hooks/useLang';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Avatar from '../../common/Avatar';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\nimport Document from '../../common/Document';\nimport Audio from '../../common/Audio';\nimport MessageMeta from './MessageMeta';\nimport ContextMenuContainer from './ContextMenuContainer.async';\nimport Sticker from './Sticker';\nimport AnimatedEmoji from '../../common/AnimatedEmoji';\nimport Photo from './Photo';\nimport Video from './Video';\nimport Contact from './Contact';\nimport Poll from './Poll';\nimport WebPage from './WebPage';\nimport Invoice from './Invoice';\nimport Album from './Album';\nimport RoundVideo from './RoundVideo';\nimport InlineButtons from './InlineButtons';\nimport CommentButton from './CommentButton';\n\nimport './Message.scss';\n\ntype MessagePositionProperties = {\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isFirstInDocumentGroup: boolean;\n isLastInDocumentGroup: boolean;\n isLastInList: boolean;\n};\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersectionForBottom: ObserveFn;\n observeIntersectionForMedia: ObserveFn;\n observeIntersectionForAnimatedStickers: ObserveFn;\n album?: IAlbum;\n withAvatar?: boolean;\n withSenderName?: boolean;\n threadId: number;\n messageListType: MessageListType;\n noComments: boolean;\n appearanceOrder: number;\n} & MessagePositionProperties;\n\ntype StateProps = {\n forceSenderName?: boolean;\n sender?: ApiUser | ApiChat;\n originSender?: ApiUser | ApiChat;\n botSender?: ApiUser;\n isThreadTop?: boolean;\n shouldHideReply?: boolean;\n replyMessage?: ApiMessage;\n replyMessageSender?: ApiUser | ApiChat;\n outgoingStatus?: ApiMessageOutgoingStatus;\n uploadProgress?: number;\n isFocused?: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n isForwarding?: boolean;\n isChatWithSelf?: boolean;\n isChannel?: boolean;\n lastSyncTime?: number;\n highlight?: string;\n isSingleEmoji?: boolean;\n animatedEmoji?: ApiSticker;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n isGroupSelected?: boolean;\n threadId?: number;\n isPinnedList?: boolean;\n shouldAutoLoadMedia?: boolean;\n shouldAutoPlayMedia?: boolean;\n shouldLoopStickers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst NBSP = '\\u00A0';\nconst GROUP_MESSAGE_HOVER_ATTRIBUTE = 'data-is-document-group-hover';\n// eslint-disable-next-line max-len\nconst APPENDIX_OWN = '';\n// eslint-disable-next-line max-len\nconst APPENDIX_NOT_OWN = '';\nconst APPEARANCE_DELAY = 10;\nconst NO_MEDIA_CORNERS_THRESHOLD = 18;\n\nconst Message: FC = ({\n message,\n observeIntersectionForBottom,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n album,\n withAvatar,\n withSenderName,\n noComments,\n appearanceOrder,\n isFirstInGroup,\n isLastInGroup,\n isFirstInDocumentGroup,\n isLastInDocumentGroup,\n isLastInList,\n forceSenderName,\n sender,\n originSender,\n botSender,\n isThreadTop,\n shouldHideReply,\n replyMessage,\n replyMessageSender,\n outgoingStatus,\n uploadProgress,\n isFocused,\n focusDirection,\n noFocusHighlight,\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n animatedEmoji,\n isInSelectMode,\n isSelected,\n isGroupSelected,\n threadId,\n messageListType,\n isPinnedList,\n shouldAutoLoadMedia,\n shouldAutoPlayMedia,\n shouldLoopStickers,\n focusMessage,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n openChat,\n cancelSendingMessage,\n markMessagesRead,\n sendPollVote,\n toggleMessageSelection,\n setReplyingToId,\n openForwardMenu,\n clickInlineButton,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const bottomMarkerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n\n useOnIntersect(bottomMarkerRef, observeIntersectionForBottom);\n\n const { width: windowWidth } = useWindowSize();\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref, false, true);\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const { chatId, id: messageId, threadInfo } = message;\n\n const isOwn = isOwnMessage(message);\n const isScheduled = messageListType === 'scheduled' || message.isScheduled;\n const hasReply = isReplyMessage(message) && !shouldHideReply;\n const hasThread = Boolean(threadInfo) && messageListType === 'thread';\n const { forwardInfo, viaBotId } = message;\n const asForwarded = forwardInfo && !isChatWithSelf && !forwardInfo.isLinkedChannelPost;\n const isInDocumentGroup = !!message.groupedId && !message.isInAlbum;\n const isAlbum = Boolean(album) && album!.messages.length > 1;\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice,\n } = getMessageContent(message);\n const customShape = getMessageCustomShape(message);\n const textParts = renderMessageText(message, highlight, isEmojiOnlyMessage(customShape));\n const isContextMenuShown = contextMenuPosition !== undefined;\n const containerClassName = buildClassName(\n 'Message message-list-item',\n isFirstInGroup && 'first-in-group',\n isLastInGroup && 'last-in-group',\n isFirstInDocumentGroup && 'first-in-document-group',\n isLastInDocumentGroup && 'last-in-document-group',\n isLastInList && 'last-in-list',\n isOwn && 'own',\n Boolean(message.views) && 'has-views',\n message.isEdited && 'was-edited',\n hasReply && 'has-reply',\n isContextMenuShown && 'has-menu-open',\n isFocused && !noFocusHighlight && 'focused',\n isForwarding && 'is-forwarding',\n message.isDeleting && 'is-deleting',\n isInDocumentGroup && 'is-in-document-group',\n isAlbum && 'is-album',\n message.hasUnreadMention && 'has-unread-mention',\n isSelected && 'is-selected',\n isInSelectMode && 'is-in-selection-mode',\n isThreadTop && 'is-thread-top',\n Boolean(message.inlineButtons) && 'has-inline-buttons',\n transitionClassNames,\n );\n const contentClassName = buildContentClassName(message, {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments: message.threadInfo && message.threadInfo.messagesCount > 0,\n });\n const avatarPeer = forwardInfo && (isChatWithSelf || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n const signature = (\n (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined\n );\n const withCommentButton = message.threadInfo && (!isInDocumentGroup || isLastInDocumentGroup)\n && messageListType === 'thread' && !noComments;\n const withAppendix = contentClassName.includes('has-appendix');\n\n useEnsureMessage(chatId, hasReply ? message.replyToMessageId : undefined, replyMessage, message.id);\n useFocusMessage(ref, chatId, isFocused, focusDirection, noFocusHighlight);\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\n\n appendixRef.current.innerHTML = isOwn ? APPENDIX_OWN : APPENDIX_NOT_OWN;\n }, [isOwn, withAppendix]);\n\n const handleGroupDocumentMessagesSelect = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n\n toggleMessageSelection({\n messageId,\n groupedId: message.groupedId,\n });\n }, [messageId, message.groupedId, toggleMessageSelection]);\n\n const handleMessageSelect = useCallback((e?: ReactMouseEvent) => {\n const params = isAlbum && album && album.messages\n ? {\n messageId,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: e && e.shiftKey,\n }\n : { messageId, withShift: e && e.shiftKey };\n toggleMessageSelection(params);\n }, [toggleMessageSelection, messageId, isAlbum, album]);\n\n const handleContainerDoubleClick = useCallback(() => {\n setReplyingToId({ messageId });\n }, [setReplyingToId, messageId]);\n\n const handleContentDoubleClick = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n }, []);\n\n const handleAvatarClick = useCallback(() => {\n if (!avatarPeer) {\n return;\n }\n\n if (isChatPrivate(avatarPeer.id)) {\n openUserInfo({ id: avatarPeer.id });\n } else {\n openChat({ id: avatarPeer.id });\n }\n }, [avatarPeer, openUserInfo, openChat]);\n\n const handleSenderClick = useCallback(() => {\n if (!senderPeer) {\n return;\n }\n\n if (isChatPrivate(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [senderPeer, openUserInfo, openChat]);\n\n const handleViaBotClick = useCallback(() => {\n if (!botSender) {\n return;\n }\n\n openUserInfo({ id: botSender.id });\n }, [botSender, openUserInfo]);\n\n const handleReplyClick = useCallback((): void => {\n focusMessage({ chatId, threadId, messageId: message.replyToMessageId });\n }, [focusMessage, chatId, threadId, message.replyToMessageId]);\n\n const handleMediaClick = useCallback((): void => {\n openMediaViewer({\n chatId, threadId, messageId, origin: isScheduled ? MediaViewerOrigin.ScheduledInline : MediaViewerOrigin.Inline,\n });\n }, [chatId, threadId, messageId, openMediaViewer, isScheduled]);\n\n const handleAudioPlay = useCallback((): void => {\n openAudioPlayer({ chatId, messageId });\n }, [chatId, messageId, openAudioPlayer]);\n\n const handleAlbumMediaClick = useCallback((albumMessageId: number): void => {\n openMediaViewer({\n chatId,\n threadId,\n messageId: albumMessageId,\n origin: isScheduled ? MediaViewerOrigin.ScheduledAlbum : MediaViewerOrigin.Album,\n });\n }, [chatId, threadId, openMediaViewer, isScheduled]);\n\n const handleReadMedia = useCallback((): void => {\n markMessagesRead({ messageIds: [messageId] });\n }, [messageId, markMessagesRead]);\n\n const handleCancelUpload = useCallback(() => {\n cancelSendingMessage({ chatId, messageId });\n }, [cancelSendingMessage, chatId, messageId]);\n\n const handleVoteSend = useCallback((options: string[]) => {\n sendPollVote({ chatId, messageId, options });\n }, [chatId, messageId, sendPollVote]);\n\n const handleGroupForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, groupedId: message.groupedId });\n }, [openForwardMenu, chatId, message.groupedId]);\n\n const handleForward = useCallback(() => {\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n }\n }, [album, openForwardMenu, chatId, messageId]);\n\n const handleFocus = useCallback(() => {\n focusMessage({\n chatId, threadId: MAIN_THREAD_ID, messageId,\n });\n }, [focusMessage, chatId, messageId]);\n\n const handleFocusForwarded = useCallback(() => {\n if (isInDocumentGroup) {\n focusMessage({\n chatId: forwardInfo!.fromChatId, groupedId: message.groupedId, groupedChatId: chatId,\n });\n return;\n }\n focusMessage({\n chatId: forwardInfo!.fromChatId, messageId: forwardInfo!.fromMessageId,\n });\n }, [focusMessage, forwardInfo, message, chatId, isInDocumentGroup]);\n\n const lang = useLang();\n\n let style = '';\n let calculatedWidth;\n let noMediaCorners = false;\n const albumLayout = useMemo(() => {\n return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), album!, windowWidth) : undefined;\n }, [isAlbum, windowWidth, isOwn, asForwarded, album]);\n\n const extraPadding = asForwarded ? 28 : 0;\n if (!isAlbum && (photo || video)) {\n let width: number | undefined;\n if (photo) {\n width = calculateMediaDimensions(message).width;\n } else if (video) {\n if (video.isRound) {\n width = ROUND_VIDEO_DIMENSIONS;\n } else {\n width = calculateMediaDimensions(message).width;\n }\n }\n\n if (width) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), width);\n if (calculatedWidth - width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n } else if (albumLayout) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), albumLayout.containerStyle.width);\n if (calculatedWidth - albumLayout.containerStyle.width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n\n if (calculatedWidth) {\n style = `width: ${calculatedWidth + extraPadding}px`;\n }\n\n function renderAvatar() {\n const isAvatarPeerUser = avatarPeer && isChatPrivate(avatarPeer.id);\n const avatarUser = avatarPeer && isAvatarPeerUser ? avatarPeer as ApiUser : undefined;\n const avatarChat = avatarPeer && !isAvatarPeerUser ? avatarPeer as ApiChat : undefined;\n const hiddenName = !avatarPeer && forwardInfo ? forwardInfo.hiddenUserName : undefined;\n\n return (\n \n );\n }\n\n function renderContent() {\n const className = buildClassName(\n 'content-inner',\n asForwarded && !customShape && 'forwarded-message',\n hasReply && 'reply-message',\n noMediaCorners && 'no-media-corners',\n );\n const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread;\n const shouldInlineMeta = !webPage && !animatedEmoji && textParts;\n\n return (\n
\n {renderSenderName()}\n {hasReply && (\n \n )}\n {sticker && (\n \n )}\n {animatedEmoji && (\n \n )}\n {isAlbum && (\n \n )}\n {!isAlbum && photo && (\n \n )}\n {!isAlbum && video && video.isRound && (\n \n )}\n {!isAlbum && video && !video.isRound && (\n \n )}\n {(audio || voice) && (\n \n )}\n {document && (\n \n )}\n {contact && (\n \n )}\n {poll && (\n \n )}\n {!animatedEmoji && textParts && (\n

\n {textParts}\n {shouldInlineMeta && (\n \n )}\n

\n )}\n {webPage && (\n \n )}\n {invoice && (\n \n )}\n
\n );\n }\n\n function renderSenderName() {\n const shouldRender = !customShape && (\n (withSenderName && !photo && !video) || asForwarded || viaBotId || forceSenderName\n ) && (!isInDocumentGroup || isFirstInDocumentGroup);\n\n if (!shouldRender) {\n return undefined;\n }\n\n let senderTitle;\n let senderColor;\n if (senderPeer) {\n senderTitle = getSenderTitle(lang, senderPeer);\n\n if (!asForwarded) {\n senderColor = `color-${getUserColorKey(senderPeer)}`;\n }\n } else if (forwardInfo && forwardInfo.hiddenUserName) {\n senderTitle = forwardInfo.hiddenUserName;\n }\n\n return (\n
\n {senderTitle ? (\n \n {renderText(senderTitle)}\n \n ) : !botSender ? (\n NBSP\n ) : undefined}\n {botSender && (\n <>\n {lang('ViaBot')}\n \n {renderText(`@${botSender.username}`)}\n \n \n )}\n {forwardInfo && forwardInfo.isLinkedChannelPost ? (\n {lang('DiscussChannel')}\n ) : message.adminTitle && !isChannel ? (\n {message.adminTitle}\n ) : undefined}\n
\n );\n }\n\n const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\n\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && (!isInDocumentGroup || isLastInDocumentGroup)\n );\n const canForward = canShowActionButton && isChannel && !isScheduled;\n const canFocus = canShowActionButton && (\n (forwardInfo && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn)) && forwardInfo.fromMessageId)\n || isPinnedList\n );\n\n return (\n \n \n {!isInDocumentGroup && (\n
\n {isSelected && }\n
\n )}\n {isLastInDocumentGroup && (\n \n {isGroupSelected && (\n \n )}\n \n )}\n {withAvatar && renderAvatar()}\n \n \n {withAppendix && (
)}\n {asForwarded && !customShape && (!isInDocumentGroup || isFirstInDocumentGroup) && (\n
{lang('ForwardedMessage')}
\n )}\n {renderContent()}\n {(!isInDocumentGroup || isLastInDocumentGroup) && !(!webPage && !animatedEmoji && textParts) && (\n \n )}\n {canForward ? (\n \n \n \n ) : canFocus ? (\n \n \n \n ) : undefined}\n {withCommentButton && }\n {contentClassName.includes('has-appendix') &&
}\n
\n {message.inlineButtons && (\n \n )}\n
\n {contextMenuPosition && (\n \n )}\n \n );\n};\n\nfunction handleDocumentGroupMouseEnter(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.setAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE, '');\n }\n}\n\nfunction handleDocumentGroupMouseLeave(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.removeAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE);\n }\n}\n\nfunction getLastElementInDocumentGroup(element: Element) {\n let current: Element | null = element;\n\n do {\n current = current.nextElementSibling;\n } while (current && !current.classList.contains('last-in-document-group'));\n\n return current;\n}\n\nexport default memo(withGlobal(\n (global, ownProps): StateProps => {\n const { focusedMessage, forwardMessages, lastSyncTime } = global;\n const {\n message, album, withSenderName, withAvatar, threadId, messageListType,\n } = ownProps;\n const {\n id, chatId, viaBotId, replyToMessageId, isOutgoing,\n } = message;\n\n const chat = selectChat(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isChannel = chat && isChatChannel(chat);\n\n const forceSenderName = !isChatWithSelf && isAnonymousOwnMessage(message);\n const canShowSender = withSenderName || withAvatar || forceSenderName;\n const sender = canShowSender ? selectSender(global, message) : undefined;\n const originSender = selectForwardedSender(global, message);\n const botSender = viaBotId ? selectUser(global, viaBotId) : undefined;\n\n const threadTopMessageId = threadId ? selectThreadTopMessageId(global, chatId, threadId) : undefined;\n const isThreadTop = message.id === threadTopMessageId;\n\n const shouldHideReply = replyToMessageId === threadTopMessageId;\n const replyMessage = replyToMessageId && !shouldHideReply\n ? selectChatMessage(global, chatId, replyToMessageId)\n : undefined;\n const replyMessageSender = replyMessage && selectSender(global, replyMessage);\n\n const uploadProgress = selectUploadProgress(global, message);\n const isFocused = messageListType === 'thread' && (\n album\n ? album.messages.some((m) => selectIsMessageFocused(global, m))\n : selectIsMessageFocused(global, message)\n );\n\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && focusedMessage) || {};\n\n const isForwarding = forwardMessages.messageIds && forwardMessages.messageIds.includes(id);\n\n const { query: highlight } = selectCurrentTextSearch(global) || {};\n\n const singleEmoji = getMessageSingleEmoji(message);\n let isSelected: boolean;\n\n if (album && album.messages) {\n isSelected = album.messages.every(({ id: messageId }) => selectIsMessageSelected(global, messageId));\n } else {\n isSelected = selectIsMessageSelected(global, id);\n }\n\n return {\n forceSenderName,\n sender,\n originSender,\n botSender,\n shouldHideReply,\n isThreadTop,\n replyMessage,\n replyMessageSender,\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n isSingleEmoji: Boolean(singleEmoji),\n animatedEmoji: singleEmoji ? selectAnimatedEmoji(global, singleEmoji) : undefined,\n isInSelectMode: selectIsInSelectMode(global),\n isSelected,\n isGroupSelected: (\n !!message.groupedId && !message.isInAlbum && selectIsDocumentGroupSelected(global, chatId, message.groupedId)\n ),\n threadId,\n isPinnedList: messageListType === 'pinned',\n shouldAutoLoadMedia: chat ? selectShouldAutoLoadMedia(global, message, chat, sender) : undefined,\n shouldAutoPlayMedia: selectShouldAutoPlayMedia(global, message),\n shouldLoopStickers: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'cancelSendingMessage',\n 'openUserInfo',\n 'openChat',\n 'markMessagesRead',\n 'sendPollVote',\n 'toggleMessageSelection',\n 'setReplyingToId',\n 'openForwardMenu',\n 'clickInlineButton',\n ]),\n)(Message));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { LoadMoreDirection } from '../../types';\n\nimport { ANIMATION_END_DELAY, MESSAGE_LIST_SLICE, SCHEDULED_WHEN_ONLINE } from '../../config';\nimport { IS_ANDROID, IS_MOBILE_SCREEN } from '../../util/environment';\nimport {\n selectChatMessages,\n selectIsViewportNewest,\n selectFirstUnreadId,\n selectFocusedMessageId,\n selectChat,\n selectIsInSelectMode,\n selectIsChatWithSelf,\n selectChatBot,\n selectIsChatBotNotStarted,\n selectScrollOffset,\n selectThreadTopMessageId,\n selectFirstMessageId,\n selectScheduledMessages,\n selectCurrentMessageIds,\n} from '../../modules/selectors';\nimport {\n getMessageOriginalId,\n isActionMessage,\n isChatChannel,\n isChatPrivate,\n isOwnMessage,\n} from '../../modules/helpers';\nimport {\n compact,\n flatten,\n orderBy,\n pick,\n} from '../../util/iteratees';\nimport {\n fastRaf, debounce, onTickEnd,\n} from '../../util/schedulers';\nimport { formatHumanDate } from '../../util/dateFormat';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport buildClassName from '../../util/buildClassName';\nimport { groupMessages, MessageDateGroup, isAlbum } from './helpers/groupMessages';\nimport { ObserveFn, useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useOnChange from '../../hooks/useOnChange';\nimport useStickyDates from './hooks/useStickyDates';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport resetScroll from '../../util/resetScroll';\nimport fastSmoothScroll, { isAnimatingScroll } from '../../util/fastSmoothScroll';\nimport renderText from '../common/helpers/renderText';\nimport useLang, { LangFn } from '../../hooks/useLang';\nimport useWindowSize from '../../hooks/useWindowSize';\n\nimport Loading from '../ui/Loading';\nimport MessageScroll from './MessageScroll';\nimport Message from './message/Message';\nimport ActionMessage from './ActionMessage';\n\nimport './MessageList.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n type: MessageListType;\n canPost: boolean;\n onFabToggle: (shouldShow: boolean) => void;\n onNotchToggle: (shouldShow: boolean) => void;\n hasTools?: boolean;\n};\n\ntype StateProps = {\n isChatLoaded?: boolean;\n isChannelChat?: boolean;\n isChatWithSelf?: boolean;\n messageIds?: number[];\n messagesById?: Record;\n firstUnreadId?: number;\n isViewportNewest?: boolean;\n isRestricted?: boolean;\n restrictionReason?: ApiRestrictionReason;\n focusingId?: number;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n lastMessage?: ApiMessage;\n botDescription?: string;\n threadTopMessageId?: number;\n threadFirstMessageId?: number;\n hasLinkedChat?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst BOTTOM_THRESHOLD = 100;\nconst UNREAD_DIVIDER_TOP = 10;\nconst UNREAD_DIVIDER_TOP_WITH_TOOLS = 60;\nconst SCROLL_DEBOUNCE = 200;\nconst INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350;\nconst INTERSECTION_MARGIN_FOR_MEDIA = IS_MOBILE_SCREEN ? 300 : 500;\nconst FOCUSING_DURATION = 1000;\nconst BOTTOM_FOCUS_MARGIN = 20;\nconst SELECT_MODE_ANIMATION_DURATION = 200;\nconst FOCUSING_FADE_ANIMATION_DURATION = 200;\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst runDebouncedForScroll = debounce((cb) => cb(), SCROLL_DEBOUNCE, false);\n\nconst MessageList: FC = ({\n chatId,\n threadId,\n type,\n hasTools,\n onFabToggle,\n onNotchToggle,\n isChatLoaded,\n isChannelChat,\n canPost,\n isChatWithSelf,\n messageIds,\n messagesById,\n firstUnreadId,\n isViewportNewest,\n threadFirstMessageId,\n isRestricted,\n restrictionReason,\n focusingId,\n isSelectModeActive,\n animationLevel,\n loadViewportMessages,\n markMessageListRead,\n markMessagesRead,\n setScrollOffset,\n lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n // We update local cached `scrollOffsetRef` when opening chat.\n // Then we update global version every second on scrolling.\n const scrollOffsetRef = useRef((type === 'thread' && selectScrollOffset(getGlobal(), chatId, threadId)) || 0);\n const anchorIdRef = useRef();\n const anchorTopRef = useRef();\n const listItemElementsRef = useRef();\n const memoUnreadDividerBeforeIdRef = useRef();\n // Updated every time (to be used from intersection callback closure)\n const memoFirstUnreadIdRef = useRef();\n const memoFocusingIdRef = useRef();\n const isScrollTopJustUpdatedRef = useRef(false);\n const shouldAnimateAppearanceRef = useRef(!messageIds);\n\n const [containerHeight, setContainerHeight] = useState();\n const [hasFocusing, setHasFocusing] = useState(Boolean(focusingId));\n\n const areMessagesLoaded = Boolean(messageIds);\n useOnChange(() => {\n // We only need it first time when message list appears\n if (areMessagesLoaded) {\n onTickEnd(() => {\n shouldAnimateAppearanceRef.current = false;\n });\n }\n }, [areMessagesLoaded]);\n\n useOnChange(() => {\n memoFirstUnreadIdRef.current = firstUnreadId;\n\n // Updated only once (to preserve divider even after messages are read)\n if (!memoUnreadDividerBeforeIdRef.current) {\n memoUnreadDividerBeforeIdRef.current = firstUnreadId;\n }\n }, [firstUnreadId]);\n\n const {\n observe: observeIntersectionForMedia, freeze: freezeForMedia, unfreeze: unfreezeForMedia,\n } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n margin: INTERSECTION_MARGIN_FOR_MEDIA,\n });\n\n const {\n observe: observeIntersectionForReading, freeze: freezeForReading, unfreeze: unfreezeForReading,\n } = useIntersectionObserver({\n rootRef: containerRef,\n }, (entries) => {\n if (type !== 'thread') {\n return;\n }\n\n let maxId = 0;\n const mentionIds: number[] = [];\n\n entries.forEach((entry) => {\n const { isIntersecting, target } = entry;\n\n if (!isIntersecting) {\n return;\n }\n\n const { dataset } = target as HTMLDivElement;\n\n const messageId = Number(dataset.lastMessageId || dataset.messageId);\n if (messageId > maxId) {\n maxId = messageId;\n }\n\n if (dataset.hasUnreadMention) {\n mentionIds.push(messageId);\n }\n });\n\n if (memoFirstUnreadIdRef.current && maxId >= memoFirstUnreadIdRef.current) {\n markMessageListRead({ maxId });\n }\n\n if (mentionIds.length) {\n markMessagesRead({ messageIds: mentionIds });\n }\n });\n\n useOnChange(() => {\n memoFocusingIdRef.current = focusingId;\n\n if (focusingId) {\n freezeForMedia();\n freezeForReading();\n } else {\n unfreezeForReading();\n unfreezeForMedia();\n }\n }, [focusingId]);\n\n const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n });\n\n useEffect(() => {\n if (focusingId) {\n setHasFocusing(true);\n } else {\n setTimeout(() => {\n setHasFocusing(false);\n }, FOCUSING_FADE_ANIMATION_DURATION);\n }\n }, [focusingId]);\n\n const messageGroups = useMemo(() => {\n if (!messageIds || !messagesById) {\n return undefined;\n }\n\n const viewportIds = threadTopMessageId && (!messageIds[0] || threadFirstMessageId === messageIds[0])\n ? [threadTopMessageId, ...messageIds]\n : messageIds;\n\n if (!viewportIds.length) {\n return undefined;\n }\n\n const listedMessages = viewportIds.map((id) => messagesById[id]);\n return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current);\n }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]);\n\n const [loadMoreBackwards, loadMoreForwards, loadMoreAround] = useMemo(\n () => (type === 'thread' ? [\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false),\n ] : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadViewportMessages, messageIds],\n );\n\n const { isScrolled, updateStickyDates } = useStickyDates();\n\n const handleScroll = useCallback(() => {\n if (isScrollTopJustUpdatedRef.current) {\n isScrollTopJustUpdatedRef.current = false;\n return;\n }\n\n const container = containerRef.current!;\n\n if (!memoFocusingIdRef.current) {\n updateStickyDates(container, hasTools);\n }\n\n runDebouncedForScroll(() => {\n fastRaf(() => {\n if (!container.parentElement) {\n return;\n }\n\n scrollOffsetRef.current = container.scrollHeight - container.scrollTop;\n\n if (type === 'thread') {\n setScrollOffset({ chatId, threadId, scrollOffset: scrollOffsetRef.current });\n }\n });\n });\n }, [updateStickyDates, hasTools, type, setScrollOffset, chatId, threadId]);\n\n // Container resize observer (caused by Composer reply/webpage panels)\n useEffect(() => {\n if (!('ResizeObserver' in window) || process.env.APP_ENV === 'perf') {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n // During animation\n if (!(entry.target as HTMLDivElement).offsetParent) {\n return;\n }\n\n setContainerHeight(entry.contentRect.height);\n });\n\n observer.observe(containerRef.current!);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Memorize height for scroll animation\n const { height: windowHeight } = useWindowSize();\n useEffect(() => {\n containerRef.current!.dataset.normalHeight = String(containerRef.current!.offsetHeight);\n }, [windowHeight]);\n\n // Initial message loading\n useEffect(() => {\n if (!loadMoreAround || !isChatLoaded || isRestricted || focusingId) {\n return;\n }\n\n const container = containerRef.current!;\n\n if (!messageIds || (\n messageIds.length < MESSAGE_LIST_SLICE / 2\n && (container.firstElementChild as HTMLDivElement).clientHeight <= container.offsetHeight\n )) {\n loadMoreAround();\n }\n }, [isChatLoaded, messageIds, loadMoreAround, focusingId, isRestricted]);\n\n // Remember scroll position before repositioning it\n useOnChange(() => {\n if (!messageIds || !listItemElementsRef.current) {\n return;\n }\n\n const preservedItemElements = listItemElementsRef.current\n .filter((element) => messageIds.includes(Number(element.dataset.messageId)));\n\n // We avoid the very first item as it may be a partly-loaded album\n // and also because it may be removed when messages limit is reached\n const anchor = preservedItemElements[1] || preservedItemElements[0];\n if (!anchor) {\n return;\n }\n\n anchorIdRef.current = anchor.id;\n anchorTopRef.current = anchor.getBoundingClientRect().top;\n // This should match deps for `useLayoutEffectWithPrevDeps` below\n }, [messageIds, isViewportNewest, containerHeight, hasTools]);\n\n // Handles updated message list, takes care of scroll repositioning\n useLayoutEffectWithPrevDeps(([\n prevMessageIds, prevIsViewportNewest, prevContainerHeight,\n ]: [\n typeof messageIds, typeof isViewportNewest, typeof containerHeight\n ]) => {\n const container = containerRef.current!;\n listItemElementsRef.current = Array.from(container.querySelectorAll('.message-list-item'));\n\n // During animation\n if (!container.offsetParent) {\n return;\n }\n\n // Add extra height when few messages to allow smooth scroll animation. Uses assumption that `parentElement`\n // is a Transition slide and its CSS class can not be reset in a declarative way.\n const shouldForceScroll = (\n isViewportNewest\n && (messageIds && messageIds.length < MESSAGE_LIST_SLICE / 2)\n && !container.parentElement!.classList.contains('force-messages-scroll')\n && (container.firstElementChild as HTMLDivElement)!.clientHeight <= container.offsetHeight * 2\n );\n\n if (shouldForceScroll) {\n container.parentElement!.classList.add('force-messages-scroll');\n\n setTimeout(() => {\n if (container.parentElement) {\n container.parentElement.classList.remove('force-messages-scroll');\n }\n }, FOCUSING_DURATION);\n }\n\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const scrollOffset = scrollOffsetRef.current!;\n const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1];\n\n // If two messages come at once (e.g. via Quiz Bot) then the first message will update `scrollOffset`\n // right away (before animation) which creates inconsistency until the animation completes.\n // To workaround that, we calculate `isAtBottom` with a \"buffer\" of the latest message height (this is approximate).\n const lastItemHeight = lastItemElement ? lastItemElement.offsetHeight : 0;\n const isAtBottom = isViewportNewest && prevIsViewportNewest && (\n scrollOffset - (prevContainerHeight || offsetHeight) - lastItemHeight <= BOTTOM_THRESHOLD\n );\n\n let newScrollTop!: number;\n\n const hasFirstMessageChanged = messageIds && prevMessageIds && messageIds[0] !== prevMessageIds[0];\n const hasLastMessageChanged = (\n messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1]\n );\n const isAlreadyFocusing = messageIds && memoFocusingIdRef.current === messageIds[messageIds.length - 1];\n\n if (isAtBottom && hasLastMessageChanged && !hasFirstMessageChanged && !isAlreadyFocusing) {\n if (lastItemElement) {\n fastRaf(() => {\n fastSmoothScroll(\n container,\n lastItemElement,\n 'end',\n BOTTOM_FOCUS_MARGIN,\n undefined,\n undefined,\n undefined,\n true,\n );\n });\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n // Scroll still needs to be restored after container resize\n if (!shouldForceScroll) {\n return;\n }\n }\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.time('scrollTop');\n }\n\n const isResized = prevContainerHeight !== undefined && prevContainerHeight !== containerHeight;\n const anchor = anchorIdRef.current && container.querySelector(`#${anchorIdRef.current}`);\n const unreadDivider = (\n !anchor\n && memoUnreadDividerBeforeIdRef.current\n && container.querySelector(`.${UNREAD_DIVIDER_CLASS}`)\n );\n\n if (isAtBottom && isResized) {\n if (isAnimatingScroll()) {\n return;\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n } else if (anchor) {\n const newAnchorTop = anchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - (anchorTopRef.current || 0));\n } else if (unreadDivider) {\n newScrollTop = unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP);\n } else {\n newScrollTop = scrollHeight - scrollOffset;\n }\n\n resetScroll(container, newScrollTop);\n\n if (!memoFocusingIdRef.current) {\n isScrollTopJustUpdatedRef.current = true;\n fastRaf(() => {\n isScrollTopJustUpdatedRef.current = false;\n });\n }\n\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.timeEnd('scrollTop');\n }\n // This should match deps for `useOnChange` above\n }, [messageIds, isViewportNewest, containerHeight, hasTools]);\n\n useEffect(() => {\n if (!animationLevel || animationLevel > 0) {\n dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isSelectModeActive]);\n\n const lang = useLang();\n\n const isPrivate = Boolean(chatId && isChatPrivate(chatId));\n const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf);\n\n const className = buildClassName(\n 'MessageList custom-scroll',\n !withUsers && 'no-avatars',\n isChannelChat && 'no-avatars',\n !canPost && 'no-composer',\n type === 'pinned' && 'type-pinned',\n isSelectModeActive && 'select-mode-active',\n hasFocusing && 'has-focusing',\n isScrolled && 'scrolled',\n );\n\n return (\n
\n {isRestricted ? (\n
\n \n {restrictionReason ? restrictionReason.text : `This is a private ${isChannelChat ? 'channel' : 'chat'}`}\n \n
\n ) : botDescription ? (\n
{renderText(lang(botDescription), ['br', 'emoji', 'links'])}
\n ) : messageIds && !messageGroups ? (\n
{lang('NoMessages')}
\n ) : ((messageIds && messageGroups) || lastMessage) ? (\n \n {renderMessages(\n lang,\n messageGroups || groupMessages([lastMessage!]),\n observeIntersectionForReading,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n withUsers,\n anchorIdRef,\n memoUnreadDividerBeforeIdRef,\n threadId,\n type,\n threadTopMessageId,\n threadFirstMessageId,\n hasLinkedChat,\n messageGroups ? type === 'scheduled' : false,\n !messageGroups || !shouldAnimateAppearanceRef.current,\n openHistoryCalendar,\n )}\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction renderMessages(\n lang: LangFn,\n messageGroups: MessageDateGroup[],\n observeIntersectionForReading: ObserveFn,\n observeIntersectionForMedia: ObserveFn,\n observeIntersectionForAnimatedStickers: ObserveFn,\n withUsers: boolean,\n currentAnchorIdRef: { current: string | undefined },\n memoFirstUnreadIdRef: { current: number | undefined },\n threadId: number,\n type: MessageListType,\n threadTopMessageId: number | undefined,\n threadFirstMessageId: number | undefined,\n hasLinkedChat: boolean | undefined,\n isSchedule: boolean,\n noAppearanceAnimation: boolean,\n openHistoryCalendar: Function,\n) {\n const unreadDivider = (\n
\n {lang('UnreadMessages')}\n
\n );\n\n const messageCountToAnimate = noAppearanceAnimation ? 0 : messageGroups.reduce((acc, messageGroup) => {\n return acc + flatten(messageGroup.senderGroups).length;\n }, 0);\n let appearanceIndex = 0;\n\n const dateGroups = messageGroups.map((\n dateGroup: MessageDateGroup,\n dateGroupIndex: number,\n dateGroupsArray: MessageDateGroup[],\n ) => {\n const senderGroups = dateGroup.senderGroups.map((\n senderGroup,\n senderGroupIndex,\n senderGroupsArray,\n ) => {\n if (senderGroup.length === 1 && !isAlbum(senderGroup[0]) && isActionMessage(senderGroup[0])) {\n const message = senderGroup[0];\n const isLastInList = (\n senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n );\n\n return compact([\n message.id === memoFirstUnreadIdRef.current && unreadDivider,\n ,\n ]);\n }\n\n let currentDocumentGroupId: string | undefined;\n\n return flatten(senderGroup.map((\n messageOrAlbum,\n messageIndex,\n ) => {\n const message = isAlbum(messageOrAlbum) ? messageOrAlbum.mainMessage : messageOrAlbum;\n const album = isAlbum(messageOrAlbum) ? messageOrAlbum : undefined;\n const isOwn = isOwnMessage(message);\n const isMessageAlbum = isAlbum(messageOrAlbum);\n const nextMessage = senderGroup[messageIndex + 1];\n\n if (message.previousLocalId && currentAnchorIdRef.current === `message${message.previousLocalId}`) {\n currentAnchorIdRef.current = `message${message.id}`;\n }\n\n const documentGroupId = !isMessageAlbum && message.groupedId ? message.groupedId : undefined;\n const nextDocumentGroupId = nextMessage && !isAlbum(nextMessage) ? nextMessage.groupedId : undefined;\n\n const position = {\n isFirstInGroup: messageIndex === 0,\n isLastInGroup: messageIndex === senderGroup.length - 1,\n isFirstInDocumentGroup: Boolean(documentGroupId && documentGroupId !== currentDocumentGroupId),\n isLastInDocumentGroup: Boolean(documentGroupId && documentGroupId !== nextDocumentGroupId),\n isLastInList: (\n messageIndex === senderGroup.length - 1\n && senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n ),\n };\n\n currentDocumentGroupId = documentGroupId;\n\n const originalId = getMessageOriginalId(message);\n // Scheduled messages can have local IDs in the middle of the list,\n // and keys should be ordered, so we prefix it with a date.\n // However, this may lead to issues if server date is not synchronized with the local one.\n const key = type !== 'scheduled' ? originalId : `${message.date}_${originalId}`;\n\n return compact([\n message.id === memoFirstUnreadIdRef.current ? unreadDivider : undefined,\n ,\n message.id === threadTopMessageId && (\n
\n {lang('DiscussionStarted')}\n
\n ),\n ]);\n }));\n });\n\n return (\n \n openHistoryCalendar({ selectedAt: dateGroup.datetime }) : undefined}\n >\n \n {isSchedule && dateGroup.originalDate === SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledUntilOnline')\n )}\n {isSchedule && dateGroup.originalDate !== SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledOn', formatHumanDate(lang, dateGroup.datetime, undefined, true))\n )}\n {!isSchedule && formatHumanDate(lang, dateGroup.datetime)}\n \n \n {flatten(senderGroups)}\n \n );\n });\n\n return flatten(dateGroups);\n}\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, type }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const messageIds = selectCurrentMessageIds(global, chatId, threadId, type);\n const messagesById = type === 'scheduled'\n ? selectScheduledMessages(global, chatId)\n : selectChatMessages(global, chatId);\n const threadTopMessageId = selectThreadTopMessageId(global, chatId, threadId);\n\n if (\n threadId !== MAIN_THREAD_ID\n && !(messagesById && threadTopMessageId && messagesById[threadTopMessageId])\n ) {\n return {};\n }\n\n const { isRestricted, restrictionReason, lastMessage } = chat;\n const focusingId = selectFocusedMessageId(global, chatId);\n\n const withLastMessageWhenPreloading = (\n threadId === MAIN_THREAD_ID\n && !messageIds && !chat.unreadCount && !focusingId && lastMessage && !lastMessage.groupedId\n );\n\n let botDescription: string | undefined;\n if (selectIsChatBotNotStarted(global, chatId)) {\n const chatBot = selectChatBot(global, chatId)!;\n if (chatBot.fullInfo) {\n botDescription = chatBot.fullInfo.botDescription || 'NoMessages';\n } else {\n botDescription = 'Updating bot info...';\n }\n }\n\n return {\n isChatLoaded: true,\n isRestricted,\n restrictionReason,\n isChannelChat: isChatChannel(chat),\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n messageIds,\n messagesById,\n firstUnreadId: selectFirstUnreadId(global, chatId, threadId),\n isViewportNewest: type !== 'thread' || selectIsViewportNewest(global, chatId, threadId),\n threadFirstMessageId: selectFirstMessageId(global, chatId, threadId),\n focusingId,\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n botDescription,\n threadTopMessageId,\n hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo)\n ? Boolean(chat.fullInfo.linkedChatId)\n : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadViewportMessages',\n 'markMessageListRead',\n 'markMessagesRead',\n 'setScrollOffset',\n 'openHistoryCalendar',\n ]),\n)(MessageList));\n","import React, {\n FC, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\n\nimport { selectChat, selectCurrentMessageList } from '../../modules/selectors';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport { pick } from '../../util/iteratees';\nimport fastSmoothScroll from '../../util/fastSmoothScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ScrollDownButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n canPost?: boolean;\n};\n\ntype StateProps = {\n messageListType?: MessageListType;\n unreadCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FOCUS_MARGIN = 20;\n\nconst ScrollDownButton: FC = ({\n isShown,\n canPost,\n messageListType,\n unreadCount,\n focusLastMessage,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const elementRef = useRef(null);\n\n const handleClick = useCallback(() => {\n if (!isShown) {\n return;\n }\n\n if (messageListType === 'thread') {\n focusLastMessage();\n } else {\n const messagesContainer = elementRef.current!.parentElement!.querySelector('.MessageList')!;\n const messageElements = messagesContainer.querySelectorAll('.message-list-item');\n const lastMessageElement = messageElements[messageElements.length - 1];\n if (!lastMessageElement) {\n return;\n }\n\n fastSmoothScroll(messagesContainer, lastMessageElement, 'end', FOCUS_MARGIN);\n }\n }, [isShown, messageListType, focusLastMessage]);\n\n const fabClassName = buildClassName(\n 'ScrollDownButton',\n isShown && 'revealed',\n !canPost && 'no-composer',\n );\n\n return (\n
\n
\n \n \n \n {Boolean(unreadCount) && (\n
{formatIntegerCompact(unreadCount!)}
\n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return {};\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n\n return {\n messageListType,\n unreadCount: chat && threadId === MAIN_THREAD_ID && messageListType === 'thread' ? chat.unreadCount : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusLastMessage']),\n)(ScrollDownButton));\n","import { ApiAttachment } from '../../../../api/types';\nimport { preloadImage, preloadVideo, createPosterForVideo } from '../../../../util/files';\n\nconst MAX_QUICK_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\nconst MAX_QUICK_IMG_SIZE = 1280; // px\n\nexport default async function buildAttachment(\n filename: string, blob: Blob, isQuick: boolean, options?: Partial,\n): Promise {\n const blobUrl = URL.createObjectURL(blob);\n const { type: mimeType, size } = blob;\n let quick;\n let previewBlobUrl;\n\n if (mimeType.startsWith('image/')) {\n if (isQuick) {\n const img = await preloadImage(blobUrl);\n const { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE || mimeType !== 'image/jpeg') {\n const newBlob = await squeezeImage(img);\n if (newBlob) {\n URL.revokeObjectURL(blobUrl);\n return buildAttachment(filename, newBlob, true, options);\n } else {\n return buildAttachment(filename, blob, false, options);\n }\n }\n\n quick = { width, height };\n } else {\n previewBlobUrl = blobUrl;\n }\n } else if (mimeType.startsWith('video/')) {\n // Videos < 10 MB are always sent in quick mode (in other clients).\n // Quick mode for videos > 10 MB is not supported until client-side video squeezing is implemented.\n if (size < MAX_QUICK_VIDEO_SIZE) {\n const { videoWidth: width, videoHeight: height, duration } = await preloadVideo(blobUrl);\n quick = { width, height, duration };\n }\n\n previewBlobUrl = await createPosterForVideo(blobUrl);\n }\n\n return {\n blobUrl,\n filename,\n mimeType,\n size,\n quick,\n previewBlobUrl,\n ...options,\n };\n}\n\nfunction squeezeImage(img: HTMLImageElement): Promise {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n let { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE) {\n if (width >= height) {\n height *= MAX_QUICK_IMG_SIZE / width;\n width = MAX_QUICK_IMG_SIZE;\n } else {\n width *= MAX_QUICK_IMG_SIZE / height;\n height = MAX_QUICK_IMG_SIZE;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height);\n canvas.toBlob(resolve, 'image/jpeg', 100);\n });\n}\n","export default __webpack_public_path__ + \"8ccc0b555efcec3616377aea078dda16.js\";","// @ts-ignore\nimport encoderPath from 'file-loader!opus-recorder/dist/encoderWorker.min';\n\nexport type Result = { blob: Blob; duration: number; waveform: number[] };\n\ninterface OpusRecorder extends Omit {\n new(options: AnyLiteral): OpusRecorder;\n\n start(stream?: MediaStreamAudioSourceNode): void;\n\n sourceNode: MediaStreamAudioSourceNode;\n\n ondataavailable: (typedArray: Uint8Array) => void;\n}\n\nconst MIN_RECORDING_TIME = 1000;\nconst POLYFILL_OPTIONS = { encoderPath, reuseWorker: true };\nconst BLOB_PARAMS = { type: 'audio/ogg' };\nconst FFT_SIZE = 64;\nconst MIN_VOLUME = 0.1;\n\nlet opusRecorderPromise: Promise<{ default: OpusRecorder }>;\nlet OpusRecorder: OpusRecorder;\nlet mediaRecorder: OpusRecorder;\n\nexport async function init() {\n if (!opusRecorderPromise) {\n // @ts-ignore\n opusRecorderPromise = import('opus-recorder');\n OpusRecorder = (await opusRecorderPromise).default;\n mediaRecorder = new OpusRecorder(POLYFILL_OPTIONS);\n }\n\n return opusRecorderPromise;\n}\n\nexport async function start(analyzerCallback: Function) {\n await startMediaRecorder();\n\n const startedAt = Date.now();\n let pausedAt: number;\n const chunks: Uint8Array[] = [];\n const waveform: number[] = [];\n\n mediaRecorder.ondataavailable = (typedArray) => {\n chunks.push(typedArray);\n };\n\n const releaseAnalyzer = subscribeToAnalyzer(mediaRecorder, (volume: number) => {\n waveform.push(volume * 255);\n analyzerCallback(volume);\n });\n\n return {\n stop: () => new Promise((resolve, reject) => {\n mediaRecorder.onstop = () => {\n resolve({\n blob: new Blob(chunks, BLOB_PARAMS),\n duration: Math.round(((pausedAt || Date.now()) - startedAt) / 1000),\n waveform,\n });\n };\n mediaRecorder.onerror = reject;\n\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.stop();\n releaseAnalyzer();\n }, delayStop);\n }),\n pause: () => {\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.pause();\n pausedAt = Date.now();\n releaseAnalyzer();\n }, delayStop);\n },\n };\n}\n\nasync function startMediaRecorder() {\n await init();\n await mediaRecorder.start();\n}\n\nfunction subscribeToAnalyzer(recorder: OpusRecorder, cb: Function) {\n const source = recorder.sourceNode;\n const analyser = source.context.createAnalyser();\n analyser.fftSize = FFT_SIZE;\n source.connect(analyser);\n\n const dataLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(dataLength);\n let isDestroyed = false;\n\n function tick() {\n if (isDestroyed) {\n return;\n }\n\n analyser.getByteFrequencyData(dataArray);\n\n const sum = dataArray.reduce((acc, current) => acc + current, 0);\n const mean = (sum / dataLength);\n const volume = mean / 255;\n\n cb(volume < MIN_VOLUME ? 0 : volume);\n\n requestAnimationFrame(tick);\n }\n\n tick();\n\n return () => {\n isDestroyed = true;\n };\n}\n","import { StateHookSetter, useEffect } from '../../../../lib/teact/teact';\nimport { ApiAttachment, ApiMessage } from '../../../../api/types';\n\nimport buildAttachment from '../helpers/buildAttachment';\nimport { EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID } from '../../../../config';\n\nconst CLIPBOARD_ACCEPTED_TYPES = ['image/png', 'image/jpeg', 'image/gif'];\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default (\n insertTextAndUpdateCursor: (text: string, inputId?: string) => void,\n setAttachments: StateHookSetter,\n editedMessage: ApiMessage | undefined,\n) => {\n useEffect(() => {\n async function handlePaste(e: ClipboardEvent) {\n if (!e.clipboardData) {\n return;\n }\n\n const input = document.activeElement;\n if (input && input.tagName === 'INPUT' && ![EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID].includes(input.id)) {\n return;\n }\n\n const { items } = e.clipboardData;\n const media = Array.from(items).find((item) => CLIPBOARD_ACCEPTED_TYPES.includes(item.type));\n const file = media && media.getAsFile();\n const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH);\n\n if (!file && !pastedText) {\n return;\n }\n\n e.preventDefault();\n\n if (file && !editedMessage) {\n const attachment = await buildAttachment(file.name, file, true);\n setAttachments((attachments) => [\n ...attachments,\n attachment,\n ]);\n }\n\n if (pastedText) {\n insertTextAndUpdateCursor(pastedText, input ? input.id : undefined);\n }\n }\n\n document.addEventListener('paste', handlePaste, false);\n\n return () => {\n document.removeEventListener('paste', handlePaste, false);\n };\n }, [insertTextAndUpdateCursor, editedMessage, setAttachments]);\n};\n","import { ApiFormattedText } from '../../../../api/types';\nimport { renderTextWithEntities } from '../../../common/helpers/renderMessageText';\n\nexport default function getMessageTextAsHtml(formattedText?: ApiFormattedText) {\n const { text, entities } = formattedText || {};\n if (!text) {\n return '';\n }\n\n const result = renderTextWithEntities(\n text,\n entities,\n undefined,\n undefined,\n true,\n );\n\n if (Array.isArray(result)) {\n return result.join('');\n }\n\n return result;\n}\n","import { useCallback, useEffect, useMemo } from '../../../../lib/teact/teact';\n\nimport { ApiFormattedText, ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { DRAFT_DEBOUNCE, EDITABLE_INPUT_ID } from '../../../../config';\nimport usePrevious from '../../../../hooks/usePrevious';\nimport { debounce } from '../../../../util/schedulers';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\n\n// Used to avoid running debounced callbacks when chat changes.\nlet currentChatId: number | undefined;\nlet currentThreadId: number | undefined;\n\nexport default (\n draft: ApiFormattedText | undefined,\n chatId: number,\n threadId: number,\n html: string,\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n saveDraft: GlobalActions['saveDraft'],\n clearDraft: GlobalActions['clearDraft'],\n) => {\n const updateDraft = useCallback((draftChatId: number, draftThreadId: number) => {\n if (htmlRef.current.length && !editedMessage) {\n saveDraft({ chatId: draftChatId, threadId: draftThreadId, draft: parseMessageInput(htmlRef.current!) });\n } else {\n clearDraft({ chatId: draftChatId, threadId: draftThreadId });\n }\n }, [clearDraft, editedMessage, htmlRef, saveDraft]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const runDebouncedForSaveDraft = useMemo(() => debounce((cb) => cb(), DRAFT_DEBOUNCE, false), [chatId]);\n\n const prevChatId = usePrevious(chatId);\n const prevThreadId = usePrevious(threadId);\n\n // Save draft on chat change\n useEffect(() => {\n currentChatId = chatId;\n currentThreadId = threadId;\n\n return () => {\n currentChatId = undefined;\n currentThreadId = undefined;\n\n updateDraft(chatId, threadId);\n };\n }, [chatId, threadId, updateDraft]);\n\n // Restore draft on chat change\n useEffect(() => {\n if (chatId === prevChatId && threadId === prevThreadId) {\n return;\n }\n\n if (!draft) {\n return;\n }\n\n setHtml(getMessageTextAsHtml(draft));\n\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }, [chatId, threadId, draft, setHtml, updateDraft, prevChatId, prevThreadId]);\n\n // Update draft when input changes\n const prevHtml = usePrevious(html);\n useEffect(() => {\n if (!chatId || !threadId || prevChatId !== chatId || prevThreadId !== threadId || prevHtml === html) {\n return;\n }\n\n if (html.length) {\n runDebouncedForSaveDraft(() => {\n if (currentChatId !== chatId || currentThreadId !== threadId) {\n return;\n }\n\n updateDraft(chatId, threadId);\n });\n } else {\n updateDraft(chatId, threadId);\n }\n }, [chatId, html, prevChatId, prevHtml, prevThreadId, runDebouncedForSaveDraft, threadId, updateDraft]);\n\n // Subscribe and handle `window.blur`\n useEffect(() => {\n function handleBlur() {\n if (chatId && threadId) {\n updateDraft(chatId, threadId);\n }\n }\n\n window.addEventListener('blur', handleBlur);\n\n return () => {\n window.removeEventListener('blur', handleBlur);\n };\n }, [chatId, threadId, updateDraft]);\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './DeleteMessageModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst DeleteMessageModalAsync: FC = (props) => {\n const { isOpen } = props;\n const DeleteMessageModal = useModuleLoader(Bundles.Extra, 'DeleteMessageModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DeleteMessageModal ? : undefined;\n};\n\nexport default memo(DeleteMessageModalAsync);\n","import React, {\n FC, useRef, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\ntype OwnProps = {\n onActivate: NoneToVoidFunction;\n} & Omit;\n\nconst BUTTON_ACTIVATE_DELAY = 200;\nlet openTimeout: number | undefined;\nlet isFirstTimeActivation = true;\n\nconst ResponsiveHoverButton: FC = ({ onActivate, ...buttonProps }) => {\n const isMouseInside = useRef(false);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n\n // This is used to counter additional delay caused by asynchronous module loading\n if (isFirstTimeActivation) {\n isFirstTimeActivation = false;\n onActivate();\n return;\n }\n\n if (openTimeout) {\n clearTimeout(openTimeout);\n openTimeout = undefined;\n }\n openTimeout = window.setTimeout(() => {\n if (isMouseInside.current) {\n onActivate();\n }\n }, BUTTON_ACTIVATE_DELAY);\n }, [onActivate]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n }, []);\n\n return (\n \n );\n};\n\nexport default memo(ResponsiveHoverButton);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const AttachMenu = useModuleLoader(Bundles.Extra, 'AttachMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachMenu ? : undefined;\n};\n\nexport default memo(AttachMenuAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './SymbolMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst SymbolMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const SymbolMenu = useModuleLoader(Bundles.Extra, 'SymbolMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SymbolMenu ? : undefined;\n};\n\nexport default memo(SymbolMenuAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './MentionTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst MentionTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const MentionTooltip = useModuleLoader(Bundles.Extra, 'MentionTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MentionTooltip ? : undefined;\n};\n\nexport default memo(MentionTooltipAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './CustomSendMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst CustomSendMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const CustomSend = useModuleLoader(Bundles.Extra, 'CustomSendMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CustomSend ? : undefined;\n};\n\nexport default memo(CustomSendMenuAsync);\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './StickerTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst StickerTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerTooltip = useModuleLoader(Bundles.Extra, 'StickerTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerTooltip ? : undefined;\n};\n\nexport default StickerTooltipAsync;\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './BotKeyboardMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst BotKeyboardMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const BotKeyboardMenu = useModuleLoader(Bundles.Extra, 'BotKeyboardMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return BotKeyboardMenu ? : undefined;\n};\n\nexport default memo(BotKeyboardMenuAsync);\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\n\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectForwardedSender,\n selectUser,\n selectCurrentMessageList,\n selectReplyingToId,\n selectEditingId,\n selectEditingScheduledId,\n selectEditingMessage,\n} from '../../../modules/selectors';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport { isChatPrivate } from '../../../modules/helpers';\n\nimport Button from '../../ui/Button';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\n\nimport './ComposerEmbeddedMessage.scss';\n\ntype StateProps = {\n replyingToId?: number;\n editingId?: number;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n shouldAnimate?: boolean;\n forwardedMessagesCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FORWARD_RENDERING_DELAY = 300;\n\nconst ComposerEmbeddedMessage: FC = ({\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount,\n setReplyingToId,\n setEditingId,\n focusMessage,\n exitForwardMode,\n}) => {\n const isShown = Boolean(\n ((replyingToId || editingId) && message)\n || (sender && forwardedMessagesCount),\n );\n const canAnimate = useAsyncRendering(\n [forwardedMessagesCount],\n forwardedMessagesCount ? FORWARD_RENDERING_DELAY : undefined,\n );\n\n const {\n shouldRender, transitionClassNames,\n } = useShowTransition(canAnimate && isShown, undefined, !shouldAnimate, undefined, !shouldAnimate);\n\n const clearEmbedded = useCallback(() => {\n if (replyingToId) {\n setReplyingToId({ messageId: undefined });\n } else if (editingId) {\n setEditingId({ messageId: undefined });\n } else if (forwardedMessagesCount) {\n exitForwardMode();\n }\n }, [replyingToId, editingId, forwardedMessagesCount, setReplyingToId, setEditingId, exitForwardMode]);\n\n useEffect(() => (isShown ? captureEscKeyListener(clearEmbedded) : undefined), [isShown, clearEmbedded]);\n\n const handleMessageClick = useCallback((): void => {\n focusMessage({ chatId: message!.chatId, messageId: message!.id });\n }, [focusMessage, message]);\n\n const className = buildClassName('ComposerEmbeddedMessage', transitionClassNames);\n\n const customText = forwardedMessagesCount && forwardedMessagesCount > 1\n ? `${forwardedMessagesCount} forwarded messages`\n : undefined;\n\n if (!shouldRender) {\n return undefined;\n }\n\n return (\n
\n
\n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId || !messageListType) {\n return {};\n }\n\n const {\n currentUserId,\n forwardMessages: { fromChatId, toChatId, messageIds: forwardMessageIds },\n } = global;\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const editingId = messageListType === 'scheduled'\n ? selectEditingScheduledId(global, chatId)\n : selectEditingId(global, chatId, threadId);\n const shouldAnimate = global.settings.byKey.animationLevel >= 1;\n const isForwarding = toChatId === chatId;\n\n let message;\n if (replyingToId) {\n message = selectChatMessage(global, chatId, replyingToId);\n } else if (editingId) {\n message = selectEditingMessage(global, chatId, threadId, messageListType);\n } else if (isForwarding && forwardMessageIds!.length === 1) {\n message = selectChatMessage(global, fromChatId!, forwardMessageIds![0]);\n }\n\n let sender: ApiChat | ApiUser | undefined;\n if (replyingToId && message) {\n const { forwardInfo } = message;\n const isChatWithSelf = chatId === currentUserId;\n\n if (forwardInfo && (forwardInfo.isChannelPost || isChatWithSelf)) {\n sender = selectForwardedSender(global, message);\n }\n\n if (!sender) {\n sender = selectSender(global, message);\n }\n } else if (isForwarding) {\n sender = isChatPrivate(fromChatId!) ? selectUser(global, fromChatId!) : selectChat(global, fromChatId!);\n }\n\n return {\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount: isForwarding ? forwardMessageIds!.length : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'focusMessage',\n 'exitForwardMode',\n ]),\n)(ComposerEmbeddedMessage));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachmentModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachmentModalAsync: FC = (props) => {\n const { attachments } = props;\n const AttachmentModal = useModuleLoader(Bundles.Extra, 'AttachmentModal', !attachments.length);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachmentModal ? : undefined;\n};\n\nexport default memo(AttachmentModalAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './PollModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst PollModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PollModal = useModuleLoader(Bundles.Extra, 'PollModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PollModal ? : undefined;\n};\n\nexport default memo(PollModalAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './DropArea';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst DropAreaAsync: FC = (props) => {\n const { isOpen } = props;\n const DropArea = useModuleLoader(Bundles.Extra, 'DropArea', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DropArea ? : undefined;\n};\n\nexport default memo(DropAreaAsync);\nexport { DropAreaState } from './DropArea';\n","import React, {\n FC, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage, ApiMessageEntityTypes, ApiWebPage } from '../../../api/types';\n\nimport { RE_LINK_TEMPLATE } from '../../../config';\nimport { selectNoWebPage } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../../hooks/useCurrentOrPrev';\nimport buildClassName from '../../../util/buildClassName';\n\nimport WebPage from '../message/WebPage';\nimport Button from '../../ui/Button';\n\nimport './WebPagePreview.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageText: string;\n disabled?: boolean;\n};\n\ntype StateProps = {\n webPagePreview?: ApiWebPage;\n noWebPage?: boolean;\n};\ntype DispatchProps = Pick;\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nconst WebPagePreview: FC = ({\n chatId,\n threadId,\n messageText,\n disabled,\n webPagePreview,\n noWebPage,\n loadWebPagePreview,\n clearWebPagePreview,\n toggleMessageWebPage,\n}) => {\n const link = useMemo(() => {\n const { text, entities } = parseMessageInput(messageText);\n\n const linkEntity = entities && entities.find(({ type }) => type === ApiMessageEntityTypes.TextUrl);\n if (linkEntity) {\n return linkEntity.url;\n }\n\n const textMatch = text.match(RE_LINK);\n if (textMatch) {\n return textMatch[0];\n }\n\n return undefined;\n }, [messageText]);\n\n useEffect(() => {\n if (link) {\n loadWebPagePreview({ text: link });\n } else {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }\n }, [chatId, toggleMessageWebPage, clearWebPagePreview, link, loadWebPagePreview, threadId]);\n\n useOnChange(() => {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }, [chatId]);\n\n const isShown = Boolean(webPagePreview && messageText.length && !noWebPage && !disabled);\n const { shouldRender, transitionClassNames } = useShowTransition(isShown);\n\n const renderingWebPage = useCurrentOrPrev(webPagePreview);\n\n if (!shouldRender || !renderingWebPage) {\n return undefined;\n }\n\n const handleClearWebpagePreview = () => {\n toggleMessageWebPage({ chatId, threadId, noWebPage: true });\n };\n\n // TODO Refactor so `WebPage` can be used without message\n const { photo, ...webPageWithoutPhoto } = renderingWebPage;\n const messageStub = {\n content: {\n webPage: webPageWithoutPhoto,\n },\n } as ApiMessage;\n\n return (\n
\n
\n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId }): StateProps => {\n const noWebPage = selectNoWebPage(global, chatId, threadId);\n return {\n webPagePreview: global.webPagePreview,\n noWebPage,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWebPagePreview', 'clearWebPagePreview', 'toggleMessageWebPage',\n ]),\n)(WebPagePreview));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './CalendarModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst CalendarModalAsync: FC = (props) => {\n const { isOpen } = props;\n const CalendarModal = useModuleLoader(Bundles.Extra, 'CalendarModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CalendarModal ? : undefined;\n};\n\nexport default memo(CalendarModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './PaymentModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst PaymentModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PaymentModal = useModuleLoader(Bundles.Extra, 'PaymentModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PaymentModal ? : undefined;\n};\n\nexport default memo(PaymentModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ReceiptModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ReceiptModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ReceiptModal = useModuleLoader(Bundles.Extra, 'ReceiptModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ReceiptModal ? : undefined;\n};\n\nexport default memo(ReceiptModalAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState, MessageListType } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessage,\n ApiFormattedText,\n ApiChat,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { LangCode } from '../../../types';\n\nimport { EDITABLE_INPUT_ID, SCHEDULED_WHEN_ONLINE } from '../../../config';\nimport { IS_VOICE_RECORDING_SUPPORTED, IS_MOBILE_SCREEN, IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport {\n selectChat,\n selectIsChatWithBot,\n selectIsRightColumnShown,\n selectIsInSelectMode,\n selectNewestMessageWithBotKeyboardButtons,\n selectDraft,\n selectScheduledIds,\n selectEditingMessage,\n selectIsChatWithSelf,\n selectChatUser,\n selectEmojiKeywords,\n} from '../../../modules/selectors';\nimport {\n getAllowedAttachmentOptions,\n getChatSlowModeOptions,\n isChatGroup,\n isChatPrivate,\n isChatAdmin,\n} from '../../../modules/helpers';\nimport { formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport buildAttachment from './helpers/buildAttachment';\nimport renderText from '../../common/helpers/renderText';\nimport insertHtmlInSelection from '../../../util/insertHtmlInSelection';\nimport deleteLastCharacterOutsideSelection from '../../../util/deleteLastCharacterOutsideSelection';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { isSelectionInsideInput } from './helpers/selection';\n\nimport useFlag from '../../../hooks/useFlag';\nimport useVoiceRecording from './hooks/useVoiceRecording';\nimport useClipboardPaste from './hooks/useClipboardPaste';\nimport useDraft from './hooks/useDraft';\nimport useEditing from './hooks/useEditing';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useStickerTooltip from './hooks/useStickerTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLang from '../../../hooks/useLang';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal.async';\nimport Button from '../../ui/Button';\nimport ResponsiveHoverButton from '../../ui/ResponsiveHoverButton';\nimport Spinner from '../../ui/Spinner';\nimport AttachMenu from './AttachMenu.async';\nimport SymbolMenu from './SymbolMenu.async';\nimport MentionTooltip from './MentionTooltip.async';\nimport CustomSendMenu from './CustomSendMenu.async';\nimport StickerTooltip from './StickerTooltip.async';\nimport EmojiTooltip from './EmojiTooltip.async';\nimport BotKeyboardMenu from './BotKeyboardMenu.async';\nimport MessageInput from './MessageInput';\nimport ComposerEmbeddedMessage from './ComposerEmbeddedMessage';\nimport AttachmentModal from './AttachmentModal.async';\nimport PollModal from './PollModal.async';\nimport DropArea, { DropAreaState } from './DropArea.async';\nimport WebPagePreview from './WebPagePreview';\nimport Portal from '../../ui/Portal';\nimport CalendarModal from '../../common/CalendarModal.async';\nimport PaymentModal from '../../payment/PaymentModal.async';\nimport ReceiptModal from '../../payment/ReceiptModal.async';\n\nimport './Composer.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n dropAreaState: string;\n onDropHide: NoneToVoidFunction;\n};\n\ntype StateProps = {\n editingMessage?: ApiMessage;\n chat?: ApiChat;\n draft?: ApiFormattedText;\n isChatWithBot?: boolean;\n isChatWithSelf?: boolean;\n isRightColumnShown?: boolean;\n isSelectModeActive?: boolean;\n isForwarding?: boolean;\n canSuggestMembers?: boolean;\n isPollModalOpen?: boolean;\n isPaymentModalOpen?: boolean;\n isReceiptModalOpen?: boolean;\n botKeyboardMessageId?: number;\n withScheduledButton?: boolean;\n shouldSchedule?: boolean;\n canScheduleUntilOnline?: boolean;\n stickersForEmoji?: ApiSticker[];\n groupChatMembers?: ApiChatMember[];\n currentUserId?: number;\n usersById?: Record;\n recentEmojis: string[];\n lastSyncTime?: number;\n contentToBeScheduled?: GlobalState['messages']['contentToBeScheduled'];\n shouldSuggestStickers?: boolean;\n language: LangCode;\n emojiKeywords?: Record;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nenum MainButtonState {\n Send = 'send',\n Record = 'record',\n Edit = 'edit',\n}\n\nconst VOICE_RECORDING_FILENAME = 'wonderful-voice-message.ogg';\n// When voice recording is active, composer placeholder will hide to prevent overlapping\nconst SCREEN_WIDTH_TO_HIDE_PLACEHOLDER = 600; // px\n\nconst MOBILE_KEYBOARD_HIDE_DELAY_MS = 100;\nconst SELECT_MODE_TRANSITION_MS = 200;\nconst CAPTION_MAX_LENGTH = 1024;\nconst SENDING_ANIMATION_DURATION = 350;\n// eslint-disable-next-line max-len\nconst APPENDIX = '';\n\nconst Composer: FC = ({\n dropAreaState,\n shouldSchedule,\n canScheduleUntilOnline,\n onDropHide,\n editingMessage,\n chatId,\n threadId,\n messageListType,\n draft,\n chat,\n connectionState,\n isChatWithBot,\n isChatWithSelf,\n isRightColumnShown,\n isSelectModeActive,\n isForwarding,\n canSuggestMembers,\n isPollModalOpen,\n isPaymentModalOpen,\n isReceiptModalOpen,\n botKeyboardMessageId,\n withScheduledButton,\n stickersForEmoji,\n groupChatMembers,\n currentUserId,\n usersById,\n lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n language,\n emojiKeywords,\n recentEmojis,\n sendMessage,\n editMessage,\n saveDraft,\n clearDraft,\n showError,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n closePaymentModal,\n openChat,\n clearReceipt,\n addRecentEmoji,\n loadEmojiKeywords,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n const [html, setHtml] = useState('');\n const lastMessageSendTimeSeconds = useRef();\n const prevDropAreaState = usePrevious(dropAreaState);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n const [\n scheduledMessageArgs, setScheduledMessageArgs,\n ] = useState();\n\n // Cache for frequently updated state\n const htmlRef = useRef(html);\n useEffect(() => {\n htmlRef.current = html;\n }, [html]);\n\n useEffect(() => {\n lastMessageSendTimeSeconds.current = undefined;\n }, [chatId]);\n\n useEffect(() => {\n if (chatId && lastSyncTime && threadId === MAIN_THREAD_ID) {\n loadScheduledHistory();\n }\n }, [chatId, loadScheduledHistory, lastSyncTime, threadId]);\n\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\n\n appendixRef.current.innerHTML = APPENDIX;\n }, []);\n\n useEffect(() => {\n if (contentToBeScheduled) {\n setScheduledMessageArgs(contentToBeScheduled);\n openCalendar();\n }\n }, [contentToBeScheduled, openCalendar]);\n\n const [attachments, setAttachments] = useState([]);\n\n const [isBotKeyboardOpen, openBotKeyboard, closeBotKeyboard] = useFlag();\n const [isAttachMenuOpen, openAttachMenu, closeAttachMenu] = useFlag();\n const [isSymbolMenuOpen, openSymbolMenu, closeSymbolMenu] = useFlag();\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isSymbolMenuLoaded, onSymbolMenuLoadingComplete] = useFlag();\n const [isHoverDisabled, disableHover, enableHover] = useFlag();\n\n const {\n startRecordingVoice,\n stopRecordingVoice,\n pauseRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef: mainButtonRef,\n startRecordTimeRef,\n } = useVoiceRecording();\n\n const mainButtonState = editingMessage\n ? MainButtonState.Edit\n : !IS_VOICE_RECORDING_SUPPORTED || activeVoiceRecording || (html && !attachments.length) || isForwarding\n ? MainButtonState.Send\n : MainButtonState.Record;\n const canShowCustomSendMenu = !shouldSchedule;\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredMembers,\n } = useMentionTooltip(\n canSuggestMembers && !attachments.length,\n html,\n setHtml,\n undefined,\n groupChatMembers,\n currentUserId,\n usersById,\n );\n\n const {\n isContextMenuOpen: isCustomSendMenuOpen,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n } = useContextMenuHandlers(mainButtonRef, !(mainButtonState === MainButtonState.Send && canShowCustomSendMenu));\n\n const allowedAttachmentOptions = useMemo(() => {\n return getAllowedAttachmentOptions(chat, isChatWithBot);\n }, [chat, isChatWithBot]);\n\n const isAdmin = chat && isChatAdmin(chat);\n const slowMode = getChatSlowModeOptions(chat);\n\n const { isStickerTooltipOpen, closeStickerTooltip } = useStickerTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n stickersForEmoji,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n recentEmojis,\n undefined,\n setHtml,\n emojiKeywords,\n );\n\n const insertTextAndUpdateCursor = useCallback((text: string, inputId: string = EDITABLE_INPUT_ID) => {\n const selection = window.getSelection()!;\n const messageInput = document.getElementById(inputId)!;\n const newHtml = renderText(text, ['escape_html', 'emoji_html', 'br_html'])\n .join('')\n .replace(/\\u200b+/g, '\\u200b');\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange)) {\n if (IS_EMOJI_SUPPORTED) {\n // Insertion will trigger `onChange` in MessageInput, so no need to setHtml in state\n document.execCommand('insertText', false, text);\n } else {\n insertHtmlInSelection(newHtml);\n messageInput.dispatchEvent(new Event('input', { bubbles: true }));\n }\n return;\n }\n }\n\n setHtml(`${htmlRef.current!}${newHtml}`);\n\n if (!IS_MOBILE_SCREEN) {\n // If selection is outside of input, set cursor at the end of input\n requestAnimationFrame(() => {\n focusEditableElement(messageInput);\n });\n }\n }, []);\n\n const removeSymbol = useCallback(() => {\n const selection = window.getSelection()!;\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange)) {\n document.execCommand('delete', false);\n return;\n }\n }\n\n setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!));\n }, []);\n\n const resetComposer = useCallback(() => {\n setHtml('');\n setAttachments([]);\n closeStickerTooltip();\n closeCalendar();\n setScheduledMessageArgs(undefined);\n closeMentionTooltip();\n closeEmojiTooltip();\n\n if (IS_MOBILE_SCREEN) {\n // @perf\n setTimeout(() => closeSymbolMenu(), SENDING_ANIMATION_DURATION);\n } else {\n closeSymbolMenu();\n }\n }, [closeStickerTooltip, closeCalendar, closeMentionTooltip, closeEmojiTooltip, closeSymbolMenu]);\n\n // Handle chat change\n const prevChatId = usePrevious(chatId);\n useEffect(() => {\n if (!prevChatId || chatId === prevChatId) {\n return;\n }\n\n stopRecordingVoice();\n resetComposer();\n }, [chatId, prevChatId, resetComposer, stopRecordingVoice]);\n\n const handleEditComplete = useEditing(htmlRef, setHtml, editingMessage, resetComposer, openDeleteModal, editMessage);\n useDraft(draft, chatId, threadId, html, htmlRef, setHtml, editingMessage, saveDraft, clearDraft);\n useClipboardPaste(insertTextAndUpdateCursor, setAttachments, editingMessage);\n\n const handleFileSelect = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments(await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))));\n }, []);\n\n const handleAppendFiles = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments([\n ...attachments,\n ...await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))),\n ]);\n }, [attachments]);\n\n const handleClearAttachment = useCallback(() => {\n setAttachments([]);\n }, []);\n\n const handleSend = useCallback(async (isSilent = false, scheduledAt?: number) => {\n if (connectionState !== 'connectionStateReady') {\n return;\n }\n\n let currentAttachments = attachments;\n\n if (activeVoiceRecording) {\n const record = await stopRecordingVoice();\n if (record) {\n const { blob, duration, waveform } = record;\n currentAttachments = [await buildAttachment(\n VOICE_RECORDING_FILENAME,\n blob,\n false,\n { voice: { duration, waveform } },\n )];\n }\n }\n\n const { text, entities } = parseMessageInput(htmlRef.current!);\n if (!currentAttachments.length && !text && !isForwarding) {\n return;\n }\n\n if (currentAttachments.length && text && text.length > CAPTION_MAX_LENGTH) {\n const extraLength = text.length - CAPTION_MAX_LENGTH;\n showError({\n error: {\n message: 'CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS',\n textParams: {\n '{EXTRA_CHARS_COUNT}': extraLength,\n '{PLURAL_S}': extraLength > 1 ? 's' : '',\n },\n },\n });\n return;\n }\n\n if (currentAttachments.length || text) {\n if (slowMode && !isAdmin) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const secondsSinceLastMessage = lastMessageSendTimeSeconds.current\n && Math.floor(nowSeconds - lastMessageSendTimeSeconds.current);\n const nextSendDateNotReached = slowMode.nextSendDate && slowMode.nextSendDate > nowSeconds;\n\n if (\n (secondsSinceLastMessage && secondsSinceLastMessage < slowMode.seconds)\n || nextSendDateNotReached\n ) {\n const secondsRemaining = nextSendDateNotReached\n ? slowMode.nextSendDate! - nowSeconds\n : slowMode.seconds - secondsSinceLastMessage!;\n showError({\n error: {\n message: `A wait of ${secondsRemaining} seconds is required before sending another message in this chat`,\n isSlowMode: true,\n },\n });\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n messageInput.blur();\n\n return;\n }\n }\n\n sendMessage({\n text,\n entities,\n attachments: currentAttachments,\n scheduledAt,\n isSilent,\n });\n }\n if (isForwarding) {\n forwardMessages();\n }\n\n lastMessageSendTimeSeconds.current = Math.floor(Date.now() / 1000);\n\n clearDraft({ chatId, localOnly: true });\n\n // Wait until message animation starts\n requestAnimationFrame(resetComposer);\n }, [\n activeVoiceRecording, attachments, connectionState, chatId, slowMode, isForwarding, isAdmin,\n sendMessage, stopRecordingVoice, resetComposer, clearDraft, showError, forwardMessages,\n ]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n if (shouldSchedule) {\n setScheduledMessageArgs({ sticker });\n openCalendar();\n } else {\n sendMessage({ sticker });\n requestAnimationFrame(resetComposer);\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handleGifSelect = useCallback((gif: ApiVideo) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ gif });\n openCalendar();\n } else {\n sendMessage({ gif });\n requestAnimationFrame(resetComposer);\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handlePollSend = useCallback((poll: ApiNewPoll) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ poll });\n closePollModal();\n openCalendar();\n } else {\n sendMessage({ poll });\n closePollModal();\n }\n }, [closePollModal, openCalendar, sendMessage, shouldSchedule]);\n\n const handleSilentSend = useCallback(() => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ isSilent: true });\n openCalendar();\n } else {\n handleSend(true);\n }\n }, [handleSend, openCalendar, shouldSchedule]);\n\n const handleMessageSchedule = useCallback((date: Date) => {\n const { isSilent, ...restArgs } = scheduledMessageArgs || {};\n\n // Scheduled time can not be less than 10 seconds in future\n const scheduledAt = Math.round(Math.max(date.getTime(), Date.now() + 60 * 1000) / 1000);\n\n if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) {\n handleSend(!!isSilent, scheduledAt);\n } else {\n sendMessage({\n ...scheduledMessageArgs,\n scheduledAt,\n });\n requestAnimationFrame(resetComposer);\n }\n closeCalendar();\n }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage]);\n\n const handleMessageScheduleUntilOnline = useCallback(() => {\n handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000));\n }, [handleMessageSchedule]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n setScheduledMessageArgs(undefined);\n }, [closeCalendar]);\n\n const handleSearchOpen = useCallback((type: 'stickers' | 'gifs') => {\n if (type === 'stickers') {\n setStickerSearchQuery({ query: '' });\n setGifSearchQuery({ query: undefined });\n } else {\n setGifSearchQuery({ query: '' });\n setStickerSearchQuery({ query: undefined });\n }\n }, [setStickerSearchQuery, setGifSearchQuery]);\n\n const handleSymbolMenuOpen = useCallback(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (!IS_MOBILE_SCREEN || messageInput !== document.activeElement) {\n openSymbolMenu();\n return;\n }\n\n messageInput.blur();\n setTimeout(() => {\n openSymbolMenu();\n }, MOBILE_KEYBOARD_HIDE_DELAY_MS);\n }, [openSymbolMenu]);\n\n const handleAllScheduledClick = useCallback(() => {\n openChat({ id: chatId, threadId, type: 'scheduled' });\n }, [openChat, chatId, threadId]);\n\n useEffect(() => {\n if (isRightColumnShown && IS_MOBILE_SCREEN) {\n closeSymbolMenu();\n }\n }, [isRightColumnShown, closeSymbolMenu]);\n\n useEffect(() => {\n if (isSelectModeActive) {\n disableHover();\n } else {\n setTimeout(() => {\n enableHover();\n }, SELECT_MODE_TRANSITION_MS);\n }\n }, [isSelectModeActive, enableHover, disableHover]);\n\n const mainButtonHandler = useCallback(() => {\n switch (mainButtonState) {\n case MainButtonState.Send:\n if (shouldSchedule) {\n if (activeVoiceRecording) {\n pauseRecordingVoice();\n }\n openCalendar();\n } else {\n handleSend();\n requestAnimationFrame(resetComposer);\n }\n break;\n case MainButtonState.Record:\n startRecordingVoice();\n break;\n case MainButtonState.Edit:\n handleEditComplete();\n break;\n default:\n break;\n }\n }, [\n mainButtonState, resetComposer, shouldSchedule, startRecordingVoice, handleEditComplete,\n activeVoiceRecording, openCalendar, pauseRecordingVoice, handleSend,\n ]);\n\n const lang = useLang();\n\n const areVoiceMessagesNotAllowed = mainButtonState === MainButtonState.Record\n && !allowedAttachmentOptions.canAttachMedia;\n\n const prevEditedMessage = usePrevious(editingMessage, true);\n const renderedEditedMessage = editingMessage || prevEditedMessage;\n\n const scheduledDefaultDate = new Date();\n scheduledDefaultDate.setSeconds(0);\n scheduledDefaultDate.setMilliseconds(0);\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n let sendButtonAriaLabel = 'SendMessage';\n switch (mainButtonState) {\n case MainButtonState.Edit:\n sendButtonAriaLabel = 'Save edited message';\n break;\n case MainButtonState.Record:\n sendButtonAriaLabel = areVoiceMessagesNotAllowed\n ? 'Conversation.DefaultRestrictedMedia'\n : 'AccDescrVoiceMessage';\n }\n\n const className = buildClassName(\n 'Composer',\n !isSelectModeActive && 'shown',\n isHoverDisabled && 'hover-disabled',\n );\n\n const symbolMenuButtonClassName = buildClassName(\n 'mobile-symbol-menu-button',\n isSymbolMenuLoaded\n ? (isSymbolMenuOpen && 'menu-opened')\n : (isSymbolMenuOpen && 'is-loading'),\n );\n\n return (\n
\n {allowedAttachmentOptions.canAttachMedia && (\n \n \n \n )}\n \n \n \n \n {renderedEditedMessage && (\n \n )}\n \n
\n
\n \n \n
\n {IS_MOBILE_SCREEN ? (\n \n \n \n \n \n ) : (\n \n \n \n )}\n \n {withScheduledButton && (\n \n \n \n )}\n {botKeyboardMessageId && !activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {!activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {activeVoiceRecording && currentRecordTime && (\n \n {formatVoiceRecordDuration(currentRecordTime - startRecordTimeRef.current!)}\n \n )}\n \n \n \n {botKeyboardMessageId && (\n \n )}\n \n
\n
\n {activeVoiceRecording && (\n \n \n \n )}\n \n \n \n \n \n {canShowCustomSendMenu && (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const chatUser = chat && selectChatUser(global, chat);\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const messageWithActualBotKeyboard = isChatWithBot && selectNewestMessageWithBotKeyboardButtons(global, chatId);\n const scheduledIds = selectScheduledIds(global, chatId);\n const { language } = global.settings.byKey;\n const emojiKeywords = selectEmojiKeywords(global, language);\n\n return {\n editingMessage: selectEditingMessage(global, chatId, threadId, messageListType),\n connectionState: global.connectionState,\n draft: selectDraft(global, chatId, threadId),\n chat,\n isChatWithBot,\n isChatWithSelf,\n canScheduleUntilOnline: (\n !isChatWithSelf && !isChatWithBot\n && (chat && chatUser && isChatPrivate(chatId) && chatUser.status && Boolean(chatUser.status.wasOnline))\n ),\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n withScheduledButton: (\n threadId === MAIN_THREAD_ID\n && messageListType === 'thread'\n && Boolean(scheduledIds && scheduledIds.length)\n ),\n shouldSchedule: messageListType === 'scheduled',\n botKeyboardMessageId: messageWithActualBotKeyboard ? messageWithActualBotKeyboard.id : undefined,\n isForwarding: chatId === global.forwardMessages.toChatId,\n canSuggestMembers: chat && isChatGroup(chat),\n isPollModalOpen: global.isPollModalOpen,\n stickersForEmoji: global.stickers.forEmoji.stickers,\n groupChatMembers: chat && chat.fullInfo && chat.fullInfo.members,\n currentUserId: global.currentUserId,\n usersById: global.users.byId,\n lastSyncTime: global.lastSyncTime,\n contentToBeScheduled: global.messages.contentToBeScheduled,\n isPaymentModalOpen: global.payment.isPaymentModalOpen,\n isReceiptModalOpen: Boolean(global.payment.receipt),\n shouldSuggestStickers: global.settings.byKey.shouldSuggestStickers,\n recentEmojis: global.recentEmojis,\n language,\n emojiKeywords: emojiKeywords ? emojiKeywords.keywords : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendMessage',\n 'editMessage',\n 'saveDraft',\n 'clearDraft',\n 'showError',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'forwardMessages',\n 'openPollModal',\n 'closePollModal',\n 'closePaymentModal',\n 'clearReceipt',\n 'loadScheduledHistory',\n 'openChat',\n 'addRecentEmoji',\n 'loadEmojiKeywords',\n ]),\n)(Composer));\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\n\nimport { IS_IOS } from '../../../../util/environment';\nimport * as voiceRecording from '../../../../util/voiceRecording';\nimport captureEscKeyListener from '../../../../util/captureEscKeyListener';\n\ntype ActiveVoiceRecording = { stop: () => Promise; pause: NoneToVoidFunction } | undefined;\n\nexport default () => {\n // eslint-disable-next-line no-null/no-null\n const recordButtonRef = useRef(null);\n const [activeVoiceRecording, setActiveVoiceRecording] = useState();\n const startRecordTimeRef = useRef();\n const [currentRecordTime, setCurrentRecordTime] = useState();\n\n useEffect(() => {\n // Preloading worker fixes silent first record on iOS\n if (IS_IOS) {\n void voiceRecording.init();\n }\n }, []);\n\n const startRecordingVoice = useCallback(async () => {\n try {\n const { stop, pause } = await voiceRecording.start((tickVolume: number) => {\n if (recordButtonRef.current) {\n if (startRecordTimeRef.current && Date.now() % 4 === 0) {\n recordButtonRef.current.style.boxShadow = `0 0 0 ${(tickVolume || 0) * 50}px rgba(0,0,0,.15)`;\n }\n setCurrentRecordTime(Date.now());\n }\n });\n startRecordTimeRef.current = Date.now();\n setCurrentRecordTime(Date.now());\n\n setActiveVoiceRecording({ stop, pause });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }, []);\n\n const pauseRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n\n try {\n return activeVoiceRecording!.pause();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n const stopRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n setActiveVoiceRecording(undefined);\n startRecordTimeRef.current = undefined;\n setCurrentRecordTime(undefined);\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n try {\n return activeVoiceRecording!.stop();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n useEffect(() => {\n return activeVoiceRecording ? captureEscKeyListener(stopRecordingVoice) : undefined;\n }, [activeVoiceRecording, stopRecordingVoice]);\n\n return {\n startRecordingVoice,\n pauseRecordingVoice,\n stopRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef,\n startRecordTimeRef,\n };\n};\n","import { useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nimport parseEmojiOnlyString from '../../../common/helpers/parseEmojiOnlyString';\n\nexport default function useStickerTooltip(\n isAllowed: boolean,\n html: string,\n stickers?: ApiSticker[],\n) {\n const { loadStickersForEmoji, clearStickersForEmoji } = getDispatch();\n const isSingleEmoji = (\n (IS_EMOJI_SUPPORTED && parseEmojiOnlyString(html) === 1)\n || (!IS_EMOJI_SUPPORTED && Boolean(html.match(/^]*?>$/g)))\n );\n const hasStickers = Boolean(stickers) && isSingleEmoji;\n\n useEffect(() => {\n if (isAllowed && isSingleEmoji) {\n loadStickersForEmoji({ emoji: html });\n } else if (hasStickers || !isSingleEmoji) {\n clearStickersForEmoji();\n }\n // We omit `hasStickers` here to prevent re-fetching after manually closing tooltip (via ).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [html, isSingleEmoji, clearStickersForEmoji, loadStickersForEmoji, isAllowed]);\n\n return {\n isStickerTooltipOpen: hasStickers,\n closeStickerTooltip: clearStickersForEmoji,\n };\n}\n","export default function insertHtmlInSelection(html: string) {\n const selection = window.getSelection();\n\n if (selection && selection.getRangeAt && selection.rangeCount) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n\n const fragment = range.createContextualFragment(html);\n const lastInsertedNode = fragment.lastChild;\n range.insertNode(fragment);\n if (lastInsertedNode) {\n range.setStartAfter(lastInsertedNode);\n range.setEndAfter(lastInsertedNode);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n}\n","export default function deleteLastCharacterOutsideSelection(html: string) {\n const tempInput = document.createElement('div');\n tempInput.contentEditable = 'true';\n tempInput.style.position = 'absolute';\n tempInput.style.left = '-10000px';\n tempInput.style.top = '-10000px';\n tempInput.innerHTML = html;\n document.body.appendChild(tempInput);\n let element = tempInput.lastChild!;\n\n if (element.lastChild) {\n // Selects the last and the deepest child of the element.\n while (element.lastChild) {\n element = element.lastChild;\n }\n }\n\n // Gets length of the element's content.\n const textLength = element.textContent!.length;\n const range = document.createRange();\n const selection = window.getSelection()!;\n\n // Sets selection position to the end of the element.\n range.setStart(element, textLength);\n range.setEnd(element, textLength);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('delete', false);\n\n const result = tempInput.innerHTML;\n document.body.removeChild(tempInput);\n\n return result;\n}\n","import { useCallback, useEffect } from '../../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport { hasMessageMedia } from '../../../../modules/helpers';\n\nexport default (\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n resetComposer: () => void,\n openDeleteModal: () => void,\n editMessage: GlobalActions['editMessage'],\n) => {\n // TODO useOnChange\n // Handle editing message\n useEffect(() => {\n if (!editedMessage) {\n setHtml('');\n return;\n }\n\n setHtml(getMessageTextAsHtml(editedMessage.content.text));\n\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }, [editedMessage, setHtml]);\n\n const handleEditComplete = useCallback(() => {\n const { text, entities } = parseMessageInput(htmlRef.current!);\n\n if (!editedMessage) {\n return;\n }\n\n if (!text && !hasMessageMedia(editedMessage)) {\n openDeleteModal();\n return;\n }\n\n editMessage({\n messageId: editedMessage.id,\n text,\n entities,\n });\n\n resetComposer();\n }, [editMessage, editedMessage, htmlRef, openDeleteModal, resetComposer]);\n\n return handleEditComplete;\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './MobileSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MobileSearchAsync: FC = (props) => {\n const { isActive } = props;\n const MobileSearch = useModuleLoader(Bundles.Extra, 'MobileSearch', !isActive, true);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MobileSearch ? : undefined;\n};\n\nexport default memo(MobileSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './MessageSelectToolbar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MessageSelectToolbarAsync: FC = (props) => {\n const { isActive } = props;\n const MessageSelectToolbar = useModuleLoader(Bundles.Extra, 'MessageSelectToolbar', !isActive);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MessageSelectToolbar ? : undefined;\n};\n\nexport default memo(MessageSelectToolbarAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './UnpinAllMessagesModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst UnpinAllMessagesModalAsync: FC = (props) => {\n const { isOpen } = props;\n const UnpinAllMessagesModal = useModuleLoader(Bundles.Extra, 'UnpinAllMessagesModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return UnpinAllMessagesModal ? : undefined;\n};\n\nexport default memo(UnpinAllMessagesModalAsync);\n","import React, {\n FC, useEffect, useState, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { ThemeKey } from '../../types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n ANIMATION_LEVEL_MAX,\n ANIMATION_END_DELAY,\n DARK_THEME_BG_COLOR,\n LIGHT_THEME_BG_COLOR,\n} from '../../config';\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV, MASK_IMAGE_DISABLED } from '../../util/environment';\nimport { DropAreaState } from './composer/DropArea';\nimport {\n selectChat,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectPinnedIds,\n} from '../../modules/selectors';\nimport { getCanPostInChat, getMessageSendingRestrictionReason, isChatPrivate } from '../../modules/helpers';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport useCustomBackground from '../../hooks/useCustomBackground';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport usePrevDuringAnimation from '../../hooks/usePrevDuringAnimation';\nimport calculateMiddleFooterTransforms from './helpers/calculateMiddleFooterTransforms';\nimport useLang from '../../hooks/useLang';\n\nimport Transition from '../ui/Transition';\nimport MiddleHeader from './MiddleHeader';\nimport MessageList from './MessageList';\nimport ScrollDownButton from './ScrollDownButton';\nimport Composer from './composer/Composer';\nimport Button from '../ui/Button';\nimport MobileSearch from './MobileSearch.async';\nimport MessageSelectToolbar from './MessageSelectToolbar.async';\nimport UnpinAllMessagesModal from '../common/UnpinAllMessagesModal.async';\n\nimport './MiddleColumn.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageListType?: MessageListType;\n isPrivate?: boolean;\n isPinnedMessageList?: boolean;\n canPost?: boolean;\n messageSendingRestrictionReason?: string;\n hasPinnedOrAudioMessage?: boolean;\n pinnedMessagesCount?: number;\n theme: ThemeKey;\n customBackground?: string;\n backgroundColor?: string;\n patternColor?: string;\n isRightColumnShown?: boolean;\n isBackgroundBlurred?: boolean;\n isMobileSearchActive?: boolean;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = IS_MOBILE_SCREEN ? 450 + ANIMATION_END_DELAY : undefined;\n\nfunction canBeQuicklyUploaded(item: DataTransferItem) {\n return item.kind === 'file' && item.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.includes(item.type);\n}\n\nconst MiddleColumn: FC = ({\n chatId,\n threadId,\n messageListType,\n isPrivate,\n isPinnedMessageList,\n canPost,\n messageSendingRestrictionReason,\n hasPinnedOrAudioMessage,\n pinnedMessagesCount,\n customBackground,\n theme,\n backgroundColor,\n patternColor,\n isRightColumnShown,\n isBackgroundBlurred,\n isMobileSearchActive,\n isSelectModeActive,\n animationLevel,\n openChat,\n unpinAllMessages,\n loadUser,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const [dropAreaState, setDropAreaState] = useState(DropAreaState.None);\n const [isFabShown, setIsFabShown] = useState();\n const [isNotchShown, setIsNotchShown] = useState();\n const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false);\n\n const hasTools = hasPinnedOrAudioMessage && (\n windowWidth < MOBILE_SCREEN_MAX_WIDTH\n || (\n isRightColumnShown && windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ) || (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n )\n );\n\n const renderingChatId = usePrevDuringAnimation(chatId, CLOSE_ANIMATION_DURATION);\n const renderingThreadId = usePrevDuringAnimation(threadId, CLOSE_ANIMATION_DURATION);\n const renderingMessageListType = usePrevDuringAnimation(messageListType, CLOSE_ANIMATION_DURATION);\n const renderingCanPost = usePrevDuringAnimation(canPost, CLOSE_ANIMATION_DURATION);\n const renderingHasTools = usePrevDuringAnimation(hasTools, CLOSE_ANIMATION_DURATION);\n const renderingIsFabShown = usePrevDuringAnimation(isFabShown, CLOSE_ANIMATION_DURATION);\n\n useEffect(() => {\n return chatId\n ? captureEscKeyListener(() => {\n openChat({ id: undefined });\n })\n : undefined;\n }, [chatId, openChat]);\n\n useEffect(() => {\n setDropAreaState(DropAreaState.None);\n setIsFabShown(undefined);\n setIsNotchShown(undefined);\n }, [chatId]);\n\n useEffect(() => {\n if (isPrivate) {\n loadUser({ userId: chatId });\n }\n }, [chatId, isPrivate, loadUser]);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n const { items } = e.dataTransfer || {};\n const shouldDrawQuick = items && Array.from(items).every(canBeQuicklyUploaded);\n\n setDropAreaState(shouldDrawQuick ? DropAreaState.QuickFile : DropAreaState.Document);\n }, []);\n\n const handleHideDropArea = useCallback(() => {\n setDropAreaState(DropAreaState.None);\n }, []);\n\n const handleOpenUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(true);\n }, []);\n\n const closeUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(false);\n }, []);\n\n const handleUnpinAllMessages = useCallback(() => {\n unpinAllMessages({ chatId });\n closeUnpinModal();\n openChat({ id: chatId });\n }, [unpinAllMessages, openChat, closeUnpinModal, chatId]);\n\n const customBackgroundValue = useCustomBackground(theme, customBackground);\n\n const className = buildClassName(\n renderingHasTools && 'has-header-tools',\n customBackground && 'custom-bg-image',\n backgroundColor && 'custom-bg-color',\n customBackground && isBackgroundBlurred && 'blurred',\n MASK_IMAGE_DISABLED ? 'mask-image-disabled' : 'mask-image-enabled',\n );\n\n const messagingDisabledClassName = buildClassName(\n 'messaging-disabled',\n !isSelectModeActive && 'shown',\n );\n\n // CSS Variables calculation doesn't work properly with transforms, so we calculate transform values in JS\n const {\n composerHiddenScale, toolbarHiddenScale,\n composerTranslateX, toolbarTranslateX,\n unpinHiddenScale, toolbarForUnpinHiddenScale,\n } = useMemo(\n () => calculateMiddleFooterTransforms(windowWidth, renderingCanPost),\n [renderingCanPost, windowWidth],\n );\n\n const lang = useLang();\n\n const footerClassName = buildClassName(\n 'middle-column-footer',\n !renderingCanPost && 'no-composer',\n renderingCanPost && isNotchShown && !isSelectModeActive && 'with-notch',\n );\n\n return (\n \n \n
\n {renderingChatId && renderingThreadId && (\n <>\n
\n \n \n {() => (\n <>\n \n
\n {renderingCanPost && (\n \n )}\n {isPinnedMessageList && (\n
\n \n \n {lang('Chat.Pinned.UnpinAll', pinnedMessagesCount, 'i')}\n \n
\n )}\n {!isPinnedMessageList && !renderingCanPost && messageSendingRestrictionReason && (\n
\n
\n \n {messageSendingRestrictionReason}\n \n
\n
\n )}\n \n
\n \n )}\n \n\n \n
\n {IS_MOBILE_SCREEN && }\n \n )}\n {chatId && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { theme } = global.settings.byKey;\n const {\n isBlurred: isBackgroundBlurred, background: customBackground, backgroundColor, patternColor,\n } = global.settings.themes[theme] || {};\n\n const currentMessageList = selectCurrentMessageList(global);\n const { chats: { listIds } } = global;\n\n const state: StateProps = {\n theme,\n customBackground,\n backgroundColor,\n patternColor,\n isRightColumnShown: selectIsRightColumnShown(global),\n isBackgroundBlurred,\n isMobileSearchActive: Boolean(IS_MOBILE_SCREEN && selectCurrentTextSearch(global)),\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n };\n\n if (!currentMessageList || !listIds.active) {\n return state;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const pinnedIds = selectPinnedIds(global, chatId);\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n\n const canPost = chat && getCanPostInChat(chat, threadId);\n const isBotNotStarted = selectIsChatBotNotStarted(global, chatId);\n const isPinnedMessageList = messageListType === 'pinned';\n\n return {\n ...state,\n chatId,\n threadId,\n messageListType,\n isPrivate: isChatPrivate(chatId),\n canPost: !isPinnedMessageList && (!chat || canPost) && (!isBotNotStarted || IS_MOBILE_SCREEN),\n isPinnedMessageList,\n messageSendingRestrictionReason: chat && getMessageSendingRestrictionReason(chat),\n hasPinnedOrAudioMessage: (\n threadId !== MAIN_THREAD_ID\n || Boolean(pinnedIds && pinnedIds.length)\n || Boolean(audioChatId && audioMessageId)\n ),\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser',\n ]),\n)(MiddleColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { ThemeKey } from '../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../config';\nimport * as cacheApi from '../util/cacheApi';\nimport { preloadImage } from '../util/files';\n\nexport default (theme: ThemeKey, settingValue?: string) => {\n const [value, setValue] = useState(settingValue);\n\n useEffect(() => {\n if (!settingValue) {\n return;\n }\n\n if (settingValue.startsWith('#')) {\n setValue(settingValue);\n } else {\n cacheApi.fetch(CUSTOM_BG_CACHE_NAME, theme, cacheApi.Type.Blob)\n .then((blob) => {\n const url = URL.createObjectURL(blob);\n preloadImage(url)\n .then(() => {\n setValue(`url(${url})`);\n });\n });\n }\n }, [settingValue, theme]);\n\n return settingValue ? value : undefined;\n};\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { debounce } from '../../util/schedulers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport {\n selectChat,\n selectCurrentGifSearch,\n selectCurrentStickerSearch,\n selectCurrentTextSearch,\n selectIsChatWithSelf,\n} from '../../modules/selectors';\nimport { isChatAdmin, isChatChannel, isChatPrivate } from '../../modules/helpers';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport useLang from '../../hooks/useLang';\n\nimport SearchInput from '../ui/SearchInput';\nimport Button from '../ui/Button';\nimport Transition from '../ui/Transition';\nimport './RightHeader.scss';\nimport { getDayStartAt } from '../../util/dateFormat';\n\ntype OwnProps = {\n chatId?: number;\n isColumnOpen?: boolean;\n isProfile?: boolean;\n isSearch?: boolean;\n isManagement?: boolean;\n isStickerSearch?: boolean;\n isGifSearch?: boolean;\n isPollResults?: boolean;\n profileState?: ProfileState;\n managementScreen?: ManagementScreens;\n onClose: () => void;\n};\n\ntype StateProps = {\n canManage?: boolean;\n isChannel?: boolean;\n messageSearchQuery?: string;\n stickerSearchQuery?: string;\n gifSearchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nenum HeaderContent {\n Profile,\n MemberList,\n SharedMedia,\n Search,\n Management,\n ManageInitial,\n ManageChannelSubscribers,\n ManageChatAdministrators,\n ManageChatPrivacyType,\n ManageDiscussion,\n ManageGroupPermissions,\n ManageGroupRemovedUsers,\n ManageGroupUserPermissionsCreate,\n ManageGroupUserPermissions,\n ManageGroupRecentActions,\n ManageGroupAdminRights,\n ManageGroupMembers,\n StickerSearch,\n GifSearch,\n PollResults,\n}\n\nconst RightHeader: FC = ({\n isColumnOpen,\n isProfile,\n isSearch,\n isManagement,\n isStickerSearch,\n isGifSearch,\n isPollResults,\n profileState,\n managementScreen,\n canManage,\n isChannel,\n onClose,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n setLocalTextSearchQuery,\n setStickerSearchQuery,\n setGifSearchQuery,\n searchTextMessagesLocal,\n toggleManagement,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backButtonRef = useRef(null);\n\n const handleMessageSearchQueryChange = useCallback((query: string) => {\n setLocalTextSearchQuery({ query });\n\n if (query.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleStickerSearchQueryChange = useCallback((query: string) => {\n setStickerSearchQuery({ query });\n }, [setStickerSearchQuery]);\n\n const handleGifSearchQueryChange = useCallback((query: string) => {\n setGifSearchQuery({ query });\n }, [setGifSearchQuery]);\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isColumnOpen);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isColumnOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isColumnOpen]);\n\n const lang = useLang();\n const contentKey = isProfile ? (\n profileState === ProfileState.Profile ? (\n HeaderContent.Profile\n ) : profileState === ProfileState.SharedMedia ? (\n HeaderContent.SharedMedia\n ) : profileState === ProfileState.MemberList ? (\n HeaderContent.MemberList\n ) : -1 // Never reached\n ) : isSearch ? (\n HeaderContent.Search\n ) : isPollResults ? (\n HeaderContent.PollResults\n ) : isStickerSearch ? (\n HeaderContent.StickerSearch\n ) : isGifSearch ? (\n HeaderContent.GifSearch\n ) : isManagement ? (\n managementScreen === ManagementScreens.Initial ? (\n HeaderContent.ManageInitial\n ) : managementScreen === ManagementScreens.ChatPrivacyType ? (\n HeaderContent.ManageChatPrivacyType\n ) : managementScreen === ManagementScreens.Discussion ? (\n HeaderContent.ManageDiscussion\n ) : managementScreen === ManagementScreens.ChannelSubscribers ? (\n HeaderContent.ManageChannelSubscribers\n ) : managementScreen === ManagementScreens.GroupPermissions ? (\n HeaderContent.ManageGroupPermissions\n ) : managementScreen === ManagementScreens.ChatAdministrators ? (\n HeaderContent.ManageChatAdministrators\n ) : managementScreen === ManagementScreens.GroupRemovedUsers ? (\n HeaderContent.ManageGroupRemovedUsers\n ) : managementScreen === ManagementScreens.GroupUserPermissionsCreate ? (\n HeaderContent.ManageGroupUserPermissionsCreate\n ) : managementScreen === ManagementScreens.GroupUserPermissions ? (\n HeaderContent.ManageGroupUserPermissions\n ) : managementScreen === ManagementScreens.GroupRecentActions ? (\n HeaderContent.ManageGroupRecentActions\n ) : managementScreen === ManagementScreens.ChatAdminRights ? (\n HeaderContent.ManageGroupAdminRights\n ) : managementScreen === ManagementScreens.GroupMembers ? (\n HeaderContent.ManageGroupMembers\n ) : undefined // Never reached\n ) : undefined; // When column is closed\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true) ?? -1;\n\n function renderHeaderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case HeaderContent.PollResults:\n return

{lang('PollResults')}

;\n case HeaderContent.Search:\n return (\n <>\n \n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n \n );\n case HeaderContent.ManageInitial:\n return

{lang('Edit')}

;\n case HeaderContent.ManageChatPrivacyType:\n return

{lang(isChannel ? 'ChannelTypeHeader' : 'GroupTypeHeader')}

;\n case HeaderContent.ManageDiscussion:\n return

{lang('Discussion')}

;\n case HeaderContent.ManageChatAdministrators:\n return

{lang('ChannelAdministrators')}

;\n case HeaderContent.ManageGroupRecentActions:\n return

{lang('Group.Info.AdminLog')}

;\n case HeaderContent.ManageGroupAdminRights:\n return

{lang('EditAdminRights')}

;\n case HeaderContent.ManageGroupPermissions:\n return

{lang('ChannelPermissions')}

;\n case HeaderContent.ManageGroupRemovedUsers:\n return

{lang('ChannelBlockedUsers')}

;\n case HeaderContent.ManageGroupUserPermissionsCreate:\n return

{lang('ChannelAddException')}

;\n case HeaderContent.ManageGroupUserPermissions:\n return

{lang('UserRestrictions')}

;\n case HeaderContent.StickerSearch:\n return (\n \n );\n case HeaderContent.GifSearch:\n return (\n \n );\n case HeaderContent.SharedMedia:\n return

{lang('SharedMedia')}

;\n case HeaderContent.ManageChannelSubscribers:\n return

{lang('ChannelSubscribers')}

;\n case HeaderContent.MemberList:\n case HeaderContent.ManageGroupMembers:\n return

{lang('GroupMembers')}

;\n default:\n return (\n <>\n

Profile

\n
\n {canManage && (\n \n \n \n )}\n
\n \n );\n }\n }\n\n const isBackButton = (\n IS_MOBILE_SCREEN\n || contentKey === HeaderContent.SharedMedia\n || contentKey === HeaderContent.MemberList\n || isManagement\n );\n\n const buttonClassName = buildClassName(\n 'animated-close-icon',\n shouldSkipTransition && 'no-transition',\n );\n\n // Add class in the next AF to synchronize with animation with Transition components\n useEffect(() => {\n backButtonRef.current!.classList.toggle('state-back', isBackButton);\n }, [isBackButton]);\n\n return (\n
\n \n
\n \n \n {renderHeaderContent}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, isProfile, isManagement }): StateProps => {\n const { query: messageSearchQuery } = selectCurrentTextSearch(global) || {};\n const { query: stickerSearchQuery } = selectCurrentStickerSearch(global) || {};\n const { query: gifSearchQuery } = selectCurrentGifSearch(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChannel = chat && isChatChannel(chat);\n\n const canManage = Boolean(\n !isManagement\n && isProfile\n && chat\n && !selectIsChatWithSelf(global, chat.id)\n // chat.isCreator is for Basic Groups\n && (isChatPrivate(chat.id) || ((isChatAdmin(chat) || chat.isCreator) && !chat.isNotJoined)),\n );\n\n return {\n canManage,\n isChannel,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'searchTextMessagesLocal',\n 'toggleManagement',\n 'openHistoryCalendar',\n ]),\n)(RightHeader));\n","import { useMemo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiChatMember, ApiMessage, ApiUser } from '../../../api/types';\nimport { ProfileTabType, SharedMediaType } from '../../../types';\n\nimport { MEMBERS_SLICE, MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { getMessageContentIds, sortUserIds } from '../../../modules/helpers';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nexport default function useProfileViewportIds(\n isRightColumnShown: boolean,\n loadMoreMembers: AnyToVoidFunction,\n searchMessages: AnyToVoidFunction,\n tabType: ProfileTabType,\n mediaSearchType?: SharedMediaType,\n groupChatMembers?: ApiChatMember[],\n usersById?: Record,\n chatMessages?: Record,\n foundIds?: number[],\n chatId?: number,\n lastSyncTime?: number,\n) {\n const resultType = tabType === 'members' || !mediaSearchType ? tabType : mediaSearchType;\n\n const memberIds = useMemo(() => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return sortUserIds(groupChatMembers.map(({ userId }) => userId), usersById);\n }, [groupChatMembers, usersById]);\n\n const [memberViewportIds, getMoreMembers, noProfileInfoForMembers] = useInfiniteScrollForMembers(\n resultType, loadMoreMembers, lastSyncTime, memberIds,\n );\n\n const [mediaViewportIds, getMoreMedia, noProfileInfoForMedia] = useInfiniteScrollForSharedMedia(\n 'media', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [documentViewportIds, getMoreDocuments, noProfileInfoForDocuments] = useInfiniteScrollForSharedMedia(\n 'documents', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [linkViewportIds, getMoreLinks, noProfileInfoForLinks] = useInfiniteScrollForSharedMedia(\n 'links', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [audioViewportIds, getMoreAudio, noProfileInfoForAudio] = useInfiniteScrollForSharedMedia(\n 'audio', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n let viewportIds: number[] | undefined;\n let getMore: AnyToVoidFunction | undefined;\n let noProfileInfo = false;\n\n switch (resultType) {\n case 'members':\n viewportIds = memberViewportIds;\n getMore = getMoreMembers;\n noProfileInfo = noProfileInfoForMembers;\n break;\n case 'media':\n viewportIds = mediaViewportIds;\n getMore = getMoreMedia;\n noProfileInfo = noProfileInfoForMedia;\n break;\n case 'documents':\n viewportIds = documentViewportIds;\n getMore = getMoreDocuments;\n noProfileInfo = noProfileInfoForDocuments;\n break;\n case 'links':\n viewportIds = linkViewportIds;\n getMore = getMoreLinks;\n noProfileInfo = noProfileInfoForLinks;\n break;\n case 'audio':\n viewportIds = audioViewportIds;\n getMore = getMoreAudio;\n noProfileInfo = noProfileInfoForAudio;\n break;\n }\n\n return [resultType, viewportIds, getMore, noProfileInfo] as const;\n}\n\nfunction useInfiniteScrollForMembers(\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n memberIds?: number[],\n) {\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n memberIds,\n undefined,\n MEMBERS_SLICE,\n );\n\n const isOnTop = !viewportIds || !memberIds || viewportIds[0] === memberIds[0];\n\n return [viewportIds, getMore, !isOnTop] as const;\n}\n\nfunction useInfiniteScrollForSharedMedia(\n forSharedMediaType: SharedMediaType,\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n chatMessages?: Record,\n foundIds?: number[],\n) {\n const messageIdsRef = useRef();\n\n useOnChange(() => {\n if (currentResultType === forSharedMediaType && chatMessages && foundIds) {\n messageIdsRef.current = getMessageContentIds(\n chatMessages,\n foundIds,\n forSharedMediaType,\n ).reverse();\n }\n }, [chatMessages, foundIds, currentResultType, forSharedMediaType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n messageIdsRef.current,\n undefined,\n forSharedMediaType === 'media' ? SHARED_MEDIA_SLICE : MESSAGE_SEARCH_SLICE,\n );\n\n const isOnTop = !viewportIds || !messageIdsRef.current || viewportIds[0] === messageIdsRef.current[0];\n\n return [viewportIds, getMore, !isOnTop] as const;\n}\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nimport { ProfileState } from '../../../types';\n\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport { throttle } from '../../../util/schedulers';\nimport useEffectWithPrevDeps from '../../../hooks/useEffectWithPrevDeps';\n\nconst TRANSITION_DURATION = 300;\nconst PROGRAMMATIC_SCROLL_TIMEOUT_MS = 350;\n\nconst runThrottledForScroll = throttle((cb) => cb(), 250, false);\n\nlet isScrollingProgrammatically = false;\n\nexport default function useProfileState(\n containerRef: { current: HTMLDivElement | null },\n tabType: string,\n profileState: ProfileState,\n onProfileStateChange: (state: ProfileState) => void,\n) {\n // Scroll to tabs if needed\n useEffectWithPrevDeps(([prevTabType]) => {\n if (prevTabType && prevTabType !== tabType) {\n const container = containerRef.current!;\n const tabsEl = container.querySelector('.TabList')!;\n if (container.scrollTop < tabsEl.offsetTop) {\n onProfileStateChange(tabType === 'members' ? ProfileState.MemberList : ProfileState.SharedMedia);\n isScrollingProgrammatically = true;\n fastSmoothScroll(container, tabsEl, 'start', undefined, undefined, undefined, TRANSITION_DURATION);\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n }\n }\n }, [tabType, onProfileStateChange]);\n\n // Scroll to top\n useEffectWithPrevDeps(([prevProfileState]) => {\n if (profileState !== ProfileState.Profile || profileState === prevProfileState) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl || tabListEl.offsetTop > container.scrollTop) {\n return;\n }\n\n isScrollingProgrammatically = true;\n fastSmoothScroll(\n container,\n container.firstElementChild as HTMLElement,\n 'start',\n undefined,\n container.offsetHeight * 2,\n );\n\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n\n onProfileStateChange(profileState);\n }, [profileState]);\n\n const determineProfileState = useCallback(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl) {\n return;\n }\n\n let state: ProfileState = ProfileState.Profile;\n if (container.scrollTop >= tabListEl.offsetTop) {\n state = tabType === 'members'\n ? ProfileState.MemberList\n : ProfileState.SharedMedia;\n }\n\n onProfileStateChange(state);\n }, [containerRef, onProfileStateChange, tabType]);\n\n // Determine profile state when switching tabs\n useEffect(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n determineProfileState();\n }, [determineProfileState, tabType]);\n\n // Determine profile state when scrolling\n const handleScroll = useCallback(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n runThrottledForScroll(determineProfileState);\n }, [determineProfileState]);\n\n return { handleScroll };\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport {\n ApiUser, ApiChat, ApiMediaFormat, ApiPhoto,\n} from '../../api/types';\n\nimport {\n getChatAvatarHash, isDeletedUser, getUserColorKey, getChatTitle, isChatPrivate, getUserFullName,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport { getFirstLetters } from '../../util/textFormat';\nimport useMedia from '../../hooks/useMedia';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ProfilePhoto.scss';\n\ntype OwnProps = {\n chat?: ApiChat;\n user?: ApiUser;\n isFirstPhoto?: boolean;\n isSavedMessages?: boolean;\n photo?: ApiPhoto;\n lastSyncTime?: number;\n onClick: NoneToVoidFunction;\n};\n\nconst ProfilePhoto: FC = ({\n chat,\n user,\n photo,\n isFirstPhoto,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const lang = useLang();\n const isDeleted = user && isDeletedUser(user);\n\n function getMediaHash(size: 'normal' | 'big' = 'big', forceAvatar?: boolean) {\n if (photo && !forceAvatar) {\n return `photo${photo.id}?size=c`;\n }\n\n let hash: string | undefined;\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n hash = getChatAvatarHash(user, size);\n } else if (chat) {\n hash = getChatAvatarHash(chat, size);\n }\n }\n\n return hash;\n }\n\n const imageHash = getMediaHash();\n const fullMediaData = useMedia(imageHash, false, ApiMediaFormat.BlobUrl, lastSyncTime);\n const avatarThumbnailData = useMedia(\n !fullMediaData && isFirstPhoto ? getMediaHash('normal', true) : undefined,\n false,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n const thumbDataUri = useBlurSync(!fullMediaData && photo && photo.thumbnail && photo.thumbnail.dataUri);\n const imageSrc = fullMediaData || avatarThumbnailData || thumbDataUri;\n const prevImageSrc = usePrevious(imageSrc);\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (imageSrc) {\n content = \"\";\n } else if (!imageSrc && user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (!imageSrc && chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isChatPrivate(chat.id) ? 2 : 1);\n } else {\n content = (\n
\n \n
\n );\n }\n\n const fullClassName = buildClassName(\n 'ProfilePhoto',\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n (!isSavedMessages && !(imageSrc)) && 'no-photo',\n );\n\n return (\n
\n {prevImageSrc && imageSrc && prevImageSrc !== imageSrc && (\n \"\"\n )}\n {typeof content === 'string' ? renderText(content, ['hq_emoji']) : content}\n
\n );\n};\n\nexport default memo(ProfilePhoto);\n","import React, {\n FC, useEffect, useCallback, memo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport {\n getUserFullName, getUserStatus, isChatChannel, isUserOnline,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport usePhotosPreload from './hooks/usePhotosPreload';\nimport useLang from '../../hooks/useLang';\n\nimport VerifiedIcon from '../common/VerifiedIcon';\nimport ProfilePhoto from './ProfilePhoto';\nimport Transition from '../ui/Transition';\n\nimport './ProfileInfo.scss';\n\ntype OwnProps = {\n userId: number;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n isSavedMessages?: boolean;\n animationLevel: 0 | 1 | 2;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n user,\n chat,\n isSavedMessages,\n lastSyncTime,\n animationLevel,\n loadFullUser,\n openMediaViewer,\n}) => {\n const { id: userId } = user || {};\n const { id: chatId } = chat || {};\n const fullName = user ? getUserFullName(user) : (chat ? chat.title : '');\n const photos = (user ? user.photos : (chat ? chat.photos : undefined)) || [];\n const slideAnimation = animationLevel >= 1 ? 'slide' : 'none';\n\n const [currentPhotoIndex, setCurrentPhotoIndex] = useState(0);\n const isFirst = isSavedMessages || photos.length <= 1 || currentPhotoIndex === 0;\n const isLast = isSavedMessages || photos.length <= 1 || currentPhotoIndex === photos.length - 1;\n\n // Deleting the last profile photo may result in an error\n useEffect(() => {\n if (currentPhotoIndex > photos.length) {\n setCurrentPhotoIndex(Math.max(0, photos.length - 1));\n }\n }, [currentPhotoIndex, photos.length]);\n\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime]);\n\n usePhotosPreload(user || chat, photos, currentPhotoIndex);\n\n const handleProfilePhotoClick = useCallback(() => {\n openMediaViewer({\n avatarOwnerId: userId || chatId,\n profilePhotoIndex: currentPhotoIndex,\n origin: MediaViewerOrigin.ProfileAvatar,\n });\n }, [openMediaViewer, userId, chatId, currentPhotoIndex]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n setCurrentPhotoIndex(currentPhotoIndex - 1);\n }, [currentPhotoIndex, isFirst]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n setCurrentPhotoIndex(currentPhotoIndex + 1);\n }, [currentPhotoIndex, isLast]);\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector(\n '.profile-slide-container > .active, .profile-slide-container > .to',\n );\n if (!element) {\n return undefined;\n }\n\n return captureEvents(element, {\n excludedClosestSelector: '.navigation',\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n }\n } : undefined,\n });\n }, [selectNextMedia, selectPreviousMedia]);\n\n if (!user && !chat) {\n return undefined;\n }\n\n function renderPhotoTabs() {\n if (isSavedMessages || !photos || photos.length <= 1) {\n return undefined;\n }\n\n return (\n
\n {photos.map((_, i) => (\n \n ))}\n
\n );\n }\n\n function renderPhoto() {\n const photo = !isSavedMessages && photos && photos.length > 0 ? photos[currentPhotoIndex] : undefined;\n\n return (\n \n );\n }\n\n function renderStatus() {\n if (user) {\n return (\n
\n {getUserStatus(lang, user)}\n
\n );\n }\n\n return (\n {\n isChatChannel(chat!)\n ? lang('Subscribers', chat!.membersCount, 'i')\n : lang('Members', chat!.membersCount, 'i')\n }\n \n );\n }\n\n const isVerifiedIconShown = (user && user.isVerified) || (chat && chat.isVerified);\n\n return (\n
\n
\n {renderPhotoTabs()}\n \n {renderPhoto}\n \n\n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n
\n\n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {isVerifiedIconShown && }\n
\n )}\n {!isSavedMessages && renderStatus()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { lastSyncTime } = global;\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const { animationLevel } = global.settings.byKey;\n\n return {\n lastSyncTime, user, chat, isSavedMessages, animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import {\n ApiChat, ApiMediaFormat, ApiPhoto, ApiUser,\n} from '../../../api/types';\nimport { useEffect } from '../../../lib/teact/teact';\nimport * as mediaLoader from '../../../util/mediaLoader';\n\nconst PHOTOS_TO_PRELOAD = 4;\n\nexport default function usePhotosPreload(\n profile: ApiUser | ApiChat | undefined,\n photos: ApiPhoto[],\n currentIndex: number,\n) {\n useEffect(() => {\n photos.slice(currentIndex, currentIndex + PHOTOS_TO_PRELOAD).forEach((photo) => {\n const mediaData = mediaLoader.getFromMemory(`photo${photo.id}?size=c`);\n if (!mediaData) {\n mediaLoader.fetch(`photo${photo.id}?size=c`, ApiMediaFormat.BlobUrl);\n }\n });\n }, [currentIndex, photos]);\n}\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isChatPrivate, isUserRightBanned,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport { copyTextToClipboard } from '../../util/clipboard';\nimport { formatPhoneNumberWithCode } from '../../util/phoneNumber';\nimport useLang from '../../hooks/useLang';\n\nimport SafeLink from '../common/SafeLink';\nimport ListItem from '../ui/ListItem';\nimport Switcher from '../ui/Switcher';\n\ntype OwnProps = {\n chatOrUserId: number;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n canInviteUsers?: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst ChatExtra: FC = ({\n lastSyncTime,\n user,\n chat,\n forceShowSelf,\n canInviteUsers,\n loadFullUser,\n showNotification,\n updateChatMutedState,\n}) => {\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n const {\n id: chatId,\n isMuted: currentIsMuted,\n username: chatUsername,\n } = chat || {};\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [loadFullUser, userId, lastSyncTime]);\n\n const handleNotificationChange = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !currentIsMuted });\n }, [chatId, currentIsMuted, updateChatMutedState]);\n\n if (!chat || chat.isRestricted || (isSelf && !forceShowSelf)) {\n return undefined;\n }\n\n function copy(text: string, entity: string) {\n copyTextToClipboard(text);\n showNotification({ message: `${entity} was copied` });\n }\n\n const formattedNumber = phoneNumber && formatPhoneNumberWithCode(phoneNumber);\n const link = getChatLink(chat);\n const url = link.indexOf('http') === 0 ? link : `http://${link}`;\n const printedUsername = username || chatUsername;\n const description = (fullInfo && fullInfo.bio) || getChatDescription(chat);\n\n return (\n
\n {formattedNumber && !!formattedNumber.length && (\n copy(formattedNumber, lang('Phone'))}>\n {formattedNumber}\n {lang('Phone')}\n \n )}\n {printedUsername && (\n copy(`@${printedUsername}`, lang('Username'))}\n >\n {renderText(printedUsername)}\n {lang('Username')}\n \n )}\n {description && !!description.length && (\n \n \n {renderText(description, ['br', 'links', 'emoji'])}\n \n {lang(userId ? 'UserBio' : 'Info')}\n \n )}\n {canInviteUsers && !printedUsername && !!link.length && (\n copy(link, lang('SetUrlPlaceholder'))}>\n
\n \n
\n {lang('SetUrlPlaceholder')}\n
\n )}\n \n {lang('Notifications')}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n const { lastSyncTime } = global;\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isChatPrivate(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n\n const canInviteUsers = chat && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return {\n lastSyncTime, chat, user, canInviteUsers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadFullUser', 'updateChatMutedState', 'showNotification',\n ]),\n)(ChatExtra));\n","import React, {\n FC, useCallback, useEffect, useMemo, useRef, useState, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiMessage,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport {\n MediaViewerOrigin, ProfileState, ProfileTabType, SharedMediaType,\n} from '../../types';\n\nimport {\n MEMBERS_SLICE,\n PROFILE_SENSITIVE_AREA,\n SHARED_MEDIA_SLICE,\n SLIDE_TRANSITION_DURATION,\n} from '../../config';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n isChatAdmin, isChatChannel, isChatGroup, isChatPrivate,\n} from '../../modules/helpers';\nimport {\n selectChatMessages,\n selectChat,\n selectCurrentMediaSearch,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport useCacheBuster from '../../hooks/useCacheBuster';\nimport useProfileViewportIds from './hooks/useProfileViewportIds';\nimport useProfileState from './hooks/useProfileState';\nimport useTransitionFixes from './hooks/useTransitionFixes';\nimport useAsyncRendering from './hooks/useAsyncRendering';\nimport useLang from '../../hooks/useLang';\n\nimport Transition from '../ui/Transition';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport TabList from '../ui/TabList';\nimport Spinner from '../ui/Spinner';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport ProfileInfo from './ProfileInfo';\nimport Document from '../common/Document';\nimport Audio from '../common/Audio';\nimport ChatExtra from './ChatExtra';\nimport Media from '../common/Media';\nimport WebLink from '../common/WebLink';\nimport NothingFound from '../common/NothingFound';\n\nimport './Profile.scss';\n\ntype OwnProps = {\n chatId: number;\n userId?: number;\n profileState: ProfileState;\n onProfileStateChange: (state: ProfileState) => void;\n};\n\ntype StateProps = {\n isChannel?: boolean;\n resolvedUserId?: number;\n chatMessages?: Record;\n foundIds?: number[];\n mediaSearchType?: SharedMediaType;\n hasMembersTab?: boolean;\n areMembersHidden?: boolean;\n members?: ApiChatMember[];\n usersById?: Record;\n isRightColumnShown: boolean;\n isRestricted?: boolean;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: 'media', title: 'SharedMediaTab2' },\n { type: 'documents', title: 'SharedFilesTab2' },\n { type: 'links', title: 'SharedLinksTab2' },\n { type: 'audio', title: 'SharedMusicTab2' },\n];\n\nconst HIDDEN_RENDER_DELAY = 1000;\n\nconst Profile: FC = ({\n chatId,\n profileState,\n onProfileStateChange,\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n members,\n usersById,\n isRightColumnShown,\n isRestricted,\n lastSyncTime,\n setLocalMediaSearchType,\n loadMoreMembers,\n searchMediaMessagesLocal,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n focusMessage,\n loadProfilePhotos,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(0);\n\n const tabs = useMemo(() => ([\n ...(hasMembersTab ? [{\n type: 'members', title: isChannel ? 'ChannelSubscribers' : 'GroupMembers',\n }] : []),\n ...TABS,\n ]), [hasMembersTab, isChannel]);\n const tabType = tabs[activeTab].type as ProfileTabType;\n\n const [resultType, viewportIds, getMore, noProfileInfo] = useProfileViewportIds(\n isRightColumnShown, loadMoreMembers, searchMediaMessagesLocal, tabType, mediaSearchType, members,\n usersById, chatMessages, foundIds, chatId, lastSyncTime,\n );\n const activeKey = tabs.findIndex(({ type }) => type === resultType);\n\n const { handleScroll } = useProfileState(containerRef, tabType, profileState, onProfileStateChange);\n\n const { applyTransitionFix, releaseTransitionFix } = useTransitionFixes(containerRef);\n\n const [cacheBuster, resetCacheBuster] = useCacheBuster();\n\n const handleTransitionStop = useCallback(() => {\n releaseTransitionFix();\n resetCacheBuster();\n }, [releaseTransitionFix, resetCacheBuster]);\n\n // Update search type when switching tabs\n useEffect(() => {\n setLocalMediaSearchType({ mediaType: tabType });\n }, [setLocalMediaSearchType, tabType]);\n\n const profileId = resolvedUserId || chatId;\n\n useEffect(() => {\n if (lastSyncTime) {\n loadProfilePhotos({ profileId });\n }\n }, [loadProfilePhotos, profileId, lastSyncTime]);\n\n const handleSelectMedia = useCallback((messageId: number) => {\n openMediaViewer({\n chatId: profileId,\n threadId: MAIN_THREAD_ID,\n messageId,\n origin: MediaViewerOrigin.SharedMedia,\n });\n }, [profileId, openMediaViewer]);\n\n const handlePlayAudio = useCallback((messageId: number) => {\n openAudioPlayer({ chatId: profileId, messageId });\n }, [profileId, openAudioPlayer]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n const handleMessageFocus = useCallback((messageId: number) => {\n focusMessage({ chatId: profileId, messageId });\n }, [profileId, focusMessage]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveTab(Math.min(activeTab + 1, tabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n }\n }),\n });\n }, [activeTab, tabs.length]);\n\n let renderingDelay;\n const isFirstTab = resultType === 'members' || (!hasMembersTab && resultType === 'media');\n // @optimization Used to unparallelize rendering of message list and profile media\n if (isFirstTab) {\n renderingDelay = !isRightColumnShown ? HIDDEN_RENDER_DELAY : 0;\n // @optimization Used to delay first render of secondary tabs while animating\n } else if (!viewportIds) {\n renderingDelay = SLIDE_TRANSITION_DURATION;\n }\n const canRenderContents = useAsyncRendering([chatId, resultType], renderingDelay);\n\n function renderSharedMedia() {\n if (!viewportIds || !canRenderContents || !chatMessages) {\n // This is just a single-frame delay so we do not show spinner\n const noSpinner = isFirstTab && viewportIds && !canRenderContents;\n\n return (\n
\n {!noSpinner && }\n
\n );\n }\n\n if (!viewportIds.length) {\n let text: string;\n\n switch (resultType) {\n case 'members':\n text = areMembersHidden ? 'You have no access to group members list.' : 'No members found';\n break;\n case 'documents':\n text = lang('lng_media_file_empty_search');\n break;\n case 'links':\n text = lang('lng_media_link_empty_search');\n break;\n case 'audio':\n text = lang('lng_media_song_empty_search');\n break;\n default:\n text = lang('SharedMedia.EmptyTitle');\n }\n\n return (\n
\n \n
\n );\n }\n\n return (\n \n {resultType === 'media' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'documents' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'links' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'audio' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'members' ? (\n viewportIds!.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : undefined}\n
\n );\n }\n\n return (\n \n {!noProfileInfo && renderProfileInfo(chatId, resolvedUserId)}\n {!isRestricted && (\n
\n \n {renderSharedMedia}\n \n \n
\n )}\n \n );\n};\n\nfunction renderProfileInfo(chatId: number, resolvedUserId?: number) {\n return (\n
\n \n \n
\n );\n}\n\nfunction buildInfiniteScrollItemSelector(resultType: string) {\n return [\n // Used on first render\n `.shared-media-transition > div:only-child > .${resultType}-list > .scroll-item`,\n // Used after transition\n `.shared-media-transition > div.active > .${resultType}-list > .scroll-item`,\n ].join(', ');\n}\n\nexport default memo(withGlobal(\n (global, { chatId, userId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n const chatMessages = selectChatMessages(global, userId || chatId);\n const { currentType: mediaSearchType, resultsByType } = selectCurrentMediaSearch(global) || {};\n const { foundIds } = (resultsByType && mediaSearchType && resultsByType[mediaSearchType]) || {};\n\n const { byId: usersById } = global.users;\n\n const isGroup = chat && isChatGroup(chat);\n const isChannel = chat && isChatChannel(chat);\n const hasMembersTab = isGroup || (isChannel && isChatAdmin(chat!));\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const areMembersHidden = hasMembersTab && chat && chat.fullInfo && !chat.fullInfo.canViewMembers;\n\n let resolvedUserId;\n if (userId) {\n resolvedUserId = userId;\n } else if (isChatPrivate(chatId)) {\n resolvedUserId = chatId;\n }\n\n return {\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n ...(hasMembersTab && members && {\n members,\n usersById,\n }),\n isRightColumnShown: selectIsRightColumnShown(global),\n isRestricted: chat && chat.isRestricted,\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalMediaSearchType',\n 'loadMoreMembers',\n 'searchMediaMessagesLocal',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'openUserInfo',\n 'focusMessage',\n 'loadProfilePhotos',\n ]),\n)(Profile));\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nexport default function useTransitionFixes(\n containerRef: { current: HTMLDivElement | null },\n transitionElSelector = '.Transition.shared-media-transition',\n) {\n // Set `min-height` for shared media container to prevent jumping when switching tabs\n useEffect(() => {\n function setMinHeight() {\n const container = containerRef.current!;\n const transitionEl = container.querySelector(transitionElSelector);\n const tabsEl = container.querySelector('.TabList');\n if (transitionEl && tabsEl) {\n transitionEl.style.minHeight = `${container.offsetHeight - tabsEl.offsetHeight}px`;\n }\n }\n\n setMinHeight();\n\n window.addEventListener('resize', setMinHeight, false);\n\n return () => {\n window.removeEventListener('resize', setMinHeight, false);\n };\n }, [containerRef, transitionElSelector]);\n\n // Workaround for scrollable content flickering during animation.\n const applyTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n if (container.style.overflowY !== 'hidden') {\n const scrollBarWidth = container.offsetWidth - container.clientWidth;\n container.style.overflowY = 'hidden';\n container.style.marginRight = `${scrollBarWidth}px`;\n }\n }, [containerRef]);\n\n const releaseTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n container.style.overflowY = 'scroll';\n container.style.marginRight = '0';\n }, [containerRef]);\n\n return { applyTransitionFix, releaseTransitionFix };\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [cacheBuster, setCacheBuster] = useState(false);\n\n const updateCacheBuster = useCallback(() => {\n setCacheBuster((current) => !current);\n }, []);\n\n return [cacheBuster, updateCacheBuster] as const;\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './RightSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst RightSearchAsync: FC = (props) => {\n const RightSearch = useModuleLoader(Bundles.Extra, 'RightSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return RightSearch ? : ;\n};\n\nexport default memo(RightSearchAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Management';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nimport Loading from '../../ui/Loading';\n\nconst ManagementAsync: FC = (props) => {\n const Management = useModuleLoader(Bundles.Extra, 'Management');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Management ? : ;\n};\n\nexport default memo(ManagementAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst StickerSearchAsync: FC = () => {\n const StickerSearch = useModuleLoader(Bundles.Extra, 'StickerSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSearch ? : ;\n};\n\nexport default memo(StickerSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst GifSearchAsync: FC = () => {\n const GifSearch = useModuleLoader(Bundles.Extra, 'GifSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return GifSearch ? : ;\n};\n\nexport default memo(GifSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst PollResultsAsync: FC = () => {\n const PollResults = useModuleLoader(Bundles.Extra, 'PollResults');\n\n return PollResults ? : ;\n};\n\nexport default memo(PollResultsAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState, RightColumnContent } from '../../types';\n\nimport { MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN } from '../../config';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport {\n selectAreActiveChatsLoaded,\n selectCurrentMessageList,\n selectRightColumnContentKey,\n} from '../../modules/selectors';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport RightHeader from './RightHeader';\nimport Profile from './Profile';\nimport Transition from '../ui/Transition';\nimport RightSearch from './RightSearch.async';\nimport Management from './management/Management.async';\nimport StickerSearch from './StickerSearch.async';\nimport GifSearch from './GifSearch.async';\nimport PollResults from './PollResults.async';\n\nimport './RightColumn.scss';\n\ntype StateProps = {\n contentKey?: RightColumnContent;\n chatId?: number;\n threadId?: number;\n currentProfileUserId?: number;\n isChatSelected: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst MAIN_SCREENS_COUNT = Object.keys(RightColumnContent).length / 2;\nconst MANAGEMENT_SCREENS_COUNT = Object.keys(ManagementScreens).length / 2;\n\nfunction blurSearchInput() {\n const searchInput = document.querySelector('.RightHeader .SearchInput input') as HTMLInputElement;\n if (searchInput) {\n searchInput.blur();\n }\n}\n\nconst RightColumn: FC = ({\n contentKey,\n chatId,\n threadId,\n currentProfileUserId,\n isChatSelected,\n toggleChatInfo,\n toggleManagement,\n openUserInfo,\n closeLocalTextSearch,\n setStickerSearchQuery,\n setGifSearchQuery,\n closePollResults,\n}) => {\n const { width: windowWidth } = useWindowSize();\n const [profileState, setProfileState] = useState(ProfileState.Profile);\n const [managementScreen, setManagementScreen] = useState(ManagementScreens.Initial);\n const [selectedChatMemberId, setSelectedChatMemberId] = useState();\n const [isPromotedByCurrentUser, setIsPromotedByCurrentUser] = useState();\n const isScrolledDown = profileState !== ProfileState.Profile;\n\n const isOpen = contentKey !== undefined;\n const isProfile = contentKey === RightColumnContent.ChatInfo || contentKey === RightColumnContent.UserInfo;\n const isSearch = contentKey === RightColumnContent.Search;\n const isManagement = contentKey === RightColumnContent.Management;\n const isStickerSearch = contentKey === RightColumnContent.StickerSearch;\n const isGifSearch = contentKey === RightColumnContent.GifSearch;\n const isPollResults = contentKey === RightColumnContent.PollResults;\n const isOverlaying = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN;\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isOpen);\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true, !isChatSelected) ?? -1;\n\n const close = useCallback(() => {\n switch (contentKey) {\n case RightColumnContent.ChatInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n break;\n }\n toggleChatInfo();\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n break;\n }\n openUserInfo({ id: undefined });\n break;\n case RightColumnContent.Management: {\n switch (managementScreen) {\n case ManagementScreens.Initial:\n toggleManagement();\n break;\n case ManagementScreens.ChatPrivacyType:\n case ManagementScreens.Discussion:\n case ManagementScreens.GroupPermissions:\n case ManagementScreens.GroupType:\n case ManagementScreens.ChatAdministrators:\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n setManagementScreen(ManagementScreens.Initial);\n break;\n case ManagementScreens.GroupUserPermissionsCreate:\n case ManagementScreens.GroupRemovedUsers:\n case ManagementScreens.GroupUserPermissions:\n setManagementScreen(ManagementScreens.GroupPermissions);\n setSelectedChatMemberId(undefined);\n setIsPromotedByCurrentUser(undefined);\n break;\n case ManagementScreens.ChatAdminRights:\n case ManagementScreens.GroupRecentActions:\n setManagementScreen(ManagementScreens.ChatAdministrators);\n break;\n }\n\n break;\n }\n case RightColumnContent.Search: {\n blurSearchInput();\n closeLocalTextSearch();\n break;\n }\n case RightColumnContent.StickerSearch:\n case RightColumnContent.GifSearch: {\n blurSearchInput();\n setStickerSearchQuery({ query: undefined });\n setGifSearchQuery({ query: undefined });\n break;\n }\n case RightColumnContent.PollResults:\n closePollResults();\n break;\n }\n }, [\n contentKey, isScrolledDown, toggleChatInfo, openUserInfo, closePollResults,\n managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery,\n ]);\n\n const handleSelectChatMember = useCallback((memberId, isPromoted) => {\n setSelectedChatMemberId(memberId);\n setIsPromotedByCurrentUser(isPromoted);\n }, []);\n\n useEffect(() => (isOpen ? captureEscKeyListener(close) : undefined), [isOpen, close]);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isOpen]);\n\n // Close Right Column when it transforms into overlayed state on screen resize\n useEffect(() => {\n if (isOpen && isOverlaying) {\n close();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOverlaying]);\n\n // We need to clear profile state and management screen state, when changing chats\n useLayoutEffectWithPrevDeps(([prevContentKey, prevChatId]) => {\n if (\n (prevContentKey === RightColumnContent.ChatInfo && contentKey === RightColumnContent.UserInfo)\n || (prevContentKey === RightColumnContent.UserInfo && contentKey === RightColumnContent.ChatInfo)\n || (prevChatId !== chatId)\n ) {\n setProfileState(ProfileState.Profile);\n setManagementScreen(ManagementScreens.Initial);\n }\n }, [contentKey, chatId]);\n\n // eslint-disable-next-line consistent-return\n function renderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case RightColumnContent.ChatInfo:\n case RightColumnContent.UserInfo:\n return (\n \n );\n case RightColumnContent.Search:\n return ;\n case RightColumnContent.Management:\n return (\n \n );\n case RightColumnContent.StickerSearch:\n return ;\n case RightColumnContent.GifSearch:\n return ;\n case RightColumnContent.PollResults:\n return ;\n }\n }\n\n return (\n \n {isOverlaying && (\n
\n )}\n
\n \n \n {renderContent}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n\n return {\n contentKey: selectRightColumnContentKey(global),\n chatId,\n threadId,\n currentProfileUserId: global.users.selectedId,\n isChatSelected: Boolean(chatId && areActiveChatsLoaded),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n 'toggleChatInfo',\n 'toggleManagement',\n 'closeLocalTextSearch',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'closePollResults',\n ]),\n)(RightColumn));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { Bundles } from '../../util/moduleLoader';\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\ninterface OwnProps {\n isOpen: boolean;\n}\n\nconst MediaViewerAsync: FC = ({ isOpen }) => {\n const MediaViewer = useModuleLoader(Bundles.Extra, 'MediaViewer', !isOpen);\n\n return MediaViewer ? : undefined;\n};\n\nexport default memo(MediaViewerAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst NotificationsAsync: FC = ({ isOpen }) => {\n const Notifications = useModuleLoader(Bundles.Extra, 'Notifications', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Notifications ? : undefined;\n};\n\nexport default memo(NotificationsAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ErrorsAsync: FC = ({ isOpen }) => {\n const Errors = useModuleLoader(Bundles.Extra, 'Errors', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Errors ? : undefined;\n};\n\nexport default memo(ErrorsAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './ForwardPicker';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ForwardPickerAsync: FC = (props) => {\n const { isOpen } = props;\n const ForwardPicker = useModuleLoader(Bundles.Extra, 'ForwardPicker', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ForwardPicker ? : undefined;\n};\n\nexport default memo(ForwardPickerAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './SafeLinkModal';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst SafeLinkModalAsync: FC = (props) => {\n const { url } = props;\n const SafeLinkModal = useModuleLoader(Bundles.Extra, 'SafeLinkModal', !url);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SafeLinkModal ? : undefined;\n};\n\nexport default memo(SafeLinkModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './HistoryCalendar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HistoryCalendarAsync: FC = (props) => {\n const { isOpen } = props;\n const HistoryCalendar = useModuleLoader(Bundles.Extra, 'HistoryCalendar', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HistoryCalendar ? : undefined;\n};\n\nexport default memo(HistoryCalendarAsync);\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport '../../modules/actions/all';\nimport {\n ANIMATION_END_DELAY, DEBUG, INACTIVE_MARKER, PAGE_TITLE,\n} from '../../config';\nimport { pick } from '../../util/iteratees';\nimport {\n selectChatMessage,\n selectCountNotMutedUnread,\n selectIsForwardModalOpen,\n selectIsMediaViewerOpen,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\nimport LeftColumn from '../left/LeftColumn';\nimport MiddleColumn from '../middle/MiddleColumn';\nimport RightColumn from '../right/RightColumn';\nimport MediaViewer from '../mediaViewer/MediaViewer.async';\nimport AudioPlayer from '../middle/AudioPlayer';\nimport Notifications from './Notifications.async';\nimport Errors from './Errors.async';\nimport ForwardPicker from './ForwardPicker.async';\nimport SafeLinkModal from './SafeLinkModal.async';\nimport HistoryCalendar from './HistoryCalendar.async';\n\nimport './Main.scss';\n\ntype StateProps = {\n animationLevel: number;\n lastSyncTime?: number;\n isLeftColumnShown: boolean;\n isRightColumnShown: boolean;\n isMediaViewerOpen: boolean;\n isForwardModalOpen: boolean;\n hasNotifications: boolean;\n hasErrors: boolean;\n audioMessage?: ApiMessage;\n safeLinkModalUrl?: string;\n isHistoryCalendarOpen: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\nconst NOTIFICATION_INTERVAL = 1000;\n\nlet rightColumnAnimationTimeout: number | undefined;\nlet notificationInterval: number | undefined;\n\nlet DEBUG_isLogged = false;\n\nconst Main: FC = ({\n lastSyncTime,\n isLeftColumnShown,\n isRightColumnShown,\n isMediaViewerOpen,\n isForwardModalOpen,\n animationLevel,\n hasNotifications,\n hasErrors,\n audioMessage,\n safeLinkModalUrl,\n isHistoryCalendarOpen,\n loadAnimatedEmojis,\n loadNotificationSettings,\n loadNotificationExceptions,\n}) => {\n if (DEBUG && !DEBUG_isLogged) {\n DEBUG_isLogged = true;\n // eslint-disable-next-line no-console\n console.log('>>> RENDER MAIN');\n }\n\n // Initial API calls\n useEffect(() => {\n if (lastSyncTime) {\n loadAnimatedEmojis();\n loadNotificationSettings();\n loadNotificationExceptions();\n }\n }, [lastSyncTime, loadAnimatedEmojis, loadNotificationExceptions, loadNotificationSettings]);\n\n const {\n transitionClassNames: middleColumnTransitionClassNames,\n } = useShowTransition(!isLeftColumnShown, undefined, true);\n\n const {\n transitionClassNames: rightColumnTransitionClassNames,\n } = useShowTransition(isRightColumnShown, undefined, true);\n\n const className = buildClassName(\n middleColumnTransitionClassNames.replace(/([\\w-]+)/g, 'middle-column-$1'),\n rightColumnTransitionClassNames.replace(/([\\w-]+)/g, 'right-column-$1'),\n );\n\n useEffect(() => {\n // For animating Symbol Menu on mobile\n document.body.classList.toggle('is-middle-column-open', className.includes('middle-column-open'));\n // For animating components in portals (i.e. Notification)\n document.body.classList.toggle('is-right-column-shown', className.includes('right-column-open'));\n }, [className]);\n\n // Add `body` classes when toggling right column\n useEffect(() => {\n if (animationLevel > 0) {\n document.body.classList.add('animating-right-column');\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n\n if (rightColumnAnimationTimeout) {\n clearTimeout(rightColumnAnimationTimeout);\n rightColumnAnimationTimeout = undefined;\n }\n\n rightColumnAnimationTimeout = window.setTimeout(() => {\n document.body.classList.remove('animating-right-column');\n rightColumnAnimationTimeout = undefined;\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isRightColumnShown]);\n\n useBackgroundMode(() => {\n const initialUnread = selectCountNotMutedUnread(getGlobal());\n let index = 0;\n\n clearInterval(notificationInterval);\n notificationInterval = window.setInterval(() => {\n if (document.title.includes(INACTIVE_MARKER)) {\n updateIcon(false);\n return;\n }\n\n if (index % 2 === 0) {\n const newUnread = selectCountNotMutedUnread(getGlobal()) - initialUnread;\n if (newUnread > 0) {\n document.title = `${newUnread} notification${newUnread > 1 ? 's' : ''}`;\n updateIcon(true);\n }\n } else {\n document.title = PAGE_TITLE;\n updateIcon(false);\n }\n\n index++;\n }, NOTIFICATION_INTERVAL);\n }, () => {\n clearInterval(notificationInterval);\n notificationInterval = undefined;\n\n if (!document.title.includes(INACTIVE_MARKER)) {\n document.title = PAGE_TITLE;\n }\n\n updateIcon(false);\n });\n\n function stopEvent(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n return (\n
\n \n \n \n \n \n \n \n {audioMessage && }\n \n \n
\n );\n};\n\nfunction updateIcon(asUnread: boolean) {\n document.querySelectorAll('link[rel=\"icon\"]')\n .forEach((link) => {\n if (asUnread) {\n if (!link.href.includes('favicon-unread')) {\n link.href = link.href.replace('favicon', 'favicon-unread');\n }\n } else {\n link.href = link.href.replace('favicon-unread', 'favicon');\n }\n });\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n return {\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n isLeftColumnShown: global.isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isMediaViewerOpen: selectIsMediaViewerOpen(global),\n isForwardModalOpen: selectIsForwardModalOpen(global),\n hasNotifications: Boolean(global.notifications.length),\n hasErrors: Boolean(global.errors.length),\n audioMessage,\n safeLinkModalUrl: global.safeLinkModalUrl,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAnimatedEmojis', 'loadNotificationSettings', 'loadNotificationExceptions',\n ]),\n)(Main));\n","import { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { DEBUG } from '../config';\n\nexport { default as Main } from '../components/main/Main';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH LOAD MAIN BUNDLE');\n}\n\nif (!getGlobal().connectionState) {\n getDispatch().initApi();\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/modules/actions/ui/chats.ts","webpack:///./src/modules/actions/ui/messages.ts","webpack:///./src/modules/actions/ui/globalSearch.ts","webpack:///./src/modules/actions/ui/localSearch.ts","webpack:///./src/modules/actions/ui/stickerSearch.ts","webpack:///./src/modules/actions/ui/users.ts","webpack:///./src/modules/actions/ui/settings.ts","webpack:///./src/modules/actions/ui/misc.ts","webpack:///./src/modules/actions/ui/payments.ts","webpack:///./src/modules/actions/api/chats.ts","webpack:///./src/modules/actions/api/messages.ts","webpack:///./src/modules/actions/api/symbols.ts","webpack:///./src/modules/actions/api/globalSearch.ts","webpack:///./src/modules/actions/api/sync.ts","webpack:///./src/modules/actions/api/localSearch.ts","webpack:///./src/modules/actions/api/management.ts","webpack:///./src/modules/actions/api/users.ts","webpack:///./src/modules/actions/api/settings.ts","webpack:///./src/modules/actions/api/bots.ts","webpack:///./src/modules/actions/api/twoFaSettings.ts","webpack:///./src/modules/actions/api/payments.ts","webpack:///./src/util/requestQuery.ts","webpack:///./src/modules/actions/apiUpdaters/chats.ts","webpack:///./src/modules/actions/apiUpdaters/messages.ts","webpack:///./src/modules/actions/apiUpdaters/users.ts","webpack:///./src/modules/actions/apiUpdaters/symbols.ts","webpack:///./src/modules/actions/apiUpdaters/misc.ts","webpack:///./src/modules/actions/apiUpdaters/settings.ts","webpack:///./src/modules/actions/apiUpdaters/twoFaSettings.ts","webpack:///./src/components/ui/Switcher.tsx","webpack:///./src/components/left/main/LeftMainHeader.tsx","webpack:///./src/components/left/ConnectionState.tsx","webpack:///./src/hooks/useThrottledMemo.ts","webpack:///./src/hooks/useThrottle.ts","webpack:///./src/components/left/main/ChatFolders.tsx","webpack:///./src/components/left/search/LeftSearch.async.tsx","webpack:///./src/components/left/main/ContactList.async.tsx","webpack:///./src/components/left/NewChatButton.tsx","webpack:///./src/components/left/main/LeftMain.tsx","webpack:///./src/components/left/settings/Settings.async.tsx","webpack:///./src/components/left/newChat/NewChat.async.tsx","webpack:///./src/components/left/ArchivedChats.async.tsx","webpack:///./src/components/left/LeftColumn.tsx","webpack:///./src/hooks/useWindowSize.ts","webpack:///./src/components/middle/helpers/calculateMiddleFooterTransforms.ts","webpack:///./src/components/middle/HeaderMenuContainer.async.tsx","webpack:///./src/components/middle/HeaderActions.tsx","webpack:///./src/hooks/useWebpThumbnail.ts","webpack:///./src/components/middle/PinnedMessageNavigation.tsx","webpack:///./src/components/middle/HeaderPinnedMessage.tsx","webpack:///./src/components/middle/AudioPlayer.tsx","webpack:///./src/components/middle/MiddleHeader.tsx","webpack:///./src/components/middle/helpers/groupMessages.ts","webpack:///./src/components/middle/hooks/useStickyDates.ts","webpack:///./src/hooks/useDebounce.ts","webpack:///./src/components/middle/MessageScroll.tsx","webpack:///./src/components/middle/message/helpers/buildContentClassName.ts","webpack:///./src/components/middle/message/helpers/mediaDimensions.ts","webpack:///./src/components/middle/message/helpers/calculateAlbumLayout.ts","webpack:///./src/components/middle/message/helpers/calculateAuthorWidth.ts","webpack:///./src/components/middle/message/hooks/useFocusMessage.ts","webpack:///./src/components/middle/message/ContextMenuContainer.async.tsx","webpack:///./src/components/middle/ActionMessage.tsx","webpack:///./src/components/common/EmbeddedMessage.tsx","webpack:///./src/components/middle/message/MessageMeta.tsx","webpack:///./src/components/middle/message/Sticker.tsx","webpack:///./src/components/middle/message/hooks/useBlurredMediaThumbRef.ts","webpack:///./src/components/middle/message/helpers/getCustomAppendixBg.ts","webpack:///./src/components/middle/message/Photo.tsx","webpack:///./src/hooks/useHeavyAnimationCheckForVideo.ts","webpack:///./src/components/middle/message/hooks/usePauseOnInactive.ts","webpack:///./src/components/middle/message/Video.tsx","webpack:///./src/components/middle/message/Contact.tsx","webpack:///./src/components/ui/CheckboxGroup.tsx","webpack:///./src/components/middle/message/PollOption.tsx","webpack:///./src/components/middle/message/Poll.tsx","webpack:///./src/components/middle/message/WebPage.tsx","webpack:///./src/components/middle/message/Invoice.tsx","webpack:///./src/components/middle/message/hocs/withSelectControl.tsx","webpack:///./src/components/middle/message/Album.tsx","webpack:///./src/components/middle/message/RoundVideo.tsx","webpack:///./src/components/middle/message/InlineButtons.tsx","webpack:///./src/components/middle/message/CommentButton.tsx","webpack:///./src/components/middle/message/Message.tsx","webpack:///./src/components/middle/MessageList.tsx","webpack:///./src/components/middle/ScrollDownButton.tsx","webpack:///./src/components/middle/composer/helpers/buildAttachment.ts","webpack:///./node_modules/opus-recorder/dist/encoderWorker.min.js","webpack:///./src/util/voiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useClipboardPaste.ts","webpack:///./src/components/middle/composer/helpers/getMessageTextAsHtml.ts","webpack:///./src/components/middle/composer/hooks/useDraft.ts","webpack:///./src/components/common/DeleteMessageModal.async.tsx","webpack:///./src/components/ui/ResponsiveHoverButton.tsx","webpack:///./src/components/middle/composer/AttachMenu.async.tsx","webpack:///./src/components/middle/composer/SymbolMenu.async.tsx","webpack:///./src/components/middle/composer/MentionTooltip.async.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.async.tsx","webpack:///./src/components/middle/composer/StickerTooltip.async.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.async.tsx","webpack:///./src/components/middle/composer/ComposerEmbeddedMessage.tsx","webpack:///./src/components/middle/composer/AttachmentModal.async.tsx","webpack:///./src/components/middle/composer/PollModal.async.tsx","webpack:///./src/components/middle/composer/DropArea.async.tsx","webpack:///./src/components/middle/composer/WebPagePreview.tsx","webpack:///./src/components/common/CalendarModal.async.tsx","webpack:///./src/components/payment/PaymentModal.async.tsx","webpack:///./src/components/payment/ReceiptModal.async.tsx","webpack:///./src/components/middle/composer/Composer.tsx","webpack:///./src/components/middle/composer/hooks/useVoiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useStickerTooltip.ts","webpack:///./src/util/insertHtmlInSelection.ts","webpack:///./src/util/deleteLastCharacterOutsideSelection.ts","webpack:///./src/components/middle/composer/hooks/useEditing.ts","webpack:///./src/components/middle/MobileSearch.async.tsx","webpack:///./src/components/middle/MessageSelectToolbar.async.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.async.tsx","webpack:///./src/components/middle/MiddleColumn.tsx","webpack:///./src/hooks/useCustomBackground.ts","webpack:///./src/components/right/RightHeader.tsx","webpack:///./src/components/right/hooks/useProfileViewportIds.ts","webpack:///./src/components/right/hooks/useProfileState.ts","webpack:///./src/components/right/ProfilePhoto.tsx","webpack:///./src/components/right/ProfileInfo.tsx","webpack:///./src/components/right/hooks/usePhotosPreload.ts","webpack:///./src/components/right/ChatExtra.tsx","webpack:///./src/components/right/Profile.tsx","webpack:///./src/components/right/hooks/useTransitionFixes.ts","webpack:///./src/hooks/useCacheBuster.ts","webpack:///./src/components/right/RightSearch.async.tsx","webpack:///./src/components/right/management/Management.async.tsx","webpack:///./src/components/right/StickerSearch.async.tsx","webpack:///./src/components/right/GifSearch.async.tsx","webpack:///./src/components/right/PollResults.async.tsx","webpack:///./src/components/right/RightColumn.tsx","webpack:///./src/components/mediaViewer/MediaViewer.async.tsx","webpack:///./src/components/main/Notifications.async.tsx","webpack:///./src/components/main/Errors.async.tsx","webpack:///./src/components/main/ForwardPicker.async.tsx","webpack:///./src/components/main/SafeLinkModal.async.tsx","webpack:///./src/components/main/HistoryCalendar.async.tsx","webpack:///./src/components/main/Main.tsx","webpack:///./src/bundles/main.ts"],"names":["window","addEventListener","e","state","chatId","id","threadId","messageListType","type","getDispatch","openChat","noPushState","addReducer","global","actions","payload","currentMessageList","selectCurrentMessageList","exitMessageSelectMode","messages","contentToBeScheduled","undefined","forwardMessages","toChatId","setGlobal","history","pushState","updateCurrentMessageList","isChatInfoShown","chatCreation","blurTimeout","scrollOffset","replaceThreadParam","messageId","paramName","chatMessages","selectChatMessages","viewportIds","selectViewportIds","lastOwnEditableMessageId","findLast","Boolean","selectAllowedMessageActions","canEdit","targetIndexDelta","replyingToId","selectReplyingToId","selectIsViewportNewest","chatMessageKeys","Object","keys","newIndex","indexOf","toString","length","Number","MAIN_THREAD_ID","chat","selectChat","lastMessage","threadInfo","selectThreadInfo","lastMessageId","setReplyingToId","focusMessage","avatarOwnerId","profilePhotoIndex","origin","mediaViewer","audioPlayer","selectIsRightColumnShown","pollResults","voters","setTimeout","newGlobal","getGlobal","noHighlight","groupedId","groupedChatId","ids","selectForwardedMessageIdsByGroupId","shouldSwitchChat","clearTimeout","updateFocusedMessage","updateFocusDirection","FocusDirection","Static","includes","direction","Down","Up","loadViewportMessages","fromChatId","messageIds","groupedMessageIds","selectMessageIdsByGroupId","isModalShown","closeMediaViewer","selectedMessages","openForwardMenu","selectCurrentChat","enterMessageSelectMode","childMessageIds","withShift","toggleMessageSelection","isPollModalOpen","query","globalSearch","updateGlobalSearch","globalResults","localResults","resultsByType","fetchingStatus","chats","recentlyFoundChatIds","newRecentIds","filter","unshift","pop","content","updateGlobalSearchContent","updateLocalTextSearch","replaceLocalTextSearchResults","chatThreadKey","buildChatThreadKey","currentQuery","localTextSearch","byChatThreadKey","MEMO_EMPTY_ARRAY","mediaType","updateLocalMediaSearchType","stickers","search","resultIds","gifs","offsetId","results","updateSelectedUserId","replaceSettings","theme","settings","replaceThemeSettings","management","byChatId","isActive","IS_MOBILE_SCREEN","isLeftColumnShown","action","emoji","recentEmojis","newEmojis","sticker","recent","hash","newStickers","s","notification","newNotifications","notifications","existingNotificationIndex","findIndex","n","message","splice","push","error","getReadableErrorText","newErrors","errors","existingErrorIndex","err","url","safeLinkModalUrl","selectedAt","historyCalendarSelectedAt","payment","isPaymentModalOpen","clearPayment","closeInvoice","runThrottledForLoadChats","throttle","cb","runThrottledForLoadTopChats","runDebouncedForLoadFullChat","debounce","async","loadChats","listType","offsetDate","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","orderedPinnedIds","chatIds","shift","addUsers","buildCollectionByKey","users","updateChats","updateChatListIds","updateChatListSecondaryInfo","draftsById","map","forEach","replyingToById","isFullyLoaded","loadFullChat","fullInfo","updateChat","openChatByUsername","username","channelPostId","localChat","selectChatByUsername","isMin","previousChat","showNotification","preloadedChatIds","i","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","pause","byId","listIds","active","currentChatId","pinnedChats","otherChats","prepareChatList","chatToPreload","find","currentUserId","hasUnreadMark","toggleChatUnread","isChatSummaryOnly","requestChatUpdate","user","selectUser","selectThreadTopMessageId","requestThreadInfoUpdate","selectSupportChat","TIPS_USERNAME","oldestChat","selectIsChatPinned","sort","chat1","chat2","date","force","isMuted","title","about","photo","memberIds","progress","ChatCreationProgress","InProgress","createdChannel","channelId","accessHash","Complete","Error","createChannel","createdChat","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","emoticon","orderedIds","maxId","recommendedId","description","newFolder","createChatFolder","Math","max","apply","deleteChatFolder","unreadCount","match","RE_TME_INVITE_LINK","exec","RE_TME_LINK","isEnabled","isChatBasicGroup","bannedRights","userId","chatAfterUpdate","members","kickedMembers","isBanned","viewMessages","isUnblocked","m","adminRights","customTitle","adminMembers","isDismissed","updateManagementProgress","ManagementProgress","Promise","all","groups","addedById","reduce","group","addChats","forDiscussionIds","channel","fullChat","isPreHistoryHidden","linkedChatId","activeChatFolder","offset","uploadProgressCallbacks","Map","runThrottledForMarkRead","isOutlying","isBudgetPreload","addOffset","LoadMoreDirection","Backwards","Around","round","MESSAGE_LIST_SLICE","Forwards","selectThreadOriginChat","threadInfos","addChatMessagesById","updateOutlyingIds","updateListedIds","updateThreadInfos","listedIds","selectListedIds","outlyingIds","selectOutlyingIds","areSortedArraysIntersecting","historyIds","newViewportIds","getViewportSlice","safeReplaceViewportIds","sourceIds","index","findClosestIndex","indexForDirection","from","to","slice","areSomeLocal","areAllLocal","sendMessage","params","localId","progressCallback","attachment","messageLocalId","has","set","fileUploads","byMessageLocalId","replyingTo","rafPromise","delete","isRestricted","resolve","loadWithBudget","selectFocusedMessageId","selectRealLastReadId","replyOriginForId","MESSAGE_DELETED","replyMessage","selectChatMessage","updateChatMessage","replyToMessageId","loadMessage","scheduledAt","clearWebPagePreview","value","noWebPage","selectNoWebPage","isSingle","attachments","isGrouped","restParams","text","entities","commonParams","groupedAttachments","split","MAX_MEDIA_FILES_FOR_ALBUM","firstAttachment","restAttachments","Date","now","selectEditingMessage","setEditingId","get","previousLocalId","cancelApiProgress","apiUpdate","draft","replyToMsgId","localOnly","selectDraft","isUnpin","isOneSide","isSilent","unpinAllMessages","shouldDeleteForAll","editingId","selectEditingId","selectEditingScheduledId","webPagePreview","loadWebPagePreview","options","option","shouldResetVoters","v","a","offsets","nextOffset","loadPollOptionResults","fromChat","toChat","b","scheduledMessages","historyHash","replaceScheduledMessages","loadScheduledHistory","selectScheduledMessage","loadPinnedMessages","copyTextToClipboard","link","searchThrottled","searchGifs","updateGifSearch","added","addedStickers","updateStickerSets","sets","loadStickerSets","setIds","addedSetIds","loadStickers","stickerSetId","recentStickers","loadRecentStickers","favorite","favoriteStickers","loadFavoriteStickers","featured","featuredStickers","loadFeaturedStickers","stickerSetAccessHash","stickerSet","selectStickerSet","packs","updateStickerSet","currentEmoji","forEmoji","rebuildStickersForEmoji","replaceAnimatedEmojis","loadAnimatedEmojis","saved","savedGifs","loadSavedGifs","unfave","unfaveSticker","installedDate","language","currentEmojiKeywords","selectEmojiKeywords","isLoading","emojiKeywords","fromVersion","version","keywords","setsById","searchWords","searchStickers","updateStickersForEmoji","loadStickersForEmoji","searchMessagesGlobal","offsetRate","maxDate","minDate","localResult","chatOrUser","GLOBAL_SEARCH_SLICE","totalCount","nextOffsetId","nextRate","currentSearchQuery","selectCurrentGlobalSearchQuery","updateGlobalSearchFetchingStatus","addMessages","updateGlobalSearchResults","loadAndReplaceArchivedChats","updateUsers","replaceChatListIds","loadAndUpdateUsers","userIds","contactIds","contactList","updatedUsers","localChats","localUsers","globalChats","globalUsers","searchChats","timestampPlusDay","foundIds","currentSearch","selectCurrentTextSearch","topMessageId","MESSAGE_SEARCH_SLICE","newFoundIds","updateLocalTextSearchResults","searchTextMessages","peerId","selectCurrentMediaSearchPeerId","selectCurrentMediaSearch","currentType","currentResults","SHARED_MEDIA_SLICE","updateLocalMediaSearchResults","searchSharedMedia","timestamp","searchMessagesByDate","updateManagement","isUsernameAvailable","afterSyncCallback","DEBUG","console","log","savedUsers","savedPrivateChatIds","savedChats","selectedChat","isChatPrivate","selectedChatUser","replaceChats","loadAndReplaceChats","areMessagesLoaded","draftsByChatId","acc","lastReadInboxMessageId","newCurrentChatId","currentMessageListInfo","threadsById","Array","prototype","concat","replaceUsers","audioChatId","audioMessageId","closeAudioPlayer","loadAndReplaceMessages","lastSyncTime","sync","afterSync","runDebouncedForFetchFullUser","buildInputPrivacyRules","visibility","allowedIds","deniedIds","usersById","chatsById","rules","collectUsers","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","lastRequestedAt","topPeers","usersHash","loadTopUsers","getCompareString","lastName","firstName","collator","Intl","Collator","sortedUsers","compare","isSelf","loadContactList","updateChatMutedState","phone","phoneNumber","updateUser","updateContact","deleteUser","profileId","isPrivate","photos","button","sendBotCommand","command","openTelegramLink","toggleSafeLinkModal","data","alert","isError","showError","answerCallbackButton","openPollModal","getReceipt","receiptMessageId","getPaymentForm","setInvoiceMessageInfo","openPaymentModal","bio","profileEdit","ProfileEditProgress","currentUser","Idle","loadedWallpapers","wallpapers","file","previewBlobUrl","URL","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","document","fileName","size","mimeType","wallpaper","firstWallpaper","withLocalMedia","blocked","blockedIds","contactId","addBlockedContact","removeBlockedContact","activeSessions","session","isCurrent","peerType","shouldShowPreviews","updateNotifySettings","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","hasPassword","updateTwoFaSettings","hint","currentPassword","onSuccess","isSuccess","password","email","waitingEmailCodeLength","code","requestInfo","saveInfo","selectPaymentMessageId","shouldSave","shippingOptions","setRequestInfoId","updateShippingOptions","setPaymentStep","PaymentStep","Shipping","PaymentInfo","validateRequestedInfo","setPaymentForm","step","invoice","shippingAddressRequested","nameRequested","phoneRequested","emailRequested","ShippingInfo","setReceipt","receipt","publishableKey","selectProviderPublishableKey","credentials","k","join","buildQueryString","cardNumber","expiryMonth","expiryYear","cvv","zip","country","response","fetch","method","headers","Authorization","json","getStripeError","setStripeCardInfo","Checkout","sendStipeCredentials","shippingOptionId","saveCredentials","requestInfoId","selectPaymentRequestId","stripeCredentials","selectStripeCredentials","requestedInfoId","sendPaymentForm","save","runThrottledForUpdateAppBadge","update","noTopChatsRequest","selectIsChatListed","loadTopChats","newProfilePhoto","selectCountNotMutedUnread","updateAppBadge","isNotJoined","listId","typingStatus","senderId","isFromScheduled","isActiveChat","hasUnreadMention","unreadMentionsCount","showNewMessageNotification","messageUpdate","selectCommonBoxChatId","targetChat","newOrderedPinnedIds","MAX_ACTIVE_PINNED_CHATS","updateChatListType","chatFoldersById","newChatFoldersById","pick","newOrderedIds","orderedId","folders","replacedMembers","addedMember","deletedMemberId","shouldUpdate","some","deleteIndex","isOwner","isAdmin","membersCount","formattedText","updateWithLocalMedia","isScheduled","currentMessage","video","getMessageContent","blobUrl","thumbnail","isPreloadedGlobally","updateScheduledMessage","updateListedAndViewportIds","firstUnreadId","selectFirstUnreadId","addViewportId","firstMessageId","selectThreadByMessage","isMessageLocal","updateChatLastMessage","currentLastMessage","findLastMessage","isDeleting","deleteMessages","newLastMessage","threadIdsToUpdate","unique","deleteChatMessages","chatsIdsToUpdate","commonBoxChatId","updateThreadInfo","newMessage","isMessageInCurrentMessageList","isOutgoing","scheduledIds","selectScheduledIds","selectScheduledMessages","deleteChatScheduledMessages","currentPinnedIds","selectPinnedIds","newTheadInfo","messagesById","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","poll","updatedPoll","updatedResults","isChosen","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","newResults","targetOption","targetOptionIndex","updatedOption","votersCount","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","key","addNotifyException","twoFaSettings","memo","name","label","checked","disabled","inactive","noAnimation","onChange","onCheck","handleChange","useCallback","currentTarget","className","buildClassName","ANIMATION_LEVEL_OPTIONS","withGlobal","searchQuery","animationLevel","byKey","globalSearchChatId","searchDate","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","setGlobalSearchChatId","onReset","openTipsChat","setGlobalSearchDate","setSettingOption","lang","useLang","hasMenu","LeftColumnContent","ChatList","clearedDateSearchParam","clearedChatSearchParam","selectedSearchDate","useMemo","formatDateToString","archivedUnreadChatsCount","values","total","MainButton","onTrigger","isOpen","Button","ripple","color","onClick","ariaLabel","handleSearchFocus","handleSelectSaved","handleDarkModeToggle","stopPropagation","newTheme","switchTheme","handleAnimationLevelChange","newLevel","_","body","classList","toggle","isSearchFocused","GlobalSearch","Contacts","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_NAME","APP_VERSION","MenuItem","icon","toLowerCase","href","FEEDBACK_URL","localStorage","setItem","JSON","stringify","SearchInput","inputId","parentContainerClassName","focused","placeholder","autoComplete","canClose","onFocus","PickerSelectedItem","isMinimized","clickArg","chatOrUserId","connectionState","dir","isRtl","Spinner","resolverFn","ms","dependencies","valueRef","useRef","runThrottled","useThrottle","forceUpdate","useForceUpdate","useOnChange","isSync","current","orderedFolderIds","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","setActiveChatFolder","transitionRef","useEffect","displayedFolders","folderCountersById","useThrottledMemo","counters","unreadDialogsCount","hasActiveDialogs","getFolderUnreadDialogs","badgeCount","isBadgeActive","folderTabs","handleSwitchTab","IS_TOUCH_ENV","captureEvents","onSwipe","SwipeDirection","Left","min","Right","isNotInAllTabRef","captureEscKeyListener","handleKeyDown","metaKey","startsWith","digit","preventDefault","removeEventListener","shouldRender","shouldRenderPlaceholder","transitionClassNames","useShowTransition","renderCurrentTab","activeFolder","folderType","noChatsText","TabList","tabs","activeTab","onSwitchTab","Transition","ref","activeKey","renderCount","props","LeftSearch","useModuleLoader","Bundles","Extra","Loading","ContactList","closeTimeout","isShown","onNewPrivateChat","onNewChannel","onNewGroup","isMenuOpen","setIsMenuOpen","useState","fabClassName","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","tabIndex","Menu","positionX","positionY","autoClose","onClose","TRANSITION_RENDER_COUNT","onContentChange","isNewChatButtonShown","setIsNewChatButtonShown","isMouseInside","handleSelectSettings","Settings","handleSelectContacts","handleSelectNewChannel","NewChannelStep1","handleSelectNewGroup","NewGroupStep1","handleSelectArchived","Archived","autoCloseTimeout","NewChat","ContentType","ArchivedChats","RENDER_COUNT","setGlobalSearchQuery","resetChatCreation","loadPasswordInfo","clearTwoFaError","setContent","settingsScreen","setSettingsScreen","SettingsScreens","Main","setContactsFilter","lastResetTime","setLastResetTime","contentType","NewChannelStep2","NewChannel","NewGroupStep2","NewGroup","handleReset","forceReturnToChatList","pickerSearchInput","getElementById","blur","EditProfile","Folders","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaCongratulations","PrivacyPhoneNumberAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenAllowedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingAllowedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsAllowedContacts","PrivacyGroupChatsDeniedContacts","TwoFaNewPassword","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaNewPasswordEmail","TwoFaNewPasswordEmailCode","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaChangePasswordHint","TwoFaRecoveryEmail","TwoFaRecoveryEmailCode","FoldersCreateFolder","FoldersEditFolder","handleSearchQuery","currentScreen","onScreenSelect","isChannel","setSize","windowSize","handleResize","calculateMiddleFooterTransforms","windowWidth","canPost","sidePadding","MOBILE_SCREEN_MAX_WIDTH","messageListWidth","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","leftColumnWidth","rightColumnWidth","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","getMessageListWidth","sendButtonWidth","composerWidth","toolbarWidth","composerHiddenScale","toolbarHiddenScale","composerTranslateX","toolbarTranslateX","unpinHiddenScale","toolbarForUnpinHiddenScale","HeaderMenuContainer","isChatChannel","noMenu","isChatWithSelf","selectIsChatWithSelf","isMainThread","isDiscussionThread","isRightColumnShown","canStartBot","selectIsChatBotNotStarted","canSubscribe","isChatSuperGroup","canSearch","canMute","canSelect","selectIsInSelectMode","canLeave","joinChannel","openLocalTextSearch","menuButtonRef","menuPosition","setMenuPosition","handleHeaderMenuOpen","rect","getBoundingClientRect","x","right","y","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleSearchClick","querySelector","focus","searchInput","fluid","anchor","onSubscribeChannel","onSearchClick","onCloseAnimationEnd","useWebpThumbnail","getMessageMediaThumbDataUri","shouldDecodeThumbnail","isWebpSupported","thumbnailDecoded","setThumbnailDecoded","EMPTY_IMAGE_DATA_URI","useLayoutEffect","webpToPngBase64","then","catch","drawRect","width","height","radius","count","containerRef","markupParams","reverseIndex","barHeight","getBarHeight","markHeight","getMarkHeight","trackHeight","getTrackHeight","clipPathId","clipPath","d","getClipPath","markTranslateY","getMarkTranslateY","trackTranslateY","getTrackTranslateY","calculateMarkup","firstChild","firstElementChild","currentElement","style","transform","svg","div","defs","innerHTML","onUnpinMessage","onAllPinnedClick","mediaThumbnail","mediaBlobUrl","useMedia","getMessageMediaHash","getMessageSummaryText","isUnpinDialogOpen","openUnpinDialog","closeUnpinDialog","useFlag","handleUnpinMessage","ConfirmDialog","confirmLabel","confirmHandler","thumbDataUri","getPictogramDimensions","src","alt","renderPictogram","renderText","RippleEffect","sender","selectSender","noUi","senderName","getSenderTitle","mediaData","mediaLoader","playPause","isPlaying","useAudioPlayer","getMessageKey","getMediaDuration","handleClick","handleClose","audio","getMessageAudio","performer","renderAudio","subtitle","renderVoice","audioMessage","originChat","messagesCount","pinnedIds","isSelectModeActive","originChatId","isChatWithBot","selectIsChatWithBot","assign","pinnedMessageId","topMessageSender","selectForwardedSender","pinnedMessageIds","canUnpin","firstPinnedMessage","openChatWithInfo","pinMessage","toggleLeftColumn","pinnedMessageIndex","setPinnedMessageIndex","isArray","pinnedMessage","pinnedMessagesCount","chatTitleLength","getChatTitle","topMessageTitle","useEnsureMessage","useWindowSize","isLeftColumnHideable","shouldShowCloseButton","componentRef","shouldAnimateTools","handleHeaderClick","handlePinnedMessageClick","cycleRestrict","handleAllPinnedClick","handleBackClick","messageInput","EDITABLE_INPUT_ID","currentChat","selectIsChatMuted","canToolsCollideWithChatInfo","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","shouldUseStackedToolsClass","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","shouldRenderAudioPlayer","audioPlayerClassNames","renderingAudioMessage","useCurrentOrPrev","shouldRenderPinnedMessage","pinnedMessageClassNames","renderingPinnedMessage","renderingPinnedMessageTitle","canRevealTools","renderInfo","renderBackButton","PrivateChatInfo","withFullInfo","withMediaViewer","withUpdatingStatus","noRtl","GroupChatInfo","asClose","unreadCountInfo","formatIntegerCompact","componentEl","add","remove","isAlbum","messageOrAlbum","groupMessages","currentAlbum","currentSenderGroup","currentDateGroup","originalDate","datetime","getDayStart","senderGroups","dateGroups","isInAlbum","mainMessage","albumId","nextMessage","nextMessageDatetime","isActionMessage","forwardInfo","senderUserId","hiddenUserName","inlineButtons","useStickyDates","isScrolled","markIsScrolled","runDebounced","shouldRunFirst","shouldRunLast","updateStickyDates","container","hasTools","contains","fastRaf","currentStuck","stuckDateEl","allElements","querySelectorAll","containerTop","scrollTop","el","offsetTop","offsetHeight","top","findStuckDate","areToolsFrozen","MessageScroll","focusingId","loadMoreForwards","loadMoreBackwards","isViewportNewest","onFabToggle","onNotchToggle","children","backwardsTriggerRef","forwardsTriggerRef","fabTriggerRef","toggleScrollTools","scrollHeight","scrollBottom","isAtBottom","observe","observeIntersection","freeze","freezeForLoadMore","unfreeze","unfreezeForLoadMore","useIntersectionObserver","rootRef","margin","MESSAGE_LIST_SENSITIVE_AREA","entries","triggerEntry","isIntersecting","target","resetScroll","useOnIntersect","observeIntersectionForFab","freezeForFab","unfreezeForFab","observeIntersectionForNotch","teactFastList","isEmojiOnlyMessage","customShape","getMinMediaWidth","hasText","hasCommentButton","calculateMediaDimensions","isOwn","isOwnMessage","isForwarded","isForwardedMessage","getMessagePhoto","getMessageWebPagePhoto","getMessageVideo","isWebPagePhoto","calculateInlineImageDimensions","calculateVideoDimensions","minMediaWidth","getMessageText","stretchFactor","finalWidth","finalHeight","isSmall","AlbumRectPart","accumulate","list","initValue","accumulator","item","clamp","num","low","high","calculateContainerSize","layout","styles","dimensions","sides","calculateAlbumLayout","album","ratios","proportions","ratio","getProportions","averageRatio","getAverageRatio","albumCount","forceCalc","maxWidth","REM","getMaxWidth","minWidth","maxHeight","spacing","originalRatios","cropRatios","attempts","pushAttempt","lineCounts","heights","currentCount","attemptCount","sum","multiHeight","first","second","third","fourth","optimalAttempt","optimalDiff","lineCount","totalHeight","bad1","bad2","line","diff","abs","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","layoutWithComplexLayouter","layoutTwoTopBottom","layoutTwoLeftRightEqual","minimalWidth","secondWidth","firstWidth","layoutTwoLeftRight","layoutTwo","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutThree","w","h0","h","w0","w2","w1","h1","layoutFourTopAndOther","h2","layoutFourLeftAndOther","layoutFour","containerStyle","element","calculateAuthorWidth","createElement","font","whiteSpace","position","left","opacity","appendChild","offsetWidth","useFocusMessage","elementRef","isFocused","focusDirection","noFocusHighlight","messagesContainer","closest","fastSmoothScroll","ContextMenuContainer","targetUserId","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","isEmbedded","appearanceOrder","isLastInList","noAppearanceAnimation","markShown","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","isContextMenuShown","data-message-id","onMouseDown","onContextMenu","EmbeddedMessage","customText","useIsIntersecting","pictogramId","isRoundVideo","getMessageRoundVideo","senderTitle","outgoingStatus","signature","views","isEdited","formatTime","MessageOutgoingStatus","Sticker","observeIntersectionForPlaying","shouldLoop","isModalOpen","openModal","closeModal","isAnimated","isMemojiSticker","MEMOJI_STICKER_ID","shouldLoad","shouldPlay","mediaHash","getMessageMediaFormat","isMediaLoaded","isAnimationLoaded","markAnimationLoaded","isMediaReady","shouldRenderFullMedia","useTransitionForMedia","getStickerDimensions","thumbClassName","stickerClassName","AnimatedSticker","animationData","play","noLoop","onLoad","fromSticker","useBlurredMediaThumbRef","fullMediaData","useCanvasBlur","IS_CANVAS_FILTER_SUPPORTED","inSelectMode","isSelected","img","Image","onload","canvas","ctx","getContext","drawImage","getImageData","getAppendixColorFromImage","Photo","shouldAutoLoad","isInSelectMode","uploadProgress","nonInteractive","shouldAffectAppendix","onCancelUpload","localBlobUrl","isDownloadAllowed","setIsDownloadAllowed","shouldDownload","downloadProgress","useMediaWithDownloadProgress","thumbRef","isUploading","isTransferring","transferProgress","getMediaTransferState","wasDownloadDisabled","usePrevious","shouldRenderSpinner","spinnerClassNames","shouldRenderThumb","isAllowed","contentEl","getCustomAppendixBg","appendixBg","setProperty","setAttribute","ProgressSpinner","useHeavyAnimationCheckForVideo","playerRef","shouldPlayRef","safePlay","useHeavyAnimationCheck","isPlayAllowed","wasPlaying","isFrozen","freezePlaying","paused","unfreezePlaying","unfreezePlayingOnRaf","hasFocus","useBackgroundMode","Video","shouldAutoPlay","videoRef","canPlayInline","canMessagePlayVideoInline","setIsPlayAllowed","isInline","isBuffered","bufferingHandlers","useBuffering","playProgress","setPlayProgress","handleTimeUpdate","currentTime","usePauseOnInactive","useVideoCleanup","videoClassName","shouldRenderInlineVideo","shouldRenderHqPreview","shouldRenderPlayButton","shouldRenderDownloadButton","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","duration","contact","openUserInfo","Avatar","formatPhoneNumberWithCode","selected","loadingOptions","setValues","event","newValues","Checkbox","subLabel","getPercentage","toFixed","PollOption","answer","voteResults","maxVotersCount","correctResults","shouldAnimate","r","correctAnswer","showIcon","answerPercent","finalPercent","setFinalPercent","lineRef","lineWidth","isAnimationDoesNotStart","lineEl","svgEl","lineStyle","onSendVote","openPollResults","summary","isSubmitting","setIsSubmitting","chosenOptions","setChosenOptions","isSolutionShown","setIsSolutionShown","wasSubmitted","setWasSubmitted","closePeriod","setClosePeriod","closed","closeDate","floor","countdownRef","hasVoted","canVote","canViewResult","isPublic","isMultiple","multipleChoice","answers","isCorrect","hidden","quiz","countdownEl","circumference","PI","lastElementChild","timerEl","strokeDashOffset","textContent","timer","recentVoters","handleRadioChange","handleCheckboxChange","handleVoteClick","handleViewResultsClick","handleSolutionShow","handleSolutionHide","solution","Notification","renderTextWithEntities","solutionEntities","onDismiss","containerId","question","getPollTypeString","RadioGroup","loadingOption","isQuiz","getReadableVotersCount","isText","inPreview","onMediaClick","onCancelMediaTransfer","webPage","getMessageWebPage","isSquarePhoto","handleMediaClick","siteName","displayUrl","isMediaInteractive","hasDocument","truncatedDescription","trimText","data-initial","SafeLink","getMessageInvoice","photoUrl","withSelectControl","WrapedComponent","ownProps","selectIsMessageSelected","handleMessageSelect","shiftKey","newProps","PhotoWithSelect","VideoWithSelect","uploadsById","hasCustomAppendix","albumLayout","cancelSendingMessage","mediaCount","handleCancelUpload","containerWidth","containerHeight","fileUpload","currentOnRelease","RoundVideo","playingProgressRef","shouldSpinnerRender","isActivated","setIsActivated","setProgress","playerEl","playingProgressEl","stopPlaying","requestAnimationFrame","capturePlaying","onRelease","ROUND_VIDEO_DIMENSIONS","onEnded","InlineButtons","recentReplierIds","recentRepliers","hasUnread","data-cnt","handleDocumentGroupMouseEnter","lastGroupElement","getLastElementInDocumentGroup","handleDocumentGroupMouseLeave","removeAttribute","nextElementSibling","withSenderName","withAvatar","viaBotId","forceSenderName","isAnonymousOwnMessage","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","selectOutgoingStatus","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","shouldAutoLoadMedia","selectShouldAutoLoadMedia","shouldAutoPlayMedia","selectShouldAutoPlayMedia","shouldLoopStickers","selectShouldLoopStickers","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","isLastInDocumentGroup","openMediaViewer","openAudioPlayer","markMessagesRead","sendPollVote","clickInlineButton","bottomMarkerRef","appendixRef","hasReply","isReplyMessage","hasThread","asForwarded","isLinkedChannelPost","isInDocumentGroup","voice","getMessageCustomShape","textParts","renderMessageText","containerClassName","contentClassName","hasComments","classNames","isMediaWithNoText","isViaBot","isRound","buildContentClassName","avatarPeer","senderPeer","adminTitle","withCommentButton","withAppendix","handleGroupDocumentMessagesSelect","handleContainerDoubleClick","handleContentDoubleClick","handleAvatarClick","handleSenderClick","handleViaBotClick","handleReplyClick","MediaViewerOrigin","ScheduledInline","Inline","handleAudioPlay","handleAlbumMediaClick","albumMessageId","ScheduledAlbum","Album","handleReadMedia","handleVoteSend","handleGroupForward","handleForward","handleFocus","handleFocusForwarded","fromMessageId","calculatedWidth","noMediaCorners","extraPadding","metaSafeAuthorWidth","canShowActionButton","canForward","canFocus","isChannelPost","onDoubleClick","data-last-message-id","data-has-unread-mention","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","shouldInlineMeta","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","Audio","isSelectable","onPlay","onReadMedia","Document","renderContent","INTERSECTION_THROTTLE_FOR_MEDIA","IS_ANDROID","INTERSECTION_MARGIN_FOR_MEDIA","runDebouncedForScroll","selectCurrentMessageIds","restrictionReason","withLastMessageWhenPreloading","botDescription","chatBot","selectChatBot","isChatLoaded","isChannelChat","threadFirstMessageId","selectFirstMessageId","hasLinkedChat","markMessageListRead","setScrollOffset","openHistoryCalendar","scrollOffsetRef","selectScrollOffset","anchorIdRef","anchorTopRef","listItemElementsRef","memoUnreadDividerBeforeIdRef","memoFirstUnreadIdRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","hasFocusing","setHasFocusing","onTickEnd","freezeForMedia","unfreezeForMedia","throttleMs","observeIntersectionForReading","freezeForReading","unfreezeForReading","mentionIds","entry","dataset","messageGroups","listedMessages","orderBy","loadMoreAround","handleScroll","parentElement","observer","ResizeObserver","offsetParent","contentRect","disconnect","windowHeight","normalHeight","String","clientHeight","preservedItemElements","useLayoutEffectWithPrevDeps","prevMessageIds","prevIsViewportNewest","prevContainerHeight","shouldForceScroll","lastItemElement","lastItemHeight","newScrollTop","hasFirstMessageChanged","hasLastMessageChanged","isAlreadyFocusing","isResized","unreadDivider","isAnimatingScroll","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","withUsers","onScroll","currentAnchorIdRef","isSchedule","messageCountToAnimate","messageGroup","flatten","appearanceIndex","dateGroup","dateGroupIndex","dateGroupsArray","senderGroup","senderGroupIndex","senderGroupsArray","compact","currentDocumentGroupId","messageIndex","isMessageAlbum","documentGroupId","nextDocumentGroupId","originalId","getMessageOriginalId","SCHEDULED_WHEN_ONLINE","formatHumanDate","renderMessages","focusLastMessage","messageElements","lastMessageElement","buildAttachment","filename","blob","isQuick","quick","preloadImage","newBlob","toBlob","squeezeImage","revokeObjectURL","videoWidth","videoHeight","preloadVideo","createPosterForVideo","POLYFILL_OPTIONS","encoderPath","reuseWorker","BLOB_PARAMS","opusRecorderPromise","OpusRecorder","mediaRecorder","init","default","start","analyzerCallback","startMediaRecorder","startedAt","pausedAt","chunks","waveform","ondataavailable","typedArray","releaseAnalyzer","recorder","source","sourceNode","analyser","context","createAnalyser","fftSize","connect","dataLength","frequencyBinCount","dataArray","Uint8Array","isDestroyed","tick","getByteFrequencyData","volume","subscribeToAnalyzer","stop","reject","onstop","Blob","onerror","delayStop","CLIPBOARD_ACCEPTED_TYPES","getMessageTextAsHtml","currentThreadId","DeleteMessageModal","openTimeout","isFirstTimeActivation","onActivate","buttonProps","AttachMenu","SymbolMenu","MentionTooltip","CustomSend","StickerTooltipAsync","StickerTooltip","BotKeyboardMenu","forwardMessageIds","forwardedMessagesCount","exitForwardMode","canAnimate","useAsyncRendering","clearEmbedded","handleMessageClick","AttachmentModal","PollModal","DropArea","RE_LINK","RegExp","RE_LINK_TEMPLATE","messageText","toggleMessageWebPage","parseMessageInput","linkEntity","ApiMessageEntityTypes","TextUrl","textMatch","renderingWebPage","webPageWithoutPhoto","messageStub","CalendarModal","PaymentModal","MainButtonState","ReceiptModal","chatUser","selectChatUser","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","editingMessage","canScheduleUntilOnline","wasOnline","withScheduledButton","shouldSchedule","botKeyboardMessageId","canSuggestMembers","isChatGroup","stickersForEmoji","groupChatMembers","isReceiptModalOpen","shouldSuggestStickers","dropAreaState","onDropHide","editMessage","saveDraft","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","closePaymentModal","clearReceipt","addRecentEmoji","loadEmojiKeywords","html","setHtml","lastMessageSendTimeSeconds","prevDropAreaState","isCalendarOpen","openCalendar","closeCalendar","scheduledMessageArgs","setScheduledMessageArgs","htmlRef","setAttachments","isBotKeyboardOpen","openBotKeyboard","closeBotKeyboard","isAttachMenuOpen","openAttachMenu","closeAttachMenu","isSymbolMenuOpen","openSymbolMenu","closeSymbolMenu","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isSymbolMenuLoaded","onSymbolMenuLoadingComplete","isHoverDisabled","disableHover","enableHover","startRecordingVoice","stopRecordingVoice","pauseRecordingVoice","activeVoiceRecording","currentRecordTime","recordButtonRef","mainButtonRef","startRecordTimeRef","setActiveVoiceRecording","setCurrentRecordTime","IS_IOS","voiceRecording","tickVolume","boxShadow","useVoiceRecording","mainButtonState","Edit","IS_VOICE_RECORDING_SUPPORTED","Send","Record","canShowCustomSendMenu","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredMembers","useMentionTooltip","isCustomSendMenuOpen","allowedAttachmentOptions","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isStickerTooltipOpen","closeStickerTooltip","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useStickerTooltip","canSendStickers","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","insertTextAndUpdateCursor","selection","getSelection","newHtml","replace","rangeCount","selectionRange","getRangeAt","isSelectionInsideInput","execCommand","range","deleteContents","fragment","createContextualFragment","lastInsertedNode","lastChild","insertNode","setStartAfter","setEndAfter","removeAllRanges","addRange","insertHtmlInSelection","dispatchEvent","Event","bubbles","focusEditableElement","removeSymbol","tempInput","contentEditable","textLength","createRange","setStart","setEnd","removeChild","deleteLastCharacterOutsideSelection","resetComposer","prevChatId","handleEditComplete","editedMessage","hasMessageMedia","useEditing","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","prevThreadId","prevHtml","handleBlur","useDraft","handlePaste","clipboardData","input","activeElement","tagName","EDITABLE_INPUT_MODAL_ID","items","media","getAsFile","pastedText","getData","substring","useClipboardPaste","handleFileSelect","files","handleAppendFiles","handleClearAttachment","handleSend","currentAttachments","record","extraLength","textParams","nowSeconds","secondsSinceLastMessage","nextSendDateNotReached","nextSendDate","seconds","secondsRemaining","isSlowMode","handleStickerSelect","handleGifSelect","gif","handlePollSend","handleSilentSend","handleMessageSchedule","restArgs","getTime","handleMessageScheduleUntilOnline","handleCloseCalendar","handleSearchOpen","handleSymbolMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","Portal","DropAreaState","None","withQuick","QuickFile","onHide","onFileSelect","caption","onCaptionUpdate","onSend","onFileAppend","onClear","onInsertUserName","filteredChatMembers","canAttachEmbedLinks","faded","MessageInput","innerWidth","shouldSetFocus","shouldSupressFocus","shouldSupressTextFormatter","onUpdate","onSupressedFocus","formatVoiceRecordDuration","onStickerSelect","emojis","onEmojiSelect","onPollCreate","onGifSelect","onRemoveSymbol","onSearchOpen","onSilentSend","onScheduleSend","withTimePicker","maxAt","getDayStartAt","isFutureMode","secondButtonLabel","onSubmit","onSecondButtonClick","MobileSearch","MessageSelectToolbar","UnpinAllMessagesModal","CLOSE_ANIMATION_DURATION","canBeQuicklyUploaded","kind","CONTENT_TYPES_FOR_QUICK_UPLOAD","isBlurred","isBackgroundBlurred","background","customBackground","backgroundColor","patternColor","themes","isMobileSearchActive","getCanPostInChat","isBotNotStarted","isPinnedMessageList","messageSendingRestrictionReason","getMessageSendingRestrictionReason","hasPinnedOrAudioMessage","loadUser","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanPost","renderingHasTools","renderingIsFabShown","handleDragEnter","dataTransfer","shouldDrawQuick","handleHideDropArea","handleOpenUnpinModal","closeUnpinModal","handleUnpinAllMessages","customBackgroundValue","settingValue","setValue","cacheApi","CUSTOM_BG_CACHE_NAME","useCustomBackground","MASK_IMAGE_DISABLED","messagingDisabledClassName","footerClassName","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","ANIMATION_LEVEL_MAX","shouldCleanup","onUnpin","runDebouncedForSearch","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canManage","isCreator","isColumnOpen","isSearch","isStickerSearch","isGifSearch","isPollResults","profileState","managementScreen","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","backButtonRef","handleMessageSearchQueryChange","handleStickerSearchQueryChange","handleGifSearchQueryChange","shouldSkipTransition","setShouldSkipTransition","contentKey","ProfileState","Profile","SharedMedia","MemberList","Search","PollResults","StickerSearch","GifSearch","ManagementScreens","Initial","ManageInitial","ChatPrivacyType","ManageChatPrivacyType","Discussion","ManageDiscussion","ChannelSubscribers","ManageChannelSubscribers","GroupPermissions","ManageGroupPermissions","ChatAdministrators","ManageChatAdministrators","GroupRemovedUsers","ManageGroupRemovedUsers","GroupUserPermissionsCreate","ManageGroupUserPermissionsCreate","GroupUserPermissions","ManageGroupUserPermissions","GroupRecentActions","ManageGroupRecentActions","ChatAdminRights","ManageGroupAdminRights","GroupMembers","ManageGroupMembers","renderingContentKey","renderHeaderContent","isBackButton","buttonClassName","useProfileViewportIds","loadMoreMembers","searchMessages","tabType","mediaSearchType","resultType","sortUserIds","memberViewportIds","getMoreMembers","noProfileInfoForMembers","currentResultType","handleLoadMore","getMore","useInfiniteScroll","MEMBERS_SLICE","isOnTop","useInfiniteScrollForMembers","mediaViewportIds","getMoreMedia","noProfileInfoForMedia","useInfiniteScrollForSharedMedia","documentViewportIds","getMoreDocuments","noProfileInfoForDocuments","linkViewportIds","getMoreLinks","noProfileInfoForLinks","audioViewportIds","getMoreAudio","noProfileInfoForAudio","noProfileInfo","forSharedMediaType","messageIdsRef","getMessageContentIds","reverse","runThrottledForScroll","isScrollingProgrammatically","isFirstPhoto","isSavedMessages","isDeleted","isDeletedUser","getMediaHash","forceAvatar","getChatAvatarHash","imageHash","ApiMediaFormat","BlobUrl","avatarThumbnailData","useBlurSync","dataUri","imageSrc","prevImageSrc","decoding","userFullName","getUserFullName","getFirstLetters","fullClassName","forceShowSelf","loadFullUser","fullName","slideAnimation","currentPhotoIndex","setCurrentPhotoIndex","isFirst","isLast","profile","currentIndex","usePhotosPreload","handleProfilePhotoClick","ProfileAvatar","selectPreviousMedia","selectNextMedia","excludedClosestSelector","renderPhoto","isVerifiedIconShown","isVerified","renderPhotoTabs","aria-label","VerifiedIcon","isUserOnline","getUserStatus","canInviteUsers","isUserRightBanned","getHasAdminRight","currentIsMuted","chatUsername","handleNotificationChange","copy","entity","formattedNumber","getChatLink","printedUsername","getChatDescription","ListItem","multiline","narrow","isStatic","TABS","buildInfiniteScrollItemSelector","isGroup","hasMembersTab","areMembersHidden","canViewMembers","resolvedUserId","onProfileStateChange","setLocalMediaSearchType","searchMediaMessagesLocal","loadProfilePhotos","setActiveTab","useEffectWithPrevDeps","prevTabType","tabsEl","prevProfileState","tabListEl","determineProfileState","useProfileState","applyTransitionFix","releaseTransitionFix","transitionElSelector","setMinHeight","transitionEl","minHeight","overflowY","scrollBarWidth","clientWidth","marginRight","useTransitionFixes","cacheBuster","resetCacheBuster","setCacheBuster","useCacheBuster","handleTransitionStop","handleSelectMedia","handlePlayAudio","handleMemberClick","handleMessageFocus","renderingDelay","isFirstTab","SLIDE_TRANSITION_DURATION","canRenderContents","renderSharedMedia","noSpinner","NothingFound","Media","withDate","smaller","onDateClick","WebLink","onMessageClick","renderingFor","teactOrderKey","InfiniteScroll","itemSelector","sensitiveArea","PROFILE_SENSITIVE_AREA","preloadBackwards","noScrollRestoreOnTop","noFastList","onLoadMore","renderProfileInfo","shouldRestoreHeight","onStart","onStop","big","RightSearch","Management","MAIN_SCREENS_COUNT","RightColumnContent","MANAGEMENT_SCREENS_COUNT","blurSearchInput","areActiveChatsLoaded","selectAreActiveChatsLoaded","selectRightColumnContentKey","currentProfileUserId","selectedId","isChatSelected","toggleChatInfo","closeLocalTextSearch","closePollResults","setProfileState","setManagementScreen","selectedChatMemberId","setSelectedChatMemberId","isPromotedByCurrentUser","setIsPromotedByCurrentUser","isScrolledDown","ChatInfo","UserInfo","isOverlaying","close","GroupType","handleSelectChatMember","memberId","isPromoted","onChatMemberSelect","prevContentKey","MediaViewer","Errors","ForwardPicker","SafeLinkModal","HistoryCalendar","rightColumnAnimationTimeout","notificationInterval","DEBUG_isLogged","updateIcon","asUnread","isMediaViewerOpen","selectIsMediaViewerOpen","isForwardModalOpen","selectIsForwardModalOpen","hasNotifications","hasErrors","isHistoryCalendarOpen","loadNotificationSettings","loadNotificationExceptions","middleColumnTransitionClassNames","rightColumnTransitionClassNames","stopEvent","initialUnread","clearInterval","setInterval","INACTIVE_MARKER","newUnread","PAGE_TITLE","onDrop","onDragOver","initApi"],"mappings":"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","file":"4.456420358e011b532a42.js","sourcesContent":["import { addReducer, getDispatch, setGlobal } from '../../../lib/teact/teactn';\nimport {\n exitMessageSelectMode,\n updateCurrentMessageList,\n} from '../../reducers';\nimport { selectCurrentMessageList } from '../../selectors';\n\nwindow.addEventListener('popstate', (e) => {\n if (!e.state) {\n return;\n }\n\n const { chatId: id, threadId, messageListType: type } = e.state;\n\n getDispatch().openChat({\n id, threadId, type, noPushState: true,\n });\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const {\n id, threadId = -1, type = 'thread', noPushState,\n } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList\n || (\n currentMessageList.chatId !== id\n || currentMessageList.threadId !== threadId\n || currentMessageList.type !== type\n )) {\n global = exitMessageSelectMode(global);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: undefined,\n },\n ...(id !== global.forwardMessages.toChatId && {\n forwardMessages: {},\n }),\n };\n\n setGlobal(global);\n\n if (!noPushState) {\n window.history.pushState({ chatId: id, threadId, messageListType: type }, '');\n }\n }\n\n return updateCurrentMessageList(global, id, threadId, type);\n});\n\naddReducer('openChatWithInfo', (global, actions, payload) => {\n setGlobal({\n ...global,\n isChatInfoShown: true,\n });\n\n actions.openChat(payload);\n});\n\naddReducer('resetChatCreation', (global) => {\n return {\n ...global,\n chatCreation: undefined,\n };\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../../api/types';\nimport { FocusDirection } from '../../../types';\n\nimport {\n enterMessageSelectMode,\n toggleMessageSelection,\n exitMessageSelectMode,\n replaceThreadParam,\n updateFocusDirection,\n updateFocusedMessage,\n} from '../../reducers';\nimport {\n selectCurrentChat,\n selectViewportIds,\n selectIsRightColumnShown,\n selectCurrentMessageList,\n selectChat,\n selectThreadInfo,\n selectChatMessages,\n selectAllowedMessageActions,\n selectMessageIdsByGroupId,\n selectForwardedMessageIdsByGroupId, selectIsViewportNewest, selectReplyingToId,\n} from '../../selectors';\nimport { findLast } from '../../../util/iteratees';\n\nconst FOCUS_DURATION = 2000;\nconst POLL_RESULT_OPEN_DELAY_MS = 450;\n\nlet blurTimeout: number | undefined;\n\naddReducer('setScrollOffset', (global, actions, payload) => {\n const { chatId, threadId, scrollOffset } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'scrollOffset', scrollOffset);\n});\n\naddReducer('setReplyingToId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n const { chatId, threadId } = currentMessageList;\n\n return replaceThreadParam(global, chatId, threadId, 'replyingToId', messageId);\n});\n\naddReducer('setEditingId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n const paramName = type === 'scheduled' ? 'editingScheduledId' : 'editingId';\n\n return replaceThreadParam(global, chatId, threadId, paramName, messageId);\n});\n\naddReducer('editLastMessage', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const lastOwnEditableMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId).canEdit);\n });\n\n if (!lastOwnEditableMessageId) {\n return undefined;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'editingId', lastOwnEditableMessageId);\n});\n\naddReducer('replyToNextMessage', (global, actions, payload) => {\n const { targetIndexDelta } = payload;\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return;\n }\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const isLatest = selectIsViewportNewest(global, chatId, threadId);\n\n let messageId: number | undefined;\n\n if (!isLatest || !replyingToId) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n messageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n messageId = threadInfo ? threadInfo.lastMessageId : undefined;\n }\n } else {\n const chatMessageKeys = Object.keys(chatMessages);\n const indexOfCurrent = chatMessageKeys.indexOf(replyingToId.toString());\n const newIndex = indexOfCurrent + targetIndexDelta;\n messageId = newIndex <= chatMessageKeys.length + 1 && newIndex >= 0\n ? Number(chatMessageKeys[newIndex])\n : undefined;\n }\n actions.setReplyingToId({ messageId });\n actions.focusMessage({\n chatId, threadId, messageId,\n });\n});\n\naddReducer('openMediaViewer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = payload!;\n\n return {\n ...global,\n mediaViewer: {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n profilePhotoIndex,\n origin,\n },\n forwardMessages: {},\n };\n});\n\naddReducer('closeMediaViewer', (global) => {\n return {\n ...global,\n mediaViewer: {},\n };\n});\n\naddReducer('openAudioPlayer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n chatId,\n threadId,\n messageId,\n },\n };\n});\n\naddReducer('closeAudioPlayer', (global) => {\n return {\n ...global,\n audioPlayer: {},\n };\n});\n\naddReducer('openPollResults', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n\n const shouldOpenInstantly = selectIsRightColumnShown(global);\n\n if (!shouldOpenInstantly) {\n window.setTimeout(() => {\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }, POLL_RESULT_OPEN_DELAY_MS);\n } else if (chatId !== global.pollResults.chatId || messageId !== global.pollResults.messageId) {\n setGlobal({\n ...global,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }\n});\n\naddReducer('closePollResults', (global) => {\n setGlobal({\n ...global,\n pollResults: {},\n });\n});\n\naddReducer('focusLastMessage', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n let lastMessageId: number | undefined;\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n lastMessageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n lastMessageId = threadInfo ? threadInfo.lastMessageId : undefined;\n }\n\n if (!lastMessageId) {\n return;\n }\n\n actions.focusMessage({\n chatId, threadId, messageId: lastMessageId, noHighlight: true,\n });\n});\n\naddReducer('focusMessage', (global, actions, payload) => {\n const {\n chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId,\n } = payload!;\n\n let { messageId } = payload!;\n\n if (groupedId !== undefined) {\n const ids = selectForwardedMessageIdsByGroupId(global, groupedChatId, groupedId);\n if (ids && ids.length) {\n ([messageId] = ids);\n }\n }\n\n const currentMessageList = selectCurrentMessageList(global);\n const shouldSwitchChat = !currentMessageList || (\n chatId !== currentMessageList.chatId\n || threadId !== currentMessageList.threadId\n || messageListType !== currentMessageList.type\n );\n\n if (blurTimeout) {\n clearTimeout(blurTimeout);\n blurTimeout = undefined;\n }\n blurTimeout = window.setTimeout(() => {\n let newGlobal = getGlobal();\n newGlobal = updateFocusedMessage(newGlobal);\n newGlobal = updateFocusDirection(newGlobal);\n setGlobal(newGlobal);\n }, FOCUS_DURATION);\n\n global = updateFocusedMessage(global, chatId, messageId, noHighlight);\n global = updateFocusDirection(global, undefined);\n\n if (shouldSwitchChat) {\n global = updateFocusDirection(global, FocusDirection.Static);\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (viewportIds && viewportIds.includes(messageId)) {\n setGlobal(global);\n actions.openChat({ id: chatId, threadId });\n return undefined;\n }\n\n if (shouldSwitchChat) {\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', undefined);\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n\n if (viewportIds && !shouldSwitchChat) {\n const direction = messageId > viewportIds[0] ? FocusDirection.Down : FocusDirection.Up;\n global = updateFocusDirection(global, direction);\n }\n\n setGlobal(global);\n\n actions.openChat({ id: chatId, threadId });\n actions.loadViewportMessages();\n return undefined;\n});\n\naddReducer('openForwardMenu', (global, actions, payload) => {\n const { fromChatId, messageIds, groupedId } = payload!;\n let groupedMessageIds;\n if (groupedId) {\n groupedMessageIds = selectMessageIdsByGroupId(global, fromChatId, groupedId);\n }\n return {\n ...global,\n forwardMessages: {\n fromChatId,\n messageIds: groupedMessageIds || messageIds,\n isModalShown: true,\n },\n };\n});\n\naddReducer('exitForwardMode', (global) => {\n setGlobal({\n ...global,\n forwardMessages: {},\n });\n});\n\naddReducer('setForwardChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n setGlobal({\n ...global,\n forwardMessages: {\n ...global.forwardMessages,\n toChatId: id,\n isModalShown: false,\n },\n });\n\n actions.openChat({ id });\n actions.closeMediaViewer();\n actions.exitMessageSelectMode();\n});\n\naddReducer('openForwardMenuForSelectedMessages', (global, actions) => {\n if (!global.selectedMessages) {\n return;\n }\n\n const { chatId: fromChatId, messageIds } = global.selectedMessages;\n\n actions.openForwardMenu({ fromChatId, messageIds });\n});\n\naddReducer('enterMessageSelectMode', (global, actions, payload) => {\n const { messageId } = payload || {};\n const openChat = selectCurrentChat(global);\n if (!openChat) {\n return global;\n }\n\n return enterMessageSelectMode(global, openChat.id, messageId);\n});\n\naddReducer('toggleMessageSelection', (global, actions, payload) => {\n const {\n messageId,\n groupedId,\n childMessageIds,\n withShift,\n } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n\n return toggleMessageSelection(\n global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift,\n );\n});\n\n\naddReducer('exitMessageSelectMode', exitMessageSelectMode);\n\naddReducer('openPollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: true,\n };\n});\n\naddReducer('closePollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: false,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { updateGlobalSearch, updateGlobalSearchContent } from '../../reducers';\n\nconst MAX_RECENTLY_FOUND_IDS = 10;\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n const { chatId } = global.globalSearch;\n\n return updateGlobalSearch(global, {\n globalResults: {},\n localResults: {},\n resultsByType: undefined,\n ...(query ? { fetchingStatus: { chats: !chatId, messages: true } } : { fetchingStatus: undefined }),\n query,\n });\n});\n\naddReducer('addRecentlyFoundChatId', (global, actions, payload) => {\n const { id } = payload!;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n if (!recentlyFoundChatIds) {\n return updateGlobalSearch(global, { recentlyFoundChatIds: [id] });\n }\n\n const newRecentIds = recentlyFoundChatIds.filter((chatId) => chatId !== id);\n newRecentIds.unshift(id);\n if (newRecentIds.length > MAX_RECENTLY_FOUND_IDS) {\n newRecentIds.pop();\n }\n\n return updateGlobalSearch(global, { recentlyFoundChatIds: newRecentIds });\n});\n\naddReducer('clearRecentlyFoundChats', (global) => {\n return updateGlobalSearch(global, { recentlyFoundChatIds: undefined });\n});\n\naddReducer('setGlobalSearchContent', (global, actions, payload) => {\n const { content } = payload!;\n\n return updateGlobalSearchContent(global, content);\n});\n\naddReducer('setGlobalSearchChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n return updateGlobalSearch(global, { chatId: id, query: undefined, resultsByType: undefined });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n updateLocalTextSearch,\n replaceLocalTextSearchResults,\n updateLocalMediaSearchType,\n} from '../../reducers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { buildChatThreadKey } from '../../helpers';\n\naddReducer('openLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n return updateLocalTextSearch(global, chatId, threadId, true);\n});\n\naddReducer('closeLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, false);\n global = replaceLocalTextSearchResults(global, chatId, threadId, undefined);\n return global;\n});\n\naddReducer('setLocalTextSearchQuery', (global, actions, payload) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const { query } = payload!;\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { query: currentQuery } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n\n if (query !== currentQuery) {\n global = replaceLocalTextSearchResults(global, chatId, threadId, MEMO_EMPTY_ARRAY);\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, true, query);\n\n return global;\n});\n\naddReducer('setLocalMediaSearchType', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return undefined;\n }\n\n const { mediaType } = payload!;\n return updateLocalMediaSearchType(global, chatId, mediaType);\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n search: {\n query,\n resultIds: undefined,\n },\n },\n };\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n query,\n offsetId: undefined,\n results: undefined,\n },\n },\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { updateSelectedUserId } from '../../reducers';\n\naddReducer('openUserInfo', (global, actions, payload) => {\n const { id } = payload!;\n\n actions.openChat({ id });\n});\n\nconst clearSelectedUserId = (global: GlobalState) => updateSelectedUserId(global, undefined);\n\naddReducer('openChat', clearSelectedUserId);\n","import { addReducer } from '../../../lib/teact/teactn';\nimport { ISettings, IThemeSettings, ThemeKey } from '../../../types';\nimport { replaceSettings, replaceThemeSettings } from '../../reducers';\n\naddReducer('setSettingOption', (global, actions, payload?: Partial) => {\n return replaceSettings(global, payload);\n});\n\naddReducer('setThemeSettings', (global, actions, payload: { theme: ThemeKey } & Partial) => {\n const { theme, ...settings } = payload;\n\n return replaceThemeSettings(global, theme, settings);\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport getReadableErrorText from '../../../util/getReadableErrorText';\nimport { selectCurrentMessageList } from '../../selectors';\n\nconst MAX_STORED_EMOJIS = 18; // Represents two rows of recent emojis\n\naddReducer('toggleChatInfo', (global) => {\n return {\n ...global,\n isChatInfoShown: !global.isChatInfoShown,\n };\n});\n\naddReducer('toggleManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: !(global.management.byChatId[chatId] || {}).isActive,\n },\n },\n },\n };\n});\n\naddReducer('closeManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: false,\n },\n },\n },\n };\n});\n\naddReducer('openChat', (global, actions, payload) => {\n if (!IS_MOBILE_SCREEN) {\n return undefined;\n }\n\n const { id } = payload!;\n\n return {\n ...global,\n isLeftColumnShown: id === undefined,\n };\n});\n\naddReducer('toggleLeftColumn', (global) => {\n return {\n ...global,\n isLeftColumnShown: !global.isLeftColumnShown,\n };\n});\n\naddReducer('addRecentEmoji', (global, action, payload) => {\n const { emoji } = payload!;\n const { recentEmojis } = global;\n if (!recentEmojis) {\n return {\n ...global,\n recentEmojis: [emoji],\n };\n }\n\n const newEmojis = recentEmojis.filter((e) => e !== emoji);\n newEmojis.unshift(emoji);\n if (newEmojis.length > MAX_STORED_EMOJIS) {\n newEmojis.pop();\n }\n\n return {\n ...global,\n recentEmojis: newEmojis,\n };\n});\n\naddReducer('addRecentSticker', (global, action, payload) => {\n const { sticker } = payload!;\n const { recent } = global.stickers;\n if (!recent) {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n hash: 0,\n stickers: [sticker],\n },\n },\n };\n }\n\n const newStickers = recent.stickers.filter((s) => s.id !== sticker.id);\n newStickers.unshift(sticker);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n ...recent,\n stickers: newStickers,\n },\n },\n };\n});\n\naddReducer('showNotification', (global, actions, payload) => {\n const notification = payload!;\n\n const newNotifications = [...global.notifications];\n const existingNotificationIndex = newNotifications.findIndex((n) => n.message === notification.message);\n if (existingNotificationIndex !== -1) {\n newNotifications.splice(existingNotificationIndex, 1);\n }\n\n newNotifications.push(notification);\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('dismissNotification', (global) => {\n const newNotifications = [...global.notifications];\n\n newNotifications.pop();\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('showError', (global, actions, payload) => {\n const { error } = payload!;\n\n // Filter out errors that we don't want to show to the user\n if (!getReadableErrorText(error)) {\n return global;\n }\n\n const newErrors = [...global.errors];\n const existingErrorIndex = newErrors.findIndex((err) => err.message === error.message);\n if (existingErrorIndex !== -1) {\n newErrors.splice(existingErrorIndex, 1);\n }\n\n newErrors.push(error);\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n\naddReducer('dismissError', (global) => {\n const newErrors = [...global.errors];\n\n newErrors.pop();\n\n return {\n ...global,\n errors: newErrors,\n };\n});\n\naddReducer('toggleSafeLinkModal', (global, actions, payload) => {\n const { url: safeLinkModalUrl } = payload;\n\n return {\n ...global,\n safeLinkModalUrl,\n };\n});\n\naddReducer('openHistoryCalendar', (global, actions, payload) => {\n const { selectedAt } = payload;\n\n return {\n ...global,\n historyCalendarSelectedAt: selectedAt,\n };\n});\n\naddReducer('closeHistoryCalendar', (global) => {\n return {\n ...global,\n historyCalendarSelectedAt: undefined,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\nimport {\n clearPayment, closeInvoice,\n} from '../../reducers';\n\naddReducer('openPaymentModal', (global, actions, payload) => {\n const { messageId } = payload;\n return {\n ...global,\n payment: {\n ...global.payment,\n messageId,\n isPaymentModalOpen: true,\n },\n };\n});\n\naddReducer('closePaymentModal', (global) => {\n const newGlobal = clearPayment(global);\n return closeInvoice(newGlobal);\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiUser, ApiChatFolder, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { ChatCreationProgress, ManagementProgress } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n ARCHIVED_FOLDER_ID,\n TOP_CHAT_MESSAGES_PRELOAD_LIMIT,\n CHAT_LIST_LOAD_SLICE,\n RE_TME_INVITE_LINK,\n RE_TME_LINK,\n TIPS_USERNAME,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n addChats,\n addUsers,\n replaceThreadParam,\n updateChatListIds,\n updateChats,\n updateChat,\n updateChatListSecondaryInfo,\n updateManagementProgress,\n} from '../../reducers';\nimport {\n selectChat,\n selectCurrentChat,\n selectUser,\n selectChatListType,\n selectIsChatPinned,\n selectChatFolder,\n selectSupportChat,\n selectChatByUsername,\n selectThreadTopMessageId,\n selectCurrentMessageList,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { debounce, pause, throttle } from '../../../util/schedulers';\nimport {\n isChatSummaryOnly, isChatArchived, prepareChatList, isChatBasicGroup,\n} from '../../helpers';\n\nconst TOP_CHATS_PRELOAD_PAUSE = 100;\n// We expect this ID does not exist\nconst TMP_CHAT_ID = -1;\n\nconst runThrottledForLoadChats = throttle((cb) => cb(), 1000, true);\nconst runThrottledForLoadTopChats = throttle((cb) => cb(), 3000, true);\nconst runDebouncedForLoadFullChat = debounce((cb) => cb(), 500, false, true);\n\naddReducer('preloadTopChatMessages', (global, actions) => {\n (async () => {\n const preloadedChatIds: number[] = [];\n\n for (let i = 0; i < TOP_CHAT_MESSAGES_PRELOAD_LIMIT; i++) {\n await pause(TOP_CHATS_PRELOAD_PAUSE);\n\n const {\n byId,\n listIds: { active: listIds },\n orderedPinnedIds: { active: orderedPinnedIds },\n } = getGlobal().chats;\n if (!listIds) {\n return;\n }\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const { pinnedChats, otherChats } = prepareChatList(byId, listIds, orderedPinnedIds);\n const topChats = [...pinnedChats, ...otherChats];\n const chatToPreload = topChats.find(({ id }) => id !== currentChatId && !preloadedChatIds.includes(id));\n if (!chatToPreload) {\n return;\n }\n\n preloadedChatIds.push(chatToPreload.id);\n\n actions.loadViewportMessages({ chatId: chatToPreload.id, threadId: MAIN_THREAD_ID });\n }\n })();\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const { id, threadId } = payload!;\n const { currentUserId } = global;\n const chat = selectChat(global, id);\n\n if (chat && chat.hasUnreadMark) {\n actions.toggleChatUnread({ id });\n }\n\n if (!chat) {\n if (id === currentUserId) {\n void callApi('fetchChat', { type: 'self' });\n } else {\n const user = selectUser(global, id);\n if (user) {\n void callApi('fetchChat', { type: 'user', user });\n }\n }\n } else if (isChatSummaryOnly(chat) && !chat.isMin) {\n actions.requestChatUpdate({ chatId: id });\n }\n\n if (threadId !== MAIN_THREAD_ID) {\n const topMessageId = selectThreadTopMessageId(global, id, threadId);\n if (!topMessageId) {\n actions.requestThreadInfoUpdate({ chatId: id, threadId });\n }\n }\n});\n\naddReducer('openSupportChat', (global, actions) => {\n const chat = selectSupportChat(global);\n\n actions.openChat({ id: chat ? chat.id : TMP_CHAT_ID });\n\n if (chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchChat', { type: 'support' });\n if (result) {\n actions.openChat({ id: result.chatId });\n }\n })();\n});\n\naddReducer('openTipsChat', (global, actions) => {\n actions.openChatByUsername({ username: TIPS_USERNAME });\n});\n\naddReducer('loadMoreChats', (global, actions, payload) => {\n const { listType = 'active' } = payload!;\n const listIds = global.chats.listIds[listType as ('active' | 'archived')];\n const isFullyLoaded = global.chats.isFullyLoaded[listType as ('active' | 'archived')];\n\n if (isFullyLoaded) {\n return;\n }\n\n const oldestChat = listIds\n ? listIds\n .map((id) => global.chats.byId[id])\n .filter((chat) => Boolean(chat && chat.lastMessage) && !selectIsChatPinned(global, chat.id))\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n if (oldestChat) {\n runThrottledForLoadChats(() => loadChats(listType, oldestChat.id, oldestChat.lastMessage!.date));\n } else {\n runThrottledForLoadChats(() => loadChats(listType));\n }\n});\n\naddReducer('loadFullChat', (global, actions, payload) => {\n const { chatId, force } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n if (force) {\n loadFullChat(chat);\n } else {\n runDebouncedForLoadFullChat(() => loadFullChat(chat));\n }\n});\n\naddReducer('loadTopChats', () => {\n runThrottledForLoadTopChats(() => loadChats('active'));\n});\n\naddReducer('requestChatUpdate', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', chat);\n});\n\naddReducer('updateChatMutedState', (global, actions, payload) => {\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('updateChatMutedState', { chat, isMuted });\n});\n\naddReducer('createChannel', (global, actions, payload) => {\n const {\n title, about, photo, memberIds,\n } = payload!;\n\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createChannel(title, members, about, photo);\n});\n\naddReducer('joinChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('joinChannel', { channelId, accessHash });\n }\n});\n\naddReducer('leaveChannel', (global, actions, payload) => {\n (async () => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n await callApi('leaveChannel', { channelId, accessHash });\n }\n\n actions.openChat({ id: undefined });\n })();\n});\n\naddReducer('deleteChannel', (global, actions, payload) => {\n (async () => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n await callApi('deleteChannel', { channelId, accessHash });\n }\n\n actions.openChat({ id: undefined });\n })();\n});\n\naddReducer('createGroupChat', (global, actions, payload) => {\n const { title, memberIds, photo } = payload!;\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createGroupChat(title, members, photo);\n});\n\naddReducer('toggleChatPinned', (global, actions, payload) => {\n const { id, folderId } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n if (folderId) {\n const folder = selectChatFolder(global, folderId);\n if (folder) {\n const shouldBePinned = !selectIsChatPinned(global, id, folderId);\n\n const { pinnedChatIds, includedChatIds } = folder;\n const newPinnedIds = shouldBePinned\n ? [id, ...(pinnedChatIds || [])]\n : (pinnedChatIds || []).filter((pinnedId) => pinnedId !== id);\n\n // With both Pin and Unpin we need to re-add a user to the included group\n const newIncludedChatIds = [id, ...includedChatIds];\n\n void callApi('editChatFolder', {\n id: folderId,\n folderUpdate: {\n ...folder,\n pinnedChatIds: newPinnedIds,\n includedChatIds: newIncludedChatIds,\n },\n });\n }\n } else {\n const listType = selectChatListType(global, id);\n const isPinned = selectIsChatPinned(global, id, listType === 'archived' ? ARCHIVED_FOLDER_ID : undefined);\n void callApi('toggleChatPinned', { chat, shouldBePinned: !isPinned });\n }\n});\n\naddReducer('toggleChatArchived', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n void callApi('toggleChatArchived', {\n chat,\n folderId: isChatArchived(chat) ? 0 : ARCHIVED_FOLDER_ID,\n });\n }\n});\n\naddReducer('loadChatFolders', () => {\n void loadChatFolders();\n});\n\naddReducer('loadRecommendedChatFolders', () => {\n void loadRecommendedChatFolders();\n});\n\naddReducer('editChatFolder', (global, actions, payload) => {\n const { id, folderUpdate } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void callApi('editChatFolder', {\n id,\n folderUpdate: {\n id,\n emoticon: folder.emoticon,\n pinnedChatIds: folder.pinnedChatIds,\n ...folderUpdate,\n },\n });\n }\n});\n\naddReducer('addChatFolder', (global, actions, payload) => {\n const { folder } = payload!;\n const { orderedIds } = global.chatFolders;\n const maxId = orderedIds && orderedIds.length ? Math.max.apply(Math.max, orderedIds) : ARCHIVED_FOLDER_ID;\n\n void createChatFolder(folder, maxId);\n});\n\naddReducer('deleteChatFolder', (global, actions, payload) => {\n const { id } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void deleteChatFolder(id);\n }\n});\n\naddReducer('toggleChatUnread', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { chat, threadId: MAIN_THREAD_ID });\n } else {\n void callApi('toggleDialogUnread', {\n chat,\n hasUnreadMark: !chat.hasUnreadMark,\n });\n }\n }\n});\n\naddReducer('openTelegramLink', (global, actions, payload) => {\n const { url } = payload!;\n let match = RE_TME_INVITE_LINK.exec(url);\n\n if (match) {\n const hash = match[1];\n\n (async () => {\n const chat = await callApi('openChatByInvite', hash);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n })();\n } else {\n match = RE_TME_LINK.exec(url)!;\n\n const username = match[1];\n const channelPostId = match[2] ? Number(match[2]) : undefined;\n\n void openChatByUsername(actions, username, channelPostId);\n }\n});\n\naddReducer('openChatByUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n void openChatByUsername(actions, username);\n});\n\naddReducer('togglePreHistoryHidden', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n let chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n void callApi('togglePreHistoryHidden', { chat, isEnabled });\n })();\n});\n\naddReducer('updateChatDefaultBannedRights', (global, actions, payload) => {\n const { chatId, bannedRights } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('updateChatDefaultBannedRights', { chat, bannedRights });\n});\n\naddReducer('updateChatMemberBannedRights', (global, actions, payload) => {\n const { chatId, userId, bannedRights } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatMemberBannedRights', { chat, user, bannedRights });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { members, kickedMembers } = chatAfterUpdate.fullInfo;\n\n const isBanned = !!bannedRights.viewMessages;\n const isUnblocked = !Object.keys(bannedRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(members && isBanned && {\n members: members.filter((m) => m.userId !== userId),\n }),\n ...(members && !isBanned && {\n members: members.map((m) => (\n m.userId === userId\n ? { ...m, bannedRights }\n : m\n )),\n }),\n ...(isUnblocked && kickedMembers && {\n kickedMembers: kickedMembers.filter((m) => m.userId !== userId),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChatAdmin', (global, actions, payload) => {\n const {\n chatId, userId, adminRights, customTitle,\n } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatAdmin', {\n chat, user, adminRights, customTitle,\n });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { adminMembers } = chatAfterUpdate.fullInfo;\n\n const isDismissed = !Object.keys(adminRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(adminMembers && isDismissed && {\n adminMembers: adminMembers.filter((m) => m.userId !== userId),\n }),\n ...(adminMembers && !isDismissed && {\n adminMembers: adminMembers.map((m) => (\n m.userId === userId\n ? { ...m, adminRights, customTitle }\n : m\n )),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChat', (global, actions, payload) => {\n const {\n chatId, title, about, photo,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n await Promise.all([\n chat.title !== title\n ? callApi('updateChatTitle', chat, title)\n : undefined,\n chat.fullInfo && chat.fullInfo.about !== about\n ? callApi('updateChatAbout', chat, about)\n : undefined,\n photo\n ? callApi('editChatPhoto', { chatId, accessHash: chat.accessHash, photo })\n : undefined,\n ]);\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n })();\n});\n\naddReducer('toggleSignatures', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleSignatures', { chat, isEnabled });\n});\n\naddReducer('loadGroupsForDiscussion', () => {\n (async () => {\n const groups = await callApi('fetchGroupsForDiscussion');\n if (!groups) {\n return;\n }\n\n const addedById = groups.reduce((result, group) => {\n if (group) {\n result[group.id] = group;\n }\n\n return result;\n }, {} as Record);\n\n const global = addChats(getGlobal(), addedById);\n setGlobal({\n ...global,\n chats: {\n ...global.chats,\n forDiscussionIds: Object.keys(addedById).map(Number),\n },\n });\n })();\n});\n\naddReducer('linkDiscussionGroup', (global, actions, payload) => {\n const { channelId, chatId } = payload!;\n\n const channel = selectChat(global, channelId);\n let chat = selectChat(global, chatId);\n if (!channel || !chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n let { fullInfo } = chat;\n if (!fullInfo) {\n const fullChat = await callApi('fetchFullChat', chat);\n if (!fullChat) {\n return;\n }\n\n fullInfo = fullChat.fullInfo;\n }\n\n if (fullInfo.isPreHistoryHidden) {\n await callApi('togglePreHistoryHidden', { chat, isEnabled: false });\n }\n\n void callApi('setDiscussionGroup', { channel, chat });\n })();\n});\n\naddReducer('unlinkDiscussionGroup', (global, actions, payload) => {\n const { channelId } = payload!;\n\n const channel = selectChat(global, channelId);\n if (!channel) {\n return;\n }\n\n let chat: ApiChat | undefined;\n if (channel.fullInfo && channel.fullInfo.linkedChatId) {\n chat = selectChat(global, channel.fullInfo.linkedChatId);\n }\n\n (async () => {\n await callApi('setDiscussionGroup', { channel });\n if (chat) {\n loadFullChat(chat);\n }\n })();\n});\n\n\naddReducer('setActiveChatFolder', (global, actions, payload) => {\n return {\n ...global,\n chatFolders: {\n ...global.chatFolders,\n activeChatFolder: payload,\n },\n };\n});\n\naddReducer('loadMoreMembers', (global) => {\n (async () => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n if (!chat || isChatBasicGroup(chat)) {\n return;\n }\n\n const offset = (chat.fullInfo && chat.fullInfo.members && chat.fullInfo.members.length) || undefined;\n const result = await callApi('fetchMembers', chat.id, chat.accessHash!, 'recent', offset);\n if (!result) {\n return;\n }\n\n const { members, users } = result;\n if (!members || !members.length) {\n return;\n }\n\n global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateChat(global, chat.id, {\n fullInfo: {\n ...chat.fullInfo,\n members: [\n ...((chat.fullInfo || {}).members || []),\n ...(members || []),\n ],\n },\n });\n setGlobal(global);\n })();\n});\n\nasync function loadChats(listType: 'active' | 'archived', offsetId?: number, offsetDate?: number) {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n offsetDate,\n archived: listType === 'archived',\n withPinned: getGlobal().chats.orderedPinnedIds[listType] === undefined,\n });\n\n if (!result) {\n return;\n }\n\n const { chatIds } = result;\n\n if (chatIds.length > 0 && chatIds[0] === offsetId) {\n chatIds.shift();\n }\n\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateChatListIds(global, listType, chatIds);\n global = updateChatListSecondaryInfo(global, listType, result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n\n if (chatIds.length === 0 && !global.chats.isFullyLoaded[listType]) {\n global = {\n ...global,\n chats: {\n ...global.chats,\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [listType]: true,\n },\n },\n };\n }\n\n setGlobal(global);\n}\n\nasync function loadFullChat(chat: ApiChat) {\n const result = await callApi('fetchFullChat', chat);\n if (!result) {\n return;\n }\n\n const { users, fullInfo } = result;\n\n let global = getGlobal();\n if (users) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n global = updateChat(global, chat.id, { fullInfo });\n\n setGlobal(global);\n}\n\nasync function createChannel(title: string, users: ApiUser[], about?: string, photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChannel = await callApi('createChannel', { title, about, users });\n if (!createdChannel) {\n return;\n }\n\n const { id: channelId, accessHash } = createdChannel;\n\n let global = getGlobal();\n global = updateChat(global, channelId, createdChannel);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChannel ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: channelId });\n\n if (channelId && accessHash && photo) {\n await callApi('editChatPhoto', { chatId: channelId, accessHash, photo });\n }\n}\n\nasync function createGroupChat(title: string, users: ApiUser[], photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChat = await callApi('createGroupChat', { title, users });\n if (!createdChat) {\n return;\n }\n\n const { id: chatId } = createdChat;\n\n let global = getGlobal();\n global = updateChat(global, chatId, createdChat);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChat ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: chatId });\n\n if (chatId && photo) {\n await callApi('editChatPhoto', { chatId, photo });\n }\n}\n\nasync function loadChatFolders() {\n const chatFolders = await callApi('fetchChatFolders');\n\n if (chatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n ...chatFolders,\n },\n });\n }\n}\n\nasync function loadRecommendedChatFolders() {\n const recommendedChatFolders = await callApi('fetchRecommendedChatFolders');\n\n if (recommendedChatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommendedChatFolders,\n },\n });\n }\n}\n\nasync function createChatFolder(folder: ApiChatFolder, maxId: number) {\n // Clear fields from recommended folders\n const { id: recommendedId, description, ...newFolder } = folder;\n\n await callApi('editChatFolder', {\n id: maxId + 1,\n folderUpdate: {\n id: maxId + 1,\n ...newFolder,\n },\n });\n\n if (!description) {\n return;\n }\n\n const global = getGlobal();\n const { recommended } = global.chatFolders;\n\n if (recommended) {\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommended.filter(({ id }) => id !== recommendedId),\n },\n });\n }\n}\n\nasync function deleteChatFolder(id: number) {\n await callApi('deleteChatFolder', id);\n}\n\nasync function openChatByUsername(\n actions: GlobalActions,\n username: string,\n channelPostId?: number,\n) {\n const global = getGlobal();\n const localChat = selectChatByUsername(global, username);\n if (localChat && !localChat.isMin) {\n if (channelPostId) {\n actions.focusMessage({ chatId: localChat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: localChat.id });\n }\n return;\n }\n\n const previousChat = selectCurrentChat(global);\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await callApi('getChatByUsername', username);\n if (!chat) {\n if (previousChat) {\n actions.openChat({ id: previousChat.id });\n }\n\n actions.showNotification({ message: 'User does not exist' });\n\n return;\n }\n\n setGlobal(updateChat(getGlobal(), chat.id, chat));\n\n if (channelPostId) {\n actions.focusMessage({ chatId: chat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: chat.id });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiChat,\n ApiMessage,\n ApiMessageEntity,\n ApiNewPoll,\n ApiOnProgress,\n ApiSticker,\n ApiVideo,\n MAIN_THREAD_ID,\n MESSAGE_DELETED,\n} from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { MAX_MEDIA_FILES_FOR_ALBUM, MESSAGE_LIST_SLICE } from '../../../config';\nimport { callApi, cancelApiProgress } from '../../../api/gramjs';\nimport { areSortedArraysIntersecting, buildCollectionByKey, split } from '../../../util/iteratees';\nimport {\n addUsers,\n addChatMessagesById,\n replaceThreadParam,\n safeReplaceViewportIds,\n updateChatMessage,\n addChats,\n updateListedIds,\n updateOutlyingIds,\n replaceScheduledMessages,\n updateThreadInfos,\n} from '../../reducers';\nimport {\n selectChat,\n selectChatMessage,\n selectCurrentMessageList,\n selectFocusedMessageId,\n selectCurrentChat,\n selectListedIds,\n selectOutlyingIds,\n selectViewportIds,\n selectRealLastReadId,\n selectReplyingToId,\n selectEditingId,\n selectDraft,\n selectThreadOriginChat,\n selectThreadTopMessageId,\n selectEditingScheduledId,\n selectEditingMessage,\n selectScheduledMessage,\n selectNoWebPage,\n} from '../../selectors';\nimport { rafPromise, throttle } from '../../../util/schedulers';\nimport { copyTextToClipboard } from '../../../util/clipboard';\n\nconst uploadProgressCallbacks = new Map();\n\nconst runThrottledForMarkRead = throttle((cb) => cb(), 1000, true);\n\naddReducer('loadViewportMessages', (global, actions, payload) => {\n const {\n direction = LoadMoreDirection.Around,\n isBudgetPreload = false,\n } = payload || {};\n\n let { chatId, threadId } = payload || {};\n\n if (!chatId) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n chatId = currentMessageList.chatId;\n threadId = currentMessageList.threadId;\n }\n\n const chat = selectChat(global, chatId);\n // TODO Revise if `chat.isRestricted` check is needed\n if (!chat || chat.isRestricted) {\n return undefined;\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (!viewportIds || !viewportIds.length || direction === LoadMoreDirection.Around) {\n const offsetId = selectFocusedMessageId(global, chatId) || selectRealLastReadId(global, chatId, threadId);\n const isOutlying = Boolean(offsetId && listedIds && !listedIds.includes(offsetId));\n const historyIds = (isOutlying ? outlyingIds : listedIds) || [];\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, LoadMoreDirection.Around);\n\n if (areSomeLocal && newViewportIds.length >= MESSAGE_LIST_SLICE) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n if (!areAllLocal) {\n void loadViewportMessages(chat, threadId, offsetId, LoadMoreDirection.Around, isOutlying, isBudgetPreload);\n }\n } else {\n const offsetId = direction === LoadMoreDirection.Backwards ? viewportIds[0] : viewportIds[viewportIds.length - 1];\n const isOutlying = Boolean(outlyingIds);\n const historyIds = (isOutlying ? outlyingIds : listedIds)!;\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, direction);\n\n if (areSomeLocal) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n void loadWithBudget(actions, areAllLocal, isOutlying, isBudgetPreload, chat, threadId, direction, offsetId);\n\n if (isBudgetPreload) {\n return undefined;\n }\n }\n\n return global;\n});\n\nasync function loadWithBudget(\n actions: GlobalActions,\n areAllLocal: boolean, isOutlying: boolean, isBudgetPreload: boolean,\n chat: ApiChat, threadId: number, direction: LoadMoreDirection, offsetId?: number,\n) {\n if (!areAllLocal) {\n await loadViewportMessages(\n chat, threadId, offsetId, direction, isOutlying, isBudgetPreload,\n );\n }\n\n if (!isBudgetPreload) {\n // Let reducer return and update global\n await Promise.resolve();\n actions.loadViewportMessages({\n chatId: chat.id, threadId, direction, isBudgetPreload: true,\n });\n }\n}\n\naddReducer('loadMessage', (global, actions, payload) => {\n const { chatId, messageId, replyOriginForId } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void loadMessage(chat, messageId, replyOriginForId);\n});\n\naddReducer('sendMessage', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n\n if (type === 'scheduled' && !payload.scheduledAt) {\n return {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: payload,\n },\n };\n }\n\n const chat = selectChat(global, chatId)!;\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n const params = {\n ...payload,\n chat,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n noWebPage: selectNoWebPage(global, chatId, threadId),\n };\n\n const isSingle = !payload.attachments || payload.attachments.length <= 1;\n const isGrouped = !isSingle && payload.attachments && payload.attachments.length > 1;\n\n if (isSingle) {\n const { attachments, ...restParams } = params;\n sendMessage({\n ...restParams,\n attachment: attachments ? attachments[0] : undefined,\n });\n } else if (isGrouped) {\n const {\n text, entities, attachments, ...commonParams\n } = params;\n const groupedAttachments = split(attachments, MAX_MEDIA_FILES_FOR_ALBUM);\n for (let i = 0; i < groupedAttachments.length; i++) {\n const [firstAttachment, ...restAttachments] = groupedAttachments[i];\n const groupedId = `${Date.now()}${i}`;\n\n sendMessage({\n ...commonParams,\n text: i === 0 ? text : undefined,\n entities: i === 0 ? entities : undefined,\n attachment: firstAttachment,\n groupedId: restAttachments.length > 0 ? groupedId : undefined,\n });\n\n restAttachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n groupedId,\n });\n });\n }\n } else {\n const {\n text, entities, attachments, replyingTo, ...commonParams\n } = params;\n\n if (text) {\n sendMessage({\n ...commonParams,\n text,\n entities,\n replyingTo,\n });\n }\n\n attachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n });\n });\n }\n\n return undefined;\n});\n\naddReducer('editMessage', (global, actions, payload) => {\n const { text, entities } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const message = selectEditingMessage(global, chatId, threadId, messageListType);\n if (!chat || !message) {\n return;\n }\n\n void callApi('editMessage', {\n chat, message, text, entities, noWebPage: selectNoWebPage(global, chatId, threadId),\n });\n\n actions.setEditingId({ messageId: undefined });\n});\n\naddReducer('cancelSendingMessage', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n const message = selectChatMessage(global, chatId, messageId);\n const progressCallback = message && uploadProgressCallbacks.get(message.previousLocalId || message.id);\n if (progressCallback) {\n cancelApiProgress(progressCallback);\n }\n\n actions.apiUpdate({\n '@type': 'deleteMessages',\n ids: [messageId],\n chatId,\n });\n});\n\naddReducer('saveDraft', (global, actions, payload) => {\n const { chatId, threadId, draft } = payload!;\n if (!draft) {\n return undefined;\n }\n\n const { text, entities } = draft;\n const chat = selectChat(global, chatId)!;\n\n if (threadId === MAIN_THREAD_ID) {\n void callApi('saveDraft', {\n chat,\n text,\n entities,\n replyToMsgId: selectReplyingToId(global, chatId, threadId),\n });\n }\n\n return replaceThreadParam(global, chatId, threadId, 'draft', draft);\n});\n\naddReducer('clearDraft', (global, actions, payload) => {\n const { chatId, threadId, localOnly } = payload!;\n if (!selectDraft(global, chatId, threadId)) {\n return undefined;\n }\n\n const chat = selectChat(global, chatId)!;\n\n if (!localOnly && threadId === MAIN_THREAD_ID) {\n void callApi('clearDraft', chat);\n }\n\n return replaceThreadParam(global, chatId, threadId, 'draft', undefined);\n});\n\naddReducer('toggleMessageWebPage', (global, actions, payload) => {\n const { chatId, threadId, noWebPage } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'noWebPage', noWebPage);\n});\n\naddReducer('pinMessage', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const {\n messageId, isUnpin, isOneSide, isSilent,\n } = payload!;\n\n void callApi('pinMessage', {\n chat, messageId, isUnpin, isOneSide, isSilent,\n });\n});\n\naddReducer('unpinAllMessages', (global, actions, payload) => {\n const chat = selectChat(global, payload.chatId);\n if (!chat) {\n return;\n }\n\n void unpinAllMessages(chat);\n});\n\nasync function unpinAllMessages(chat: ApiChat) {\n await callApi('unpinAllMessages', { chat });\n let global = getGlobal();\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', []);\n setGlobal(global);\n}\n\naddReducer('deleteMessages', (global, actions, payload) => {\n const { messageIds, shouldDeleteForAll } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { chatId, threadId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteMessages', { chat, messageIds, shouldDeleteForAll });\n\n const editingId = selectEditingId(global, chatId, threadId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteScheduledMessages', (global, actions, payload) => {\n const { messageIds } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteScheduledMessages', { chat, messageIds });\n\n const editingId = selectEditingScheduledId(global, chatId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteHistory', (global, actions, payload) => {\n (async () => {\n const { chatId, shouldDeleteForAll } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const maxId = chat.lastMessage && chat.lastMessage.id;\n\n await callApi('deleteHistory', { chat, shouldDeleteForAll, maxId });\n\n actions.openChat({ id: undefined });\n })();\n});\n\naddReducer('markMessageListRead', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n const { maxId } = payload!;\n\n runThrottledForMarkRead(() => {\n void callApi('markMessageListRead', { chat, threadId, maxId });\n });\n});\n\naddReducer('markMessagesRead', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { messageIds } = payload!;\n\n void callApi('markMessagesRead', { chat, messageIds });\n});\n\naddReducer('loadWebPagePreview', (global, actions, payload) => {\n const { text } = payload!;\n void loadWebPagePreview(text);\n});\n\naddReducer('clearWebPagePreview', (global) => {\n if (!global.webPagePreview) {\n return undefined;\n }\n\n return {\n ...global,\n webPagePreview: undefined,\n };\n});\n\naddReducer('sendPollVote', (global, actions, payload) => {\n const { chatId, messageId, options } = payload!;\n const chat = selectChat(global, chatId);\n\n if (chat) {\n void callApi('sendPollVote', { chat, messageId, options });\n }\n});\n\naddReducer('loadPollOptionResults', (global, actions, payload) => {\n const {\n chat, messageId, option, offset, limit, shouldResetVoters,\n } = payload!;\n\n void loadPollOptionResults(chat, messageId, option, offset, limit, shouldResetVoters);\n});\n\naddReducer('forwardMessages', (global) => {\n const { fromChatId, messageIds, toChatId } = global.forwardMessages;\n const fromChat = fromChatId ? selectChat(global, fromChatId) : undefined;\n const toChat = toChatId ? selectChat(global, toChatId) : undefined;\n const messages = fromChatId && messageIds\n ? messageIds\n .sort((a, b) => a - b)\n .map((id) => selectChatMessage(global, fromChatId, id)).filter(Boolean as any)\n : undefined;\n\n if (fromChat && toChat && messages && messages.length) {\n void forwardMessages(fromChat, toChat, messages);\n }\n});\n\naddReducer('loadScheduledHistory', (global) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { hash } = global.scheduledMessages.byChatId[chat.id] || {};\n\n void loadScheduledHistory(chat, hash);\n});\n\naddReducer('sendScheduledMessages', (global, actions, payload) => {\n const {\n chatId, id,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('sendScheduledMessages', {\n chat,\n ids: [id],\n });\n});\n\naddReducer('rescheduleMessage', (global, actions, payload) => {\n const {\n chatId, messageId, scheduledAt,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n const message = chat && selectScheduledMessage(global, chat.id, messageId);\n if (!chat || !message) {\n return;\n }\n\n void callApi('rescheduleMessage', {\n chat,\n message,\n scheduledAt,\n });\n});\n\naddReducer('requestThreadInfoUpdate', (global, actions, payload) => {\n const { chatId, threadId } = payload;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n void callApi('requestThreadInfoUpdate', { chat, threadId });\n});\n\nasync function loadWebPagePreview(message: string) {\n const webPagePreview = await callApi('fetchWebPagePreview', { message });\n\n setGlobal({\n ...getGlobal(),\n webPagePreview,\n });\n}\n\nasync function loadViewportMessages(\n chat: ApiChat,\n threadId: number,\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n isOutlying = false,\n isBudgetPreload = false,\n) {\n const chatId = chat.id;\n\n let addOffset: number | undefined;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n addOffset = undefined;\n break;\n case LoadMoreDirection.Around:\n addOffset = -(Math.round(MESSAGE_LIST_SLICE / 2) + 1);\n break;\n case LoadMoreDirection.Forwards:\n addOffset = -(MESSAGE_LIST_SLICE + 1);\n break;\n }\n\n const result = await callApi('fetchMessages', {\n chat: selectThreadOriginChat(getGlobal(), chatId, threadId)!,\n offsetId,\n addOffset,\n limit: MESSAGE_LIST_SLICE,\n threadId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, chats, threadInfos,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n global = addChatMessagesById(global, chatId, byId);\n global = isOutlying\n ? updateOutlyingIds(global, chatId, threadId, ids)\n : updateListedIds(global, chatId, threadId, ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n global = updateThreadInfos(global, chatId, threadInfos);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (isOutlying && listedIds && outlyingIds) {\n if (areSortedArraysIntersecting(listedIds, outlyingIds)) {\n global = updateListedIds(global, chatId, threadId, outlyingIds);\n listedIds = selectListedIds(global, chatId, threadId);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n isOutlying = false;\n }\n }\n\n if (!isBudgetPreload) {\n const historyIds = isOutlying ? outlyingIds! : listedIds!;\n const { newViewportIds } = getViewportSlice(historyIds, offsetId, direction);\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds!);\n }\n\n setGlobal(global);\n}\n\nasync function loadMessage(chat: ApiChat, messageId: number, replyOriginForId: number) {\n const result = await callApi('fetchMessage', { chat, messageId });\n if (!result) {\n return;\n }\n\n if (result === MESSAGE_DELETED) {\n if (replyOriginForId) {\n let global = getGlobal();\n const replyMessage = selectChatMessage(global, chat.id, replyOriginForId);\n global = updateChatMessage(global, chat.id, replyOriginForId, {\n ...replyMessage,\n replyToMessageId: undefined,\n });\n setGlobal(global);\n }\n\n return;\n }\n\n let global = getGlobal();\n global = updateChatMessage(global, chat.id, messageId, result.message);\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n setGlobal(global);\n}\n\nfunction findClosestIndex(sourceIds: number[], offsetId: number) {\n if (offsetId < sourceIds[0]) {\n return 0;\n }\n\n if (offsetId > sourceIds[sourceIds.length - 1]) {\n return sourceIds.length - 1;\n }\n\n return sourceIds.findIndex((id, i) => (\n id === offsetId\n || (id < offsetId && sourceIds[i + 1] > offsetId)\n ));\n}\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n) {\n const { length } = sourceIds;\n const index = offsetId ? findClosestIndex(sourceIds, offsetId) : -1;\n const isBackwards = direction === LoadMoreDirection.Backwards;\n const indexForDirection = isBackwards ? index : (index + 1) || length;\n const from = indexForDirection - MESSAGE_LIST_SLICE;\n const to = indexForDirection + MESSAGE_LIST_SLICE - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n case LoadMoreDirection.Around:\n default:\n areSomeLocal = newViewportIds.length > 0;\n areAllLocal = newViewportIds.length === MESSAGE_LIST_SLICE;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n\nasync function sendMessage(params: {\n chat: ApiChat;\n text: string;\n entities: ApiMessageEntity[];\n replyingTo: number;\n attachment: ApiAttachment;\n sticker: ApiSticker;\n gif: ApiVideo;\n poll: ApiNewPoll;\n}) {\n let localId: number | undefined;\n const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => {\n if (!uploadProgressCallbacks.has(messageLocalId)) {\n localId = messageLocalId;\n uploadProgressCallbacks.set(messageLocalId, progressCallback!);\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n fileUploads: {\n byMessageLocalId: {\n ...global.fileUploads.byMessageLocalId,\n [messageLocalId]: { progress },\n },\n },\n });\n } : undefined;\n\n // @optimization\n if (params.replyingTo) {\n await rafPromise();\n }\n\n const global = getGlobal();\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { threadId } = currentMessageList;\n\n if (!params.replyingTo && threadId !== MAIN_THREAD_ID) {\n params.replyingTo = selectThreadTopMessageId(global, params.chat.id, threadId)!;\n }\n\n await callApi('sendMessage', params, progressCallback);\n\n if (progressCallback && localId) {\n uploadProgressCallbacks.delete(localId);\n }\n}\n\nfunction forwardMessages(\n fromChat: ApiChat,\n toChat: ApiChat,\n messages: ApiMessage[],\n) {\n callApi('forwardMessages', {\n fromChat,\n toChat,\n messages,\n });\n\n setGlobal({\n ...getGlobal(),\n forwardMessages: {},\n });\n}\n\nasync function loadPollOptionResults(\n chat: ApiChat,\n messageId: number,\n option: string,\n offset?: string,\n limit?: number,\n shouldResetVoters?: boolean,\n) {\n const result = await callApi('loadPollOptionResults', {\n chat, messageId, option, offset, limit,\n });\n\n if (!result) {\n return;\n }\n\n const isUnique = (v: number, i: number, a: number[]) => a.indexOf(v) === i;\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n const { voters } = global.pollResults;\n\n setGlobal({\n ...global,\n pollResults: {\n ...global.pollResults,\n voters: {\n ...voters,\n [option]: [\n ...(!shouldResetVoters && voters && voters[option] ? voters[option] : []),\n ...(result && result.users.map((user) => user.id)),\n ].filter(isUnique),\n },\n offsets: {\n ...(global.pollResults.offsets ? global.pollResults.offsets : {}),\n [option]: result.nextOffset || '',\n },\n },\n });\n}\n\naddReducer('loadPinnedMessages', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void loadPinnedMessages(chat);\n});\n\naddReducer('loadMessageLink', (global, actions, payload) => {\n const { messageId, chatId } = payload;\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n if (!chat || !message) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchMessageLink', { chat, message });\n\n if (result) {\n copyTextToClipboard(result.link);\n }\n })();\n});\n\nasync function loadPinnedMessages(chat: ApiChat) {\n const result = await callApi('fetchPinnedMessages', { chat });\n if (!result) {\n return;\n }\n\n const { messages, chats, users } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = addChatMessagesById(global, chat.id, byId);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n setGlobal(global);\n}\n\nasync function loadScheduledHistory(chat: ApiChat, historyHash?: number) {\n const result = await callApi('fetchScheduledHistory', { chat, hash: historyHash });\n if (!result) {\n return;\n }\n\n const { hash, messages } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = replaceScheduledMessages(global, chat.id, byId, hash);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { LangCode } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { pause, throttle } from '../../../util/schedulers';\nimport {\n updateStickerSets,\n updateStickerSet,\n replaceAnimatedEmojis,\n updateGifSearch,\n updateStickersForEmoji,\n rebuildStickersForEmoji,\n} from '../../reducers';\nimport searchWords from '../../../util/searchWords';\nimport { selectEmojiKeywords, selectStickerSet } from '../../selectors';\n\nconst ADDED_SETS_THROTTLE = 500;\nconst ADDED_SETS_THROTTLE_CHUNK = 50;\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('loadStickerSets', (global) => {\n const { hash } = global.stickers.added || {};\n void loadStickerSets(hash);\n});\n\naddReducer('loadAddedStickers', (global, actions) => {\n const { setIds: addedSetIds } = global.stickers.added;\n if (!addedSetIds || !addedSetIds.length) {\n return;\n }\n\n (async () => {\n for (let i = 0; i < addedSetIds.length; i++) {\n actions.loadStickers({ stickerSetId: addedSetIds[i] });\n\n if (i % ADDED_SETS_THROTTLE_CHUNK === 0 && i > 0) {\n await pause(ADDED_SETS_THROTTLE);\n }\n }\n })();\n});\n\naddReducer('loadRecentStickers', (global) => {\n const { hash } = global.stickers.recent || {};\n void loadRecentStickers(hash);\n});\n\naddReducer('loadFavoriteStickers', (global) => {\n const { hash } = global.stickers.favorite || {};\n void loadFavoriteStickers(hash);\n});\n\naddReducer('loadFeaturedStickers', (global) => {\n const { hash } = global.stickers.featured || {};\n void loadFeaturedStickers(hash);\n});\n\naddReducer('loadStickers', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n let { stickerSetAccessHash } = payload!;\n\n if (!stickerSetAccessHash) {\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n stickerSetAccessHash = stickerSet.accessHash;\n }\n\n void loadStickers(stickerSetId, stickerSetAccessHash);\n});\n\naddReducer('loadAnimatedEmojis', () => {\n void loadAnimatedEmojis();\n});\n\naddReducer('loadSavedGifs', (global) => {\n const { hash } = global.gifs.saved;\n void loadSavedGifs(hash);\n});\n\naddReducer('faveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void callApi('faveSticker', { sticker });\n }\n});\n\naddReducer('unfaveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void unfaveSticker(sticker);\n }\n});\n\naddReducer('toggleStickerSet', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n const { accessHash, installedDate } = stickerSet;\n\n void callApi(!installedDate ? 'installStickerSet' : 'uninstallStickerSet', { stickerSetId, accessHash });\n});\n\naddReducer('loadEmojiKeywords', (global, actions, payload: { language: LangCode }) => {\n const { language } = payload;\n let currentEmojiKeywords = selectEmojiKeywords(global, language);\n\n if (currentEmojiKeywords && currentEmojiKeywords.isLoading) {\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: true,\n },\n },\n });\n\n (async () => {\n const emojiKeywords = await callApi('fetchEmojiKeywords', {\n language,\n fromVersion: currentEmojiKeywords ? currentEmojiKeywords.version : 0,\n });\n\n global = getGlobal();\n currentEmojiKeywords = selectEmojiKeywords(global, language);\n\n if (!emojiKeywords) {\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: false,\n },\n },\n });\n\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n isLoading: false,\n version: emojiKeywords.version,\n keywords: {\n ...(currentEmojiKeywords && currentEmojiKeywords.keywords),\n ...emojiKeywords.keywords,\n },\n },\n },\n });\n })();\n});\n\nasync function loadStickerSets(hash = 0) {\n const addedStickers = await callApi('fetchStickerSets', { hash });\n if (!addedStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'added',\n addedStickers.hash,\n addedStickers.sets,\n ));\n}\n\nasync function loadRecentStickers(hash = 0) {\n const recentStickers = await callApi('fetchRecentStickers', { hash });\n if (!recentStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n recent: recentStickers,\n },\n });\n}\n\nasync function loadFavoriteStickers(hash = 0) {\n const favoriteStickers = await callApi('fetchFavoriteStickers', { hash });\n if (!favoriteStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: favoriteStickers,\n },\n });\n}\n\nasync function loadFeaturedStickers(hash = 0) {\n const featuredStickers = await callApi('fetchFeaturedStickers', { hash });\n if (!featuredStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'featured',\n featuredStickers.hash,\n featuredStickers.sets,\n ));\n}\n\nasync function loadStickers(stickerSetId: string, accessHash: string) {\n const stickerSet = await callApi('fetchStickers', { stickerSetId, accessHash });\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers, packs } = stickerSet;\n\n let global = getGlobal();\n\n global = updateStickerSet(global, set.id, { ...set, stickers, packs });\n\n const currentEmoji = global.stickers.forEmoji.emoji;\n if (currentEmoji && packs[currentEmoji]) {\n global = rebuildStickersForEmoji(global);\n }\n\n setGlobal(global);\n}\n\nasync function loadAnimatedEmojis() {\n const stickerSet = await callApi('fetchAnimatedEmojis');\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers } = stickerSet;\n\n setGlobal(replaceAnimatedEmojis(getGlobal(), { ...set, stickers }));\n}\n\nfunction unfaveSticker(sticker: ApiSticker) {\n const global = getGlobal();\n\n // Remove sticker preemptively to get instant feedback when user removes sticker\n // from favorites while in Sticker Picker\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: {\n ...global.stickers.favorite,\n stickers: global.stickers.favorite.stickers.filter(({ id }) => id !== sticker.id),\n },\n },\n });\n\n void callApi('faveSticker', { sticker, unfave: true });\n}\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (query) {\n void searchThrottled(() => {\n searchStickers(query);\n });\n }\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query);\n });\n }\n});\n\naddReducer('searchMoreGifs', (global) => {\n const { query, offset } = global.gifs.search;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query, offset);\n });\n }\n});\n\naddReducer('loadStickersForEmoji', (global, actions, payload) => {\n const { emoji } = payload!;\n const { hash } = global.stickers.forEmoji;\n\n void searchThrottled(() => {\n loadStickersForEmoji(emoji, hash);\n });\n});\n\naddReducer('clearStickersForEmoji', (global) => {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {},\n },\n };\n});\n\nasync function searchStickers(query: string, hash = 0) {\n const result = await callApi('searchStickers', { query, hash });\n\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n const { setsById, added } = global.stickers;\n\n const resultIds = result.sets.map(({ id }) => id);\n\n if (added.setIds) {\n added.setIds.forEach((id) => {\n if (!resultIds.includes(id)) {\n const { title } = setsById[id] || {};\n if (title && searchWords(title, query)) {\n resultIds.unshift(id);\n }\n }\n });\n }\n\n setGlobal(updateStickerSets(\n global,\n 'search',\n result.hash,\n result.sets,\n resultIds,\n ));\n}\n\nasync function searchGifs(query: string, offset?: string) {\n const result = await callApi('searchGifs', { query, offset });\n if (!result) {\n return;\n }\n\n setGlobal(updateGifSearch(getGlobal(), !offset, result.gifs, result.nextOffset));\n}\n\nasync function loadSavedGifs(hash = 0) {\n const savedGifs = await callApi('fetchSavedGifs', { hash });\n if (!savedGifs) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n gifs: {\n ...global.gifs,\n saved: savedGifs,\n },\n });\n}\n\nasync function loadStickersForEmoji(emoji: string, hash = 0) {\n let global = getGlobal();\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n ...global.stickers.forEmoji,\n emoji,\n },\n },\n });\n\n const result = await callApi('fetchStickersForEmoji', { emoji, hash });\n\n global = getGlobal();\n\n if (!result || global.stickers.forEmoji.emoji !== emoji) {\n return;\n }\n\n global = updateStickersForEmoji(global, emoji, result.stickers, result.hash);\n\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { ApiChat, ApiGlobalMessageSearchType } from '../../../api/types';\n\nimport {\n addChats,\n addMessages,\n addUsers,\n updateGlobalSearch,\n updateGlobalSearchFetchingStatus,\n updateGlobalSearchResults,\n} from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\nimport { selectChat, selectCurrentGlobalSearchQuery } from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { GLOBAL_SEARCH_SLICE } from '../../../config';\nimport { timestampPlusDay } from '../../../util/dateFormat';\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { chatId } = global.globalSearch;\n const { query } = payload!;\n\n if (query && !chatId) {\n void searchThrottled(() => {\n searchChats(query);\n });\n }\n});\n\naddReducer('setGlobalSearchDate', (global, actions, payload) => {\n const { date } = payload!;\n const maxDate = date ? timestampPlusDay(date) : date;\n const newGlobal = updateGlobalSearch(global, {\n date,\n query: '',\n resultsByType: {\n ...global.globalSearch.resultsByType,\n text: {\n totalCount: undefined,\n foundIds: [],\n nextOffsetId: 0,\n },\n },\n });\n setGlobal(newGlobal);\n const { chatId } = global.globalSearch;\n const chat = chatId ? selectChat(global, chatId) : undefined;\n searchMessagesGlobal('', 'text', undefined, chat, maxDate, date);\n});\n\naddReducer('searchMessagesGlobal', (global, actions, payload) => {\n const {\n query, resultsByType, chatId, date,\n } = global.globalSearch;\n const maxDate = date ? timestampPlusDay(date) : date;\n const { type } = payload;\n const { nextOffsetId } = (resultsByType && resultsByType[type as ApiGlobalMessageSearchType]) || {};\n\n const chat = chatId ? selectChat(global, chatId) : undefined;\n\n searchMessagesGlobal(query, type, nextOffsetId, chat, maxDate, date);\n});\n\nasync function searchChats(query: string) {\n const result = await callApi('searchChats', { query });\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { chats: false }));\n return;\n }\n\n const {\n localChats, localUsers, globalChats, globalUsers,\n } = result;\n\n if (localChats.length || globalChats.length) {\n global = addChats(global, buildCollectionByKey([...localChats, ...globalChats], 'id'));\n }\n\n if (localUsers.length || globalUsers.length) {\n global = addUsers(global, buildCollectionByKey([...localUsers, ...globalUsers], 'id'));\n }\n\n global = updateGlobalSearchFetchingStatus(global, { chats: false });\n global = updateGlobalSearch(global, {\n localResults: {\n chatIds: localChats.map(({ id }) => id),\n userIds: localUsers.map(({ id }) => id),\n },\n globalResults: {\n ...global.globalSearch.globalResults,\n chatIds: globalUsers.map(({ id }) => id),\n userIds: globalChats.map(({ id }) => id),\n },\n });\n\n setGlobal(global);\n}\n\nasync function searchMessagesGlobal(\n query = '', type: ApiGlobalMessageSearchType, offsetRate?: number, chat?: ApiChat, maxDate?: number, minDate?: number,\n) {\n let result;\n\n if (chat) {\n const localResult = await callApi('searchMessagesLocal', {\n chatOrUser: chat,\n query,\n type,\n limit: GLOBAL_SEARCH_SLICE,\n offsetId: offsetRate,\n minDate,\n maxDate,\n });\n\n if (localResult) {\n const {\n messages, users, totalCount, nextOffsetId,\n } = localResult;\n\n result = {\n messages,\n users,\n chats: [],\n totalCount,\n nextRate: nextOffsetId,\n };\n }\n } else {\n result = await callApi('searchMessagesGlobal', {\n query,\n offsetRate,\n limit: GLOBAL_SEARCH_SLICE,\n type,\n maxDate,\n minDate,\n });\n }\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || (query !== '' && query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { messages: false }));\n return;\n }\n\n const {\n messages, users, chats, totalCount, nextRate,\n } = result;\n\n if (chats.length) {\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n }\n\n if (users.length) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (messages.length) {\n global = addMessages(global, messages);\n }\n\n global = updateGlobalSearchResults(\n global,\n messages,\n totalCount,\n type,\n nextRate,\n );\n\n setGlobal(global);\n}\n","import {\n addReducer, getGlobal, setGlobal, getDispatch,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiFormattedText, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n CHAT_LIST_LOAD_SLICE, DEBUG, MESSAGE_LIST_SLICE,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n replaceChatListIds,\n replaceChats,\n replaceUsers,\n updateUsers,\n updateChats,\n updateChatListSecondaryInfo,\n updateThreadInfos,\n replaceThreadParam,\n} from '../../reducers';\nimport {\n selectUser, selectChat, selectCurrentMessageList, selectDraft, selectChatMessage,\n} from '../../selectors';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('sync', (global, actions) => {\n void sync(actions.afterSync);\n});\n\naddReducer('afterSync', (global, actions) => {\n void afterSync(actions);\n});\n\nasync function sync(afterSyncCallback: () => void) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START SYNC');\n }\n\n await callApi('fetchCurrentUser');\n\n // This fetches only active chats and clears archived chats, which will be fetched in `afterSync`\n const savedUsers = await loadAndReplaceChats();\n await loadAndReplaceMessages(savedUsers);\n\n setGlobal({\n ...getGlobal(),\n lastSyncTime: Date.now(),\n });\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH SYNC');\n }\n\n afterSyncCallback();\n}\n\nasync function afterSync(actions: GlobalActions) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START AFTER-SYNC');\n }\n\n actions.loadFavoriteStickers();\n\n await Promise.all([\n loadAndUpdateUsers(),\n loadAndReplaceArchivedChats(),\n ]);\n\n await callApi('fetchCurrentUser');\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH AFTER-SYNC');\n }\n}\n\nasync function loadAndReplaceChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n withPinned: true,\n });\n if (!result) {\n return undefined;\n }\n\n let global = getGlobal();\n\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n const { currentUserId } = global;\n\n const savedPrivateChatIds = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ...(currentUserId ? [currentUserId] : []),\n ];\n\n const savedUsers = savedPrivateChatIds\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n const savedChats = savedPrivateChatIds\n .map((id) => selectChat(global, id))\n .filter(Boolean as any);\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n if (currentChatId) {\n const selectedChat = selectChat(global, currentChatId);\n if (selectedChat && !savedPrivateChatIds.includes(currentChatId)) {\n savedChats.push(selectedChat);\n }\n\n if (isChatPrivate(currentChatId)) {\n const selectedChatUser = selectUser(global, currentChatId);\n if (selectedChatUser && !savedPrivateChatIds.includes(currentChatId)) {\n savedUsers.push(selectedChatUser);\n }\n }\n }\n\n savedUsers.push(...result.users);\n savedChats.push(...result.chats);\n\n global = replaceChats(global, buildCollectionByKey(savedChats, 'id'));\n global = replaceChatListIds(global, 'active', result.chatIds);\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n },\n };\n\n global = updateChatListSecondaryInfo(global, 'active', result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n setGlobal(global);\n\n if (currentChatId && !global.chats.byId[currentChatId]) {\n getDispatch().openChat({ id: undefined });\n }\n\n return savedUsers;\n}\n\nasync function loadAndReplaceArchivedChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n archived: true,\n withPinned: true,\n });\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = replaceChatListIds(global, 'archived', result.chatIds);\n global = updateChatListSecondaryInfo(global, 'archived', result);\n setGlobal(global);\n}\n\nasync function loadAndReplaceMessages(savedUsers?: ApiUser[]) {\n let areMessagesLoaded = false;\n let users = savedUsers || [];\n\n let global = getGlobal();\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n // Memoize drafts\n const draftChatIds = Object.keys(global.messages.byChatId).map(Number);\n const draftsByChatId = draftChatIds.reduce>((acc, chatId) => {\n const draft = selectDraft(global, chatId, MAIN_THREAD_ID);\n return draft ? { ...acc, [chatId]: draft } : acc;\n }, {});\n\n if (currentChatId) {\n const result = await loadTopMessages(global.chats.byId[currentChatId]);\n global = getGlobal();\n const { chatId: newCurrentChatId } = selectCurrentMessageList(global) || {};\n\n if (result && newCurrentChatId === currentChatId) {\n const currentMessageListInfo = global.messages.byChatId[currentChatId];\n const byId = buildCollectionByKey(result.messages, 'id');\n const listedIds = Object.keys(byId).map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n [currentChatId]: {\n byId,\n threadsById: {\n [MAIN_THREAD_ID]: {\n ...(currentMessageListInfo && currentMessageListInfo.threadsById[MAIN_THREAD_ID]),\n listedIds,\n viewportIds: listedIds,\n outlyingIds: undefined,\n },\n },\n },\n },\n },\n };\n\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateThreadInfos(global, currentChatId, result.threadInfos);\n\n areMessagesLoaded = true;\n users = Array.prototype.concat(users, result.users);\n }\n }\n\n if (!areMessagesLoaded) {\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {},\n },\n };\n }\n\n // Restore drafts\n Object.keys(draftsByChatId).map(Number).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', draftsByChatId[chatId]);\n });\n\n if (savedUsers) {\n global = replaceUsers(global, buildCollectionByKey(users, 'id'));\n } else if (users) {\n // If `fetchChats` has failed for some reason, we don't have saved chats, thus we can not replace\n global = updateUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n setGlobal(global);\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n if (audioChatId && audioMessageId && !selectChatMessage(global, audioChatId, audioMessageId)) {\n getDispatch().closeAudioPlayer();\n }\n}\n\nasync function loadAndUpdateUsers() {\n let global = getGlobal();\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n if (\n (!contactIds || !contactIds.length)\n && (!recentlyFoundChatIds || !recentlyFoundChatIds.length)\n ) {\n return;\n }\n\n const users = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ].map((id) => selectUser(global, id)).filter(Boolean as any);\n\n const updatedUsers = await callApi('fetchUsers', { users });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n}\n\nfunction loadTopMessages(chat: ApiChat) {\n return callApi('fetchMessages', {\n chat,\n threadId: MAIN_THREAD_ID,\n offsetId: chat.lastReadInboxMessageId,\n addOffset: -(Math.round(MESSAGE_LIST_SLICE / 2) + 1),\n limit: MESSAGE_LIST_SLICE,\n });\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectCurrentTextSearch,\n selectCurrentMediaSearchPeerId,\n selectCurrentMediaSearch, selectCurrentMessageList, selectChat, selectThreadInfo,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n addChatMessagesById,\n addUsers,\n updateLocalMediaSearchResults,\n updateLocalTextSearchResults,\n} from '../../reducers';\nimport { SharedMediaType } from '../../../types';\n\naddReducer('searchTextMessagesLocal', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const currentSearch = selectCurrentTextSearch(global);\n if (!chat || !currentSearch || !threadId) {\n return;\n }\n\n const { query, results } = currentSearch;\n const offsetId = results ? results.nextOffsetId : undefined;\n\n let topMessageId: number | undefined;\n if (threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId!, threadId);\n topMessageId = threadInfo ? threadInfo.topMessageId : undefined;\n }\n\n void searchTextMessages(chat, threadId, topMessageId, query, offsetId);\n});\n\naddReducer('searchMediaMessagesLocal', (global) => {\n const peerId = selectCurrentMediaSearchPeerId(global);\n const chatOrUser = peerId\n ? global.users.byId[peerId] || global.chats.byId[peerId]\n : undefined;\n const currentSearch = selectCurrentMediaSearch(global);\n\n if (!chatOrUser || !currentSearch) {\n return;\n }\n\n const { currentType: type, resultsByType } = currentSearch;\n const currentResults = type && resultsByType && resultsByType[type];\n const offsetId = currentResults ? currentResults.nextOffsetId : undefined;\n\n if (!type) {\n return;\n }\n\n void searchSharedMedia(chatOrUser, type, offsetId);\n});\n\naddReducer('searchMessagesByDate', (global, actions, payload) => {\n const { timestamp } = payload!;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void searchMessagesByDate(chat, timestamp);\n});\n\nasync function searchTextMessages(\n chatOrUser: ApiChat,\n threadId: number,\n topMessageId?: number,\n query?: string,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type: 'text',\n query,\n topMessageId,\n limit: MESSAGE_SEARCH_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentTextSearch(global);\n if (!currentSearch || (query && query !== currentSearch.query)) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalTextSearchResults(global, chatOrUser.id, threadId, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\nasync function searchSharedMedia(\n chatOrUser: ApiChat | ApiUser,\n type: SharedMediaType,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type,\n limit: SHARED_MEDIA_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentMediaSearch(global);\n if (!currentSearch) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalMediaSearchResults(global, chatOrUser.id, type, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\n/**\n * @param timestamp start of target date in seconds\n */\nasync function searchMessagesByDate(chat: ApiChat, timestamp: number) {\n const messageId = await callApi('findFirstMessageIdAfterDate', {\n chat,\n timestamp,\n });\n\n if (!messageId) {\n return;\n }\n\n getDispatch().focusMessage({\n chatId: chat.id,\n messageId,\n });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementProgress } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { updateManagement, updateManagementProgress } from '../../reducers';\nimport { selectChat, selectCurrentMessageList } from '../../selectors';\nimport { isChatBasicGroup } from '../../helpers';\n\naddReducer('checkPublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n // No need to check the username if already in progress\n if (global.management.progress === ManagementProgress.InProgress) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n\n const isUsernameAvailable = await callApi('checkChatUsername', { username })!;\n\n global = getGlobal();\n global = updateManagementProgress(\n global, isUsernameAvailable ? ManagementProgress.Complete : ManagementProgress.Error,\n );\n global = updateManagement(global, chatId, { isUsernameAvailable });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n let chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n setGlobal(global);\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n const result = await callApi('setChatUsername', { chat, username });\n\n global = getGlobal();\n global = updateManagementProgress(global, result ? ManagementProgress.Complete : ManagementProgress.Error);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePrivateLink', (global) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n callApi('updatePrivateLink', { chat });\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { debounce } from '../../../util/schedulers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { isChatPrivate } from '../../helpers';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat, selectUser } from '../../selectors';\nimport {\n addChats, addUsers, updateChat, updateManagementProgress, updateUser, updateUsers,\n} from '../../reducers';\n\nconst runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);\nconst TOP_PEERS_REQUEST_COOLDOWN = 60000; // 1 min\n\naddReducer('loadFullUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n runDebouncedForFetchFullUser(() => callApi('fetchFullUser', { id, accessHash }));\n});\n\naddReducer('loadUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n (async () => {\n const updatedUsers = await callApi('fetchUsers', { users: [user] });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n })();\n});\n\naddReducer('loadTopUsers', (global) => {\n const { hash, lastRequestedAt } = global.topPeers;\n\n if (!lastRequestedAt || Date.now() - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) {\n void loadTopUsers(hash);\n }\n});\n\naddReducer('loadContactList', (global) => {\n const { hash } = global.contactList || {};\n void loadContactList(hash);\n});\n\naddReducer('loadCurrentUser', () => {\n void callApi('fetchCurrentUser');\n});\n\naddReducer('updateContact', (global, actions, payload) => {\n const {\n userId, isMuted, firstName, lastName,\n } = payload!;\n\n void updateContact(userId, isMuted, firstName, lastName);\n});\n\naddReducer('deleteUser', (global, actions, payload) => {\n const { userId } = payload!;\n\n void deleteUser(userId);\n});\n\nasync function loadTopUsers(usersHash?: number) {\n const result = await callApi('fetchTopUsers', { hash: usersHash });\n if (!result) {\n return;\n }\n\n const { hash, ids, users } = result;\n\n let global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = {\n ...global,\n topPeers: {\n ...global.topPeers,\n hash,\n userIds: ids,\n lastRequestedAt: Date.now(),\n },\n };\n setGlobal(global);\n}\n\nasync function loadContactList(hash?: number) {\n const contactList = await callApi('fetchContactList', { hash });\n if (!contactList) {\n return;\n }\n\n let global = addUsers(getGlobal(), buildCollectionByKey(contactList.users, 'id'));\n global = addChats(global, buildCollectionByKey(contactList.chats, 'id'));\n\n // Sort contact list by Last Name (or First Name), with latin names being placed first\n const getCompareString = (user: ApiUser) => (user.lastName || user.firstName || '');\n const collator = new Intl.Collator('en-US');\n\n const sortedUsers = contactList.users.sort((a, b) => (\n collator.compare(getCompareString(a), getCompareString(b))\n )).filter((user) => !user.isSelf);\n\n setGlobal({\n ...global,\n contactList: {\n hash: contactList.hash,\n userIds: sortedUsers.map((user) => user.id),\n },\n });\n}\n\nasync function updateContact(\n userId: number,\n isMuted: boolean,\n firstName: string,\n lastName?: string,\n) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n getDispatch().updateChatMutedState({ chatId: userId, isMuted });\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n const result = await callApi('updateContact', { phone: user.phoneNumber, firstName, lastName });\n\n if (result) {\n setGlobal(updateUser(\n getGlobal(),\n user.id,\n {\n firstName,\n lastName,\n },\n ));\n }\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n}\n\nasync function deleteUser(userId: number) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n await callApi('deleteUser', { id, accessHash });\n}\n\naddReducer('loadProfilePhotos', (global, actions, payload) => {\n const { profileId } = payload!;\n const isPrivate = isChatPrivate(profileId);\n const user = isPrivate ? selectUser(global, profileId) : undefined;\n const chat = !isPrivate ? selectChat(global, profileId) : undefined;\n\n (async () => {\n const result = await callApi('fetchProfilePhotos', user, chat);\n if (!result || !result.photos) {\n return;\n }\n\n let newGlobal = getGlobal();\n if (isPrivate) {\n newGlobal = updateUser(newGlobal, profileId, { photos: result.photos });\n } else {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users!, 'id'));\n newGlobal = updateChat(newGlobal, profileId, { photos: result.photos });\n }\n\n setGlobal(newGlobal);\n })();\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, IInputPrivacyRules, IInputPrivacyContact,\n UPLOADING_WALLPAPER_SLUG,\n} from '../../../types';\n\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n} from '../../reducers';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('updateProfile', (global, actions, payload) => {\n const {\n photo, firstName, lastName, bio: about, username,\n } = payload!;\n\n (async () => {\n const { currentUserId } = global;\n if (!currentUserId) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.InProgress,\n },\n });\n\n if (photo) {\n await callApi('updateProfilePhoto', photo);\n }\n\n if (firstName || lastName || about) {\n const result = await callApi('updateProfile', { firstName, lastName, about });\n if (result) {\n global = getGlobal();\n const currentUser = currentUserId && selectUser(global, currentUserId);\n\n if (currentUser) {\n setGlobal(updateUser(\n global,\n currentUser.id,\n {\n firstName,\n lastName,\n fullInfo: {\n ...currentUser.fullInfo,\n bio: about,\n },\n },\n ));\n }\n }\n }\n\n if (username) {\n const result = await callApi('updateUsername', username);\n if (result && currentUserId) {\n setGlobal(updateUser(getGlobal(), currentUserId, { username }));\n }\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.Complete,\n },\n });\n })();\n});\n\naddReducer('checkUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n (async () => {\n // No need to check the username if profile update is already in progress\n if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) {\n return;\n }\n\n setGlobal({\n ...global,\n profileEdit: {\n progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle,\n isUsernameAvailable: undefined,\n },\n });\n\n const isUsernameAvailable = await callApi('checkUsername', username);\n\n global = getGlobal();\n setGlobal({\n ...global,\n profileEdit: {\n ...global.profileEdit!,\n isUsernameAvailable,\n },\n });\n })();\n});\n\naddReducer('loadWallpapers', () => {\n (async () => {\n const result = await callApi('fetchWallpapers', 0);\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: result.wallpapers,\n },\n });\n })();\n});\n\naddReducer('uploadWallpaper', (global, actions, payload) => {\n const file = payload;\n const previewBlobUrl = URL.createObjectURL(file);\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n {\n slug: UPLOADING_WALLPAPER_SLUG,\n document: {\n fileName: '',\n size: file.size,\n mimeType: file.type,\n previewBlobUrl,\n },\n },\n ...(global.settings.loadedWallpapers || []),\n ],\n },\n });\n\n (async () => {\n const result = await callApi('uploadWallpaper', file);\n if (!result) {\n return;\n }\n\n const { wallpaper } = result;\n\n global = getGlobal();\n if (!global.settings.loadedWallpapers) {\n return;\n }\n\n const firstWallpaper = global.settings.loadedWallpapers[0];\n if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) {\n return;\n }\n\n const withLocalMedia = {\n ...wallpaper,\n document: {\n ...wallpaper.document,\n previewBlobUrl,\n },\n };\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n withLocalMedia,\n ...global.settings.loadedWallpapers.slice(1),\n ],\n },\n });\n })();\n});\n\naddReducer('loadBlockedContacts', () => {\n (async () => {\n const result = await callApi('fetchBlockedContacts');\n\n if (!result) {\n return;\n }\n\n let newGlobal = getGlobal();\n\n if (result.users && result.users.length) {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n }\n if (result.chats && result.chats.length) {\n newGlobal = updateChats(newGlobal, buildCollectionByKey(result.chats, 'id'));\n }\n\n newGlobal = {\n ...newGlobal,\n blocked: {\n ...newGlobal.blocked,\n ids: [...(newGlobal.blocked.ids || []), ...result.blockedIds],\n totalCount: result.totalCount,\n },\n };\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('blockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(addBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('unblockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n let accessHash: string | undefined;\n const isPrivate = isChatPrivate(contactId);\n\n if (isPrivate) {\n const user = selectUser(global, contactId);\n if (!user) {\n return;\n }\n\n accessHash = user.accessHash;\n }\n\n (async () => {\n const result = await callApi('unblockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(removeBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('loadAuthorizations', () => {\n (async () => {\n const result = await callApi('fetchAuthorizations');\n if (!result) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n activeSessions: result,\n });\n })();\n});\n\naddReducer('terminateAuthorization', (global, actions, payload) => {\n const { hash } = payload!;\n\n (async () => {\n const result = await callApi('terminateAuthorization', hash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n activeSessions: newGlobal.activeSessions.filter((session) => session.hash !== hash),\n });\n })();\n});\n\naddReducer('terminateAllAuthorizations', () => {\n (async () => {\n const result = await callApi('terminateAllAuthorizations');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n activeSessions: global.activeSessions.filter((session) => session.isCurrent),\n });\n })();\n});\n\naddReducer('loadNotificationExceptions', () => {\n callApi('fetchNotificationExceptions');\n});\n\naddReducer('loadNotificationSettings', () => {\n (async () => {\n const result = await callApi('fetchNotificationSettings');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateNotificationSettings', (global, actions, payload) => {\n const { peerType, isSilent, shouldShowPreviews } = payload!;\n\n (async () => {\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, shouldShowPreviews });\n\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, shouldShowPreviews));\n })();\n});\n\naddReducer('updateContactSignUpNotification', (global, actions, payload) => {\n const { isSilent } = payload!;\n\n (async () => {\n const result = await callApi('updateContactSignUpNotification', isSilent);\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent }));\n })();\n});\n\naddReducer('loadLanguages', () => {\n (async () => {\n const result = await callApi('fetchLanguages');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { languages: result }));\n })();\n});\n\naddReducer('loadPrivacySettings', () => {\n (async () => {\n const [\n phoneNumberSettings, lastSeenSettings, profilePhotoSettings, forwardsSettings, chatInviteSettings,\n ] = await Promise.all([\n callApi('fetchPrivacySettings', 'phoneNumber'),\n callApi('fetchPrivacySettings', 'lastSeen'),\n callApi('fetchPrivacySettings', 'profilePhoto'),\n callApi('fetchPrivacySettings', 'forwards'),\n callApi('fetchPrivacySettings', 'chatInvite'),\n ]);\n\n if (\n !phoneNumberSettings || !lastSeenSettings || !profilePhotoSettings || !forwardsSettings || !chatInviteSettings\n ) {\n return;\n }\n\n const global = getGlobal();\n\n global.settings.privacy.phoneNumber = phoneNumberSettings;\n global.settings.privacy.lastSeen = lastSeenSettings;\n global.settings.privacy.profilePhoto = profilePhotoSettings;\n global.settings.privacy.forwards = forwardsSettings;\n global.settings.privacy.chatInvite = chatInviteSettings;\n\n setGlobal(global);\n })();\n});\n\naddReducer('setPrivacyVisibility', (global, actions, payload) => {\n const { privacyKey, visibility } = payload!;\n\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility,\n allowedIds: [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\naddReducer('setPrivacySettings', (global, actions, payload) => {\n const { privacyKey, isAllowList, contactsIds } = payload!;\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility: settings.visibility,\n allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\nfunction buildInputPrivacyRules(global: GlobalState, {\n visibility,\n allowedIds,\n deniedIds,\n}: {\n visibility: PrivacyVisibility;\n allowedIds: number[];\n deniedIds: number[];\n}): IInputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: IInputPrivacyRules = {\n visibility,\n };\n let users: IInputPrivacyContact[];\n let chats: IInputPrivacyContact[];\n\n const collectUsers = (userId: number) => {\n if (!isChatPrivate(userId)) {\n return undefined;\n }\n const { id, accessHash } = usersById[userId] || {};\n if (!id) {\n return undefined;\n }\n\n return { id, accessHash };\n };\n\n const collectChats = (userId: number) => {\n if (isChatPrivate(userId)) {\n return undefined;\n }\n const chat = chatsById[userId];\n\n return chat ? { id: chat.id } : undefined;\n };\n\n if (visibility === 'contacts' || visibility === 'nobody') {\n users = allowedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.allowedUsers = users;\n }\n if (chats.length > 0) {\n rules.allowedChats = chats;\n }\n }\n\n if (visibility === 'everybody' || visibility === 'contacts') {\n users = deniedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.blockedUsers = users;\n }\n if (chats.length > 0) {\n rules.blockedChats = chats;\n }\n }\n\n return rules;\n}\n","import { addReducer, getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { RE_TME_INVITE_LINK, RE_TME_LINK } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChatMessage, selectCurrentChat } from '../../selectors';\n\naddReducer('clickInlineButton', (global, actions, payload) => {\n const { button } = payload;\n\n switch (button.type) {\n case 'command':\n actions.sendBotCommand({ command: button.value });\n break;\n case 'url':\n if (button.value.match(RE_TME_INVITE_LINK) || button.value.match(RE_TME_LINK)) {\n actions.openTelegramLink({ url: button.value });\n } else {\n actions.toggleSafeLinkModal({ url: button.value });\n }\n break;\n case 'callback': {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n void answerCallbackButton(chat, button.messageId, button.value);\n break;\n }\n case 'requestPoll':\n actions.openPollModal();\n break;\n case 'buy': {\n const chat = selectCurrentChat(global);\n const { messageId, value } = button;\n if (!chat) {\n return;\n }\n\n if (value) {\n actions.getReceipt({ receiptMessageId: value, chatId: chat.id, messageId });\n } else {\n actions.getPaymentForm({ messageId });\n actions.setInvoiceMessageInfo(selectChatMessage(global, chat.id, messageId));\n actions.openPaymentModal({ messageId });\n }\n break;\n }\n }\n});\n\naddReducer('sendBotCommand', (global, actions, payload) => {\n const { command } = payload;\n const { currentUserId } = global;\n const chat = selectCurrentChat(global);\n if (!currentUserId || !chat) {\n return;\n }\n\n void sendBotCommand(chat, currentUserId, command);\n});\n\nasync function sendBotCommand(chat: ApiChat, currentUserId: number, command: string) {\n await callApi('sendMessage', {\n chat,\n text: command,\n });\n}\n\nasync function answerCallbackButton(chat: ApiChat, messageId: number, data: string) {\n const result = await callApi('answerCallbackButton', {\n chatId: chat.id,\n accessHash: chat.accessHash,\n messageId,\n data,\n });\n\n if (!result || !result.message) {\n return;\n }\n\n const { message, alert: isError } = result;\n\n if (isError) {\n getDispatch().showError({ error: { message } });\n } else {\n getDispatch().showNotification({ message });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { replaceSettings, updateTwoFaSettings } from '../../reducers';\n\naddReducer('loadPasswordInfo', () => {\n (async () => {\n const result = await callApi('getPasswordInfo');\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = replaceSettings(global, { hasPassword: result.hasPassword });\n global = updateTwoFaSettings(global, { hint: result.hint });\n setGlobal(global);\n })();\n});\n\naddReducer('checkPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('checkPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('clearPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('clearPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updatePassword', (global, actions, payload) => {\n const {\n currentPassword, password, hint, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updatePassword', currentPassword, password, hint, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updateRecoveryEmail', (global, actions, payload) => {\n const {\n currentPassword, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updateRecoveryEmail', currentPassword, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false, waitingEmailCodeLength: undefined }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('provideTwoFaEmailCode', (global, actions, payload) => {\n const { code } = payload;\n\n void callApi('provideRecoveryEmailCode', code);\n});\n\naddReducer('clearTwoFaError', (global) => {\n return updateTwoFaSettings(global, { error: undefined });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { PaymentStep } from '../../../types/index';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectPaymentMessageId,\n selectPaymentRequestId,\n selectProviderPublishableKey,\n selectStripeCredentials,\n selectChatMessage,\n} from '../../selectors';\n\nimport { getStripeError } from '../../helpers/payments';\nimport { buildQueryString } from '../../../util/requestQuery';\n\nimport {\n updateShippingOptions,\n setPaymentStep,\n setRequestInfoId,\n setPaymentForm,\n setStripeCardInfo,\n setInvoiceMessageInfo,\n setReceipt,\n clearPayment,\n closeInvoice,\n} from '../../reducers';\n\naddReducer('validateRequestedInfo', (global, actions, payload) => {\n const { requestInfo, saveInfo } = payload;\n const messageId = selectPaymentMessageId(global);\n if (!messageId) {\n return;\n }\n validateRequestedInfo(messageId, requestInfo, saveInfo);\n});\n\nasync function validateRequestedInfo(messageId: number, requestInfo: any, shouldSave?: true) {\n const result = await callApi('validateRequestedInfo', { messageId, requestInfo, shouldSave });\n if (!result) {\n return;\n }\n const { id, shippingOptions } = result;\n if (!id) {\n return;\n }\n let global = setRequestInfoId(getGlobal(), id);\n if (shippingOptions) {\n global = updateShippingOptions(global, shippingOptions);\n global = setPaymentStep(global, PaymentStep.Shipping);\n } else {\n global = setPaymentStep(global, PaymentStep.PaymentInfo);\n }\n setGlobal(global);\n}\n\naddReducer('getPaymentForm', (global, actions, payload) => {\n const { messageId } = payload;\n if (!messageId) {\n return;\n }\n getPaymentForm(messageId);\n});\n\n\nasync function getPaymentForm(messageId: number) {\n const result = await callApi('getPaymentForm', { messageId });\n if (!result) {\n return;\n }\n let global = setPaymentForm(getGlobal(), result);\n let step = PaymentStep.PaymentInfo;\n if (global.payment.invoice\n && (global.payment.invoice.shippingAddressRequested\n || global.payment.invoice.nameRequested\n || global.payment.invoice.phoneRequested\n || global.payment.invoice.emailRequested)) {\n step = PaymentStep.ShippingInfo;\n }\n global = setPaymentStep(global, step);\n setGlobal(global);\n}\n\naddReducer('getReceipt', (global, actions, payload) => {\n const { receiptMessageId, chatId, messageId } = payload;\n if (!messageId || !receiptMessageId || !chatId) {\n return;\n }\n getReceipt(messageId, receiptMessageId, chatId);\n});\n\nasync function getReceipt(messageId: number, receiptMessageId: number, chatId: number) {\n const result = await callApi('getReceipt', receiptMessageId);\n if (!result) {\n return;\n }\n let global = getGlobal();\n const message = selectChatMessage(global, chatId, messageId);\n global = setReceipt(global, result, message);\n setGlobal(global);\n}\n\naddReducer('clearPaymentError', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: undefined,\n },\n });\n});\n\naddReducer('clearReceipt', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n });\n});\n\naddReducer('sendCredentialsInfo', (global, actions, payload) => {\n const publishableKey = selectProviderPublishableKey(global);\n if (!publishableKey) {\n return;\n }\n const { credentials } = payload;\n const { data } = credentials;\n sendStipeCredentials(data, publishableKey);\n});\n\naddReducer('sendPaymentForm', (global, actions, payload) => {\n const { shippingOptionId, saveCredentials } = payload;\n const messageId = selectPaymentMessageId(global);\n const requestInfoId = selectPaymentRequestId(global);\n const publishableKey = selectProviderPublishableKey(global);\n const stripeCredentials = selectStripeCredentials(global);\n if (!messageId || !publishableKey) {\n return;\n }\n sendPaymentForm(messageId, {\n save: saveCredentials,\n data: stripeCredentials,\n }, requestInfoId, shippingOptionId);\n});\n\nasync function sendStipeCredentials(data: {\n cardNumber: string;\n cardholder?: string;\n expiryMonth: string;\n expiryYear: string;\n cvv: string;\n country: string;\n zip: string;\n},\npublishableKey: string) {\n const query = buildQueryString({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvv,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n });\n\n const response = await fetch(`https://api.stripe.com/v1/tokens${query}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Bearer ${publishableKey}`,\n },\n });\n const result = await response.json();\n if (result.error) {\n const error = getStripeError(result.error);\n const global = getGlobal();\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: {\n ...error,\n },\n },\n });\n return;\n }\n let global = setStripeCardInfo(getGlobal(), {\n type: result.type,\n id: result.id,\n });\n global = setPaymentStep(global, PaymentStep.Checkout);\n setGlobal(global);\n}\n\nasync function sendPaymentForm(\n messageId: number,\n credentials: any,\n requestedInfoId?: string,\n shippingOptionId?: string,\n) {\n const result = await callApi('sendPaymentForm', {\n messageId, credentials, requestedInfoId, shippingOptionId,\n });\n if (result) {\n const global = clearPayment(getGlobal());\n setGlobal(closeInvoice(global));\n }\n}\n\naddReducer('setPaymentStep', (global, actions, payload = {}) => {\n return setPaymentStep(global, payload.step || PaymentStep.ShippingInfo);\n});\n\naddReducer('setInvoiceMessageInfo', (global, actions, payload) => {\n return setInvoiceMessageInfo(global, payload);\n});\n","export function buildQueryString(data: Record) {\n const query = Object.keys(data).map((k) => `${k}=${data[k]}`).join('&');\n return query.length > 0 ? `?${query}` : '';\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { ARCHIVED_FOLDER_ID, MAX_ACTIVE_PINNED_CHATS } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { showNewMessageNotification } from '../../../util/notifications';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n updateChat,\n replaceChatListIds,\n updateChatListIds,\n updateChatListType,\n replaceThreadParam,\n} from '../../reducers';\nimport {\n selectChat,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectChatListType,\n selectCurrentMessageList,\n selectCountNotMutedUnread,\n} from '../../selectors';\nimport { throttle } from '../../../util/schedulers';\n\nconst TYPING_STATUS_CLEAR_DELAY = 6000; // 6 seconds\n\n// Enough to animate and mark as read in Message List\nconst CURRENT_CHAT_UNREAD_DELAY = 1000;\nconst runThrottledForUpdateAppBadge = throttle((cb) => cb(), CURRENT_CHAT_UNREAD_DELAY, true);\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateChat': {\n if (!update.noTopChatsRequest && !selectIsChatListed(global, update.id)) {\n // Chat can appear in dialogs list.\n actions.loadTopChats();\n }\n\n const newGlobal = updateChat(global, update.id, update.chat, update.newProfilePhoto);\n setGlobal(newGlobal);\n\n const unreadCount = selectCountNotMutedUnread(newGlobal);\n runThrottledForUpdateAppBadge(() => updateAppBadge(unreadCount));\n break;\n }\n\n case 'updateChatJoin': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n global = updateChatListIds(global, listType, [update.id]);\n global = updateChat(global, update.id, { isNotJoined: false });\n setGlobal(global);\n\n const chat = selectChat(global, update.id);\n if (chat) {\n actions.requestChatUpdate({ chatId: chat.id });\n }\n break;\n }\n\n case 'updateChatLeave': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== update.id));\n }\n\n global = updateChat(global, update.id, { isNotJoined: true });\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatInbox': {\n setGlobal(updateChat(global, update.id, update.chat));\n\n break;\n }\n\n case 'updateChatTypingStatus': {\n const { id, typingStatus } = update;\n setGlobal(updateChat(global, id, { typingStatus }));\n\n setTimeout(() => {\n const newGlobal = getGlobal();\n const chat = selectChat(newGlobal, id);\n if (chat && typingStatus && chat.typingStatus && chat.typingStatus.timestamp === typingStatus.timestamp) {\n setGlobal(updateChat(newGlobal, id, { typingStatus: undefined }));\n }\n }, TYPING_STATUS_CLEAR_DELAY);\n\n break;\n }\n\n case 'newMessage': {\n const { message } = update;\n const { chatId: currentChatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n\n if (message.senderId === global.currentUserId && !message.isFromScheduled) {\n return;\n }\n\n const chat = selectChat(global, update.chatId);\n if (!chat) {\n return;\n }\n\n const isActiveChat = (\n messageListType === 'thread'\n && threadId === MAIN_THREAD_ID\n && update.chatId === currentChatId\n );\n\n if (isActiveChat) {\n setTimeout(() => {\n actions.requestChatUpdate({ chatId: update.chatId });\n }, CURRENT_CHAT_UNREAD_DELAY);\n } else {\n setGlobal(updateChat(global, update.chatId, {\n unreadCount: chat.unreadCount ? chat.unreadCount + 1 : 1,\n ...(update.message.hasUnreadMention && {\n unreadMentionsCount: chat.unreadMentionsCount ? chat.unreadMentionsCount + 1 : 1,\n }),\n }));\n }\n\n const unreadCount = selectCountNotMutedUnread(getGlobal());\n updateAppBadge(unreadCount);\n showNewMessageNotification({ chat, message, isActiveChat });\n\n break;\n }\n\n case 'updateCommonBoxMessages':\n case 'updateChannelMessages': {\n const { ids, messageUpdate } = update;\n if (messageUpdate.hasUnreadMention !== false) {\n return;\n }\n\n ids.forEach((id) => {\n const chatId = 'channelId' in update ? update.channelId : selectCommonBoxChatId(global, id);\n const chat = selectChat(global, chatId);\n if (chat && chat.unreadMentionsCount) {\n global = updateChat(global, chatId, {\n unreadMentionsCount: chat.unreadMentionsCount - 1,\n });\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatFullInfo': {\n const { fullInfo } = update;\n const targetChat = global.chats.byId[update.id];\n if (!targetChat) {\n return;\n }\n\n setGlobal(updateChat(global, update.id, {\n fullInfo: {\n ...targetChat.fullInfo,\n ...fullInfo,\n },\n }));\n\n break;\n }\n\n case 'updatePinnedChatIds': {\n const { ids, folderId } = update;\n\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: ids.length ? ids : undefined,\n },\n },\n };\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatPinned': {\n const { id, isPinned } = update;\n const listType = selectChatListType(global, id);\n if (listType) {\n const { [listType]: orderedPinnedIds } = global.chats.orderedPinnedIds;\n\n let newOrderedPinnedIds = orderedPinnedIds || [];\n if (!isPinned) {\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => pinnedId !== id);\n } else if (!newOrderedPinnedIds.includes(id)) {\n // When moving pinned chats to archive, active ordered pinned ids don't get updated\n // (to preserve chat pinned state when it returns from archive)\n // If user already has max pinned chats, we should check for orderedIds\n // that don't point to listed chats\n if (listType === 'active' && newOrderedPinnedIds.length >= MAX_ACTIVE_PINNED_CHATS) {\n const listIds = global.chats.listIds.active;\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => listIds && listIds.includes(pinnedId));\n }\n\n newOrderedPinnedIds = [id, ...newOrderedPinnedIds];\n }\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: newOrderedPinnedIds.length ? newOrderedPinnedIds : undefined,\n },\n },\n };\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatListType': {\n const { id, folderId } = update;\n\n setGlobal(updateChatListType(global, id, folderId));\n\n break;\n }\n\n case 'updateChatFolder': {\n const { id, folder } = update;\n const { byId: chatFoldersById, orderedIds } = global.chatFolders;\n\n const newChatFoldersById = folder\n ? { ...chatFoldersById, [id]: folder }\n : pick(\n chatFoldersById,\n Object.keys(chatFoldersById).map(Number).filter((folderId) => folderId !== id),\n );\n\n const newOrderedIds = folder\n ? orderedIds && orderedIds.includes(id) ? orderedIds : [...(orderedIds || []), id]\n : orderedIds ? orderedIds.filter((orderedId) => orderedId !== id) : undefined;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n byId: newChatFoldersById,\n orderedIds: newOrderedIds,\n },\n });\n\n break;\n }\n\n case 'updateChatFoldersOrder': {\n const { orderedIds } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n orderedIds,\n },\n });\n\n break;\n }\n\n case 'updateRecommendedChatFolders': {\n const { folders } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: folders,\n },\n });\n\n break;\n }\n\n case 'updateChatMembers': {\n const targetChat = global.chats.byId[update.id];\n const { replacedMembers, addedMember, deletedMemberId } = update;\n if (!targetChat) {\n return;\n }\n\n let shouldUpdate = false;\n let members = targetChat.fullInfo && targetChat.fullInfo.members\n ? [...targetChat.fullInfo.members]\n : [];\n\n if (replacedMembers) {\n members = replacedMembers;\n shouldUpdate = true;\n } else if (addedMember) {\n if (\n !members.length\n || !members.some((m) => m.userId === addedMember.userId)\n ) {\n members.push(addedMember);\n shouldUpdate = true;\n }\n } else if (members.length && deletedMemberId) {\n const deleteIndex = members.findIndex((m) => m.userId === deletedMemberId);\n if (deleteIndex > -1) {\n members.slice(deleteIndex, 1);\n shouldUpdate = true;\n }\n }\n\n if (shouldUpdate) {\n const adminMembers = members.filter(({ isOwner, isAdmin }) => isOwner || isAdmin);\n // TODO Kicked members?\n\n setGlobal(updateChat(global, update.id, {\n membersCount: members.length,\n fullInfo: {\n ...targetChat.fullInfo,\n members,\n adminMembers,\n },\n }));\n }\n\n break;\n }\n\n case 'deleteProfilePhotos': {\n const { chatId, ids } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat && chat.photos) {\n setGlobal(updateChat(global, chatId, {\n photos: chat.photos.filter((photo) => !ids.includes(photo.id)),\n }));\n }\n break;\n }\n\n case 'draftMessage': {\n const { chatId, formattedText, replyingToId } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat) {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', formattedText);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'replyingToId', replyingToId);\n\n setGlobal(global);\n }\n }\n }\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiUpdate, ApiMessage, ApiPollResult, ApiThreadInfo, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { unique } from '../../../util/iteratees';\nimport {\n updateChat,\n deleteChatMessages,\n updateChatMessage,\n updateListedIds,\n addViewportId,\n updateThreadInfo,\n replaceThreadParam,\n updateScheduledMessage,\n deleteChatScheduledMessages,\n} from '../../reducers';\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport {\n selectChatMessage,\n selectChatMessages,\n selectIsViewportNewest,\n selectListedIds,\n selectChatMessageByPollId,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectThreadInfo,\n selectThreadByMessage,\n selectPinnedIds,\n selectScheduledMessage,\n selectScheduledMessages,\n isMessageInCurrentMessageList,\n selectScheduledIds,\n selectCurrentMessageList,\n selectViewportIds,\n selectFirstUnreadId,\n selectChat,\n} from '../../selectors';\nimport { getMessageContent, isChatPrivate, isMessageLocal } from '../../helpers';\n\nconst ANIMATION_DELAY = 350;\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'newMessage': {\n const { chatId, id, message } = update;\n global = updateWithLocalMedia(global, chatId, id, message);\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n\n setGlobal(global);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n\n if (isMessageInCurrentMessageList(global, chatId, message as ApiMessage)) {\n if (message.isOutgoing && !(message.content && message.content.action)) {\n const currentMessageList = selectCurrentMessageList(global);\n if (currentMessageList) {\n // We do not use `actions.focusLastMessage` as it may be set with a delay (see below)\n actions.focusMessage({\n chatId,\n threadId: currentMessageList.threadId,\n messageId: message.id,\n noHighlight: true,\n });\n }\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message as ApiMessage) || {};\n if (threadInfo) {\n actions.requestThreadInfoUpdate({ chatId, threadId: threadInfo.threadId });\n }\n\n // @perf Wait until scroll animation finishes or simply rely on delivery status update (which is itself delayed)\n if (!isMessageLocal(message as ApiMessage)) {\n setTimeout(() => {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }, ANIMATION_DELAY);\n }\n } else {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }\n\n // Edge case: New message in an old (not loaded) chat.\n if (!selectIsChatListed(global, chatId)) {\n actions.loadTopChats();\n }\n\n break;\n }\n\n case 'newScheduledMessage': {\n const { chatId, id, message } = update;\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', unique([...scheduledIds, id]));\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectChatMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectScheduledMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n const ids = Object.keys(selectScheduledMessages(global, chatId) || {}).map(Number).sort((a, b) => b - a);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n const currentMessage = selectChatMessage(global, chatId, localId);\n\n global = deleteChatMessages(global, chatId, [localId]);\n\n // Edge case for \"Send When Online\"\n if (message.isScheduled) {\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n }\n\n global = updateChatMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n const newMessage = selectChatMessage(global, chatId, message.id)!;\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', [...scheduledIds, message.id]);\n\n const currentMessage = selectScheduledMessage(global, chatId, localId);\n\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n global = updateScheduledMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n setGlobal(global);\n break;\n }\n\n case 'updatePinnedIds': {\n const { chatId, isPinned, messageIds } = update;\n\n const currentPinnedIds = selectPinnedIds(global, chatId) || [];\n const newPinnedIds = isPinned\n ? [...currentPinnedIds, ...messageIds].sort((a, b) => b - a)\n : currentPinnedIds.filter((id) => !messageIds.includes(id));\n\n setGlobal(replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds', newPinnedIds));\n\n break;\n }\n\n case 'updateThreadInfo': {\n const {\n chatId, threadId, threadInfo, firstMessageId,\n } = update;\n\n const currentThreadInfo = selectThreadInfo(global, chatId, threadId);\n const newTheadInfo = {\n ...currentThreadInfo,\n ...threadInfo,\n };\n\n if (!newTheadInfo.threadId) {\n return;\n }\n\n global = updateThreadInfo(global, chatId, threadId, newTheadInfo as ApiThreadInfo);\n\n if (firstMessageId) {\n global = replaceThreadParam(global, chatId, threadId, 'firstMessageId', firstMessageId);\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'resetMessages': {\n const { id: chatId } = update;\n const messagesById = selectChatMessages(global, chatId);\n\n if (messagesById && !isChatPrivate(chatId)) {\n global = deleteChatMessages(global, chatId, Object.keys(messagesById).map(Number));\n setGlobal(global);\n actions.loadFullChat({ chatId, force: true });\n }\n\n break;\n }\n\n case 'deleteMessages': {\n const { ids, chatId } = update;\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteScheduledMessages': {\n const { ids, chatId } = update;\n\n deleteScheduledMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteHistory': {\n const { chatId } = update;\n const ids = Object.keys(global.messages.byChatId[chatId].byId).map(Number);\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'updateCommonBoxMessages': {\n const { ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n const chatId = selectCommonBoxChatId(global, id);\n if (chatId) {\n global = updateChatMessage(global, chatId, id, messageUpdate);\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChannelMessages': {\n const { channelId, ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n global = updateChatMessage(global, channelId, id, messageUpdate);\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessagePoll': {\n const { pollId, pollUpdate } = update;\n\n const message = selectChatMessageByPollId(global, pollId);\n\n if (message && message.content.poll) {\n const updatedPoll = { ...message.content.poll, ...pollUpdate };\n\n // Workaround for poll update bug: `chosen` option gets reset when someone votes after current user\n const { results: updatedResults } = updatedPoll.results || {};\n if (updatedResults && !updatedResults.some(((result) => result.isChosen))) {\n const { results } = message.content.poll.results;\n const chosenAnswers = results && results.filter((result) => result.isChosen);\n if (chosenAnswers) {\n chosenAnswers.forEach((chosenAnswer) => {\n const chosenAnswerIndex = updatedResults.findIndex((result) => result.option === chosenAnswer.option);\n if (chosenAnswerIndex >= 0) {\n updatedPoll.results.results![chosenAnswerIndex].isChosen = true;\n }\n });\n }\n }\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: updatedPoll,\n },\n },\n ));\n }\n break;\n }\n\n case 'updateMessagePollVote': {\n const { pollId, userId, options } = update;\n const message = selectChatMessageByPollId(global, pollId);\n if (!message || !message.content.poll || !message.content.poll.results) {\n break;\n }\n\n const { poll } = message.content;\n\n const { recentVoterIds, totalVoters, results } = poll.results;\n const newRecentVoterIds = recentVoterIds ? [...recentVoterIds] : [];\n const newTotalVoters = totalVoters ? totalVoters + 1 : 1;\n const newResults = results ? [...results] : [];\n\n newRecentVoterIds.push(userId);\n\n options.forEach((option) => {\n const targetOption = newResults.find((result) => result.option === option);\n const targetOptionIndex = newResults.findIndex((result) => result.option === option);\n const updatedOption: ApiPollResult = targetOption ? { ...targetOption } : { option, votersCount: 0 };\n\n updatedOption.votersCount += 1;\n if (userId === global.currentUserId) {\n updatedOption.isChosen = true;\n }\n\n if (targetOptionIndex) {\n newResults[targetOptionIndex] = updatedOption;\n } else {\n newResults.push(updatedOption);\n }\n });\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: {\n ...poll,\n results: {\n ...poll.results,\n recentVoterIds: newRecentVoterIds,\n totalVoters: newTotalVoters,\n results: newResults,\n },\n },\n },\n },\n ));\n\n break;\n }\n }\n});\n\nfunction updateWithLocalMedia(\n global: GlobalState, chatId: number, id: number, message: Partial, isScheduled = false,\n) {\n // Preserve locally uploaded media.\n const currentMessage = isScheduled\n ? selectScheduledMessage(global, chatId, id)\n : selectChatMessage(global, chatId, id);\n if (currentMessage && message.content) {\n const {\n photo, video, sticker, document,\n } = getMessageContent(currentMessage);\n if (photo && message.content.photo) {\n message.content.photo.blobUrl = photo.blobUrl;\n message.content.photo.thumbnail = photo.thumbnail;\n } else if (video && message.content.video) {\n message.content.video.blobUrl = video.blobUrl;\n } else if (sticker && message.content.sticker) {\n message.content.sticker.isPreloadedGlobally = sticker.isPreloadedGlobally;\n } else if (document && message.content.document) {\n message.content.document.previewBlobUrl = document.previewBlobUrl;\n }\n }\n\n return isScheduled\n ? updateScheduledMessage(global, chatId, id, message)\n : updateChatMessage(global, chatId, id, message);\n}\n\nfunction updateListedAndViewportIds(global: GlobalState, message: ApiMessage) {\n const { id, chatId } = message;\n\n const chat = selectChat(global, chatId);\n const isUnreadChatNotLoaded = chat && chat.unreadCount && !selectListedIds(global, chatId, MAIN_THREAD_ID);\n if (isUnreadChatNotLoaded) {\n return global;\n }\n\n global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]);\n\n if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) {\n // Always keep the first uread message in the viewport list\n const firstUnreadId = selectFirstUnreadId(global, chatId, MAIN_THREAD_ID);\n const newGlobal = addViewportId(global, chatId, MAIN_THREAD_ID, id);\n const newViewportIds = selectViewportIds(newGlobal, chatId, MAIN_THREAD_ID);\n\n if (!firstUnreadId || newViewportIds!.includes(firstUnreadId)) {\n global = newGlobal;\n }\n }\n\n const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {};\n\n if (!firstMessageId && isMessageLocal(message)) {\n return global;\n }\n\n if (threadInfo) {\n global = updateListedIds(global, chatId, threadInfo.threadId, [id]);\n\n if (selectIsViewportNewest(global, chatId, threadInfo.threadId)) {\n global = addViewportId(global, chatId, threadInfo.threadId, id);\n\n if (!firstMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'firstMessageId', message.id);\n }\n\n if (!threadInfo.lastMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', {\n ...threadInfo,\n lastMessageId: message.id,\n });\n }\n }\n }\n\n return global;\n}\n\nfunction updateChatLastMessage(\n global: GlobalState,\n chatId: number,\n message: ApiMessage,\n force = false,\n) {\n const { chats } = global;\n const currentLastMessage = chats.byId[chatId] && chats.byId[chatId].lastMessage;\n\n if (currentLastMessage && !force) {\n const isSameOrNewer = (\n currentLastMessage.id === message.id || currentLastMessage.id === message.previousLocalId\n ) || message.id > currentLastMessage.id;\n\n if (!isSameOrNewer) {\n return global;\n }\n }\n\n return updateChat(global, chatId, { lastMessage: message });\n}\n\nfunction findLastMessage(global: GlobalState, chatId: number) {\n const byId = selectChatMessages(global, chatId);\n const listedIds = selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n if (!byId || !listedIds) {\n return undefined;\n }\n\n let i = listedIds.length;\n while (i--) {\n const message = byId[listedIds[i]];\n if (!message.isDeleting) {\n return message;\n }\n }\n\n return undefined;\n}\n\nfunction deleteMessages(chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState) {\n // Channel update\n\n if (chatId) {\n ids.forEach((id) => {\n global = updateChatMessage(global, chatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, chatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, chatId, newLastMessage, true);\n }\n });\n\n setGlobal(global);\n\n actions.requestChatUpdate({ chatId });\n\n const threadIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const message = selectChatMessage(global, chatId, id);\n if (!message) {\n return;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n if (threadInfo) {\n threadIdsToUpdate.push(threadInfo.threadId);\n }\n });\n\n unique(threadIdsToUpdate).forEach((threadId) => {\n actions.requestThreadInfoUpdate({ chatId, threadId });\n });\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), chatId, ids));\n }, ANIMATION_DELAY);\n\n return;\n }\n\n // Common box update\n\n const chatsIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const commonBoxChatId = selectCommonBoxChatId(global, id);\n if (commonBoxChatId) {\n chatsIdsToUpdate.push(commonBoxChatId);\n\n global = updateChatMessage(global, commonBoxChatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, commonBoxChatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, commonBoxChatId, newLastMessage, true);\n }\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), commonBoxChatId, [id]));\n }, ANIMATION_DELAY);\n }\n });\n\n setGlobal(global);\n\n unique(chatsIdsToUpdate).forEach((id) => {\n actions.requestChatUpdate({ chatId: id });\n });\n}\n\nfunction deleteScheduledMessages(\n chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState,\n) {\n if (!chatId) {\n return;\n }\n\n ids.forEach((id) => {\n global = updateScheduledMessage(global, chatId, id, {\n isDeleting: true,\n });\n });\n\n setGlobal(global);\n\n setTimeout(() => {\n global = deleteChatScheduledMessages(getGlobal(), chatId, ids);\n const scheduledMessages = selectScheduledMessages(global, chatId);\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'scheduledIds', Object.keys(scheduledMessages || {}).map(Number),\n );\n setGlobal(global);\n }, ANIMATION_DELAY);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, ApiUserStatus } from '../../../api/types';\n\nimport { deleteUser, updateUser } from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\n\nconst STATUS_UPDATE_THROTTLE = 3000;\n\nconst flushStatusUpdatesThrottled = throttle(flushStatusUpdates, STATUS_UPDATE_THROTTLE, true);\n\nlet pendingStatusUpdates: [number, ApiUserStatus][] = [];\n\nfunction scheduleStatusUpdate(userId: number, statusUpdate: ApiUserStatus) {\n pendingStatusUpdates.push([userId, statusUpdate]);\n flushStatusUpdatesThrottled();\n}\n\nfunction flushStatusUpdates() {\n let global = getGlobal();\n pendingStatusUpdates.forEach(([userId, statusUpdate]) => {\n global = updateUser(global, userId, {\n status: statusUpdate,\n });\n });\n setGlobal(global);\n\n pendingStatusUpdates = [];\n}\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'deleteUser': {\n return deleteUser(global, update.id);\n }\n\n case 'updateUser': {\n return updateUser(global, update.id, update.user);\n }\n\n case 'updateUserStatus': {\n // Status updates come very often so we throttle them\n scheduleStatusUpdate(update.userId, update.status);\n return undefined;\n }\n\n case 'updateUserFullInfo': {\n const { id, fullInfo } = update;\n const targetUser = global.users.byId[id];\n if (!targetUser) {\n return undefined;\n }\n\n return updateUser(global, id, {\n fullInfo: {\n ...targetUser.fullInfo,\n ...fullInfo,\n },\n });\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\n\nimport { updateStickerSet } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateStickerSet': {\n return updateStickerSet(global, update.id, update.stickerSet);\n }\n }\n\n return undefined;\n});\n","import {\n addReducer, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { ApiPrivacyKey } from '../../../types';\n\nimport { addBlockedContact, removeBlockedContact } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updatePeerBlocked':\n if (update.isBlocked) {\n return addBlockedContact(getGlobal(), update.id);\n } else {\n return removeBlockedContact(getGlobal(), update.id);\n }\n\n case 'updateResetContactList':\n setGlobal({\n ...getGlobal(),\n contactList: {\n hash: 0,\n userIds: [],\n },\n });\n break;\n\n case 'updateFavoriteStickers':\n actions.loadFavoriteStickers();\n break;\n\n case 'updatePrivacy':\n global.settings.privacy[update.key as ApiPrivacyKey] = update.rules;\n break;\n }\n\n return undefined;\n});\n","import { addReducer, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\nimport { addNotifyException, updateChat, updateNotifySettings } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateNotifySettings': {\n return updateNotifySettings(global, update.peerType, update.isSilent, update.shouldShowPreviews);\n }\n\n case 'updateNotifyExceptions': {\n const {\n id, isMuted, isSilent, shouldShowPreviews,\n } = update;\n const chat = global.chats.byId[id];\n\n if (chat) {\n global = updateChat(global, id, { isMuted });\n }\n\n setGlobal(addNotifyException(global, id, { isMuted, isSilent, shouldShowPreviews }));\n break;\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateTwoFaStateWaitCode': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n isLoading: false,\n waitingEmailCodeLength: update.length,\n },\n };\n }\n\n case 'updateTwoFaError': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n error: update.message,\n },\n };\n }\n }\n\n return undefined;\n});\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Switcher.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n checked?: boolean;\n disabled?: boolean;\n inactive?: boolean;\n noAnimation?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Switcher: FC = ({\n id,\n name,\n value,\n label,\n checked = false,\n disabled,\n inactive,\n noAnimation,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((e: ChangeEvent) => {\n if (onChange) {\n onChange(e);\n }\n\n if (onCheck) {\n onCheck(e.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Switcher',\n disabled && 'disabled',\n inactive && 'inactive',\n noAnimation && 'no-animation',\n );\n\n return (\n \n );\n};\n\nexport default memo(Switcher);\n","import React, {\n FC, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LeftColumnContent, ISettings } from '../../../types';\nimport { ApiChat } from '../../../api/types';\n\nimport { APP_NAME, APP_VERSION, FEEDBACK_URL } from '../../../config';\nimport { IS_MOBILE_SCREEN } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { isChatArchived } from '../../../modules/helpers';\nimport { formatDateToString } from '../../../util/dateFormat';\nimport switchTheme from '../../../util/switchTheme';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport SearchInput from '../../ui/SearchInput';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\nimport Switcher from '../../ui/Switcher';\n\nimport './LeftMainHeader.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n contactsFilter: string;\n onSearchQuery: (query: string) => void;\n onSelectSettings: () => void;\n onSelectContacts: () => void;\n onSelectArchived: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n searchQuery?: string;\n isLoading: boolean;\n currentUserId?: number;\n globalSearchChatId?: number;\n searchDate?: number;\n theme: ISettings['theme'];\n animationLevel: 0 | 1 | 2;\n chatsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [0, 1, 2];\n\nconst LEGACY_VERSION_URL = 'https://web.telegram.org/?legacy=1';\nconst WEBK_VERSION_URL = 'https://web.telegram.org/k/';\nconst PERMANENT_VERSION_KEY = 'kz_version';\n\nconst LeftMainHeader: FC = ({\n content,\n contactsFilter,\n onSearchQuery,\n onSelectSettings,\n onSelectContacts,\n onSelectArchived,\n setGlobalSearchChatId,\n onReset,\n searchQuery,\n isLoading,\n currentUserId,\n globalSearchChatId,\n searchDate,\n theme,\n animationLevel,\n chatsById,\n openChat,\n openTipsChat,\n setGlobalSearchDate,\n setSettingOption,\n}) => {\n const lang = useLang();\n const hasMenu = content === LeftColumnContent.ChatList;\n const clearedDateSearchParam = { date: undefined };\n const clearedChatSearchParam = { id: undefined };\n const selectedSearchDate = useMemo(() => {\n return searchDate\n ? formatDateToString(new Date(searchDate * 1000))\n : undefined;\n }, [searchDate]);\n const archivedUnreadChatsCount = useMemo(() => {\n if (!hasMenu || !chatsById) {\n return 0;\n }\n\n return Object.values(chatsById).reduce((total, chat) => {\n if (!isChatArchived(chat)) {\n return total;\n }\n\n return chat.unreadCount ? total + 1 : total;\n }, 0);\n }, [hasMenu, chatsById]);\n\n const MainButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n onReset()}\n ariaLabel={hasMenu ? lang('AccDescrOpenMenu2') : 'Return to chat list'}\n >\n
\n \n );\n }, [hasMenu, lang, onReset]);\n\n const handleSearchFocus = useCallback(() => {\n if (!searchQuery) {\n onSearchQuery('');\n }\n }, [searchQuery, onSearchQuery]);\n\n const handleSelectSaved = useCallback(() => {\n openChat({ id: currentUserId });\n }, [currentUserId, openChat]);\n\n const handleDarkModeToggle = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n const newTheme = theme === 'light' ? 'dark' : 'light';\n\n setSettingOption({ theme: newTheme });\n switchTheme(newTheme, animationLevel > 0);\n }, [animationLevel, setSettingOption, theme]);\n\n const handleAnimationLevelChange = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n\n const newLevel = animationLevel === 0 ? 2 : 0;\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [animationLevel, setSettingOption]);\n\n const handleSwitchToWebK = () => {\n localStorage.setItem(PERMANENT_VERSION_KEY, JSON.stringify('K'));\n };\n\n const isSearchFocused = (\n Boolean(globalSearchChatId)\n || content === LeftColumnContent.GlobalSearch\n || content === LeftColumnContent.Contacts\n );\n\n const searchInputPlaceholder = content === LeftColumnContent.Contacts\n ? lang('SearchFriends')\n : lang('Search');\n\n return (\n
\n
\n \n \n {lang('SavedMessages')}\n \n \n {lang('ArchivedChats')}\n {archivedUnreadChatsCount > 0 && (\n
{archivedUnreadChatsCount}
\n )}\n \n \n {lang('Contacts')}\n \n \n {lang('Settings')}\n \n \n {lang('lng_menu_night_mode')}\n \n \n \n {lang('Appearance.Animations').toLowerCase()}\n 0}\n />\n \n \n {lang('TelegramFeatures')}\n \n \n Report Bug\n \n \n Switch to K Version\n \n \n Switch to Old Version\n \n \n \n {selectedSearchDate && (\n \n )}\n {globalSearchChatId && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n query: searchQuery, fetchingStatus, chatId, date,\n } = global.globalSearch;\n const { currentUserId } = global;\n const { byId: chatsById } = global.chats;\n const { theme, animationLevel } = global.settings.byKey;\n\n return {\n searchQuery,\n isLoading: fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false,\n currentUserId,\n chatsById,\n globalSearchChatId: chatId,\n searchDate: date,\n theme,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'openTipsChat',\n 'setGlobalSearchDate',\n 'setGlobalSearchChatId',\n 'setSettingOption',\n ]),\n)(LeftMainHeader));\n","import React, { FC } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ConnectionState.scss';\n\ntype StateProps = Pick;\n\nconst ConnectionState: FC = ({ connectionState }) => {\n const lang = useLang();\n\n const isConnecting = connectionState === 'connectionStateConnecting';\n\n return isConnecting && (\n
\n \n
{lang('WaitingForNetwork')}
\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['connectionState']),\n)(ConnectionState);\n","import { useRef } from '../lib/teact/teact';\n\nimport useThrottle from './useThrottle';\nimport useOnChange from './useOnChange';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (resolverFn: () => R, ms: number, dependencies: D) => {\n const valueRef = useRef();\n const runThrottled = useThrottle(ms);\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n let isSync = true;\n runThrottled(() => {\n valueRef.current = resolverFn();\n\n if (!isSync) {\n forceUpdate();\n }\n });\n isSync = false;\n }, dependencies);\n\n return valueRef.current;\n};\n","import { useMemo } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (ms: number) => {\n return useMemo(() => {\n return throttle((cb) => cb(), ms);\n }, [ms]);\n};\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatFolder, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { NotifyException, NotifySettings } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { buildCollectionByKey, pick } from '../../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../../util/captureEvents';\nimport { getFolderUnreadDialogs } from '../../../modules/helpers';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../modules/selectors';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport useThrottledMemo from '../../../hooks/useThrottledMemo';\nimport useLang from '../../../hooks/useLang';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\n\nimport Transition from '../../ui/Transition';\nimport TabList from '../../ui/TabList';\nimport ChatList from './ChatList';\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFoldersById: Record;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n orderedFolderIds?: number[];\n activeChatFolder: number;\n currentUserId?: number;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst INFO_THROTTLE = 3000;\nconst SAVED_MESSAGES_HOTKEY = '0';\n\nconst ChatFolders: FC = ({\n chatsById,\n usersById,\n chatFoldersById,\n notifySettings,\n notifyExceptions,\n orderedFolderIds,\n activeChatFolder,\n currentUserId,\n lastSyncTime,\n loadChatFolders,\n setActiveChatFolder,\n openChat,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime) {\n loadChatFolders();\n }\n }, [lastSyncTime, loadChatFolders]);\n\n const displayedFolders = useMemo(() => {\n return orderedFolderIds\n ? orderedFolderIds.map((id) => chatFoldersById[id] || {}).filter(Boolean)\n : undefined;\n }, [chatFoldersById, orderedFolderIds]);\n\n const folderCountersById = useThrottledMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n const counters = displayedFolders.map((folder) => {\n const {\n unreadDialogsCount, hasActiveDialogs,\n } = getFolderUnreadDialogs(chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions) || {};\n\n return {\n id: folder.id,\n badgeCount: unreadDialogsCount,\n isBadgeActive: hasActiveDialogs,\n };\n });\n\n return buildCollectionByKey(counters, 'id');\n }, INFO_THROTTLE, [displayedFolders, chatsById, usersById, notifySettings, notifyExceptions]);\n\n const folderTabs = useMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n return [\n { title: lang('FilterAllChats') },\n ...displayedFolders.map((folder) => ({\n title: folder.title,\n ...(folderCountersById && folderCountersById[folder.id]),\n })),\n ];\n }, [displayedFolders, folderCountersById, lang]);\n\n const handleSwitchTab = useCallback((index: number) => {\n setActiveChatFolder(index);\n }, [setActiveChatFolder]);\n\n // Prevent `activeTab` pointing at non-existing folder after update\n useEffect(() => {\n if (!folderTabs || !folderTabs.length) {\n return;\n }\n\n if (activeChatFolder >= folderTabs.length) {\n setActiveChatFolder(0);\n }\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV || !folderTabs || !folderTabs.length) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveChatFolder(Math.min(activeChatFolder + 1, folderTabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveChatFolder(Math.max(0, activeChatFolder - 1));\n }\n }),\n });\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n const isNotInAllTabRef = useRef();\n isNotInAllTabRef.current = activeChatFolder !== 0;\n useEffect(() => (isNotInAllTabRef.current ? captureEscKeyListener(() => {\n if (isNotInAllTabRef.current) {\n setActiveChatFolder(0);\n }\n }) : undefined), [activeChatFolder, setActiveChatFolder]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.metaKey && e.code.startsWith('Digit') && folderTabs) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n if (digit === SAVED_MESSAGES_HOTKEY) {\n openChat({ id: currentUserId });\n return;\n }\n\n const folder = Number(digit) - 1;\n if (folder > folderTabs.length - 1) return;\n\n setActiveChatFolder(folder);\n e.preventDefault();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n };\n });\n\n const {\n shouldRender: shouldRenderPlaceholder, transitionClassNames,\n } = useShowTransition(!orderedFolderIds, undefined, true);\n\n function renderCurrentTab(isActive: boolean) {\n const activeFolder = Object.values(chatFoldersById)\n .find(({ title }) => title === folderTabs![activeChatFolder].title);\n\n if (!activeFolder || activeChatFolder === 0) {\n return ;\n }\n\n return (\n \n );\n }\n\n return (\n
\n {folderTabs && folderTabs.length ? (\n \n ) : shouldRenderPlaceholder ? (\n
\n ) : undefined}\n \n {renderCurrentTab}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n chatFolders: {\n byId: chatFoldersById,\n orderedIds: orderedFolderIds,\n activeChatFolder,\n },\n currentUserId,\n lastSyncTime,\n } = global;\n\n return {\n chatsById,\n usersById,\n chatFoldersById,\n orderedFolderIds,\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n activeChatFolder,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadChatFolders',\n 'setActiveChatFolder',\n 'openChat',\n ]),\n)(ChatFolders));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './LeftSearch';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst LeftSearchAsync: FC = (props) => {\n const LeftSearch = useModuleLoader(Bundles.Extra, 'LeftSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return LeftSearch ? : ;\n};\n\nexport default memo(LeftSearchAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './ContactList';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst ContactListAsync: FC = (props) => {\n const ContactList = useModuleLoader(Bundles.Extra, 'ContactList');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContactList ? : ;\n};\n\nexport default memo(ContactListAsync);\n","import React, {\n FC, useCallback, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\n\nimport './NewChatButton.scss';\n\nconst MENU_CLOSE_DELAY_MS = 750;\nlet closeTimeout: number | undefined;\n\ntype OwnProps = {\n isShown: boolean;\n onNewPrivateChat: () => void;\n onNewChannel: () => void;\n onNewGroup: () => void;\n};\n\nconst NewChatButton: FC = ({\n isShown,\n onNewPrivateChat,\n onNewChannel,\n onNewGroup,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n useEffect(() => {\n if (!isShown) {\n setIsMenuOpen(false);\n }\n }, [isShown]);\n\n const lang = useLang();\n\n const fabClassName = buildClassName(\n 'NewChatButton',\n isShown && 'revealed',\n isMenuOpen && 'menu-is-open',\n );\n\n const toggleIsMenuOpen = () => {\n setIsMenuOpen(!isMenuOpen);\n };\n\n const handleClose = () => {\n setIsMenuOpen(false);\n };\n\n const handleMouseEnter = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n setIsMenuOpen(false);\n }, MENU_CLOSE_DELAY_MS);\n }, []);\n\n return (\n \n \n \n \n \n \n {lang('NewChannel')}\n {lang('NewGroup')}\n {lang('NewMessageTitle')}\n \n
\n );\n};\n\nexport default memo(NewChatButton);\n","import React, {\n FC, memo, useState, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport LeftMainHeader from './LeftMainHeader';\nimport ConnectionState from '../ConnectionState';\nimport ChatFolders from './ChatFolders';\nimport LeftSearch from '../search/LeftSearch.async';\nimport ContactList from './ContactList.async';\nimport NewChatButton from '../NewChatButton';\n\nimport './LeftMain.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n searchQuery?: string;\n searchDate?: number;\n contactsFilter: string;\n onSearchQuery: (query: string) => void;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\ntype StateProps = {};\n\nconst TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\nconst BUTTON_CLOSE_DELAY_MS = 250;\nlet closeTimeout: number | undefined;\n\nconst LeftMain: FC = ({\n content,\n searchQuery,\n searchDate,\n contactsFilter,\n onSearchQuery,\n onContentChange,\n onReset,\n}) => {\n const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV);\n\n const isMouseInside = useRef(false);\n\n const handleSelectSettings = useCallback(() => {\n onContentChange(LeftColumnContent.Settings);\n }, [onContentChange]);\n\n const handleSelectContacts = useCallback(() => {\n onContentChange(LeftColumnContent.Contacts);\n }, [onContentChange]);\n\n const handleSelectNewChannel = useCallback(() => {\n onContentChange(LeftColumnContent.NewChannelStep1);\n }, [onContentChange]);\n\n const handleSelectNewGroup = useCallback(() => {\n onContentChange(LeftColumnContent.NewGroupStep1);\n }, [onContentChange]);\n\n const handleSelectArchived = useCallback(() => {\n onContentChange(LeftColumnContent.Archived);\n }, [onContentChange]);\n\n const handleMouseEnter = useCallback(() => {\n if (content !== LeftColumnContent.ChatList) {\n return;\n }\n isMouseInside.current = true;\n setIsNewChatButtonShown(true);\n }, [content]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n setIsNewChatButtonShown(false);\n }\n }, BUTTON_CLOSE_DELAY_MS);\n }, []);\n\n useEffect(() => {\n let autoCloseTimeout: number | undefined;\n if (content !== LeftColumnContent.ChatList) {\n autoCloseTimeout = window.setTimeout(() => {\n setIsNewChatButtonShown(false);\n }, BUTTON_CLOSE_DELAY_MS);\n } else if (isMouseInside.current || IS_TOUCH_ENV) {\n setIsNewChatButtonShown(true);\n }\n\n return () => {\n if (autoCloseTimeout) {\n clearTimeout(autoCloseTimeout);\n autoCloseTimeout = undefined;\n }\n };\n }, [content]);\n\n return (\n \n \n \n \n {(isActive) => {\n switch (content) {\n case LeftColumnContent.ChatList:\n return ;\n case LeftColumnContent.GlobalSearch:\n return (\n \n );\n case LeftColumnContent.Contacts:\n return ;\n default:\n return undefined;\n }\n }}\n \n \n
\n );\n};\n\nexport default memo(LeftMain);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Settings';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst SettingsAsync: FC = (props) => {\n const Settings = useModuleLoader(Bundles.Extra, 'Settings');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Settings ? : ;\n};\n\nexport default memo(SettingsAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './NewChat';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst NewChatAsync: FC = (props) => {\n const NewChat = useModuleLoader(Bundles.Extra, 'NewChat');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return NewChat ? : ;\n};\n\nexport default memo(NewChatAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ArchivedChats';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst ArchivedChatsAsync: FC = (props) => {\n const ArchivedChats = useModuleLoader(Bundles.Extra, 'ArchivedChats');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ArchivedChats ? : ;\n};\n\nexport default memo(ArchivedChatsAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { LeftColumnContent, SettingsScreens } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\n\nimport Transition from '../ui/Transition';\nimport LeftMain from './main/LeftMain';\nimport Settings from './settings/Settings.async';\nimport NewChat from './newChat/NewChat.async';\nimport ArchivedChats from './ArchivedChats.async';\n\nimport './LeftColumn.scss';\n\ntype StateProps = {\n searchQuery?: string;\n searchDate?: number;\n activeChatFolder: number;\n};\n\ntype DispatchProps = Pick;\n\nenum ContentType {\n Main,\n // eslint-disable-next-line no-shadow\n Settings,\n Archived,\n // eslint-disable-next-line no-shadow\n NewGroup,\n // eslint-disable-next-line no-shadow\n NewChannel\n}\n\nconst RENDER_COUNT = Object.keys(ContentType).length / 2;\nconst RESET_TRANSITION_DELAY_MS = 250;\n\nconst LeftColumn: FC = ({\n searchQuery,\n searchDate,\n activeChatFolder,\n setGlobalSearchQuery,\n setGlobalSearchChatId,\n resetChatCreation,\n setGlobalSearchDate,\n loadPasswordInfo,\n clearTwoFaError,\n}) => {\n const [content, setContent] = useState(LeftColumnContent.ChatList);\n const [settingsScreen, setSettingsScreen] = useState(SettingsScreens.Main);\n const [contactsFilter, setContactsFilter] = useState('');\n\n // Used to reset child components in background.\n const [lastResetTime, setLastResetTime] = useState(0);\n\n let contentType: ContentType = ContentType.Main;\n switch (content) {\n case LeftColumnContent.Archived:\n contentType = ContentType.Archived;\n break;\n case LeftColumnContent.Settings:\n contentType = ContentType.Settings;\n break;\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewChannelStep2:\n contentType = ContentType.NewChannel;\n break;\n case LeftColumnContent.NewGroupStep1:\n case LeftColumnContent.NewGroupStep2:\n contentType = ContentType.NewGroup;\n break;\n }\n\n const handleReset = useCallback((forceReturnToChatList?: boolean) => {\n if (\n content === LeftColumnContent.NewGroupStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewGroupStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewGroupStep1) {\n const pickerSearchInput = document.getElementById('new-group-picker-search');\n if (pickerSearchInput) {\n pickerSearchInput.blur();\n }\n }\n\n if (content === LeftColumnContent.Settings) {\n switch (settingsScreen) {\n case SettingsScreens.EditProfile:\n case SettingsScreens.Folders:\n case SettingsScreens.General:\n case SettingsScreens.Notifications:\n case SettingsScreens.Privacy:\n case SettingsScreens.Language:\n setSettingsScreen(SettingsScreens.Main);\n return;\n\n case SettingsScreens.GeneralChatBackground:\n setSettingsScreen(SettingsScreens.General);\n return;\n case SettingsScreens.GeneralChatBackgroundColor:\n setSettingsScreen(SettingsScreens.GeneralChatBackground);\n return;\n\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyActiveSessions:\n case SettingsScreens.PrivacyBlockedUsers:\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaCongratulations:\n setSettingsScreen(SettingsScreens.Privacy);\n return;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyPhoneNumber);\n return;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyLastSeen);\n return;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyProfilePhoto);\n return;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyForwarding);\n return;\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyGroupChats);\n return;\n case SettingsScreens.TwoFaNewPassword:\n setSettingsScreen(SettingsScreens.TwoFaDisabled);\n return;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaNewPassword);\n return;\n case SettingsScreens.TwoFaNewPasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordConfirm);\n return;\n case SettingsScreens.TwoFaNewPasswordEmail:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordHint);\n return;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordEmail);\n return;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n setSettingsScreen(SettingsScreens.TwoFaEnabled);\n return;\n case SettingsScreens.TwoFaChangePasswordNew:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordCurrent);\n return;\n case SettingsScreens.TwoFaChangePasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordNew);\n return;\n case SettingsScreens.TwoFaChangePasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordConfirm);\n return;\n case SettingsScreens.TwoFaRecoveryEmail:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmailCurrentPassword);\n return;\n case SettingsScreens.TwoFaRecoveryEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmail);\n return;\n\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n setSettingsScreen(SettingsScreens.Folders);\n return;\n default:\n break;\n }\n }\n\n if (content === LeftColumnContent.ChatList && activeChatFolder === 0) {\n setContent(LeftColumnContent.GlobalSearch);\n return;\n }\n\n setContent(LeftColumnContent.ChatList);\n setContactsFilter('');\n setGlobalSearchQuery({ query: '' });\n setGlobalSearchDate({ date: undefined });\n setGlobalSearchChatId({ id: undefined });\n resetChatCreation();\n setTimeout(() => {\n setLastResetTime(Date.now());\n }, RESET_TRANSITION_DELAY_MS);\n }, [\n content, activeChatFolder, setGlobalSearchQuery, setGlobalSearchDate, setGlobalSearchChatId, resetChatCreation,\n settingsScreen,\n ]);\n\n const handleSearchQuery = useCallback((query: string) => {\n if (content === LeftColumnContent.Contacts) {\n setContactsFilter(query);\n return;\n }\n\n setContent(LeftColumnContent.GlobalSearch);\n\n if (query !== searchQuery) {\n setGlobalSearchQuery({ query });\n }\n }, [content, setGlobalSearchQuery, searchQuery]);\n\n useEffect(\n () => (content !== LeftColumnContent.ChatList || activeChatFolder === 0\n ? captureEscKeyListener(() => handleReset())\n : undefined),\n [activeChatFolder, content, handleReset],\n );\n\n useEffect(() => {\n clearTwoFaError();\n\n if (settingsScreen === SettingsScreens.Privacy) {\n loadPasswordInfo();\n }\n }, [clearTwoFaError, loadPasswordInfo, settingsScreen]);\n\n return (\n \n {(isActive) => {\n switch (contentType) {\n case ContentType.Archived:\n return (\n \n );\n case ContentType.Settings:\n return (\n \n );\n case ContentType.NewChannel:\n return (\n \n );\n case ContentType.NewGroup:\n return (\n \n );\n default:\n return (\n \n );\n }\n }}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n globalSearch: {\n query,\n date,\n },\n chatFolders: {\n activeChatFolder,\n },\n } = global;\n return { searchQuery: query, searchDate: date, activeChatFolder };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setGlobalSearchQuery', 'setGlobalSearchChatId', 'resetChatCreation', 'setGlobalSearchDate',\n 'loadPasswordInfo', 'clearTwoFaError',\n ]),\n)(LeftColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { IDimensions } from '../modules/helpers';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\n\nconst THROTTLE = 250;\n\nexport default () => {\n const [size, setSize] = useState(windowSize.get());\n\n useEffect(() => {\n const handleResize = throttle(() => {\n setSize(windowSize.get());\n }, THROTTLE, false);\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return size;\n};\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../../../config';\n\nconst REM = 16; // px\nconst MAX_TOOLBAR_WIDTH = 32 * REM;\nconst MAX_MESSAGES_LIST_WIDTH = 45.5 * REM;\nconst SIDE_COLUMN_MAX_WIDTH = 26.5 * REM;\nconst MIN_LEFT_COLUMN_WIDTH = 18 * REM;\nconst UNPIN_BUTTON_WIDTH = 16.125 * REM;\n\nexport default function calculateMiddleFooterTransforms(windowWidth: number, canPost?: boolean) {\n const sidePadding = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? REM\n : 2 * REM;\n const messageListWidth = getMessageListWidth(windowWidth);\n const sendButtonWidth = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? 3.375 * REM\n : 4 * REM;\n\n const composerWidth = canPost\n ? messageListWidth - sidePadding - sendButtonWidth\n : messageListWidth - sidePadding;\n const toolbarWidth = windowWidth > MOBILE_SCREEN_MAX_WIDTH\n ? Math.min(messageListWidth - sidePadding, MAX_TOOLBAR_WIDTH)\n : messageListWidth - sidePadding;\n\n const composerHiddenScale = toolbarWidth / composerWidth;\n const toolbarHiddenScale = composerWidth / toolbarWidth;\n const unpinHiddenScale = toolbarWidth / UNPIN_BUTTON_WIDTH;\n const toolbarForUnpinHiddenScale = UNPIN_BUTTON_WIDTH / toolbarWidth;\n\n const composerTranslateX = canPost\n ? (sendButtonWidth / 2) * toolbarHiddenScale\n : 0;\n\n const toolbarTranslateX = canPost\n ? (sendButtonWidth / 2) * -1 * composerHiddenScale\n : 0;\n\n return {\n composerHiddenScale,\n toolbarHiddenScale,\n composerTranslateX,\n toolbarTranslateX,\n unpinHiddenScale,\n toolbarForUnpinHiddenScale,\n };\n}\n\nfunction getMessageListWidth(windowWidth: number) {\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.25, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n const rightColumnWidth = Math.min(\n windowWidth * 0.25,\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth - rightColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.4, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MAX_MESSAGES_LIST_WIDTH) {\n return MAX_MESSAGES_LIST_WIDTH;\n }\n\n return windowWidth;\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './HeaderMenuContainer';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HeaderMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const HeaderMenuContainer = useModuleLoader(Bundles.Extra, 'HeaderMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HeaderMenuContainer ? : undefined;\n};\n\nexport default memo(HeaderMenuContainerAsync);\n","import React, {\n FC,\n memo,\n useRef,\n useCallback,\n useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport { isChatChannel, isChatSuperGroup } from '../../modules/helpers';\nimport {\n selectChat,\n selectIsChatBotNotStarted, selectIsChatWithSelf,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport HeaderMenuContainer from './HeaderMenuContainer.async';\n\ninterface OwnProps {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n}\n\ninterface StateProps {\n noMenu?: boolean;\n isChannel?: boolean;\n isRightColumnShown?: boolean;\n canStartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n}\n\ntype DispatchProps = Pick;\n\n// Chrome breaks layout when focusing input during transition\nconst SEARCH_FOCUS_DELAY_MS = 400;\n\nconst HeaderActions: FC = ({\n chatId,\n threadId,\n noMenu,\n isChannel,\n canStartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n isRightColumnShown,\n joinChannel,\n sendBotCommand,\n openLocalTextSearch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuButtonRef = useRef(null);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState(undefined);\n\n const handleHeaderMenuOpen = useCallback(() => {\n setIsMenuOpen(true);\n const rect = menuButtonRef.current!.getBoundingClientRect();\n setMenuPosition({ x: rect.right, y: rect.bottom });\n }, []);\n\n const handleHeaderMenuClose = useCallback(() => {\n setIsMenuOpen(false);\n }, []);\n\n const handleHeaderMenuHide = useCallback(() => {\n setMenuPosition(undefined);\n }, []);\n\n const handleSubscribeClick = useCallback(() => {\n joinChannel({ chatId });\n }, [joinChannel, chatId]);\n\n const handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleSearchClick = useCallback(() => {\n openLocalTextSearch();\n\n if (IS_MOBILE_SCREEN) {\n // iOS requires synchronous focus on user event.\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.focus();\n } else {\n setTimeout(() => {\n const searchInput = document.querySelector('.RightHeader .SearchInput input');\n if (searchInput) {\n searchInput.focus();\n }\n }, SEARCH_FOCUS_DELAY_MS);\n }\n }, [openLocalTextSearch]);\n\n const lang = useLang();\n\n return (\n
\n {!IS_MOBILE_SCREEN && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {!IS_MOBILE_SCREEN && canStartBot && (\n \n {lang('Start')}\n \n )}\n {!IS_MOBILE_SCREEN && canSearch && (\n \n \n \n )}\n {(IS_MOBILE_SCREEN || !canSubscribe) && (\n \n \n \n )}\n {menuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const isChannel = Boolean(chat && isChatChannel(chat));\n\n if (chat && chat.isRestricted) {\n return {\n noMenu: true,\n };\n }\n\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isMainThread = messageListType === 'thread' && threadId === MAIN_THREAD_ID;\n const isDiscussionThread = messageListType === 'thread' && threadId !== MAIN_THREAD_ID;\n const isRightColumnShown = selectIsRightColumnShown(global);\n\n const canStartBot = Boolean(selectIsChatBotNotStarted(global, chatId));\n const canSubscribe = Boolean(\n isMainThread && chat && (isChannel || isChatSuperGroup(chat)) && chat.isNotJoined,\n );\n const canSearch = isMainThread || isDiscussionThread;\n const canMute = isMainThread && !isChatWithSelf && !canSubscribe;\n const canSelect = !selectIsInSelectMode(global);\n const canLeave = isMainThread && !canSubscribe;\n\n const noMenu = !(\n (IS_MOBILE_SCREEN && canSubscribe)\n || (IS_MOBILE_SCREEN && canSearch)\n || canMute\n || canSelect\n || canLeave\n );\n\n return {\n noMenu,\n isChannel,\n isRightColumnShown,\n canStartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'joinChannel', 'sendBotCommand', 'openLocalTextSearch',\n ]),\n)(HeaderActions));\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\n\nimport { ApiMessage } from '../api/types';\n\nimport { DEBUG } from '../config';\nimport { isWebpSupported } from '../util/environment';\nimport { EMPTY_IMAGE_DATA_URI, webpToPngBase64 } from '../util/webpToPng';\nimport { getMessageMediaThumbDataUri } from '../modules/helpers';\n\nexport default function useWebpThumbnail(message?: ApiMessage) {\n const thumbnail = message && getMessageMediaThumbDataUri(message);\n const { sticker } = (message && message.content) || {};\n const shouldDecodeThumbnail = thumbnail && sticker && !isWebpSupported() && thumbnail.includes('image/webp');\n const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI);\n const messageId = message && message.id;\n\n useLayoutEffect(() => {\n if (!shouldDecodeThumbnail) {\n return;\n }\n\n webpToPngBase64(`b64-${messageId}`, thumbnail!)\n .then(setThumbnailDecoded)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n }, [messageId, shouldDecodeThumbnail, thumbnail]);\n\n return shouldDecodeThumbnail ? thumbnailDecoded : thumbnail;\n}\n","import React, {\n FC,\n useRef,\n useEffect,\n useMemo,\n memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n count: number;\n index: number;\n};\n\nconst BORDER_MASK_LEVEL = 4;\n\nconst PinnedMessageNavigation: FC = ({\n count, index,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const markupParams = useMemo(() => {\n return calculateMarkup(count, index);\n }, [count, index]);\n\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n const {\n trackHeight,\n trackTranslateY,\n markHeight,\n markTranslateY,\n clipPathId,\n clipPath,\n } = markupParams;\n\n const firstChild = containerRef.current.firstElementChild;\n if (containerRef && containerRef.current) {\n const currentElement = containerRef.current;\n const { style } = currentElement;\n style.height = `${trackHeight}px`;\n style.transform = `translateY(-${trackTranslateY}px)`;\n style.clipPath = `url(\"#${clipPathId}\")`;\n const svg = currentElement.querySelector('svg');\n const div = currentElement.querySelector('div');\n const defs = currentElement.querySelector('defs');\n if (!svg) {\n if (firstChild) {\n firstChild.innerHTML = ` ${clipPath} `;\n }\n }\n if (defs) {\n defs.innerHTML = clipPath;\n }\n if (div) {\n div.style.height = `${markHeight}px`;\n div.style.transform = `translateY(${markTranslateY}px)`;\n }\n }\n }, [markupParams]);\n\n if (count === 1) {\n return (\n
\n \n
\n );\n }\n\n const {\n trackHeight, trackTranslateY, markHeight, markTranslateY, clipPathId,\n } = markupParams;\n\n return (\n
BORDER_MASK_LEVEL && 'pinned-message-border-mask')}>\n \n \n \n
\n
\n );\n};\n\nfunction calculateMarkup(count: number, index: number) {\n const reverseIndex = count - index - 1;\n const barHeight = getBarHeight(count);\n const markHeight = getMarkHeight(count, reverseIndex);\n const trackHeight = getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath${count}`;\n const clipPath = getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = getMarkTranslateY(reverseIndex, barHeight, count);\n const trackTranslateY = getTrackTranslateY(reverseIndex, count, barHeight, trackHeight);\n return {\n markHeight,\n clipPath,\n markTranslateY,\n trackTranslateY,\n trackHeight,\n clipPathId,\n };\n}\n\nfunction getBarHeight(count: number): number {\n let barHeight = 8;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getMarkHeight(count: number, index: number) {\n let barHeight = 36;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = index === 1 ? 12 : 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getTrackHeight(count: number, barHeight: number) {\n return count <= 3 ? 36 : barHeight * count + 2 * (count - 1);\n}\n\nfunction getClipPath(id: string, barHeight: number, count: number) {\n const radius = 1;\n\n let d = '';\n if (count === 3) {\n d = drawRect(0, 0, 2, barHeight, radius)\n + drawRect(0, 12, 2, barHeight + 1, radius)\n + drawRect(0, 25, 2, barHeight, radius);\n } else {\n for (let i = 0; i < count; i++) {\n d += drawRect(0, (barHeight + 2) * i, 2, barHeight, radius);\n }\n }\n\n return (\n `\n \n `\n );\n}\n\nfunction drawRect(x: number, y: number, width: number, height: number, radius: number) {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,\n ${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n}\n\nfunction getMarkTranslateY(index: number, barHeight: number, count: number) {\n if (count === 1) {\n return 0;\n } else if (count === 2) {\n return index === 0 ? 0 : barHeight + 2;\n }\n\n if (count === 3) {\n if (index === 0) {\n return 0;\n } else if (index === 1) {\n return 12;\n }\n\n return 25;\n } else {\n return (barHeight + 2) * index;\n }\n}\n\nfunction getTrackTranslateY(index: number, count: number, barHeight: number, trackHeight: number) {\n if (count <= 4) {\n return 0;\n }\n\n if (index <= 1) {\n return 0;\n } else if (index >= count - 2) {\n return trackHeight - 36;\n }\n\n return (barHeight + 4) / 2 + (index - 2) * (barHeight + 2);\n}\n\nexport default memo(PinnedMessageNavigation);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getPictogramDimensions } from '../common/helpers/mediaDimensions';\nimport { getMessageMediaHash, getMessageSummaryText } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\nimport Button from '../ui/Button';\nimport RippleEffect from '../ui/RippleEffect';\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport PinnedMessageNavigation from './PinnedMessageNavigation';\n\ntype OwnProps = {\n message: ApiMessage;\n index: number;\n count: number;\n customTitle?: string;\n className?: string;\n onUnpinMessage?: (id: number) => void;\n onClick?: () => void;\n onAllPinnedClick?: () => void;\n};\n\nconst HeaderPinnedMessage: FC = ({\n message, count, index, customTitle, className, onUnpinMessage, onClick, onAllPinnedClick,\n}) => {\n const lang = useLang();\n const mediaThumbnail = useWebpThumbnail(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n\n const text = getMessageSummaryText(lang, message, Boolean(mediaThumbnail));\n const [isUnpinDialogOpen, openUnpinDialog, closeUnpinDialog] = useFlag();\n\n const handleUnpinMessage = useCallback(() => {\n closeUnpinDialog();\n\n if (onUnpinMessage) {\n onUnpinMessage(message.id);\n }\n }, [closeUnpinDialog, onUnpinMessage, message.id]);\n\n return (\n
\n {count > 1 && (\n \n \n \n )}\n {onUnpinMessage && (\n \n \n \n )}\n \n
\n \n {mediaThumbnail && renderPictogram(mediaThumbnail, mediaBlobUrl)}\n
\n
\n {customTitle || `${lang('PinnedMessage')} ${index > 0 ? `#${count - index}` : ''}`}\n
\n

{renderText(text)}

\n
\n\n \n
\n
\n );\n};\n\nfunction renderPictogram(thumbDataUri: string, blobUrl?: string) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \"\"\n );\n}\n\nexport default memo(HeaderPinnedMessage);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiAudio, ApiChat, ApiMessage, ApiUser,\n} from '../../api/types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport {\n getMediaDuration, getMessageAudio, getMessageKey, getMessageMediaHash, getSenderTitle,\n} from '../../modules/helpers';\nimport { selectSender } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from '../ui/RippleEffect';\nimport Button from '../ui/Button';\n\nimport './AudioPlayer.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n className?: string;\n noUi?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiChat | ApiUser;\n};\n\ntype DispatchProps = Pick;\n\nconst AudioPlayer: FC = ({\n message, className, noUi, sender, focusMessage, closeAudioPlayer,\n}) => {\n const lang = useLang();\n\n const senderName = sender ? getSenderTitle(lang, sender) : undefined;\n const mediaData = mediaLoader.getFromMemory(getMessageMediaHash(message, 'inline')!) as (string | undefined);\n const { playPause, isPlaying } = useAudioPlayer(\n getMessageKey(message), getMediaDuration(message)!, mediaData, undefined, undefined, true,\n );\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }, [focusMessage, message.chatId, message.id]);\n\n const handleClose = useCallback(() => {\n if (isPlaying) {\n playPause();\n }\n closeAudioPlayer();\n }, [closeAudioPlayer, isPlaying, playPause]);\n\n if (noUi) {\n return undefined;\n }\n\n const audio = getMessageAudio(message);\n\n return (\n
\n \n \n \n \n\n
\n {audio ? renderAudio(audio) : renderVoice(lang('AttachAudio'), senderName)}\n \n
\n\n \n \n \n
\n );\n};\n\nfunction renderAudio(audio: ApiAudio) {\n const { title, performer, fileName } = audio;\n\n return (\n <>\n
{renderText(title || fileName)}
\n {performer && (\n
{renderText(performer)}
\n )}\n \n );\n}\n\nfunction renderVoice(subtitle: string, senderName?: string) {\n return (\n <>\n
{senderName && renderText(senderName)}
\n
{subtitle}
\n \n );\n}\n\nexport default withGlobal(\n (global, { message }): StateProps => {\n const sender = selectSender(global, message);\n\n return { sender };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage', 'closeAudioPlayer']),\n)(AudioPlayer);\n","import React, {\n FC, useCallback, useMemo, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport cycleRestrict from '../../util/cycleRestrict';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport {\n ApiMessage,\n ApiChat,\n ApiTypingStatus,\n MAIN_THREAD_ID, ApiUser,\n} from '../../api/types';\nimport { NotifyException, NotifySettings } from '../../types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n EDITABLE_INPUT_ID,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n} from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport {\n isChatPrivate,\n isChatArchived,\n getMessageKey,\n getChatTitle,\n getSenderTitle,\n selectIsChatMuted,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatMessage,\n selectAllowedMessageActions,\n selectIsRightColumnShown,\n selectThreadTopMessageId,\n selectThreadOriginChat,\n selectThreadInfo,\n selectChatMessages,\n selectPinnedIds,\n selectIsChatWithSelf,\n selectForwardedSender,\n selectScheduledIds,\n selectIsInSelectMode,\n selectIsChatWithBot,\n selectNotifySettings,\n selectNotifyExceptions,\n} from '../../modules/selectors';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport { pick } from '../../util/iteratees';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport HeaderActions from './HeaderActions';\nimport HeaderPinnedMessage from './HeaderPinnedMessage';\nimport AudioPlayer from './AudioPlayer';\n\nimport './MiddleHeader.scss';\n\nconst ANIMATION_DURATION = 350;\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n pinnedMessageIds?: number[] | number;\n messagesById?: Record;\n canUnpin?: boolean;\n topMessageSender?: ApiChat | ApiUser;\n typingStatus?: ApiTypingStatus;\n isSelectModeActive?: boolean;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n audioMessage?: ApiMessage;\n chatsById?: Record;\n originChatId: number;\n messagesCount?: number;\n isChatWithSelf?: boolean;\n isChatWithBot?: boolean;\n lastSyncTime?: number;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst MiddleHeader: FC = ({\n chatId,\n threadId,\n messageListType,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n topMessageSender,\n typingStatus,\n isSelectModeActive,\n isLeftColumnShown,\n isRightColumnShown,\n audioMessage,\n chat,\n chatsById,\n originChatId,\n messagesCount,\n isChatWithSelf,\n isChatWithBot,\n lastSyncTime,\n notifySettings,\n notifyExceptions,\n openChatWithInfo,\n pinMessage,\n focusMessage,\n openChat,\n loadPinnedMessages,\n toggleLeftColumn,\n exitMessageSelectMode,\n}) => {\n const lang = useLang();\n\n const [pinnedMessageIndex, setPinnedMessageIndex] = useState(0);\n const pinnedMessageId = Array.isArray(pinnedMessageIds) ? pinnedMessageIds[pinnedMessageIndex] : pinnedMessageIds;\n const pinnedMessage = messagesById && pinnedMessageId ? messagesById[pinnedMessageId] : undefined;\n const pinnedMessagesCount = Array.isArray(pinnedMessageIds) ? pinnedMessageIds.length : (pinnedMessageIds ? 1 : 0);\n const chatTitleLength = chat && getChatTitle(lang, chat).length;\n const topMessageTitle = topMessageSender ? getSenderTitle(lang, topMessageSender) : undefined;\n\n useEffect(() => {\n if (threadId === MAIN_THREAD_ID && lastSyncTime) {\n loadPinnedMessages({ chatId });\n }\n }, [chatId, loadPinnedMessages, lastSyncTime, threadId]);\n\n // Reset pinned index when switching chats and pinning/unpinning\n useEffect(() => {\n setPinnedMessageIndex(0);\n }, [pinnedMessageIds]);\n\n useEnsureMessage(chatId, pinnedMessageId, pinnedMessage);\n\n const { width: windowWidth } = useWindowSize();\n\n const isLeftColumnHideable = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN;\n const shouldShowCloseButton = windowWidth >= MOBILE_SCREEN_MAX_WIDTH && isLeftColumnShown;\n\n // eslint-disable-next-line no-null/no-null\n const componentRef = useRef(null);\n const shouldAnimateTools = useRef(true);\n\n const handleHeaderClick = useCallback(() => {\n openChatWithInfo({ id: chatId });\n }, [openChatWithInfo, chatId]);\n\n const handleUnpinMessage = useCallback((messageId: number) => {\n pinMessage({ chatId, messageId, isUnpin: true });\n }, [pinMessage, chatId]);\n\n const handlePinnedMessageClick = useCallback((): void => {\n if (pinnedMessage) {\n focusMessage({ chatId: pinnedMessage.chatId, threadId, messageId: pinnedMessage.id });\n\n const newIndex = cycleRestrict(pinnedMessagesCount, pinnedMessageIndex + 1);\n setPinnedMessageIndex(newIndex);\n }\n }, [pinnedMessage, focusMessage, threadId, pinnedMessagesCount, pinnedMessageIndex]);\n\n const handleAllPinnedClick = useCallback(() => {\n openChat({ id: chatId, threadId: MAIN_THREAD_ID, type: 'pinned' });\n }, [openChat, chatId]);\n\n const handleBackClick = useCallback(() => {\n if (IS_MOBILE_SCREEN) {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID);\n if (messageInput) {\n messageInput.blur();\n }\n }\n if (threadId === MAIN_THREAD_ID && messageListType === 'thread') {\n if (IS_MOBILE_SCREEN) {\n openChat({ id: undefined });\n } else {\n toggleLeftColumn();\n }\n\n return;\n }\n\n if (messageListType === 'scheduled' && isSelectModeActive) {\n exitMessageSelectMode();\n }\n openChat({ id: originChatId, threadId: MAIN_THREAD_ID });\n }, [openChat, originChatId, threadId, messageListType, toggleLeftColumn, isSelectModeActive, exitMessageSelectMode]);\n\n const unreadCount = useMemo(() => {\n if (!isLeftColumnHideable || !chatsById) {\n return undefined;\n }\n\n let isActive = false;\n\n const totalCount = Object.values(chatsById).reduce((total, currentChat) => {\n if (isChatArchived(currentChat)) {\n return total;\n }\n\n const count = currentChat.unreadCount || 0;\n if (\n count && (!selectIsChatMuted(currentChat, notifySettings, notifyExceptions) || currentChat.unreadMentionsCount)\n ) {\n isActive = true;\n }\n\n return total + count;\n }, 0);\n\n if (!totalCount) {\n return undefined;\n }\n\n return {\n isActive,\n totalCount,\n };\n }, [isLeftColumnHideable, chatsById, notifySettings, notifyExceptions]);\n\n const canToolsCollideWithChatInfo = (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n ) || (\n windowWidth > MOBILE_SCREEN_MAX_WIDTH\n && windowWidth < MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && (!chatTitleLength || chatTitleLength > 30)\n );\n const shouldUseStackedToolsClass = canToolsCollideWithChatInfo || (\n windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n );\n\n const {\n shouldRender: shouldRenderAudioPlayer,\n transitionClassNames: audioPlayerClassNames,\n } = useShowTransition(Boolean(audioMessage));\n\n const renderingAudioMessage = useCurrentOrPrev(audioMessage);\n\n const {\n shouldRender: shouldRenderPinnedMessage,\n transitionClassNames: pinnedMessageClassNames,\n } = useShowTransition(pinnedMessage && !shouldRenderAudioPlayer);\n\n const renderingPinnedMessage = useCurrentOrPrev(pinnedMessage);\n const renderingPinnedMessageTitle = useCurrentOrPrev(topMessageTitle);\n\n const canRevealTools = (shouldRenderPinnedMessage && renderingPinnedMessage)\n || (shouldRenderAudioPlayer && renderingAudioMessage);\n\n // Logic for transition to and from custom display of AudioPlayer/PinnedMessage on smaller screens\n useEffect(() => {\n const componentEl = componentRef.current;\n if (!componentEl) {\n return;\n }\n\n if (!shouldUseStackedToolsClass || !canRevealTools) {\n componentEl.classList.remove('tools-stacked', 'animated');\n shouldAnimateTools.current = true;\n return;\n }\n\n if (isRightColumnShown || canToolsCollideWithChatInfo) {\n if (shouldAnimateTools.current) {\n componentEl.classList.add('tools-stacked', 'animated');\n shouldAnimateTools.current = false;\n }\n\n // Remove animation class to prevent it messing up the show transitions\n setTimeout(() => {\n componentEl.classList.remove('animated');\n }, ANIMATION_DURATION);\n } else {\n componentEl.classList.remove('tools-stacked');\n shouldAnimateTools.current = true;\n }\n }, [shouldUseStackedToolsClass, canRevealTools, canToolsCollideWithChatInfo, isRightColumnShown]);\n\n function renderInfo() {\n return (\n messageListType === 'thread' && threadId === MAIN_THREAD_ID ? (\n renderMainThreadInfo()\n ) : messageListType === 'thread' ? (\n <>\n {renderBackButton()}\n

\n {lang('CommentsCount', messagesCount)}\n

\n \n ) : messageListType === 'pinned' ? (\n <>\n {renderBackButton()}\n

\n {lang('PinnedMessagesCount', messagesCount)}\n

\n \n ) : messageListType === 'scheduled' ? (\n <>\n {renderBackButton()}\n

\n {isChatWithSelf ? lang('Reminders') : lang('messages', messagesCount)}\n

\n \n ) : undefined\n );\n }\n\n function renderMainThreadInfo() {\n return (\n <>\n {isLeftColumnHideable && renderBackButton(shouldShowCloseButton, unreadCount)}\n
\n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n
\n \n );\n }\n\n function renderBackButton(asClose = false, unreadCountInfo?: typeof unreadCount) {\n return (\n
\n \n
\n \n {unreadCountInfo && (\n
\n {formatIntegerCompact(unreadCountInfo.totalCount)}\n
\n )}\n
\n );\n }\n\n return (\n
\n \n {renderInfo}\n \n\n
\n {shouldRenderPinnedMessage && renderingPinnedMessage && !shouldRenderAudioPlayer && (\n \n )}\n {shouldRenderAudioPlayer && renderingAudioMessage && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const { isLeftColumnShown, lastSyncTime } = global;\n const { byId: chatsById } = global.chats;\n const chat = selectChat(global, chatId);\n\n const { typingStatus } = chat || {};\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n const originChat = selectThreadOriginChat(global, chatId, threadId);\n\n let messagesCount: number | undefined;\n if (messageListType === 'pinned') {\n const pinnedIds = selectPinnedIds(global, chatId);\n messagesCount = pinnedIds && pinnedIds.length;\n } else if (messageListType === 'scheduled') {\n const scheduledIds = selectScheduledIds(global, chatId);\n messagesCount = scheduledIds && scheduledIds.length;\n } else if (messageListType === 'thread' && threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (threadInfo) {\n messagesCount = threadInfo.messagesCount;\n }\n }\n\n const state: StateProps = {\n typingStatus,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n audioMessage,\n chat,\n chatsById,\n originChatId: originChat ? originChat.id : chatId,\n messagesCount,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isChatWithBot: chat && selectIsChatWithBot(global, chat),\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n\n const messagesById = selectChatMessages(global, chatId);\n if (messageListType !== 'thread' || !messagesById) {\n return state;\n }\n\n Object.assign(state, { messagesById });\n\n if (threadId !== MAIN_THREAD_ID) {\n const pinnedMessageId = selectThreadTopMessageId(global, chatId, threadId);\n const message = pinnedMessageId ? selectChatMessage(global, chatId, pinnedMessageId) : undefined;\n const topMessageSender = message ? selectForwardedSender(global, message) : undefined;\n\n return {\n ...state,\n pinnedMessageIds: pinnedMessageId,\n canUnpin: false,\n topMessageSender,\n };\n }\n\n const pinnedMessageIds = selectPinnedIds(global, chatId);\n if (pinnedMessageIds && pinnedMessageIds.length) {\n const firstPinnedMessage = messagesById[pinnedMessageIds[0]];\n const {\n canUnpin,\n } = (firstPinnedMessage && selectAllowedMessageActions(global, firstPinnedMessage, threadId)) || {};\n\n return {\n ...state,\n pinnedMessageIds,\n canUnpin,\n };\n }\n\n return state;\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChatWithInfo',\n 'pinMessage',\n 'focusMessage',\n 'openChat',\n 'loadPinnedMessages',\n 'toggleLeftColumn',\n 'exitMessageSelectMode',\n ]),\n)(MiddleHeader));\n","import { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\n\nimport { getDayStart } from '../../../util/dateFormat';\nimport { isActionMessage } from '../../../modules/helpers';\n\ntype SenderGroup = (ApiMessage | IAlbum)[];\n\nexport type MessageDateGroup = {\n originalDate: number;\n datetime: number;\n senderGroups: SenderGroup[];\n};\n\nexport function isAlbum(messageOrAlbum: ApiMessage | IAlbum): messageOrAlbum is IAlbum {\n return 'albumId' in messageOrAlbum;\n}\n\nexport function groupMessages(messages: ApiMessage[], firstUnreadId?: number) {\n let currentSenderGroup: SenderGroup = [];\n let currentDateGroup = {\n originalDate: messages[0].date,\n datetime: Number(getDayStart(messages[0].date * 1000)),\n senderGroups: [currentSenderGroup],\n };\n let currentAlbum: IAlbum | undefined;\n\n const dateGroups: MessageDateGroup[] = [currentDateGroup];\n\n messages.forEach((message, index) => {\n if (message.isInAlbum) {\n if (!currentAlbum) {\n currentAlbum = {\n albumId: message.groupedId!,\n messages: [message],\n mainMessage: message,\n };\n } else {\n currentAlbum.messages.push(message);\n if (message.content.text) {\n currentAlbum.mainMessage = message;\n }\n }\n } else {\n currentSenderGroup.push(message);\n }\n\n const nextMessage = messages[index + 1];\n\n if (\n currentAlbum\n && (!nextMessage || !nextMessage.groupedId || nextMessage.groupedId !== currentAlbum.albumId)\n ) {\n currentSenderGroup.push(currentAlbum);\n currentAlbum = undefined;\n }\n if (nextMessage) {\n const nextMessageDatetime = Number(getDayStart(nextMessage.date * 1000));\n if (currentDateGroup.datetime !== nextMessageDatetime) {\n currentDateGroup = {\n originalDate: nextMessage.date,\n datetime: nextMessageDatetime,\n senderGroups: [],\n };\n dateGroups.push(currentDateGroup);\n\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n } else if (\n nextMessage.id === firstUnreadId\n || message.senderId !== nextMessage.senderId\n || message.isOutgoing !== nextMessage.isOutgoing\n || isActionMessage(message)\n || isActionMessage(nextMessage)\n || (\n message.forwardInfo && nextMessage.forwardInfo\n && (\n message.forwardInfo.senderUserId !== nextMessage.forwardInfo.senderUserId\n || message.forwardInfo.fromChatId !== nextMessage.forwardInfo.fromChatId\n || message.forwardInfo.hiddenUserName !== nextMessage.forwardInfo.hiddenUserName\n )\n )\n || message.inlineButtons\n || nextMessage.inlineButtons\n ) {\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n }\n }\n });\n\n return dateGroups;\n}\n","import { useCallback } from '../../../lib/teact/teact';\n\nimport { fastRaf } from '../../../util/schedulers';\nimport useDebounce from '../../../hooks/useDebounce';\nimport useFlag from '../../../hooks/useFlag';\n\nconst DEBOUNCE = 1000;\nconst STICKY_TOP = 10;\nconst STICKY_TOP_WITH_TOOLS = 60;\n\nexport default function useStickyDates() {\n // For some reason we can not synchronously hide a sticky element (from `useLayoutEffect`) when chat opens\n // so we will add `position: sticky` only after first scroll. There would be no animation on the first show though.\n const [isScrolled, markIsScrolled] = useFlag(false);\n\n const runDebounced = useDebounce(DEBOUNCE, false);\n\n const updateStickyDates = useCallback((container: HTMLDivElement, hasTools?: boolean) => {\n markIsScrolled();\n\n if (!document.body.classList.contains('is-scrolling-messages')) {\n fastRaf(() => {\n document.body.classList.add('is-scrolling-messages');\n });\n }\n\n runDebounced(() => {\n fastRaf(() => {\n const currentStuck = document.querySelector('.stuck');\n if (currentStuck) {\n currentStuck.classList.remove('stuck');\n }\n\n const stuckDateEl = findStuckDate(container, hasTools);\n if (stuckDateEl) {\n stuckDateEl.classList.add('stuck');\n }\n\n document.body.classList.remove('is-scrolling-messages');\n });\n });\n }, [markIsScrolled, runDebounced]);\n\n return {\n isScrolled,\n updateStickyDates,\n };\n}\n\nfunction findStuckDate(container: HTMLElement, hasTools?: boolean) {\n const allElements = container.querySelectorAll('.sticky-date');\n const containerTop = container.scrollTop;\n\n return Array.from(allElements).find((el) => {\n const { offsetTop, offsetHeight } = el;\n const top = offsetTop - containerTop;\n return -offsetHeight <= top && top <= (hasTools ? STICKY_TOP_WITH_TOOLS : STICKY_TOP);\n });\n}\n","import { useMemo } from '../lib/teact/teact';\n\nimport { debounce } from '../util/schedulers';\n\nexport default function useDebounce(ms: number, shouldRunFirst?: boolean, shouldRunLast?: boolean) {\n return useMemo(() => {\n return debounce((cb) => cb(), ms, shouldRunFirst, shouldRunLast);\n }, [ms, shouldRunFirst, shouldRunLast]);\n}\n","import { MutableRefObject } from 'react';\nimport React, {\n FC, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { MESSAGE_LIST_SENSITIVE_AREA } from '../../config';\nimport resetScroll from '../../util/resetScroll';\nimport { useIntersectionObserver, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useOnChange from '../../hooks/useOnChange';\n\ntype OwnProps = {\n containerRef: MutableRefObject;\n className: string;\n messageIds: number[];\n focusingId?: number;\n loadMoreForwards?: NoneToVoidFunction;\n loadMoreBackwards?: NoneToVoidFunction;\n isViewportNewest?: boolean;\n firstUnreadId?: number;\n onFabToggle: AnyToVoidFunction;\n onNotchToggle: AnyToVoidFunction;\n children: any;\n};\n\nconst FAB_THRESHOLD = 50;\nconst TOOLS_FREEZE_TIMEOUT = 100;\n\n// Local flag is used because `freeze/unfreeze` methods are controlled by heavy animation\nlet areToolsFrozen = false;\n\nconst MessageScroll: FC = ({\n containerRef,\n className,\n messageIds,\n focusingId,\n loadMoreForwards,\n loadMoreBackwards,\n isViewportNewest,\n firstUnreadId,\n onFabToggle,\n onNotchToggle,\n children,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const forwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const fabTriggerRef = useRef(null);\n\n const toggleScrollTools = useCallback(() => {\n if (areToolsFrozen) {\n return;\n }\n\n if (!messageIds || !messageIds.length) {\n onFabToggle(false);\n onNotchToggle(false);\n return;\n }\n\n if (!isViewportNewest) {\n onFabToggle(true);\n onNotchToggle(true);\n return;\n }\n\n const { offsetHeight, scrollHeight, scrollTop } = containerRef.current!;\n const scrollBottom = scrollHeight - scrollTop - offsetHeight;\n const isNearBottom = scrollBottom <= FAB_THRESHOLD;\n const isAtBottom = scrollBottom <= 0;\n\n onFabToggle(firstUnreadId ? !isAtBottom : !isNearBottom);\n onNotchToggle(!isAtBottom);\n }, [messageIds, isViewportNewest, containerRef, onFabToggle, firstUnreadId, onNotchToggle]);\n\n const {\n observe: observeIntersection,\n freeze: freezeForLoadMore,\n unfreeze: unfreezeForLoadMore,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: MESSAGE_LIST_SENSITIVE_AREA,\n }, (entries) => {\n if (!loadMoreForwards || !loadMoreBackwards) {\n return;\n }\n\n const triggerEntry = entries.find(({ isIntersecting }) => isIntersecting);\n if (!triggerEntry) {\n return;\n }\n\n const { target } = triggerEntry;\n\n if (target.className === 'backwards-trigger') {\n resetScroll(containerRef.current!);\n loadMoreBackwards();\n } else if (target.className === 'forwards-trigger') {\n resetScroll(containerRef.current!);\n loadMoreForwards();\n }\n });\n\n useOnIntersect(backwardsTriggerRef, observeIntersection);\n useOnIntersect(forwardsTriggerRef, observeIntersection);\n\n const {\n observe: observeIntersectionForFab,\n freeze: freezeForFab,\n unfreeze: unfreezeForFab,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: FAB_THRESHOLD,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForFab);\n\n const {\n observe: observeIntersectionForNotch,\n } = useIntersectionObserver({\n rootRef: containerRef,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForNotch);\n\n // Do not load more and show FAB when focusing\n useOnChange(() => {\n if (focusingId) {\n freezeForLoadMore();\n freezeForFab();\n } else {\n unfreezeForFab();\n unfreezeForLoadMore();\n }\n }, [focusingId]);\n\n // Workaround for FAB and notch flickering with tall incoming message\n useOnChange(() => {\n areToolsFrozen = true;\n\n setTimeout(() => {\n areToolsFrozen = false;\n }, TOOLS_FREEZE_TIMEOUT);\n }, [messageIds]);\n\n // Workaround for stuck FAB when many unread messages\n useEffect(toggleScrollTools, [firstUnreadId]);\n\n return (\n
\n
\n {children}\n \n \n
\n );\n};\n\nexport default MessageScroll;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { getMessageContent } from '../../../../modules/helpers';\n\nexport function isEmojiOnlyMessage(customShape?: boolean | number) {\n return typeof customShape === 'number';\n}\n\nexport function buildContentClassName(\n message: ApiMessage,\n {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments,\n }: {\n hasReply?: boolean;\n customShape?: boolean | number;\n isLastInGroup?: boolean;\n asForwarded?: boolean;\n hasThread?: boolean;\n forceSenderName?: boolean;\n hasComments?: boolean;\n } = {},\n) {\n const {\n text, photo, video, audio, voice, document, poll, webPage, contact,\n } = getMessageContent(message);\n\n const classNames = ['message-content'];\n const isMediaWithNoText = (photo || video) && !text;\n const isViaBot = Boolean(message.viaBotId);\n\n if (isEmojiOnlyMessage(customShape)) {\n classNames.push(`emoji-only emoji-only-${customShape}`);\n } else if (text) {\n classNames.push('text');\n }\n\n if (customShape) {\n classNames.push('custom-shape');\n if (video && video.isRound) {\n classNames.push('round');\n }\n\n if (hasComments) {\n classNames.push('has-comments');\n }\n }\n if (photo || video) {\n classNames.push('media');\n } else if (audio) {\n classNames.push('audio');\n } else if (voice) {\n classNames.push('voice');\n } else if (document) {\n classNames.push('document');\n } else if (contact) {\n classNames.push('contact');\n } else if (poll) {\n classNames.push('poll');\n } else if (webPage) {\n classNames.push('web-page');\n\n if (webPage.photo) {\n classNames.push('media');\n }\n }\n\n if (asForwarded && !customShape) {\n classNames.push('is-forwarded');\n }\n\n if (hasReply) {\n classNames.push('is-reply');\n }\n\n if (hasThread) {\n classNames.push('has-replies');\n }\n\n if (isViaBot) {\n classNames.push('is-via-bot');\n }\n\n if (forceSenderName) {\n classNames.push('force-sender-name');\n }\n\n if (!customShape) {\n classNames.push('has-shadow');\n\n if (hasReply || asForwarded || !isMediaWithNoText || isViaBot || forceSenderName) {\n classNames.push('has-solid-background');\n }\n\n if (isLastInGroup && (photo || !isMediaWithNoText)) {\n classNames.push('has-appendix');\n }\n }\n\n return classNames.join(' ');\n}\n","import { ApiMessage } from '../../../../api/types';\nimport { calculateInlineImageDimensions, calculateVideoDimensions } from '../../../common/helpers/mediaDimensions';\nimport {\n getMessageText,\n getMessagePhoto,\n getMessageWebPagePhoto,\n isForwardedMessage,\n isOwnMessage,\n getMessageVideo,\n} from '../../../../modules/helpers';\n\nconst MIN_MEDIA_WIDTH = 100;\nconst MIN_MEDIA_WIDTH_WITH_TEXT = 175;\nconst MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS = 238;\nconst MIN_MEDIA_HEIGHT = 90;\nconst SMALL_IMAGE_THRESHOLD = 12;\n\nexport function getMinMediaWidth(hasText?: boolean, hasCommentButton?: boolean) {\n return hasText\n ? (hasCommentButton ? MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS : MIN_MEDIA_WIDTH_WITH_TEXT)\n : MIN_MEDIA_WIDTH;\n}\n\nexport function calculateMediaDimensions(message: ApiMessage) {\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const photo = getMessagePhoto(message) || getMessageWebPagePhoto(message);\n const video = getMessageVideo(message);\n\n const isWebPagePhoto = Boolean(getMessageWebPagePhoto(message));\n const { width, height } = photo\n ? calculateInlineImageDimensions(photo, isOwn, isForwarded, isWebPagePhoto)\n : calculateVideoDimensions(video!, isOwn, isForwarded);\n\n const hasText = Boolean(getMessageText(message));\n const minMediaWidth = getMinMediaWidth(hasText);\n\n let stretchFactor = 1;\n if (width < minMediaWidth && minMediaWidth - width < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = minMediaWidth / width;\n }\n if (height * stretchFactor < MIN_MEDIA_HEIGHT && MIN_MEDIA_HEIGHT - height * stretchFactor < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = MIN_MEDIA_HEIGHT / height;\n }\n\n const finalWidth = Math.round(width * stretchFactor);\n const finalHeight = Math.round(height * stretchFactor);\n\n return {\n width: finalWidth,\n height: finalHeight,\n isSmall: finalWidth < minMediaWidth || finalHeight < MIN_MEDIA_HEIGHT,\n };\n}\n","/* eslint-disable no-bitwise */\n// Based on\n// https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/SourceFiles/ui/grouped_layout.cpp\n// https://github.com/overtake/TelegramSwift/blob/master/Telegram-Mac/GroupedLayout.swift#L83\n\nimport { IAlbum } from '../../../../types';\nimport { ApiMessage } from '../../../../api/types';\nimport { IDimensions } from '../../../../modules/helpers';\n\nimport { MOBILE_SCREEN_MAX_WIDTH } from '../../../../config';\nimport { REM } from '../../../common/helpers/mediaDimensions';\nimport { calculateMediaDimensions } from './mediaDimensions';\n\nconst MAX_WIDTH_MOBILE_VW = 69;\nconst MAX_WIDTH_DESK_OWN_REM = 30;\nconst MAX_WIDTH_DESK_REM = 29;\nexport const AlbumRectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8,\n};\n\ntype IAttempt = {\n lineCounts: number[];\n heights: number[];\n};\nexport type IMediaDimensions = {\n width: number;\n height: number;\n x: number;\n y: number;\n};\ntype IMediaLayout = {\n dimensions: IMediaDimensions;\n sides: number;\n};\ntype ILayoutParams = {\n ratios: number[];\n proportions: string;\n averageRatio: number;\n maxWidth: number;\n minWidth: number;\n maxHeight: number;\n spacing: number;\n};\nexport type IAlbumLayout = {\n layout: IMediaLayout[];\n containerStyle: IDimensions;\n};\n\nfunction getMaxWidth(isOwn: boolean, isForwarded: boolean, windowWidth: number) {\n if (windowWidth <= MOBILE_SCREEN_MAX_WIDTH) {\n return (windowWidth / 100) * MAX_WIDTH_MOBILE_VW - (isForwarded ? 1.625 : 0) * REM;\n }\n\n const maxWidth = isOwn ? MAX_WIDTH_DESK_OWN_REM : MAX_WIDTH_DESK_REM;\n\n return (maxWidth - (isForwarded ? 1.625 : 0)) * REM;\n}\n\nfunction getRatios(messages: ApiMessage[]) {\n return messages.map(\n (message) => {\n const dimensions = calculateMediaDimensions(message) as IDimensions;\n\n return dimensions.width / dimensions.height;\n },\n );\n}\n\nfunction getProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2 ? 'w' : (ratio < 0.8 ? 'n' : 'q'))).join('');\n}\n\nfunction getAverageRatio(ratios: number[]) {\n return ratios.reduce((result, ratio) => ratio + result, 1) / ratios.length;\n}\n\nfunction accumulate(list: number[], initValue: number) {\n return list.reduce((accumulator, item) => accumulator + item, initValue);\n}\n\nfunction clamp(num: number, low: number, high: number) {\n return num < low ? low : (num > high ? high : num);\n}\n\nfunction cropRatios(ratios: number[], averageRatio: number) {\n return ratios.map((ratio) => (averageRatio > 1.1 ? clamp(ratio, 1, 2.75) : clamp(ratio, 0.6667, 1)));\n}\n\nfunction calculateContainerSize(layout: IMediaLayout[]) {\n const styles: IDimensions = { width: 0, height: 0 };\n layout.forEach(({\n dimensions,\n sides,\n }) => {\n if (sides & AlbumRectPart.Right) {\n styles.width = dimensions.width + dimensions.x;\n }\n if (sides & AlbumRectPart.Bottom) {\n styles.height = dimensions.height + dimensions.y;\n }\n });\n\n return styles;\n}\n\nexport function calculateAlbumLayout(\n isOwn: boolean,\n isForwarded: boolean,\n album: IAlbum,\n windowWidth: number,\n): IAlbumLayout {\n const spacing = 2;\n const ratios = getRatios(album.messages);\n const proportions = getProportions(ratios);\n const averageRatio = getAverageRatio(ratios);\n const albumCount = ratios.length;\n const forceCalc = ratios.some((ratio) => ratio > 2);\n const maxWidth = getMaxWidth(isOwn, isForwarded, windowWidth);\n const maxHeight = maxWidth;\n\n let layout;\n\n const params = {\n ratios,\n proportions,\n averageRatio,\n maxWidth,\n minWidth: 100,\n maxHeight,\n spacing,\n };\n\n if (albumCount >= 5 || forceCalc) {\n layout = layoutWithComplexLayouter(params);\n } else if (albumCount === 2) {\n layout = layoutTwo(params);\n } else if (albumCount === 3) {\n layout = layoutThree(params);\n } else {\n layout = layoutFour(params);\n }\n\n return {\n layout,\n containerStyle: calculateContainerSize(layout),\n };\n}\n\nfunction layoutWithComplexLayouter({\n ratios: originalRatios,\n averageRatio,\n maxWidth,\n minWidth,\n spacing,\n maxHeight = (4 * maxWidth) / 3,\n}: ILayoutParams) {\n const ratios = cropRatios(originalRatios, averageRatio);\n const count = originalRatios.length;\n const result = new Array(count);\n const attempts: IAttempt[] = [];\n\n const multiHeight = (offset: number, attemptCount: number) => {\n const attemptRatios = ratios.slice(offset, offset + attemptCount);\n const sum = accumulate(attemptRatios, 0);\n\n return (maxWidth - (attemptCount - 1) * spacing) / sum;\n };\n\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n lineCounts.forEach((currentCount) => {\n heights.push(multiHeight(offset, currentCount));\n offset += currentCount;\n });\n\n attempts.push({\n lineCounts,\n heights,\n });\n };\n\n for (let first = 1; first !== count; ++first) {\n const second = count - first;\n if (first <= 3 && second <= 3) {\n pushAttempt([first, second]);\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n const third = count - first - second;\n if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) {\n pushAttempt([first, second, third]);\n }\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n for (let third = 1; third !== count - first - second; ++third) {\n const fourth = count - first - second - third;\n if (first <= 3 && second <= 3 && third <= 3 && fourth <= 4) {\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n }\n\n let optimalAttempt: IAttempt | undefined;\n let optimalDiff = 0;\n for (let i = 0; i < attempts.length; i++) {\n const {\n heights,\n lineCounts,\n } = attempts[i];\n const lineCount = lineCounts.length;\n const totalHeight = accumulate(heights, 0) + spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const bad1 = minLineHeight < minWidth ? 1.5 : 1;\n const bad2 = (() => {\n for (let line = 1; line !== lineCount; ++line) {\n if (lineCounts[line - 1] > lineCounts[line]) {\n return 1.5;\n }\n }\n\n return 1;\n })();\n const diff = Math.abs(totalHeight - maxHeight) * bad1 * bad2;\n\n if (!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempts[i];\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt!.lineCounts;\n const optimalHeights = optimalAttempt!.heights;\n const rowCount = optimalCounts.length;\n let index = 0;\n let y = 0;\n for (let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n let x = 0;\n\n for (let col = 0; col !== colCount; ++col) {\n const sides = AlbumRectPart.None\n | (row === 0 ? AlbumRectPart.Top : AlbumRectPart.None)\n | (row === rowCount - 1 ? AlbumRectPart.Bottom : AlbumRectPart.None)\n | (col === 0 ? AlbumRectPart.Left : AlbumRectPart.None)\n | (col === colCount - 1 ? AlbumRectPart.Right : AlbumRectPart.None);\n const ratio = ratios[index];\n const width = col === colCount - 1 ? maxWidth - x : Math.round(ratio * lineHeight);\n result[index] = {\n dimensions: {\n x,\n y,\n width,\n height,\n },\n sides,\n };\n x += width + spacing;\n ++index;\n }\n y += height + spacing;\n }\n\n return result;\n}\n\n\nfunction layoutTwo(params: ILayoutParams) {\n const {\n ratios,\n proportions,\n averageRatio,\n } = params;\n return proportions === 'ww' && averageRatio > 1.4 && ratios[1] - ratios[0] < 0.2\n ? layoutTwoTopBottom(params)\n : proportions === 'ww' || proportions === 'qq'\n ? layoutTwoLeftRightEqual(params)\n : layoutTwoLeftRight(params);\n}\n\nfunction layoutTwoTopBottom(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const height = Math.round(Math.min(maxWidth / ratios[0], Math.min(maxWidth / ratios[1], (maxHeight - spacing) / 2)));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: height + spacing,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutTwoLeftRightEqual(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const width = (maxWidth - spacing) / 2;\n const height = Math.round(Math.min(width / ratios[0], Math.min(width / ratios[1], maxHeight)));\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: width + spacing,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutTwoLeftRight(params: ILayoutParams) {\n const {\n ratios,\n minWidth,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const minimalWidth = Math.round(1.5 * minWidth);\n const secondWidth = Math.min(\n Math.round(\n Math.max(\n 0.4 * (maxWidth - spacing),\n (maxWidth - spacing) / ratios[0] / (1 / ratios[0] + 1 / ratios[1]),\n ),\n ),\n maxWidth - spacing - minimalWidth,\n );\n const firstWidth = maxWidth - secondWidth - spacing;\n const height = Math.min(maxHeight, Math.round(Math.min(firstWidth / ratios[0], secondWidth / ratios[1])));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: firstWidth + spacing,\n y: 0,\n width: secondWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutThree(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'n'\n ? layoutThreeLeftAndOther(params)\n : layoutThreeTopAndOther(params);\n}\n\nfunction layoutThreeLeftAndOther(params: ILayoutParams) {\n const {\n maxHeight,\n spacing,\n ratios,\n maxWidth,\n minWidth,\n } = params;\n const firstHeight = maxHeight;\n const thirdHeight = Math.round(\n Math.min(\n (maxHeight - spacing) / 2,\n (ratios[1] * (maxWidth - spacing)) / (ratios[2] + ratios[1]),\n ),\n );\n const secondHeight = firstHeight - thirdHeight - spacing;\n const rightWidth = Math.max(\n minWidth,\n Math.round(\n Math.min(\n (maxWidth - spacing) / 2,\n Math.min(\n thirdHeight * ratios[2],\n secondHeight * ratios[1],\n ),\n ),\n ),\n );\n const leftWidth = Math.min(Math.round(firstHeight * ratios[0]), maxWidth - spacing - rightWidth);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: leftWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: 0,\n width: rightWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: secondHeight + spacing,\n width: rightWidth,\n height: thirdHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutThreeTopAndOther(params: ILayoutParams) {\n const {\n maxWidth,\n ratios,\n maxHeight,\n spacing,\n } = params;\n const firstWidth = maxWidth;\n const firstHeight = Math.round(Math.min(firstWidth / ratios[0], 0.66 * (maxHeight - spacing)));\n const secondWidth = (maxWidth - spacing) / 2;\n const secondHeight = Math.min(\n maxHeight - firstHeight - spacing,\n Math.round(Math.min(\n secondWidth / ratios[1],\n secondWidth / ratios[2],\n )),\n );\n const thirdWidth = firstWidth - secondWidth - spacing;\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: firstHeight + spacing,\n width: secondWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: secondWidth + spacing,\n y: firstHeight + spacing,\n width: thirdWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutFour(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'w'\n ? layoutFourTopAndOther(params)\n : layoutFourLeftAndOther(params);\n}\n\nfunction layoutFourTopAndOther({\n maxWidth,\n ratios,\n spacing,\n maxHeight,\n minWidth,\n}: ILayoutParams) {\n const w = maxWidth;\n const h0 = Math.round(Math.min(w / ratios[0], 0.66 * (maxHeight - spacing)));\n const h = Math.round((maxWidth - 2 * spacing) / (ratios[1] + ratios[2] + ratios[3]));\n const w0 = Math.max(minWidth, Math.round(Math.min(0.4 * (maxWidth - 2 * spacing), h * ratios[1])));\n const w2 = Math.round(Math.max(Math.max(minWidth, 0.33 * (maxWidth - 2 * spacing)), h * ratios[3]));\n const w1 = w - w0 - w2 - 2 * spacing;\n const h1 = Math.min(maxHeight - h0 - spacing, h);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w,\n height: h0,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: h0 + spacing,\n width: w0,\n height: h1,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing + w1 + spacing,\n y: h0 + spacing,\n width: w2,\n height: h1,\n },\n sides: AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutFourLeftAndOther({\n maxHeight,\n ratios,\n maxWidth,\n spacing,\n minWidth,\n}: ILayoutParams) {\n const h = maxHeight;\n const w0 = Math.round(Math.min(h * ratios[0], 0.6 * (maxWidth - spacing)));\n const w = Math.round((maxHeight - 2 * spacing) / (1 / ratios[1] + 1 / ratios[2] + 1 / ratios[3]));\n const h0 = Math.round(w / ratios[1]);\n const h1 = Math.round(w / ratios[2]);\n const h2 = h - h0 - h1 - 2 * spacing;\n const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - spacing, w));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w0,\n height: h,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: 0,\n width: w1,\n height: h0,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + h1 + 2 * spacing,\n width: w1,\n height: h2,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n","let element: HTMLSpanElement | undefined;\n\nexport default function calculateAuthorWidth(text: string) {\n if (!element) {\n element = document.createElement('span');\n element.style.font = '400 12px Roboto, \"Helvetica Neue\", \"Apple Color Emoji\", sans-serif';\n element.style.whiteSpace = 'nowrap';\n element.style.position = 'absolute';\n element.style.left = '-999px';\n element.style.opacity = '.01';\n document.body.appendChild(element);\n }\n\n element.innerHTML = text;\n\n return element.offsetWidth;\n}\n","import { useLayoutEffect } from '../../../../lib/teact/teact';\nimport fastSmoothScroll from '../../../../util/fastSmoothScroll';\nimport { FocusDirection } from '../../../../types';\n\n// This is the max scroll offset within existing viewport.\nconst FOCUS_MAX_OFFSET = 1500;\n// This is used when the viewport was replaced.\nconst RELOCATED_FOCUS_OFFSET = 1000;\nconst FOCUS_MARGIN = 20;\n\nexport default function useFocusMessage(\n elementRef: { current: HTMLDivElement | null },\n chatId: number,\n isFocused?: boolean,\n focusDirection?: FocusDirection,\n noFocusHighlight?: boolean,\n) {\n useLayoutEffect(() => {\n if (isFocused && elementRef.current) {\n const messagesContainer = elementRef.current.closest('.MessageList')!;\n\n fastSmoothScroll(\n messagesContainer,\n elementRef.current,\n // `noFocusHighlight` always called from “scroll-to-bottom” buttons\n noFocusHighlight ? 'end' : 'center',\n FOCUS_MARGIN,\n focusDirection === undefined ? FOCUS_MAX_OFFSET : RELOCATED_FOCUS_OFFSET,\n focusDirection,\n );\n }\n }, [elementRef, chatId, isFocused, focusDirection, noFocusHighlight]);\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './ContextMenuContainer';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst ContextMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const ContextMenuContainer = useModuleLoader(Bundles.Extra, 'ContextMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContextMenuContainer ? : undefined;\n};\n\nexport default memo(ContextMenuContainerAsync);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport {\n selectUser,\n selectChatMessage,\n selectIsMessageFocused,\n selectChat,\n} from '../../modules/selectors';\nimport { isChatChannel } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport { renderActionMessageText } from '../common/helpers/renderActionMessageText';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport { ObserveFn, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useFocusMessage from './message/hooks/useFocusMessage';\nimport useLang from '../../hooks/useLang';\n\nimport ContextMenuContainer from './message/ContextMenuContainer.async';\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n isEmbedded?: boolean;\n appearanceOrder?: number;\n isLastInList?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n targetUser?: ApiUser;\n targetMessage?: ApiMessage;\n targetChatId?: number;\n isFocused: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n};\n\nconst APPEARANCE_DELAY = 10;\n\nconst ActionMessage: FC = ({\n message,\n observeIntersection,\n isEmbedded,\n appearanceOrder = 0,\n isLastInList,\n sender,\n targetUser,\n targetMessage,\n targetChatId,\n isFocused,\n focusDirection,\n noFocusHighlight,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n useEnsureMessage(message.chatId, message.replyToMessageId, targetMessage);\n useFocusMessage(ref, message.chatId, isFocused, focusDirection, noFocusHighlight);\n\n const lang = useLang();\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const content = renderActionMessageText(\n lang,\n message,\n sender,\n targetUser,\n targetMessage,\n targetChatId,\n isEmbedded ? { isEmbedded: true, asPlain: true } : undefined,\n );\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref);\n const isContextMenuShown = contextMenuPosition !== undefined;\n\n if (isEmbedded) {\n return {renderText(content as string)};\n }\n\n const className = buildClassName(\n 'ActionMessage message-list-item',\n isFocused && !noFocusHighlight && 'focused',\n isContextMenuShown && 'has-menu-open',\n isLastInList && 'last-in-list',\n transitionClassNames,\n );\n\n return (\n \n {content}\n {contextMenuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message }): StateProps => {\n const userId = message.senderId;\n const { targetUserId, targetChatId } = message.content.action || {};\n const targetMessageId = message.replyToMessageId;\n const targetMessage = targetMessageId\n ? selectChatMessage(global, message.chatId, targetMessageId)\n : undefined;\n\n const isFocused = selectIsMessageFocused(global, message);\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && global.focusedMessage) || {};\n\n const chat = selectChat(global, message.chatId);\n const sender = chat && (isChatChannel(chat) || userId === message.chatId)\n ? chat\n : userId ? selectUser(global, userId) : undefined;\n\n return {\n sender,\n ...(targetUserId && { targetUser: selectUser(global, targetUserId) }),\n targetChatId,\n targetMessage,\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n };\n },\n)(ActionMessage));\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\n\nimport {\n getMessageMediaHash,\n isActionMessage,\n getMessageSummaryText,\n getSenderTitle,\n getMessageRoundVideo,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { getPictogramDimensions } from './helpers/mediaDimensions';\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\nimport useLang from '../../hooks/useLang';\n\nimport ActionMessage from '../middle/ActionMessage';\n\nimport './EmbeddedMessage.scss';\n\ntype OwnProps = {\n observeIntersection?: ObserveFn;\n className?: string;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n title?: string;\n customText?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst NBSP = '\\u00A0';\n\nconst EmbeddedMessage: FC = ({\n className,\n message,\n sender,\n title,\n customText,\n observeIntersection,\n onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaBlobUrl = useMedia(message && getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n const pictogramId = message && `sticker-reply-thumb${message.id}`;\n const mediaThumbnail = useWebpThumbnail(message);\n const isRoundVideo = Boolean(message && getMessageRoundVideo(message));\n\n const lang = useLang();\n\n const senderTitle = sender && getSenderTitle(lang, sender);\n\n return (\n \n {mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl, isRoundVideo)}\n
\n

\n {!message ? (\n customText || NBSP\n ) : isActionMessage(message) ? (\n \n ) : (\n renderText(getMessageSummaryText(lang, message, Boolean(mediaThumbnail)))\n )}\n

\n
{renderText(senderTitle || title || NBSP)}
\n
\n
\n );\n};\n\nfunction renderPictogram(\n id: string | undefined,\n thumbDataUri: string,\n blobUrl?: string,\n isRoundVideo?: boolean,\n) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \n );\n}\n\nexport default EmbeddedMessage;\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../../api/types';\n\nimport { formatTime } from '../../../util/dateFormat';\nimport { formatIntegerCompact } from '../../../util/textFormat';\n\nimport MessageOutgoingStatus from '../../common/MessageOutgoingStatus';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\n\nimport './MessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n signature?: string;\n onClick: () => void;\n};\n\nconst MessageMeta: FC = ({\n message, outgoingStatus, signature, onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n {Boolean(message.views) && (\n <>\n \n {formatIntegerCompact(message.views!)}\n \n \n \n )}\n {signature && (\n {renderText(signature)}\n )}\n \n {message.isEdited && `${lang('EditedMessage')} `}\n {formatTime(message.date * 1000)}\n \n {outgoingStatus && (\n \n )}\n \n );\n};\n\nexport default memo(MessageMeta);\n","import React, { FC, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { MEMOJI_STICKER_ID } from '../../../config';\nimport { getStickerDimensions } from '../../common/helpers/mediaDimensions';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useFlag from '../../../hooks/useFlag';\nimport useWebpThumbnail from '../../../hooks/useWebpThumbnail';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\nimport './Sticker.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n observeIntersectionForPlaying: ObserveFn;\n shouldLoop?: boolean;\n lastSyncTime?: number;\n};\n\nconst Sticker: FC = ({\n message, observeIntersection, observeIntersectionForPlaying, shouldLoop, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n const sticker = message.content.sticker!;\n const { isAnimated, stickerSetId } = sticker;\n const isMemojiSticker = stickerSetId === MEMOJI_STICKER_ID;\n\n const shouldLoad = useIsIntersecting(ref, observeIntersection);\n const shouldPlay = useIsIntersecting(ref, observeIntersectionForPlaying);\n\n const mediaHash = sticker.isPreloadedGlobally ? `sticker${sticker.id}` : getMessageMediaHash(message, 'inline')!;\n const thumbDataUri = useWebpThumbnail(message);\n const mediaData = useMedia(\n mediaHash,\n !shouldLoad,\n getMessageMediaFormat(message, 'inline', true),\n lastSyncTime,\n );\n\n const isMediaLoaded = Boolean(mediaData);\n const [isAnimationLoaded, markAnimationLoaded] = useFlag(isMediaLoaded);\n const isMediaReady = isAnimated ? isAnimationLoaded : isMediaLoaded;\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(isMediaReady, 'slow');\n\n const { width, height } = getStickerDimensions(sticker);\n const thumbClassName = buildClassName('thumbnail', !thumbDataUri && 'empty');\n\n const stickerClassName = buildClassName(\n 'Sticker media-inner',\n isMemojiSticker && 'inactive',\n );\n\n return (\n
\n {!isMediaReady && (\n \n )}\n {!isAnimated && shouldRenderFullMedia && (\n \n )}\n {isAnimated && isMediaLoaded && (\n \n )}\n \n
\n );\n};\n\nexport default Sticker;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { IS_CANVAS_FILTER_SUPPORTED, IS_MOBILE_SCREEN } from '../../../../util/environment';\nimport { getMessageMediaThumbDataUri } from '../../../../modules/helpers';\nimport useCanvasBlur from '../../../../hooks/useCanvasBlur';\n\nexport default function useBlurredMediaThumbRef(message: ApiMessage, fullMediaData?: string) {\n return useCanvasBlur(\n getMessageMediaThumbDataUri(message),\n Boolean(fullMediaData),\n IS_MOBILE_SCREEN && !IS_CANVAS_FILTER_SUPPORTED,\n );\n}\n","const SELECTED_APPENDIX_BACKGROUND = 'rgba(255,255,255,1)';\n\nexport default async (src: string, isOwn: boolean, inSelectMode?: boolean, isSelected?: boolean) => {\n return isSelected ? SELECTED_APPENDIX_BACKGROUND : getAppendixColorFromImage(src, isOwn);\n};\n\nasync function getAppendixColorFromImage(src: string, isOwn: boolean) {\n const img = new Image();\n img.src = src;\n\n if (!img.width) {\n await new Promise((resolve) => {\n img.onload = resolve;\n });\n }\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n canvas.width = img.width;\n canvas.height = img.height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height);\n\n const x = isOwn ? img.width - 1 : 0;\n const y = img.height - 1;\n\n const pixel = Array.from(ctx.getImageData(x, y, 1, 1).data);\n return `rgba(${pixel.join(',')})`;\n}\n","import React, {\n FC, useCallback, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport {\n getMessagePhoto,\n getMessageWebPagePhoto,\n getMessageMediaHash,\n getMediaTransferState,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\nimport usePrevious from '../../../hooks/usePrevious';\nimport buildClassName from '../../../util/buildClassName';\nimport getCustomAppendixBg from './helpers/getCustomAppendixBg';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n shouldAutoLoad?: boolean;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n uploadProgress?: number;\n size?: 'inline' | 'pictogram';\n shouldAffectAppendix?: boolean;\n dimensions?: IMediaDimensions & { isSmall?: boolean };\n nonInteractive?: boolean;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\n\nconst Photo: FC = ({\n id,\n message,\n observeIntersection,\n shouldAutoLoad,\n isInSelectMode,\n isSelected,\n uploadProgress,\n size = 'inline',\n dimensions,\n nonInteractive,\n shouldAffectAppendix,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const photo = (getMessagePhoto(message) || getMessageWebPagePhoto(message))!;\n const localBlobUrl = photo.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = isDownloadAllowed && isIntersecting;\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, size), !shouldDownload);\n const fullMediaData = localBlobUrl || mediaData;\n const thumbRef = useBlurredMediaThumbRef(message, fullMediaData);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, shouldDownload && !fullMediaData);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled, 'slow');\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(fullMediaData, 'slow');\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (!fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (onClick) {\n onClick(message.id);\n }\n }, [fullMediaData, isUploading, message, onCancelUpload, onClick]);\n\n const isOwn = isOwnMessage(message);\n useLayoutEffect(() => {\n if (!shouldAffectAppendix) {\n return;\n }\n\n const contentEl = ref.current!.closest('.message-content')!;\n\n if (fullMediaData) {\n getCustomAppendixBg(fullMediaData, isOwn, isInSelectMode, isSelected).then((appendixBg) => {\n contentEl.style.setProperty('--appendix-bg', appendixBg);\n contentEl.setAttribute(CUSTOM_APPENDIX_ATTRIBUTE, '');\n });\n } else {\n contentEl.classList.add('has-appendix-thumb');\n }\n }, [fullMediaData, isOwn, shouldAffectAppendix, isInSelectMode, isSelected]);\n\n const { width, height, isSmall } = dimensions || calculateMediaDimensions(message);\n\n const className = buildClassName(\n 'media-inner',\n !isUploading && !nonInteractive && 'interactive',\n isSmall && 'small-image',\n width === height && 'square-image',\n );\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n return (\n \n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {!fullMediaData && !isDownloadAllowed && (\n \n )}\n {isTransferring && (\n {Math.round(transferProgress * 100)}%\n )}\n \n );\n};\n\nexport default Photo;\n","import { RefObject } from 'react';\nimport { useCallback, useRef } from '../lib/teact/teact';\n\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport safePlay from '../util/safePlay';\n\nexport default function useHeavyAnimationCheckForVideo(playerRef: RefObject, shouldPlay: boolean) {\n const shouldPlayRef = useRef();\n shouldPlayRef.current = shouldPlay;\n\n const pause = useCallback(() => {\n if (playerRef.current) {\n playerRef.current.pause();\n }\n }, [playerRef]);\n\n const play = useCallback(() => {\n if (playerRef.current && shouldPlayRef.current) {\n safePlay(playerRef.current);\n }\n }, [playerRef]);\n\n useHeavyAnimationCheck(pause, play);\n}\n","import { useCallback, useRef } from '../../../../lib/teact/teact';\nimport { fastRaf } from '../../../../util/schedulers';\nimport useBackgroundMode from '../../../../hooks/useBackgroundMode';\nimport safePlay from '../../../../util/safePlay';\n\nexport default (playerRef: { current: HTMLVideoElement | null }, isPlayAllowed = false) => {\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const freezePlaying = useCallback(() => {\n isFrozen.current = true;\n\n if (!isPlayAllowed || !playerRef.current) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = !playerRef.current.paused;\n }\n\n playerRef.current.pause();\n }, [isPlayAllowed, playerRef]);\n\n const unfreezePlaying = useCallback(() => {\n // At this point HTMLVideoElement can be unmounted from the DOM\n if (isPlayAllowed && playerRef.current && wasPlaying.current && document.body.contains(playerRef.current)) {\n safePlay(playerRef.current);\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [isPlayAllowed, playerRef]);\n\n const unfreezePlayingOnRaf = useCallback(() => {\n fastRaf(unfreezePlaying);\n }, [unfreezePlaying]);\n\n if (!document.hasFocus()) {\n freezePlaying();\n }\n\n useBackgroundMode(freezePlaying, unfreezePlayingOnRaf);\n};\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { calculateVideoDimensions } from '../../common/helpers/mediaDimensions';\nimport {\n canMessagePlayVideoInline,\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n isForwardedMessage,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../../hooks/useMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport usePauseOnInactive from './hooks/usePauseOnInactive';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n uploadProgress?: number;\n dimensions?: IMediaDimensions;\n lastSyncTime?: number;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst Video: FC = ({\n id,\n message,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n uploadProgress,\n lastSyncTime,\n dimensions,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const video = message.content.video!;\n const localBlobUrl = video.blobUrl;\n const canPlayInline = Boolean(localBlobUrl) || canMessagePlayVideoInline(video);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const [isPlayAllowed, setIsPlayAllowed] = useState(shouldAutoPlay);\n\n const previewBlobUrl = useMedia(\n getMessageMediaHash(message, 'pictogram'),\n !(isIntersecting && lastSyncTime),\n getMessageMediaFormat(message, 'pictogram'),\n lastSyncTime,\n );\n const thumbRef = useBlurredMediaThumbRef(message);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n\n const fullMediaData = localBlobUrl || mediaData;\n const isInline = Boolean(canPlayInline && isIntersecting && fullMediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering(!shouldAutoLoad);\n const { isUploading, isTransferring, transferProgress } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n shouldDownload && (canPlayInline && !isBuffered),\n );\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(fullMediaData, 'slow');\n\n const [playProgress, setPlayProgress] = useState(0);\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setPlayProgress(Math.max(0, e.currentTarget.currentTime - 1));\n }, []);\n\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded);\n\n useHeavyAnimationCheckForVideo(videoRef, Boolean(isInline && shouldAutoPlay));\n\n usePauseOnInactive(videoRef, isPlayAllowed);\n\n useVideoCleanup(videoRef, [isInline]);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (canPlayInline && !fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (canPlayInline && fullMediaData && !isPlayAllowed) {\n setIsPlayAllowed(true);\n videoRef.current!.play();\n } else if (onClick) {\n onClick(message.id);\n }\n }, [isUploading, canPlayInline, fullMediaData, isPlayAllowed, onClick, onCancelUpload, message]);\n\n const className = buildClassName('media-inner dark', !isUploading && 'interactive');\n const videoClassName = buildClassName('full-media', transitionClassNames);\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n const shouldRenderInlineVideo = isInline;\n const shouldRenderHqPreview = !canPlayInline && mediaData;\n const shouldRenderPlayButton = !canPlayInline || (isDownloadAllowed && !isPlayAllowed && !shouldRenderSpinner);\n const shouldRenderDownloadButton = canPlayInline && !isDownloadAllowed;\n\n return (\n \n {(!isInline || shouldRenderThumb)\n && (\n \n )}\n {previewBlobUrl && (\n \n )}\n\n {shouldRenderInlineVideo && (\n \n \n \n )}\n {shouldRenderHqPreview && (\n \n )}\n {shouldRenderPlayButton && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {shouldRenderDownloadButton && (\n \n )}\n {isTransferring && !canPlayInline ? (\n {Math.round(transferProgress * 100)}%\n ) : isTransferring && canPlayInline ? (\n ...\n ) : (\n
\n {video.isGif ? 'GIF' : formatMediaDuration(video.duration - playProgress)}\n
\n )}\n \n );\n};\n\nexport default Video;\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser, ApiContact } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\n\nimport Avatar from '../../common/Avatar';\n\nimport './Contact.scss';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n contact: ApiContact;\n};\n\ntype StateProps = {\n user?: ApiUser;\n};\n\ntype DispatchProps = Pick;\n\nconst Contact: FC = ({\n contact, user, openUserInfo,\n}) => {\n const {\n firstName,\n lastName,\n phoneNumber,\n userId,\n } = contact;\n\n const handleClick = useCallback(() => {\n openUserInfo({ id: userId });\n }, [openUserInfo, userId]);\n\n return (\n \n \n
\n
{firstName} {lastName}
\n
{formatPhoneNumberWithCode(phoneNumber)}
\n
\n \n );\n};\n\nexport default withGlobal(\n (global, { contact }): StateProps => {\n return {\n user: selectUser(global, contact.userId),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(Contact);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, memo, useState,\n} from '../../lib/teact/teact';\n\nimport Checkbox from './Checkbox';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n};\n\ntype OwnProps = {\n id?: string;\n options: IRadioOption[];\n selected?: string[];\n disabled?: boolean;\n round?: boolean;\n loadingOptions?: string[];\n onChange: (value: string[]) => void;\n};\n\nconst CheckboxGroup: FC = ({\n id,\n options,\n selected = [],\n disabled,\n round,\n loadingOptions,\n onChange,\n}) => {\n const [values, setValues] = useState([]);\n\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value, checked } = event.currentTarget;\n let newValues: string[];\n if (checked) {\n newValues = [...values, value];\n } else {\n newValues = values.filter((v) => v !== value);\n }\n\n setValues(newValues);\n onChange(newValues);\n }, [onChange, values]);\n\n return (\n
\n {options.map((option) => (\n \n ))}\n
\n );\n};\n\nexport default memo(CheckboxGroup);\n","import React, {\n FC, useState, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiPollAnswer, ApiPollResult } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport renderText from '../../common/helpers/renderText';\n\nimport './PollOption.scss';\n\ntype OwnProps = {\n answer: ApiPollAnswer;\n voteResults?: ApiPollResult[];\n totalVoters?: number;\n maxVotersCount?: number;\n correctResults: string[];\n shouldAnimate: boolean;\n};\n\nconst PollOption: FC = ({\n answer,\n voteResults,\n totalVoters,\n maxVotersCount,\n correctResults,\n shouldAnimate,\n}) => {\n const result = voteResults && voteResults.find((r) => r.option === answer.option);\n const correctAnswer = correctResults.length === 0 || correctResults.indexOf(answer.option) !== -1;\n const showIcon = (correctResults.length > 0 && correctAnswer) || (result && result.isChosen);\n const answerPercent = result ? getPercentage(result.votersCount, totalVoters || 0) : 0;\n const [finalPercent, setFinalPercent] = useState(shouldAnimate ? 0 : answerPercent);\n // eslint-disable-next-line no-null/no-null\n const lineRef = useRef(null);\n const lineWidth = result ? getPercentage(result.votersCount, maxVotersCount || 0) : 0;\n const isAnimationDoesNotStart = finalPercent < answerPercent;\n\n useEffect(() => {\n if (shouldAnimate) {\n setFinalPercent(answerPercent);\n }\n }, [shouldAnimate, answerPercent]);\n\n useEffect(() => {\n const lineEl = lineRef.current;\n\n if (lineEl && shouldAnimate) {\n const svgEl = lineEl.firstElementChild;\n\n const style = isAnimationDoesNotStart ? '' : 'stroke-dasharray: 100% 200%; stroke-dashoffset: -44';\n if (!svgEl) {\n lineEl.innerHTML = `\n \n \n `;\n } else {\n svgEl.setAttribute('style', style);\n }\n }\n }, [isAnimationDoesNotStart, shouldAnimate]);\n\n if (!voteResults || !result) {\n return undefined;\n }\n\n const lineStyle = `width: ${lineWidth}%; transform:scaleX(${isAnimationDoesNotStart ? 0 : 1})`;\n\n return (\n
\n
\n {answerPercent}%\n {showIcon && (\n \n \n \n )}\n
\n
\n
\n {renderText(answer.text)}\n
\n
\n
\n \n
\n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default PollOption;\n","import React, {\n FC,\n useCallback,\n useEffect,\n useState,\n memo,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiMessage, ApiPoll, ApiUser, ApiPollAnswer,\n} from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\nimport { renderTextWithEntities } from '../../common/helpers/renderMessageText';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport CheckboxGroup from '../../ui/CheckboxGroup';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport Notification from '../../ui/Notification';\nimport PollOption from './PollOption';\n\nimport './Poll.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n poll: ApiPoll;\n onSendVote: (options: string[]) => void;\n};\n\ntype StateProps = {\n recentVoterIds?: number[];\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SOLUTION_CONTAINER_ID = '#middle-column-portals';\nconst SOLUTION_DURATION = 5000;\nconst NBSP = '\\u00A0';\n\nconst Poll: FC = ({\n message,\n poll,\n recentVoterIds,\n usersById,\n loadMessage,\n onSendVote,\n openPollResults,\n}) => {\n const { id: messageId, chatId } = message;\n const { summary, results } = poll;\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [chosenOptions, setChosenOptions] = useState([]);\n const [isSolutionShown, setIsSolutionShown] = useState(false);\n const [wasSubmitted, setWasSubmitted] = useState(false);\n const [closePeriod, setClosePeriod] = useState(\n !summary.closed && summary.closeDate && summary.closeDate > 0\n ? Math.min(summary.closeDate - Math.floor(Date.now() / 1000), summary.closePeriod!)\n : 0,\n );\n // eslint-disable-next-line no-null/no-null\n const countdownRef = useRef(null);\n const { results: voteResults, totalVoters } = results;\n const hasVoted = voteResults && voteResults.some((r) => r.isChosen);\n const canVote = !summary.closed && !hasVoted;\n const canViewResult = !canVote && summary.isPublic && Number(results.totalVoters) > 0;\n const isMultiple = canVote && summary.multipleChoice;\n const maxVotersCount = voteResults ? Math.max(...voteResults.map((r) => r.votersCount)) : totalVoters;\n const correctResults = voteResults ? voteResults.reduce((answers: string[], r) => {\n if (r.isCorrect) {\n answers.push(r.option);\n }\n\n return answers;\n }, []) : [];\n const answers = summary.answers.map((a) => ({\n label: a.text,\n value: a.option,\n hidden: Boolean(summary.quiz && summary.closePeriod && closePeriod <= 0),\n }));\n\n useEffect(() => {\n if (\n isSubmitting\n && poll.results.results\n && poll.results.results.some((result) => result.isChosen)\n ) {\n setIsSubmitting(false);\n }\n }, [isSubmitting, poll.results.results]);\n\n useEffect(() => {\n if (closePeriod > 0) {\n setTimeout(() => setClosePeriod(closePeriod - 1), 1000);\n }\n\n const countdownEl = countdownRef.current;\n\n if (countdownEl) {\n const circumference = 6 * 2 * Math.PI;\n const svgEl = countdownEl.lastElementChild;\n const timerEl = countdownEl.firstElementChild;\n if (closePeriod <= 5) {\n countdownEl.classList.add('hurry-up');\n }\n\n if (!svgEl || !timerEl) {\n countdownEl.innerHTML = `\n ${formatMediaDuration(closePeriod)}\n \n \n `;\n } else {\n const strokeDashOffset = ((summary.closePeriod! - closePeriod) / summary.closePeriod!) * circumference;\n timerEl.textContent = formatMediaDuration(closePeriod);\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', `-${strokeDashOffset}`);\n }\n }\n }, [closePeriod, summary.closePeriod]);\n\n useEffect(() => {\n if (summary.quiz && (closePeriod <= 0 || (hasVoted && !summary.closed))) {\n loadMessage({ chatId, messageId });\n }\n }, [chatId, closePeriod, hasVoted, loadMessage, messageId, summary.closed, summary.quiz]);\n\n // If the client time is not synchronized, the poll must be updated after the closePeriod time has expired.\n useEffect(() => {\n let timer: number | undefined;\n\n if (summary.quiz && !summary.closed && summary.closePeriod && summary.closePeriod > 0) {\n timer = window.setTimeout(() => {\n loadMessage({ chatId, messageId });\n }, summary.closePeriod * 1000);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [canVote, chatId, loadMessage, messageId, summary.closePeriod, summary.closed, summary.quiz]);\n\n const recentVoters = useMemo(() => {\n return recentVoterIds ? recentVoterIds.reduce((result: ApiUser[], id) => {\n const user = usersById[id];\n if (user) {\n result.push(user);\n }\n\n return result;\n }, []) : [];\n }, [usersById, recentVoterIds]);\n\n const handleRadioChange = useCallback(\n (option: string) => {\n setChosenOptions([option]);\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote([option]);\n }, [onSendVote],\n );\n\n const handleCheckboxChange = useCallback(\n (options: string[]) => {\n setChosenOptions(options);\n }, [],\n );\n\n const handleVoteClick = useCallback(\n () => {\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote(chosenOptions);\n }, [onSendVote, chosenOptions],\n );\n\n const handleViewResultsClick = useCallback(\n () => {\n openPollResults({ chatId, messageId });\n }, [chatId, messageId, openPollResults],\n );\n\n const handleSolutionShow = useCallback(() => {\n setIsSolutionShown(true);\n }, []);\n\n const handleSolutionHide = useCallback(() => {\n setIsSolutionShown(false);\n setWasSubmitted(false);\n }, []);\n\n // Show the solution to quiz if the answer was incorrect\n useEffect(() => {\n if (wasSubmitted && hasVoted && summary.quiz && results.results && poll.results.solution) {\n const correctResult = results.results.find((r) => r.isChosen && r.isCorrect);\n if (!correctResult) {\n setIsSolutionShown(true);\n }\n }\n }, [hasVoted, wasSubmitted, results.results, summary.quiz, poll.results.solution]);\n\n const lang = useLang();\n\n function renderResultOption(answer: ApiPollAnswer) {\n return (\n \n );\n }\n\n function renderRecentVoters() {\n return (\n recentVoters.length > 0 && (\n
\n {recentVoters.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n function renderSolution() {\n return (\n isSolutionShown && poll.results.solution && (\n \n )\n );\n }\n\n return (\n
\n {renderSolution()}\n
{renderText(summary.question)}
\n
\n {lang(getPollTypeString(summary))}\n {renderRecentVoters()}\n {closePeriod > 0 && canVote &&
}\n {summary.quiz && poll.results.solution && !canVote && (\n \n \n \n )}\n
\n {canVote && (\n
\n {isMultiple\n ? (\n \n )\n : (\n \n )}\n
\n )}\n {!canVote && (\n
\n {summary.answers.map(renderResultOption)}\n
\n )}\n {!canViewResult && !isMultiple && (\n
{getReadableVotersCount(lang, summary.quiz, results.totalVoters)}
\n )}\n {isMultiple && (\n \n {lang('PollSubmitVotes')}\n \n )}\n {canViewResult && (\n \n {lang('PollViewResults')}\n \n )}\n
\n );\n};\n\nfunction getPollTypeString(summary: ApiPoll['summary']) {\n // When we just created the poll, some properties don't exist.\n if (typeof summary.isPublic === 'undefined') {\n return NBSP;\n }\n\n if (summary.quiz) {\n return summary.isPublic ? 'QuizPoll' : 'AnonymousQuizPoll';\n }\n\n if (summary.closed) {\n return 'FinalResults';\n }\n\n return summary.isPublic ? 'PublicPoll' : 'AnonymousPoll';\n}\n\nfunction getReadableVotersCount(lang: LangFn, isQuiz: true | undefined, count?: number) {\n if (!count) {\n return lang(isQuiz ? 'Chat.Quiz.TotalVotesEmpty' : 'Chat.Poll.TotalVotesResultEmpty');\n }\n\n return lang(isQuiz ? 'Answer' : 'Vote', count, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { poll }) => {\n const { recentVoterIds } = poll.results;\n const { byId: usersById } = global.users;\n if (!recentVoterIds || recentVoterIds.length === 0) {\n return {};\n }\n\n return {\n recentVoterIds,\n usersById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMessage', 'openPollResults']),\n)(Poll));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport { getMessageWebPage } from '../../../modules/helpers';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\nimport renderText from '../../common/helpers/renderText';\nimport trimText from '../../../util/trimText';\nimport buildClassName from '../../../util/buildClassName';\n\nimport SafeLink from '../../common/SafeLink';\nimport Photo from './Photo';\n\nimport './WebPage.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n shouldAutoLoad?: boolean;\n inPreview?: boolean;\n onMediaClick?: () => void;\n onCancelMediaTransfer?: () => void;\n};\n\nconst WebPage: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n inPreview,\n onMediaClick,\n onCancelMediaTransfer,\n}) => {\n const webPage = getMessageWebPage(message);\n\n let isSquarePhoto = false;\n if (webPage && webPage.photo) {\n const { width, height } = calculateMediaDimensions(message);\n isSquarePhoto = width === height;\n }\n\n const handleMediaClick = useCallback(() => {\n onMediaClick!();\n }, [onMediaClick]);\n\n if (!webPage) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n } = webPage;\n\n const isMediaInteractive = photo && onMediaClick && !isSquarePhoto && !webPage.hasDocument;\n const truncatedDescription = trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebPage',\n photo\n ? (isSquarePhoto && 'with-square-photo')\n : (!inPreview && 'without-photo'),\n );\n\n return (\n \n {photo && (\n \n )}\n
\n \n {!inPreview && title && (\n

{renderText(title)}

\n )}\n {truncatedDescription && (\n

{renderText(truncatedDescription, ['emoji', 'br'])}

\n )}\n
\n
\n );\n};\n\nexport default memo(WebPage);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { getMessageInvoice } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\n\nimport './Invoice.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n};\n\nconst Invoice: FC = ({\n message,\n}) => {\n const invoice = getMessageInvoice(message);\n\n const {\n title,\n text,\n description,\n photoUrl,\n } = invoice!;\n\n return (\n \n {title && (\n

{renderText(title)}

\n )}\n {text && (\n

{renderText(text, ['emoji', 'br'])}

\n )}\n
\n {photoUrl && (\n \n )}\n {description && (\n

{renderText(description, ['emoji', 'br'])}

\n )}\n
\n
\n );\n};\n\nexport default memo(Invoice);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC,\n useCallback,\n useMemo,\n memo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { OwnProps as PhotoProps } from '../Photo';\nimport { OwnProps as VideoProps } from '../Video';\n\nimport buildClassName from '../../../../util/buildClassName';\nimport { GlobalActions } from '../../../../global/types';\nimport {\n selectIsInSelectMode,\n selectIsMessageSelected,\n} from '../../../../modules/selectors';\n\nimport { pick } from '../../../../util/iteratees';\n\ntype OwnProps = PhotoProps & VideoProps;\n\ntype StateProps = {\n isInSelectMode?: boolean;\n isSelected?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nexport default function withSelectControl(WrapedComponent: FC) {\n const Component: FC = (props) => {\n const {\n isInSelectMode,\n isSelected,\n message,\n toggleMessageSelection,\n dimensions,\n } = props;\n\n const handleMessageSelect = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n toggleMessageSelection({ messageId: message.id, withShift: e && e.shiftKey });\n }, [toggleMessageSelection, message]);\n\n const newProps = useMemo(() => {\n return {\n ...props,\n isInSelectMode,\n isSelected,\n dimensions: {\n ...props.dimensions,\n x: 0,\n y: 0,\n },\n onClick: isInSelectMode ? undefined : props.onClick,\n };\n }, [props, isInSelectMode, isSelected]);\n\n return (\n \n {isInSelectMode && (\n
\n {isSelected && (\n \n )}\n
\n )}\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n \n \n );\n };\n\n return memo(withGlobal(\n (global, ownProps) => {\n const { message } = ownProps;\n return {\n isInSelectMode: selectIsInSelectMode(global),\n isSelected: selectIsMessageSelected(global, message.id),\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'toggleMessageSelection',\n ]),\n )(Component));\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\nimport { AlbumRectPart, IAlbumLayout } from './helpers/calculateAlbumLayout';\n\nimport { getMessageContent } from '../../../modules/helpers';\nimport { withGlobal } from '../../../lib/teact/teactn';\nimport { pick } from '../../../util/iteratees';\nimport withSelectControl from './hocs/withSelectControl';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport Photo from './Photo';\nimport Video from './Video';\n\nimport './Album.scss';\n\nconst PhotoWithSelect = withSelectControl(Photo);\nconst VideoWithSelect = withSelectControl(Video);\n\ntype OwnProps = {\n album: IAlbum;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n hasCustomAppendix?: boolean;\n lastSyncTime?: number;\n isOwn: boolean;\n albumLayout: IAlbumLayout;\n onMediaClick: (messageId: number) => void;\n};\n\ntype StateProps = {\n uploadsById: GlobalState['fileUploads']['byMessageLocalId'];\n};\n\ntype DispatchProps = Pick;\n\nconst Album: FC = ({\n album,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n hasCustomAppendix,\n lastSyncTime,\n isOwn,\n albumLayout,\n onMediaClick,\n uploadsById,\n cancelSendingMessage,\n}) => {\n const mediaCount = album.messages.length;\n\n const handleCancelUpload = useCallback((message: ApiMessage) => {\n cancelSendingMessage({ chatId: message.chatId, messageId: message.id });\n }, [cancelSendingMessage]);\n\n function renderAlbumMessage(message: ApiMessage, index: number) {\n const { photo, video } = getMessageContent(message);\n const fileUpload = uploadsById[message.previousLocalId || message.id];\n const uploadProgress = fileUpload ? fileUpload.progress : undefined;\n const { dimensions, sides } = albumLayout.layout[index];\n\n if (photo) {\n const shouldAffectAppendix = hasCustomAppendix && (\n // eslint-disable-next-line no-bitwise\n isOwn ? index === mediaCount - 1 : Boolean(sides & AlbumRectPart.Left && sides & AlbumRectPart.Bottom)\n );\n\n return (\n \n );\n } else if (video) {\n return (\n \n );\n }\n\n return undefined;\n }\n\n const { width: containerWidth, height: containerHeight } = albumLayout.containerStyle;\n\n return (\n \n {album.messages.map(renderAlbumMessage)}\n \n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n uploadsById: global.fileUploads.byMessageLocalId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'cancelSendingMessage',\n ]),\n)(Album);\n","import React, {\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport buildClassName from '../../../util/buildClassName';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport usePauseOnInactive from './hooks/usePauseOnInactive';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\nimport safePlay from '../../../util/safePlay';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './RoundVideo.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n lastSyncTime?: number;\n};\n\nlet currentOnRelease: NoneToVoidFunction;\n\nfunction createCapture(onRelease: NoneToVoidFunction) {\n return () => {\n if (currentOnRelease) {\n currentOnRelease();\n }\n\n currentOnRelease = onRelease;\n };\n}\n\nconst RoundVideo: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playingProgressRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playerRef = useRef(null);\n\n const video = message.content.video!;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad && shouldAutoPlay);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n const thumbRef = useBlurredMediaThumbRef(message, mediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering();\n const isTransferring = isDownloadAllowed && !isBuffered;\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring || !isBuffered, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n const [isActivated, setIsActivated] = useState(false);\n const [progress, setProgress] = useState(0);\n\n useEffect(() => {\n if (!isActivated) {\n return;\n }\n\n const circumference = 94 * 2 * Math.PI;\n const strokeDashOffset = circumference - progress * circumference;\n\n const playerEl = playerRef.current!;\n const playingProgressEl = playingProgressRef.current!;\n const svgEl = playingProgressEl.firstElementChild;\n\n if (!svgEl) {\n playingProgressEl.innerHTML = `\n \n `;\n } else {\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, [isActivated, progress]);\n\n const shouldPlay = Boolean(mediaData && isIntersecting);\n\n const stopPlaying = () => {\n setIsActivated(false);\n setProgress(0);\n safePlay(playerRef.current!);\n\n requestAnimationFrame(() => {\n playingProgressRef.current!.innerHTML = '';\n });\n };\n\n const capturePlaying = createCapture(stopPlaying);\n\n useEffect(() => {\n if (!playerRef.current) {\n return;\n }\n\n if (shouldPlay) {\n safePlay(playerRef.current);\n } else {\n playerRef.current.pause();\n }\n }, [shouldPlay]);\n\n useHeavyAnimationCheckForVideo(playerRef, shouldPlay);\n\n usePauseOnInactive(playerRef, Boolean(mediaData));\n\n useVideoCleanup(playerRef, [mediaData]);\n\n const handleClick = useCallback(() => {\n if (!mediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n\n return;\n }\n\n const playerEl = playerRef.current!;\n if (isActivated) {\n if (playerEl.paused) {\n safePlay(playerEl);\n } else {\n playerEl.pause();\n }\n } else {\n capturePlaying();\n playerEl.currentTime = 0;\n setIsActivated(true);\n }\n }, [capturePlaying, isActivated, mediaData]);\n\n const handleTimeUpdate = useCallback((e: React.UIEvent) => {\n const playerEl = e.currentTarget;\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, []);\n\n const videoClassName = buildClassName('full-media', transitionClassNames);\n\n return (\n \n {shouldRenderThumb && (\n
\n \n
\n )}\n {mediaData && (\n
\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n \n \n
\n )}\n
\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {!mediaData && !isDownloadAllowed && (\n \n )}\n
\n {isActivated ? formatMediaDuration(playerRef.current!.currentTime) : formatMediaDuration(video.duration)}\n {(!isActivated || playerRef.current!.paused) && }\n
\n
\n );\n};\n\nexport default RoundVideo;\n","import React, { FC } from '../../../lib/teact/teact';\n\nimport { ApiKeyboardButton, ApiMessage } from '../../../api/types';\n\nimport Button from '../../ui/Button';\n\nimport './InlineButtons.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n onClick: ({ button }: { button: ApiKeyboardButton }) => void;\n};\n\nconst InlineButtons: FC = ({ message, onClick }) => {\n return (\n
\n {message.inlineButtons!.map((row) => (\n
\n {row.map((button) => (\n onClick({ button })}\n >\n {button.text}\n {button.type === 'url' && }\n \n ))}\n
\n ))}\n
\n );\n};\n\nexport default InlineButtons;\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiMessage, ApiThreadInfo, ApiUser,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { isChatPrivate } from '../../../modules/helpers';\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { selectThreadInfo } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\n\nimport './CommentButton.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n disabled?: boolean;\n};\n\ntype StateProps = {\n threadInfo: ApiThreadInfo;\n usersById?: Record;\n chatsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst CommentButton: FC = ({\n disabled, threadInfo, usersById, chatsById, openChat,\n}) => {\n const lang = useLang();\n const {\n threadId, chatId, messagesCount, lastMessageId, lastReadInboxMessageId, recentReplierIds,\n } = threadInfo;\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId, threadId });\n }, [openChat, chatId, threadId]);\n\n if (messagesCount === undefined) {\n return undefined;\n }\n\n const recentRepliers = recentReplierIds && recentReplierIds.map((peerId) => {\n return isChatPrivate(peerId) ? usersById![peerId] : chatsById![peerId];\n }).filter(Boolean);\n\n function renderRecentRepliers() {\n return (\n recentRepliers && recentRepliers.length > 0 && (\n
\n {recentRepliers.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n const hasUnread = Boolean(lastReadInboxMessageId && lastMessageId && lastReadInboxMessageId < lastMessageId);\n\n return (\n \n \n {(!recentRepliers || recentRepliers.length === 0) && }\n {renderRecentRepliers()}\n
\n {messagesCount ? lang('Comments', messagesCount, 'i') : lang('LeaveAComment')}\n
\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message }) => {\n const { threadId, chatId } = message.threadInfo!;\n\n const threadInfo = selectThreadInfo(global, chatId, threadId) || message.threadInfo!;\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n\n return {\n threadInfo,\n usersById,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n ]),\n)(CommentButton));\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport {\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n ApiChat,\n ApiSticker,\n MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { FocusDirection, IAlbum, MediaViewerOrigin } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n selectChat,\n selectChatMessage,\n selectUploadProgress,\n selectIsChatWithSelf,\n selectOutgoingStatus,\n selectUser,\n selectIsMessageFocused,\n selectCurrentTextSearch,\n selectAnimatedEmoji,\n selectIsInSelectMode,\n selectIsMessageSelected,\n selectIsDocumentGroupSelected,\n selectSender,\n selectForwardedSender,\n selectThreadTopMessageId,\n selectShouldAutoLoadMedia,\n selectShouldAutoPlayMedia, selectShouldLoopStickers,\n} from '../../../modules/selectors';\nimport {\n getMessageContent,\n isOwnMessage,\n isReplyMessage,\n isAnonymousOwnMessage,\n isChatPrivate,\n getMessageCustomShape,\n isChatChannel,\n getMessageSingleEmoji, getSenderTitle, getUserColorKey,\n} from '../../../modules/helpers';\nimport buildClassName from '../../../util/buildClassName';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport { renderMessageText } from '../../common/helpers/renderMessageText';\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { buildContentClassName, isEmojiOnlyMessage } from './helpers/buildContentClassName';\nimport { getMinMediaWidth, calculateMediaDimensions } from './helpers/mediaDimensions';\nimport { calculateAlbumLayout } from './helpers/calculateAlbumLayout';\nimport renderText from '../../common/helpers/renderText';\nimport calculateAuthorWidth from './helpers/calculateAuthorWidth';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useFocusMessage from './hooks/useFocusMessage';\nimport useWindowSize from '../../../hooks/useWindowSize';\nimport useLang from '../../../hooks/useLang';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Avatar from '../../common/Avatar';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\nimport Document from '../../common/Document';\nimport Audio from '../../common/Audio';\nimport MessageMeta from './MessageMeta';\nimport ContextMenuContainer from './ContextMenuContainer.async';\nimport Sticker from './Sticker';\nimport AnimatedEmoji from '../../common/AnimatedEmoji';\nimport Photo from './Photo';\nimport Video from './Video';\nimport Contact from './Contact';\nimport Poll from './Poll';\nimport WebPage from './WebPage';\nimport Invoice from './Invoice';\nimport Album from './Album';\nimport RoundVideo from './RoundVideo';\nimport InlineButtons from './InlineButtons';\nimport CommentButton from './CommentButton';\n\nimport './Message.scss';\n\ntype MessagePositionProperties = {\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isFirstInDocumentGroup: boolean;\n isLastInDocumentGroup: boolean;\n isLastInList: boolean;\n};\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersectionForBottom: ObserveFn;\n observeIntersectionForMedia: ObserveFn;\n observeIntersectionForAnimatedStickers: ObserveFn;\n album?: IAlbum;\n withAvatar?: boolean;\n withSenderName?: boolean;\n threadId: number;\n messageListType: MessageListType;\n noComments: boolean;\n appearanceOrder: number;\n} & MessagePositionProperties;\n\ntype StateProps = {\n forceSenderName?: boolean;\n sender?: ApiUser | ApiChat;\n originSender?: ApiUser | ApiChat;\n botSender?: ApiUser;\n isThreadTop?: boolean;\n shouldHideReply?: boolean;\n replyMessage?: ApiMessage;\n replyMessageSender?: ApiUser | ApiChat;\n outgoingStatus?: ApiMessageOutgoingStatus;\n uploadProgress?: number;\n isFocused?: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n isForwarding?: boolean;\n isChatWithSelf?: boolean;\n isChannel?: boolean;\n lastSyncTime?: number;\n highlight?: string;\n isSingleEmoji?: boolean;\n animatedEmoji?: ApiSticker;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n isGroupSelected?: boolean;\n threadId?: number;\n isPinnedList?: boolean;\n shouldAutoLoadMedia?: boolean;\n shouldAutoPlayMedia?: boolean;\n shouldLoopStickers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst NBSP = '\\u00A0';\nconst GROUP_MESSAGE_HOVER_ATTRIBUTE = 'data-is-document-group-hover';\n// eslint-disable-next-line max-len\nconst APPENDIX_OWN = '';\n// eslint-disable-next-line max-len\nconst APPENDIX_NOT_OWN = '';\nconst APPEARANCE_DELAY = 10;\nconst NO_MEDIA_CORNERS_THRESHOLD = 18;\n\nconst Message: FC = ({\n message,\n observeIntersectionForBottom,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n album,\n withAvatar,\n withSenderName,\n noComments,\n appearanceOrder,\n isFirstInGroup,\n isLastInGroup,\n isFirstInDocumentGroup,\n isLastInDocumentGroup,\n isLastInList,\n forceSenderName,\n sender,\n originSender,\n botSender,\n isThreadTop,\n shouldHideReply,\n replyMessage,\n replyMessageSender,\n outgoingStatus,\n uploadProgress,\n isFocused,\n focusDirection,\n noFocusHighlight,\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n animatedEmoji,\n isInSelectMode,\n isSelected,\n isGroupSelected,\n threadId,\n messageListType,\n isPinnedList,\n shouldAutoLoadMedia,\n shouldAutoPlayMedia,\n shouldLoopStickers,\n focusMessage,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n openChat,\n cancelSendingMessage,\n markMessagesRead,\n sendPollVote,\n toggleMessageSelection,\n setReplyingToId,\n openForwardMenu,\n clickInlineButton,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const bottomMarkerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n\n useOnIntersect(bottomMarkerRef, observeIntersectionForBottom);\n\n const { width: windowWidth } = useWindowSize();\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref, false, true);\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const { chatId, id: messageId, threadInfo } = message;\n\n const isOwn = isOwnMessage(message);\n const isScheduled = messageListType === 'scheduled' || message.isScheduled;\n const hasReply = isReplyMessage(message) && !shouldHideReply;\n const hasThread = Boolean(threadInfo) && messageListType === 'thread';\n const { forwardInfo, viaBotId } = message;\n const asForwarded = forwardInfo && !isChatWithSelf && !forwardInfo.isLinkedChannelPost;\n const isInDocumentGroup = !!message.groupedId && !message.isInAlbum;\n const isAlbum = Boolean(album) && album!.messages.length > 1;\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice,\n } = getMessageContent(message);\n const customShape = getMessageCustomShape(message);\n const textParts = renderMessageText(message, highlight, isEmojiOnlyMessage(customShape));\n const isContextMenuShown = contextMenuPosition !== undefined;\n const containerClassName = buildClassName(\n 'Message message-list-item',\n isFirstInGroup && 'first-in-group',\n isLastInGroup && 'last-in-group',\n isFirstInDocumentGroup && 'first-in-document-group',\n isLastInDocumentGroup && 'last-in-document-group',\n isLastInList && 'last-in-list',\n isOwn && 'own',\n Boolean(message.views) && 'has-views',\n message.isEdited && 'was-edited',\n hasReply && 'has-reply',\n isContextMenuShown && 'has-menu-open',\n isFocused && !noFocusHighlight && 'focused',\n isForwarding && 'is-forwarding',\n message.isDeleting && 'is-deleting',\n isInDocumentGroup && 'is-in-document-group',\n isAlbum && 'is-album',\n message.hasUnreadMention && 'has-unread-mention',\n isSelected && 'is-selected',\n isInSelectMode && 'is-in-selection-mode',\n isThreadTop && 'is-thread-top',\n Boolean(message.inlineButtons) && 'has-inline-buttons',\n transitionClassNames,\n );\n const contentClassName = buildContentClassName(message, {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments: message.threadInfo && message.threadInfo.messagesCount > 0,\n });\n const avatarPeer = forwardInfo && (isChatWithSelf || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n const signature = (\n (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined\n );\n const withCommentButton = message.threadInfo && (!isInDocumentGroup || isLastInDocumentGroup)\n && messageListType === 'thread' && !noComments;\n const withAppendix = contentClassName.includes('has-appendix');\n\n useEnsureMessage(chatId, hasReply ? message.replyToMessageId : undefined, replyMessage, message.id);\n useFocusMessage(ref, chatId, isFocused, focusDirection, noFocusHighlight);\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\n\n appendixRef.current.innerHTML = isOwn ? APPENDIX_OWN : APPENDIX_NOT_OWN;\n }, [isOwn, withAppendix]);\n\n const handleGroupDocumentMessagesSelect = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n\n toggleMessageSelection({\n messageId,\n groupedId: message.groupedId,\n });\n }, [messageId, message.groupedId, toggleMessageSelection]);\n\n const handleMessageSelect = useCallback((e?: ReactMouseEvent) => {\n const params = isAlbum && album && album.messages\n ? {\n messageId,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: e && e.shiftKey,\n }\n : { messageId, withShift: e && e.shiftKey };\n toggleMessageSelection(params);\n }, [toggleMessageSelection, messageId, isAlbum, album]);\n\n const handleContainerDoubleClick = useCallback(() => {\n setReplyingToId({ messageId });\n }, [setReplyingToId, messageId]);\n\n const handleContentDoubleClick = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n }, []);\n\n const handleAvatarClick = useCallback(() => {\n if (!avatarPeer) {\n return;\n }\n\n if (isChatPrivate(avatarPeer.id)) {\n openUserInfo({ id: avatarPeer.id });\n } else {\n openChat({ id: avatarPeer.id });\n }\n }, [avatarPeer, openUserInfo, openChat]);\n\n const handleSenderClick = useCallback(() => {\n if (!senderPeer) {\n return;\n }\n\n if (isChatPrivate(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [senderPeer, openUserInfo, openChat]);\n\n const handleViaBotClick = useCallback(() => {\n if (!botSender) {\n return;\n }\n\n openUserInfo({ id: botSender.id });\n }, [botSender, openUserInfo]);\n\n const handleReplyClick = useCallback((): void => {\n focusMessage({ chatId, threadId, messageId: message.replyToMessageId });\n }, [focusMessage, chatId, threadId, message.replyToMessageId]);\n\n const handleMediaClick = useCallback((): void => {\n openMediaViewer({\n chatId, threadId, messageId, origin: isScheduled ? MediaViewerOrigin.ScheduledInline : MediaViewerOrigin.Inline,\n });\n }, [chatId, threadId, messageId, openMediaViewer, isScheduled]);\n\n const handleAudioPlay = useCallback((): void => {\n openAudioPlayer({ chatId, messageId });\n }, [chatId, messageId, openAudioPlayer]);\n\n const handleAlbumMediaClick = useCallback((albumMessageId: number): void => {\n openMediaViewer({\n chatId,\n threadId,\n messageId: albumMessageId,\n origin: isScheduled ? MediaViewerOrigin.ScheduledAlbum : MediaViewerOrigin.Album,\n });\n }, [chatId, threadId, openMediaViewer, isScheduled]);\n\n const handleReadMedia = useCallback((): void => {\n markMessagesRead({ messageIds: [messageId] });\n }, [messageId, markMessagesRead]);\n\n const handleCancelUpload = useCallback(() => {\n cancelSendingMessage({ chatId, messageId });\n }, [cancelSendingMessage, chatId, messageId]);\n\n const handleVoteSend = useCallback((options: string[]) => {\n sendPollVote({ chatId, messageId, options });\n }, [chatId, messageId, sendPollVote]);\n\n const handleGroupForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, groupedId: message.groupedId });\n }, [openForwardMenu, chatId, message.groupedId]);\n\n const handleForward = useCallback(() => {\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n }\n }, [album, openForwardMenu, chatId, messageId]);\n\n const handleFocus = useCallback(() => {\n focusMessage({\n chatId, threadId: MAIN_THREAD_ID, messageId,\n });\n }, [focusMessage, chatId, messageId]);\n\n const handleFocusForwarded = useCallback(() => {\n if (isInDocumentGroup) {\n focusMessage({\n chatId: forwardInfo!.fromChatId, groupedId: message.groupedId, groupedChatId: chatId,\n });\n return;\n }\n focusMessage({\n chatId: forwardInfo!.fromChatId, messageId: forwardInfo!.fromMessageId,\n });\n }, [focusMessage, forwardInfo, message, chatId, isInDocumentGroup]);\n\n const lang = useLang();\n\n let style = '';\n let calculatedWidth;\n let noMediaCorners = false;\n const albumLayout = useMemo(() => {\n return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), album!, windowWidth) : undefined;\n }, [isAlbum, windowWidth, isOwn, asForwarded, album]);\n\n const extraPadding = asForwarded ? 28 : 0;\n if (!isAlbum && (photo || video)) {\n let width: number | undefined;\n if (photo) {\n width = calculateMediaDimensions(message).width;\n } else if (video) {\n if (video.isRound) {\n width = ROUND_VIDEO_DIMENSIONS;\n } else {\n width = calculateMediaDimensions(message).width;\n }\n }\n\n if (width) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), width);\n if (calculatedWidth - width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n } else if (albumLayout) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), albumLayout.containerStyle.width);\n if (calculatedWidth - albumLayout.containerStyle.width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n\n if (calculatedWidth) {\n style = `width: ${calculatedWidth + extraPadding}px`;\n }\n\n function renderAvatar() {\n const isAvatarPeerUser = avatarPeer && isChatPrivate(avatarPeer.id);\n const avatarUser = avatarPeer && isAvatarPeerUser ? avatarPeer as ApiUser : undefined;\n const avatarChat = avatarPeer && !isAvatarPeerUser ? avatarPeer as ApiChat : undefined;\n const hiddenName = !avatarPeer && forwardInfo ? forwardInfo.hiddenUserName : undefined;\n\n return (\n \n );\n }\n\n function renderContent() {\n const className = buildClassName(\n 'content-inner',\n asForwarded && !customShape && 'forwarded-message',\n hasReply && 'reply-message',\n noMediaCorners && 'no-media-corners',\n );\n const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread;\n const shouldInlineMeta = !webPage && !animatedEmoji && textParts;\n\n return (\n
\n {renderSenderName()}\n {hasReply && (\n \n )}\n {sticker && (\n \n )}\n {animatedEmoji && (\n \n )}\n {isAlbum && (\n \n )}\n {!isAlbum && photo && (\n \n )}\n {!isAlbum && video && video.isRound && (\n \n )}\n {!isAlbum && video && !video.isRound && (\n \n )}\n {(audio || voice) && (\n \n )}\n {document && (\n \n )}\n {contact && (\n \n )}\n {poll && (\n \n )}\n {!animatedEmoji && textParts && (\n

\n {textParts}\n {shouldInlineMeta && (\n \n )}\n

\n )}\n {webPage && (\n \n )}\n {invoice && (\n \n )}\n
\n );\n }\n\n function renderSenderName() {\n const shouldRender = !customShape && (\n (withSenderName && !photo && !video) || asForwarded || viaBotId || forceSenderName\n ) && (!isInDocumentGroup || isFirstInDocumentGroup);\n\n if (!shouldRender) {\n return undefined;\n }\n\n let senderTitle;\n let senderColor;\n if (senderPeer) {\n senderTitle = getSenderTitle(lang, senderPeer);\n\n if (!asForwarded) {\n senderColor = `color-${getUserColorKey(senderPeer)}`;\n }\n } else if (forwardInfo && forwardInfo.hiddenUserName) {\n senderTitle = forwardInfo.hiddenUserName;\n }\n\n return (\n
\n {senderTitle ? (\n \n {renderText(senderTitle)}\n \n ) : !botSender ? (\n NBSP\n ) : undefined}\n {botSender && (\n <>\n {lang('ViaBot')}\n \n {renderText(`@${botSender.username}`)}\n \n \n )}\n {forwardInfo && forwardInfo.isLinkedChannelPost ? (\n {lang('DiscussChannel')}\n ) : message.adminTitle && !isChannel ? (\n {message.adminTitle}\n ) : undefined}\n
\n );\n }\n\n const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\n\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && (!isInDocumentGroup || isLastInDocumentGroup)\n );\n const canForward = canShowActionButton && isChannel && !isScheduled;\n const canFocus = canShowActionButton && (\n (forwardInfo && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn)) && forwardInfo.fromMessageId)\n || isPinnedList\n );\n\n return (\n \n \n {!isInDocumentGroup && (\n
\n {isSelected && }\n
\n )}\n {isLastInDocumentGroup && (\n \n {isGroupSelected && (\n \n )}\n \n )}\n {withAvatar && renderAvatar()}\n \n \n {withAppendix && (
)}\n {asForwarded && !customShape && (!isInDocumentGroup || isFirstInDocumentGroup) && (\n
{lang('ForwardedMessage')}
\n )}\n {renderContent()}\n {(!isInDocumentGroup || isLastInDocumentGroup) && !(!webPage && !animatedEmoji && textParts) && (\n \n )}\n {canForward ? (\n \n \n \n ) : canFocus ? (\n \n \n \n ) : undefined}\n {withCommentButton && }\n {contentClassName.includes('has-appendix') &&
}\n
\n {message.inlineButtons && (\n \n )}\n
\n {contextMenuPosition && (\n \n )}\n \n );\n};\n\nfunction handleDocumentGroupMouseEnter(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.setAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE, '');\n }\n}\n\nfunction handleDocumentGroupMouseLeave(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.removeAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE);\n }\n}\n\nfunction getLastElementInDocumentGroup(element: Element) {\n let current: Element | null = element;\n\n do {\n current = current.nextElementSibling;\n } while (current && !current.classList.contains('last-in-document-group'));\n\n return current;\n}\n\nexport default memo(withGlobal(\n (global, ownProps): StateProps => {\n const { focusedMessage, forwardMessages, lastSyncTime } = global;\n const {\n message, album, withSenderName, withAvatar, threadId, messageListType,\n } = ownProps;\n const {\n id, chatId, viaBotId, replyToMessageId, isOutgoing,\n } = message;\n\n const chat = selectChat(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isChannel = chat && isChatChannel(chat);\n\n const forceSenderName = !isChatWithSelf && isAnonymousOwnMessage(message);\n const canShowSender = withSenderName || withAvatar || forceSenderName;\n const sender = canShowSender ? selectSender(global, message) : undefined;\n const originSender = selectForwardedSender(global, message);\n const botSender = viaBotId ? selectUser(global, viaBotId) : undefined;\n\n const threadTopMessageId = threadId ? selectThreadTopMessageId(global, chatId, threadId) : undefined;\n const isThreadTop = message.id === threadTopMessageId;\n\n const shouldHideReply = replyToMessageId === threadTopMessageId;\n const replyMessage = replyToMessageId && !shouldHideReply\n ? selectChatMessage(global, chatId, replyToMessageId)\n : undefined;\n const replyMessageSender = replyMessage && selectSender(global, replyMessage);\n\n const uploadProgress = selectUploadProgress(global, message);\n const isFocused = messageListType === 'thread' && (\n album\n ? album.messages.some((m) => selectIsMessageFocused(global, m))\n : selectIsMessageFocused(global, message)\n );\n\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && focusedMessage) || {};\n\n const isForwarding = forwardMessages.messageIds && forwardMessages.messageIds.includes(id);\n\n const { query: highlight } = selectCurrentTextSearch(global) || {};\n\n const singleEmoji = getMessageSingleEmoji(message);\n let isSelected: boolean;\n\n if (album && album.messages) {\n isSelected = album.messages.every(({ id: messageId }) => selectIsMessageSelected(global, messageId));\n } else {\n isSelected = selectIsMessageSelected(global, id);\n }\n\n return {\n forceSenderName,\n sender,\n originSender,\n botSender,\n shouldHideReply,\n isThreadTop,\n replyMessage,\n replyMessageSender,\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n isSingleEmoji: Boolean(singleEmoji),\n animatedEmoji: singleEmoji ? selectAnimatedEmoji(global, singleEmoji) : undefined,\n isInSelectMode: selectIsInSelectMode(global),\n isSelected,\n isGroupSelected: (\n !!message.groupedId && !message.isInAlbum && selectIsDocumentGroupSelected(global, chatId, message.groupedId)\n ),\n threadId,\n isPinnedList: messageListType === 'pinned',\n shouldAutoLoadMedia: chat ? selectShouldAutoLoadMedia(global, message, chat, sender) : undefined,\n shouldAutoPlayMedia: selectShouldAutoPlayMedia(global, message),\n shouldLoopStickers: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'cancelSendingMessage',\n 'openUserInfo',\n 'openChat',\n 'markMessagesRead',\n 'sendPollVote',\n 'toggleMessageSelection',\n 'setReplyingToId',\n 'openForwardMenu',\n 'clickInlineButton',\n ]),\n)(Message));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { LoadMoreDirection } from '../../types';\n\nimport { ANIMATION_END_DELAY, MESSAGE_LIST_SLICE, SCHEDULED_WHEN_ONLINE } from '../../config';\nimport { IS_ANDROID, IS_MOBILE_SCREEN } from '../../util/environment';\nimport {\n selectChatMessages,\n selectIsViewportNewest,\n selectFirstUnreadId,\n selectFocusedMessageId,\n selectChat,\n selectIsInSelectMode,\n selectIsChatWithSelf,\n selectChatBot,\n selectIsChatBotNotStarted,\n selectScrollOffset,\n selectThreadTopMessageId,\n selectFirstMessageId,\n selectScheduledMessages,\n selectCurrentMessageIds,\n} from '../../modules/selectors';\nimport {\n getMessageOriginalId,\n isActionMessage,\n isChatChannel,\n isChatPrivate,\n isOwnMessage,\n} from '../../modules/helpers';\nimport {\n compact,\n flatten,\n orderBy,\n pick,\n} from '../../util/iteratees';\nimport {\n fastRaf, debounce, onTickEnd,\n} from '../../util/schedulers';\nimport { formatHumanDate } from '../../util/dateFormat';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport buildClassName from '../../util/buildClassName';\nimport { groupMessages, MessageDateGroup, isAlbum } from './helpers/groupMessages';\nimport { ObserveFn, useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useOnChange from '../../hooks/useOnChange';\nimport useStickyDates from './hooks/useStickyDates';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport resetScroll from '../../util/resetScroll';\nimport fastSmoothScroll, { isAnimatingScroll } from '../../util/fastSmoothScroll';\nimport renderText from '../common/helpers/renderText';\nimport useLang, { LangFn } from '../../hooks/useLang';\nimport useWindowSize from '../../hooks/useWindowSize';\n\nimport Loading from '../ui/Loading';\nimport MessageScroll from './MessageScroll';\nimport Message from './message/Message';\nimport ActionMessage from './ActionMessage';\n\nimport './MessageList.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n type: MessageListType;\n canPost: boolean;\n onFabToggle: (shouldShow: boolean) => void;\n onNotchToggle: (shouldShow: boolean) => void;\n hasTools?: boolean;\n};\n\ntype StateProps = {\n isChatLoaded?: boolean;\n isChannelChat?: boolean;\n isChatWithSelf?: boolean;\n messageIds?: number[];\n messagesById?: Record;\n firstUnreadId?: number;\n isViewportNewest?: boolean;\n isRestricted?: boolean;\n restrictionReason?: ApiRestrictionReason;\n focusingId?: number;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n lastMessage?: ApiMessage;\n botDescription?: string;\n threadTopMessageId?: number;\n threadFirstMessageId?: number;\n hasLinkedChat?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst BOTTOM_THRESHOLD = 100;\nconst UNREAD_DIVIDER_TOP = 10;\nconst UNREAD_DIVIDER_TOP_WITH_TOOLS = 60;\nconst SCROLL_DEBOUNCE = 200;\nconst INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350;\nconst INTERSECTION_MARGIN_FOR_MEDIA = IS_MOBILE_SCREEN ? 300 : 500;\nconst FOCUSING_DURATION = 1000;\nconst BOTTOM_FOCUS_MARGIN = 20;\nconst SELECT_MODE_ANIMATION_DURATION = 200;\nconst FOCUSING_FADE_ANIMATION_DURATION = 200;\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst runDebouncedForScroll = debounce((cb) => cb(), SCROLL_DEBOUNCE, false);\n\nconst MessageList: FC = ({\n chatId,\n threadId,\n type,\n hasTools,\n onFabToggle,\n onNotchToggle,\n isChatLoaded,\n isChannelChat,\n canPost,\n isChatWithSelf,\n messageIds,\n messagesById,\n firstUnreadId,\n isViewportNewest,\n threadFirstMessageId,\n isRestricted,\n restrictionReason,\n focusingId,\n isSelectModeActive,\n animationLevel,\n loadViewportMessages,\n markMessageListRead,\n markMessagesRead,\n setScrollOffset,\n lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n // We update local cached `scrollOffsetRef` when opening chat.\n // Then we update global version every second on scrolling.\n const scrollOffsetRef = useRef((type === 'thread' && selectScrollOffset(getGlobal(), chatId, threadId)) || 0);\n const anchorIdRef = useRef();\n const anchorTopRef = useRef();\n const listItemElementsRef = useRef();\n const memoUnreadDividerBeforeIdRef = useRef();\n // Updated every time (to be used from intersection callback closure)\n const memoFirstUnreadIdRef = useRef();\n const memoFocusingIdRef = useRef();\n const isScrollTopJustUpdatedRef = useRef(false);\n const shouldAnimateAppearanceRef = useRef(!messageIds);\n\n const [containerHeight, setContainerHeight] = useState();\n const [hasFocusing, setHasFocusing] = useState(Boolean(focusingId));\n\n const areMessagesLoaded = Boolean(messageIds);\n useOnChange(() => {\n // We only need it first time when message list appears\n if (areMessagesLoaded) {\n onTickEnd(() => {\n shouldAnimateAppearanceRef.current = false;\n });\n }\n }, [areMessagesLoaded]);\n\n useOnChange(() => {\n memoFirstUnreadIdRef.current = firstUnreadId;\n\n // Updated only once (to preserve divider even after messages are read)\n if (!memoUnreadDividerBeforeIdRef.current) {\n memoUnreadDividerBeforeIdRef.current = firstUnreadId;\n }\n }, [firstUnreadId]);\n\n const {\n observe: observeIntersectionForMedia, freeze: freezeForMedia, unfreeze: unfreezeForMedia,\n } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n margin: INTERSECTION_MARGIN_FOR_MEDIA,\n });\n\n const {\n observe: observeIntersectionForReading, freeze: freezeForReading, unfreeze: unfreezeForReading,\n } = useIntersectionObserver({\n rootRef: containerRef,\n }, (entries) => {\n if (type !== 'thread') {\n return;\n }\n\n let maxId = 0;\n const mentionIds: number[] = [];\n\n entries.forEach((entry) => {\n const { isIntersecting, target } = entry;\n\n if (!isIntersecting) {\n return;\n }\n\n const { dataset } = target as HTMLDivElement;\n\n const messageId = Number(dataset.lastMessageId || dataset.messageId);\n if (messageId > maxId) {\n maxId = messageId;\n }\n\n if (dataset.hasUnreadMention) {\n mentionIds.push(messageId);\n }\n });\n\n if (memoFirstUnreadIdRef.current && maxId >= memoFirstUnreadIdRef.current) {\n markMessageListRead({ maxId });\n }\n\n if (mentionIds.length) {\n markMessagesRead({ messageIds: mentionIds });\n }\n });\n\n useOnChange(() => {\n memoFocusingIdRef.current = focusingId;\n\n if (focusingId) {\n freezeForMedia();\n freezeForReading();\n } else {\n unfreezeForReading();\n unfreezeForMedia();\n }\n }, [focusingId]);\n\n const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n });\n\n useEffect(() => {\n if (focusingId) {\n setHasFocusing(true);\n } else {\n setTimeout(() => {\n setHasFocusing(false);\n }, FOCUSING_FADE_ANIMATION_DURATION);\n }\n }, [focusingId]);\n\n const messageGroups = useMemo(() => {\n if (!messageIds || !messagesById) {\n return undefined;\n }\n\n const viewportIds = threadTopMessageId && (!messageIds[0] || threadFirstMessageId === messageIds[0])\n ? [threadTopMessageId, ...messageIds]\n : messageIds;\n\n if (!viewportIds.length) {\n return undefined;\n }\n\n const listedMessages = viewportIds.map((id) => messagesById[id]);\n return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current);\n }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]);\n\n const [loadMoreBackwards, loadMoreForwards, loadMoreAround] = useMemo(\n () => (type === 'thread' ? [\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false),\n ] : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadViewportMessages, messageIds],\n );\n\n const { isScrolled, updateStickyDates } = useStickyDates();\n\n const handleScroll = useCallback(() => {\n if (isScrollTopJustUpdatedRef.current) {\n isScrollTopJustUpdatedRef.current = false;\n return;\n }\n\n const container = containerRef.current!;\n\n if (!memoFocusingIdRef.current) {\n updateStickyDates(container, hasTools);\n }\n\n runDebouncedForScroll(() => {\n fastRaf(() => {\n if (!container.parentElement) {\n return;\n }\n\n scrollOffsetRef.current = container.scrollHeight - container.scrollTop;\n\n if (type === 'thread') {\n setScrollOffset({ chatId, threadId, scrollOffset: scrollOffsetRef.current });\n }\n });\n });\n }, [updateStickyDates, hasTools, type, setScrollOffset, chatId, threadId]);\n\n // Container resize observer (caused by Composer reply/webpage panels)\n useEffect(() => {\n if (!('ResizeObserver' in window) || process.env.APP_ENV === 'perf') {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n // During animation\n if (!(entry.target as HTMLDivElement).offsetParent) {\n return;\n }\n\n setContainerHeight(entry.contentRect.height);\n });\n\n observer.observe(containerRef.current!);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Memorize height for scroll animation\n const { height: windowHeight } = useWindowSize();\n useEffect(() => {\n containerRef.current!.dataset.normalHeight = String(containerRef.current!.offsetHeight);\n }, [windowHeight]);\n\n // Initial message loading\n useEffect(() => {\n if (!loadMoreAround || !isChatLoaded || isRestricted || focusingId) {\n return;\n }\n\n const container = containerRef.current!;\n\n if (!messageIds || (\n messageIds.length < MESSAGE_LIST_SLICE / 2\n && (container.firstElementChild as HTMLDivElement).clientHeight <= container.offsetHeight\n )) {\n loadMoreAround();\n }\n }, [isChatLoaded, messageIds, loadMoreAround, focusingId, isRestricted]);\n\n // Remember scroll position before repositioning it\n useOnChange(() => {\n if (!messageIds || !listItemElementsRef.current) {\n return;\n }\n\n const preservedItemElements = listItemElementsRef.current\n .filter((element) => messageIds.includes(Number(element.dataset.messageId)));\n\n // We avoid the very first item as it may be a partly-loaded album\n // and also because it may be removed when messages limit is reached\n const anchor = preservedItemElements[1] || preservedItemElements[0];\n if (!anchor) {\n return;\n }\n\n anchorIdRef.current = anchor.id;\n anchorTopRef.current = anchor.getBoundingClientRect().top;\n // This should match deps for `useLayoutEffectWithPrevDeps` below\n }, [messageIds, isViewportNewest, containerHeight, hasTools]);\n\n // Handles updated message list, takes care of scroll repositioning\n useLayoutEffectWithPrevDeps(([\n prevMessageIds, prevIsViewportNewest, prevContainerHeight,\n ]: [\n typeof messageIds, typeof isViewportNewest, typeof containerHeight\n ]) => {\n const container = containerRef.current!;\n listItemElementsRef.current = Array.from(container.querySelectorAll('.message-list-item'));\n\n // During animation\n if (!container.offsetParent) {\n return;\n }\n\n // Add extra height when few messages to allow smooth scroll animation. Uses assumption that `parentElement`\n // is a Transition slide and its CSS class can not be reset in a declarative way.\n const shouldForceScroll = (\n isViewportNewest\n && (messageIds && messageIds.length < MESSAGE_LIST_SLICE / 2)\n && !container.parentElement!.classList.contains('force-messages-scroll')\n && (container.firstElementChild as HTMLDivElement)!.clientHeight <= container.offsetHeight * 2\n );\n\n if (shouldForceScroll) {\n container.parentElement!.classList.add('force-messages-scroll');\n\n setTimeout(() => {\n if (container.parentElement) {\n container.parentElement.classList.remove('force-messages-scroll');\n }\n }, FOCUSING_DURATION);\n }\n\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const scrollOffset = scrollOffsetRef.current!;\n const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1];\n\n // If two messages come at once (e.g. via Quiz Bot) then the first message will update `scrollOffset`\n // right away (before animation) which creates inconsistency until the animation completes.\n // To workaround that, we calculate `isAtBottom` with a \"buffer\" of the latest message height (this is approximate).\n const lastItemHeight = lastItemElement ? lastItemElement.offsetHeight : 0;\n const isAtBottom = isViewportNewest && prevIsViewportNewest && (\n scrollOffset - (prevContainerHeight || offsetHeight) - lastItemHeight <= BOTTOM_THRESHOLD\n );\n\n let newScrollTop!: number;\n\n const hasFirstMessageChanged = messageIds && prevMessageIds && messageIds[0] !== prevMessageIds[0];\n const hasLastMessageChanged = (\n messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1]\n );\n const isAlreadyFocusing = messageIds && memoFocusingIdRef.current === messageIds[messageIds.length - 1];\n\n if (isAtBottom && hasLastMessageChanged && !hasFirstMessageChanged && !isAlreadyFocusing) {\n if (lastItemElement) {\n fastRaf(() => {\n fastSmoothScroll(\n container,\n lastItemElement,\n 'end',\n BOTTOM_FOCUS_MARGIN,\n undefined,\n undefined,\n undefined,\n true,\n );\n });\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n // Scroll still needs to be restored after container resize\n if (!shouldForceScroll) {\n return;\n }\n }\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.time('scrollTop');\n }\n\n const isResized = prevContainerHeight !== undefined && prevContainerHeight !== containerHeight;\n const anchor = anchorIdRef.current && container.querySelector(`#${anchorIdRef.current}`);\n const unreadDivider = (\n !anchor\n && memoUnreadDividerBeforeIdRef.current\n && container.querySelector(`.${UNREAD_DIVIDER_CLASS}`)\n );\n\n if (isAtBottom && isResized) {\n if (isAnimatingScroll()) {\n return;\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n } else if (anchor) {\n const newAnchorTop = anchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - (anchorTopRef.current || 0));\n } else if (unreadDivider) {\n newScrollTop = unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP);\n } else {\n newScrollTop = scrollHeight - scrollOffset;\n }\n\n resetScroll(container, newScrollTop);\n\n if (!memoFocusingIdRef.current) {\n isScrollTopJustUpdatedRef.current = true;\n fastRaf(() => {\n isScrollTopJustUpdatedRef.current = false;\n });\n }\n\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.timeEnd('scrollTop');\n }\n // This should match deps for `useOnChange` above\n }, [messageIds, isViewportNewest, containerHeight, hasTools]);\n\n useEffect(() => {\n if (!animationLevel || animationLevel > 0) {\n dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isSelectModeActive]);\n\n const lang = useLang();\n\n const isPrivate = Boolean(chatId && isChatPrivate(chatId));\n const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf);\n\n const className = buildClassName(\n 'MessageList custom-scroll',\n !withUsers && 'no-avatars',\n isChannelChat && 'no-avatars',\n !canPost && 'no-composer',\n type === 'pinned' && 'type-pinned',\n isSelectModeActive && 'select-mode-active',\n hasFocusing && 'has-focusing',\n isScrolled && 'scrolled',\n );\n\n return (\n
\n {isRestricted ? (\n
\n \n {restrictionReason ? restrictionReason.text : `This is a private ${isChannelChat ? 'channel' : 'chat'}`}\n \n
\n ) : botDescription ? (\n
{renderText(lang(botDescription), ['br', 'emoji', 'links'])}
\n ) : messageIds && !messageGroups ? (\n
{lang('NoMessages')}
\n ) : ((messageIds && messageGroups) || lastMessage) ? (\n \n {renderMessages(\n lang,\n messageGroups || groupMessages([lastMessage!]),\n observeIntersectionForReading,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n withUsers,\n anchorIdRef,\n memoUnreadDividerBeforeIdRef,\n threadId,\n type,\n threadTopMessageId,\n threadFirstMessageId,\n hasLinkedChat,\n messageGroups ? type === 'scheduled' : false,\n !messageGroups || !shouldAnimateAppearanceRef.current,\n openHistoryCalendar,\n )}\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction renderMessages(\n lang: LangFn,\n messageGroups: MessageDateGroup[],\n observeIntersectionForReading: ObserveFn,\n observeIntersectionForMedia: ObserveFn,\n observeIntersectionForAnimatedStickers: ObserveFn,\n withUsers: boolean,\n currentAnchorIdRef: { current: string | undefined },\n memoFirstUnreadIdRef: { current: number | undefined },\n threadId: number,\n type: MessageListType,\n threadTopMessageId: number | undefined,\n threadFirstMessageId: number | undefined,\n hasLinkedChat: boolean | undefined,\n isSchedule: boolean,\n noAppearanceAnimation: boolean,\n openHistoryCalendar: Function,\n) {\n const unreadDivider = (\n
\n {lang('UnreadMessages')}\n
\n );\n\n const messageCountToAnimate = noAppearanceAnimation ? 0 : messageGroups.reduce((acc, messageGroup) => {\n return acc + flatten(messageGroup.senderGroups).length;\n }, 0);\n let appearanceIndex = 0;\n\n const dateGroups = messageGroups.map((\n dateGroup: MessageDateGroup,\n dateGroupIndex: number,\n dateGroupsArray: MessageDateGroup[],\n ) => {\n const senderGroups = dateGroup.senderGroups.map((\n senderGroup,\n senderGroupIndex,\n senderGroupsArray,\n ) => {\n if (senderGroup.length === 1 && !isAlbum(senderGroup[0]) && isActionMessage(senderGroup[0])) {\n const message = senderGroup[0];\n const isLastInList = (\n senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n );\n\n return compact([\n message.id === memoFirstUnreadIdRef.current && unreadDivider,\n ,\n ]);\n }\n\n let currentDocumentGroupId: string | undefined;\n\n return flatten(senderGroup.map((\n messageOrAlbum,\n messageIndex,\n ) => {\n const message = isAlbum(messageOrAlbum) ? messageOrAlbum.mainMessage : messageOrAlbum;\n const album = isAlbum(messageOrAlbum) ? messageOrAlbum : undefined;\n const isOwn = isOwnMessage(message);\n const isMessageAlbum = isAlbum(messageOrAlbum);\n const nextMessage = senderGroup[messageIndex + 1];\n\n if (message.previousLocalId && currentAnchorIdRef.current === `message${message.previousLocalId}`) {\n currentAnchorIdRef.current = `message${message.id}`;\n }\n\n const documentGroupId = !isMessageAlbum && message.groupedId ? message.groupedId : undefined;\n const nextDocumentGroupId = nextMessage && !isAlbum(nextMessage) ? nextMessage.groupedId : undefined;\n\n const position = {\n isFirstInGroup: messageIndex === 0,\n isLastInGroup: messageIndex === senderGroup.length - 1,\n isFirstInDocumentGroup: Boolean(documentGroupId && documentGroupId !== currentDocumentGroupId),\n isLastInDocumentGroup: Boolean(documentGroupId && documentGroupId !== nextDocumentGroupId),\n isLastInList: (\n messageIndex === senderGroup.length - 1\n && senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n ),\n };\n\n currentDocumentGroupId = documentGroupId;\n\n const originalId = getMessageOriginalId(message);\n // Scheduled messages can have local IDs in the middle of the list,\n // and keys should be ordered, so we prefix it with a date.\n // However, this may lead to issues if server date is not synchronized with the local one.\n const key = type !== 'scheduled' ? originalId : `${message.date}_${originalId}`;\n\n return compact([\n message.id === memoFirstUnreadIdRef.current ? unreadDivider : undefined,\n ,\n message.id === threadTopMessageId && (\n
\n {lang('DiscussionStarted')}\n
\n ),\n ]);\n }));\n });\n\n return (\n \n openHistoryCalendar({ selectedAt: dateGroup.datetime }) : undefined}\n >\n \n {isSchedule && dateGroup.originalDate === SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledUntilOnline')\n )}\n {isSchedule && dateGroup.originalDate !== SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledOn', formatHumanDate(lang, dateGroup.datetime, undefined, true))\n )}\n {!isSchedule && formatHumanDate(lang, dateGroup.datetime)}\n \n \n {flatten(senderGroups)}\n \n );\n });\n\n return flatten(dateGroups);\n}\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, type }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const messageIds = selectCurrentMessageIds(global, chatId, threadId, type);\n const messagesById = type === 'scheduled'\n ? selectScheduledMessages(global, chatId)\n : selectChatMessages(global, chatId);\n const threadTopMessageId = selectThreadTopMessageId(global, chatId, threadId);\n\n if (\n threadId !== MAIN_THREAD_ID\n && !(messagesById && threadTopMessageId && messagesById[threadTopMessageId])\n ) {\n return {};\n }\n\n const { isRestricted, restrictionReason, lastMessage } = chat;\n const focusingId = selectFocusedMessageId(global, chatId);\n\n const withLastMessageWhenPreloading = (\n threadId === MAIN_THREAD_ID\n && !messageIds && !chat.unreadCount && !focusingId && lastMessage && !lastMessage.groupedId\n );\n\n let botDescription: string | undefined;\n if (selectIsChatBotNotStarted(global, chatId)) {\n const chatBot = selectChatBot(global, chatId)!;\n if (chatBot.fullInfo) {\n botDescription = chatBot.fullInfo.botDescription || 'NoMessages';\n } else {\n botDescription = 'Updating bot info...';\n }\n }\n\n return {\n isChatLoaded: true,\n isRestricted,\n restrictionReason,\n isChannelChat: isChatChannel(chat),\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n messageIds,\n messagesById,\n firstUnreadId: selectFirstUnreadId(global, chatId, threadId),\n isViewportNewest: type !== 'thread' || selectIsViewportNewest(global, chatId, threadId),\n threadFirstMessageId: selectFirstMessageId(global, chatId, threadId),\n focusingId,\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n botDescription,\n threadTopMessageId,\n hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo)\n ? Boolean(chat.fullInfo.linkedChatId)\n : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadViewportMessages',\n 'markMessageListRead',\n 'markMessagesRead',\n 'setScrollOffset',\n 'openHistoryCalendar',\n ]),\n)(MessageList));\n","import React, {\n FC, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\n\nimport { selectChat, selectCurrentMessageList } from '../../modules/selectors';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport { pick } from '../../util/iteratees';\nimport fastSmoothScroll from '../../util/fastSmoothScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ScrollDownButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n canPost?: boolean;\n};\n\ntype StateProps = {\n messageListType?: MessageListType;\n unreadCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FOCUS_MARGIN = 20;\n\nconst ScrollDownButton: FC = ({\n isShown,\n canPost,\n messageListType,\n unreadCount,\n focusLastMessage,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const elementRef = useRef(null);\n\n const handleClick = useCallback(() => {\n if (!isShown) {\n return;\n }\n\n if (messageListType === 'thread') {\n focusLastMessage();\n } else {\n const messagesContainer = elementRef.current!.parentElement!.querySelector('.MessageList')!;\n const messageElements = messagesContainer.querySelectorAll('.message-list-item');\n const lastMessageElement = messageElements[messageElements.length - 1];\n if (!lastMessageElement) {\n return;\n }\n\n fastSmoothScroll(messagesContainer, lastMessageElement, 'end', FOCUS_MARGIN);\n }\n }, [isShown, messageListType, focusLastMessage]);\n\n const fabClassName = buildClassName(\n 'ScrollDownButton',\n isShown && 'revealed',\n !canPost && 'no-composer',\n );\n\n return (\n
\n
\n \n \n \n {Boolean(unreadCount) && (\n
{formatIntegerCompact(unreadCount!)}
\n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return {};\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n\n return {\n messageListType,\n unreadCount: chat && threadId === MAIN_THREAD_ID && messageListType === 'thread' ? chat.unreadCount : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusLastMessage']),\n)(ScrollDownButton));\n","import { ApiAttachment } from '../../../../api/types';\nimport { preloadImage, preloadVideo, createPosterForVideo } from '../../../../util/files';\n\nconst MAX_QUICK_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\nconst MAX_QUICK_IMG_SIZE = 1280; // px\n\nexport default async function buildAttachment(\n filename: string, blob: Blob, isQuick: boolean, options?: Partial,\n): Promise {\n const blobUrl = URL.createObjectURL(blob);\n const { type: mimeType, size } = blob;\n let quick;\n let previewBlobUrl;\n\n if (mimeType.startsWith('image/')) {\n if (isQuick) {\n const img = await preloadImage(blobUrl);\n const { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE || mimeType !== 'image/jpeg') {\n const newBlob = await squeezeImage(img);\n if (newBlob) {\n URL.revokeObjectURL(blobUrl);\n return buildAttachment(filename, newBlob, true, options);\n } else {\n return buildAttachment(filename, blob, false, options);\n }\n }\n\n quick = { width, height };\n } else {\n previewBlobUrl = blobUrl;\n }\n } else if (mimeType.startsWith('video/')) {\n // Videos < 10 MB are always sent in quick mode (in other clients).\n // Quick mode for videos > 10 MB is not supported until client-side video squeezing is implemented.\n if (size < MAX_QUICK_VIDEO_SIZE) {\n const { videoWidth: width, videoHeight: height, duration } = await preloadVideo(blobUrl);\n quick = { width, height, duration };\n }\n\n previewBlobUrl = await createPosterForVideo(blobUrl);\n }\n\n return {\n blobUrl,\n filename,\n mimeType,\n size,\n quick,\n previewBlobUrl,\n ...options,\n };\n}\n\nfunction squeezeImage(img: HTMLImageElement): Promise {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n let { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE) {\n if (width >= height) {\n height *= MAX_QUICK_IMG_SIZE / width;\n width = MAX_QUICK_IMG_SIZE;\n } else {\n width *= MAX_QUICK_IMG_SIZE / height;\n height = MAX_QUICK_IMG_SIZE;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height);\n canvas.toBlob(resolve, 'image/jpeg', 100);\n });\n}\n","export default __webpack_public_path__ + \"8ccc0b555efcec3616377aea078dda16.js\";","// @ts-ignore\nimport encoderPath from 'file-loader!opus-recorder/dist/encoderWorker.min';\n\nexport type Result = { blob: Blob; duration: number; waveform: number[] };\n\ninterface OpusRecorder extends Omit {\n new(options: AnyLiteral): OpusRecorder;\n\n start(stream?: MediaStreamAudioSourceNode): void;\n\n sourceNode: MediaStreamAudioSourceNode;\n\n ondataavailable: (typedArray: Uint8Array) => void;\n}\n\nconst MIN_RECORDING_TIME = 1000;\nconst POLYFILL_OPTIONS = { encoderPath, reuseWorker: true };\nconst BLOB_PARAMS = { type: 'audio/ogg' };\nconst FFT_SIZE = 64;\nconst MIN_VOLUME = 0.1;\n\nlet opusRecorderPromise: Promise<{ default: OpusRecorder }>;\nlet OpusRecorder: OpusRecorder;\nlet mediaRecorder: OpusRecorder;\n\nexport async function init() {\n if (!opusRecorderPromise) {\n // @ts-ignore\n opusRecorderPromise = import('opus-recorder');\n OpusRecorder = (await opusRecorderPromise).default;\n mediaRecorder = new OpusRecorder(POLYFILL_OPTIONS);\n }\n\n return opusRecorderPromise;\n}\n\nexport async function start(analyzerCallback: Function) {\n await startMediaRecorder();\n\n const startedAt = Date.now();\n let pausedAt: number;\n const chunks: Uint8Array[] = [];\n const waveform: number[] = [];\n\n mediaRecorder.ondataavailable = (typedArray) => {\n chunks.push(typedArray);\n };\n\n const releaseAnalyzer = subscribeToAnalyzer(mediaRecorder, (volume: number) => {\n waveform.push(volume * 255);\n analyzerCallback(volume);\n });\n\n return {\n stop: () => new Promise((resolve, reject) => {\n mediaRecorder.onstop = () => {\n resolve({\n blob: new Blob(chunks, BLOB_PARAMS),\n duration: Math.round(((pausedAt || Date.now()) - startedAt) / 1000),\n waveform,\n });\n };\n mediaRecorder.onerror = reject;\n\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.stop();\n releaseAnalyzer();\n }, delayStop);\n }),\n pause: () => {\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.pause();\n pausedAt = Date.now();\n releaseAnalyzer();\n }, delayStop);\n },\n };\n}\n\nasync function startMediaRecorder() {\n await init();\n await mediaRecorder.start();\n}\n\nfunction subscribeToAnalyzer(recorder: OpusRecorder, cb: Function) {\n const source = recorder.sourceNode;\n const analyser = source.context.createAnalyser();\n analyser.fftSize = FFT_SIZE;\n source.connect(analyser);\n\n const dataLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(dataLength);\n let isDestroyed = false;\n\n function tick() {\n if (isDestroyed) {\n return;\n }\n\n analyser.getByteFrequencyData(dataArray);\n\n const sum = dataArray.reduce((acc, current) => acc + current, 0);\n const mean = (sum / dataLength);\n const volume = mean / 255;\n\n cb(volume < MIN_VOLUME ? 0 : volume);\n\n requestAnimationFrame(tick);\n }\n\n tick();\n\n return () => {\n isDestroyed = true;\n };\n}\n","import { StateHookSetter, useEffect } from '../../../../lib/teact/teact';\nimport { ApiAttachment, ApiMessage } from '../../../../api/types';\n\nimport buildAttachment from '../helpers/buildAttachment';\nimport { EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID } from '../../../../config';\n\nconst CLIPBOARD_ACCEPTED_TYPES = ['image/png', 'image/jpeg', 'image/gif'];\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default (\n insertTextAndUpdateCursor: (text: string, inputId?: string) => void,\n setAttachments: StateHookSetter,\n editedMessage: ApiMessage | undefined,\n) => {\n useEffect(() => {\n async function handlePaste(e: ClipboardEvent) {\n if (!e.clipboardData) {\n return;\n }\n\n const input = document.activeElement;\n if (input && input.tagName === 'INPUT' && ![EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID].includes(input.id)) {\n return;\n }\n\n const { items } = e.clipboardData;\n const media = Array.from(items).find((item) => CLIPBOARD_ACCEPTED_TYPES.includes(item.type));\n const file = media && media.getAsFile();\n const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH);\n\n if (!file && !pastedText) {\n return;\n }\n\n e.preventDefault();\n\n if (file && !editedMessage) {\n const attachment = await buildAttachment(file.name, file, true);\n setAttachments((attachments) => [\n ...attachments,\n attachment,\n ]);\n }\n\n if (pastedText) {\n insertTextAndUpdateCursor(pastedText, input ? input.id : undefined);\n }\n }\n\n document.addEventListener('paste', handlePaste, false);\n\n return () => {\n document.removeEventListener('paste', handlePaste, false);\n };\n }, [insertTextAndUpdateCursor, editedMessage, setAttachments]);\n};\n","import { ApiFormattedText } from '../../../../api/types';\nimport { renderTextWithEntities } from '../../../common/helpers/renderMessageText';\n\nexport default function getMessageTextAsHtml(formattedText?: ApiFormattedText) {\n const { text, entities } = formattedText || {};\n if (!text) {\n return '';\n }\n\n const result = renderTextWithEntities(\n text,\n entities,\n undefined,\n undefined,\n true,\n );\n\n if (Array.isArray(result)) {\n return result.join('');\n }\n\n return result;\n}\n","import { useCallback, useEffect, useMemo } from '../../../../lib/teact/teact';\n\nimport { ApiFormattedText, ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { DRAFT_DEBOUNCE, EDITABLE_INPUT_ID } from '../../../../config';\nimport usePrevious from '../../../../hooks/usePrevious';\nimport { debounce } from '../../../../util/schedulers';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\n\n// Used to avoid running debounced callbacks when chat changes.\nlet currentChatId: number | undefined;\nlet currentThreadId: number | undefined;\n\nexport default (\n draft: ApiFormattedText | undefined,\n chatId: number,\n threadId: number,\n html: string,\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n saveDraft: GlobalActions['saveDraft'],\n clearDraft: GlobalActions['clearDraft'],\n) => {\n const updateDraft = useCallback((draftChatId: number, draftThreadId: number) => {\n if (htmlRef.current.length && !editedMessage) {\n saveDraft({ chatId: draftChatId, threadId: draftThreadId, draft: parseMessageInput(htmlRef.current!) });\n } else {\n clearDraft({ chatId: draftChatId, threadId: draftThreadId });\n }\n }, [clearDraft, editedMessage, htmlRef, saveDraft]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const runDebouncedForSaveDraft = useMemo(() => debounce((cb) => cb(), DRAFT_DEBOUNCE, false), [chatId]);\n\n const prevChatId = usePrevious(chatId);\n const prevThreadId = usePrevious(threadId);\n\n // Save draft on chat change\n useEffect(() => {\n currentChatId = chatId;\n currentThreadId = threadId;\n\n return () => {\n currentChatId = undefined;\n currentThreadId = undefined;\n\n updateDraft(chatId, threadId);\n };\n }, [chatId, threadId, updateDraft]);\n\n // Restore draft on chat change\n useEffect(() => {\n if (chatId === prevChatId && threadId === prevThreadId) {\n return;\n }\n\n if (!draft) {\n return;\n }\n\n setHtml(getMessageTextAsHtml(draft));\n\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }, [chatId, threadId, draft, setHtml, updateDraft, prevChatId, prevThreadId]);\n\n // Update draft when input changes\n const prevHtml = usePrevious(html);\n useEffect(() => {\n if (!chatId || !threadId || prevChatId !== chatId || prevThreadId !== threadId || prevHtml === html) {\n return;\n }\n\n if (html.length) {\n runDebouncedForSaveDraft(() => {\n if (currentChatId !== chatId || currentThreadId !== threadId) {\n return;\n }\n\n updateDraft(chatId, threadId);\n });\n } else {\n updateDraft(chatId, threadId);\n }\n }, [chatId, html, prevChatId, prevHtml, prevThreadId, runDebouncedForSaveDraft, threadId, updateDraft]);\n\n // Subscribe and handle `window.blur`\n useEffect(() => {\n function handleBlur() {\n if (chatId && threadId) {\n updateDraft(chatId, threadId);\n }\n }\n\n window.addEventListener('blur', handleBlur);\n\n return () => {\n window.removeEventListener('blur', handleBlur);\n };\n }, [chatId, threadId, updateDraft]);\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './DeleteMessageModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst DeleteMessageModalAsync: FC = (props) => {\n const { isOpen } = props;\n const DeleteMessageModal = useModuleLoader(Bundles.Extra, 'DeleteMessageModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DeleteMessageModal ? : undefined;\n};\n\nexport default memo(DeleteMessageModalAsync);\n","import React, {\n FC, useRef, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\ntype OwnProps = {\n onActivate: NoneToVoidFunction;\n} & Omit;\n\nconst BUTTON_ACTIVATE_DELAY = 200;\nlet openTimeout: number | undefined;\nlet isFirstTimeActivation = true;\n\nconst ResponsiveHoverButton: FC = ({ onActivate, ...buttonProps }) => {\n const isMouseInside = useRef(false);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n\n // This is used to counter additional delay caused by asynchronous module loading\n if (isFirstTimeActivation) {\n isFirstTimeActivation = false;\n onActivate();\n return;\n }\n\n if (openTimeout) {\n clearTimeout(openTimeout);\n openTimeout = undefined;\n }\n openTimeout = window.setTimeout(() => {\n if (isMouseInside.current) {\n onActivate();\n }\n }, BUTTON_ACTIVATE_DELAY);\n }, [onActivate]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n }, []);\n\n return (\n \n );\n};\n\nexport default memo(ResponsiveHoverButton);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const AttachMenu = useModuleLoader(Bundles.Extra, 'AttachMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachMenu ? : undefined;\n};\n\nexport default memo(AttachMenuAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './SymbolMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst SymbolMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const SymbolMenu = useModuleLoader(Bundles.Extra, 'SymbolMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SymbolMenu ? : undefined;\n};\n\nexport default memo(SymbolMenuAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './MentionTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst MentionTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const MentionTooltip = useModuleLoader(Bundles.Extra, 'MentionTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MentionTooltip ? : undefined;\n};\n\nexport default memo(MentionTooltipAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './CustomSendMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst CustomSendMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const CustomSend = useModuleLoader(Bundles.Extra, 'CustomSendMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CustomSend ? : undefined;\n};\n\nexport default memo(CustomSendMenuAsync);\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './StickerTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst StickerTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerTooltip = useModuleLoader(Bundles.Extra, 'StickerTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerTooltip ? : undefined;\n};\n\nexport default StickerTooltipAsync;\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './BotKeyboardMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst BotKeyboardMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const BotKeyboardMenu = useModuleLoader(Bundles.Extra, 'BotKeyboardMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return BotKeyboardMenu ? : undefined;\n};\n\nexport default memo(BotKeyboardMenuAsync);\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\n\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectForwardedSender,\n selectUser,\n selectCurrentMessageList,\n selectReplyingToId,\n selectEditingId,\n selectEditingScheduledId,\n selectEditingMessage,\n} from '../../../modules/selectors';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport { isChatPrivate } from '../../../modules/helpers';\n\nimport Button from '../../ui/Button';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\n\nimport './ComposerEmbeddedMessage.scss';\n\ntype StateProps = {\n replyingToId?: number;\n editingId?: number;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n shouldAnimate?: boolean;\n forwardedMessagesCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FORWARD_RENDERING_DELAY = 300;\n\nconst ComposerEmbeddedMessage: FC = ({\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount,\n setReplyingToId,\n setEditingId,\n focusMessage,\n exitForwardMode,\n}) => {\n const isShown = Boolean(\n ((replyingToId || editingId) && message)\n || (sender && forwardedMessagesCount),\n );\n const canAnimate = useAsyncRendering(\n [forwardedMessagesCount],\n forwardedMessagesCount ? FORWARD_RENDERING_DELAY : undefined,\n );\n\n const {\n shouldRender, transitionClassNames,\n } = useShowTransition(canAnimate && isShown, undefined, !shouldAnimate, undefined, !shouldAnimate);\n\n const clearEmbedded = useCallback(() => {\n if (replyingToId) {\n setReplyingToId({ messageId: undefined });\n } else if (editingId) {\n setEditingId({ messageId: undefined });\n } else if (forwardedMessagesCount) {\n exitForwardMode();\n }\n }, [replyingToId, editingId, forwardedMessagesCount, setReplyingToId, setEditingId, exitForwardMode]);\n\n useEffect(() => (isShown ? captureEscKeyListener(clearEmbedded) : undefined), [isShown, clearEmbedded]);\n\n const handleMessageClick = useCallback((): void => {\n focusMessage({ chatId: message!.chatId, messageId: message!.id });\n }, [focusMessage, message]);\n\n const className = buildClassName('ComposerEmbeddedMessage', transitionClassNames);\n\n const customText = forwardedMessagesCount && forwardedMessagesCount > 1\n ? `${forwardedMessagesCount} forwarded messages`\n : undefined;\n\n if (!shouldRender) {\n return undefined;\n }\n\n return (\n
\n
\n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId || !messageListType) {\n return {};\n }\n\n const {\n currentUserId,\n forwardMessages: { fromChatId, toChatId, messageIds: forwardMessageIds },\n } = global;\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const editingId = messageListType === 'scheduled'\n ? selectEditingScheduledId(global, chatId)\n : selectEditingId(global, chatId, threadId);\n const shouldAnimate = global.settings.byKey.animationLevel >= 1;\n const isForwarding = toChatId === chatId;\n\n let message;\n if (replyingToId) {\n message = selectChatMessage(global, chatId, replyingToId);\n } else if (editingId) {\n message = selectEditingMessage(global, chatId, threadId, messageListType);\n } else if (isForwarding && forwardMessageIds!.length === 1) {\n message = selectChatMessage(global, fromChatId!, forwardMessageIds![0]);\n }\n\n let sender: ApiChat | ApiUser | undefined;\n if (replyingToId && message) {\n const { forwardInfo } = message;\n const isChatWithSelf = chatId === currentUserId;\n\n if (forwardInfo && (forwardInfo.isChannelPost || isChatWithSelf)) {\n sender = selectForwardedSender(global, message);\n }\n\n if (!sender) {\n sender = selectSender(global, message);\n }\n } else if (isForwarding) {\n sender = isChatPrivate(fromChatId!) ? selectUser(global, fromChatId!) : selectChat(global, fromChatId!);\n }\n\n return {\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount: isForwarding ? forwardMessageIds!.length : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'focusMessage',\n 'exitForwardMode',\n ]),\n)(ComposerEmbeddedMessage));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachmentModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachmentModalAsync: FC = (props) => {\n const { attachments } = props;\n const AttachmentModal = useModuleLoader(Bundles.Extra, 'AttachmentModal', !attachments.length);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachmentModal ? : undefined;\n};\n\nexport default memo(AttachmentModalAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './PollModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst PollModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PollModal = useModuleLoader(Bundles.Extra, 'PollModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PollModal ? : undefined;\n};\n\nexport default memo(PollModalAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './DropArea';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst DropAreaAsync: FC = (props) => {\n const { isOpen } = props;\n const DropArea = useModuleLoader(Bundles.Extra, 'DropArea', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DropArea ? : undefined;\n};\n\nexport default memo(DropAreaAsync);\nexport { DropAreaState } from './DropArea';\n","import React, {\n FC, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage, ApiMessageEntityTypes, ApiWebPage } from '../../../api/types';\n\nimport { RE_LINK_TEMPLATE } from '../../../config';\nimport { selectNoWebPage } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../../hooks/useCurrentOrPrev';\nimport buildClassName from '../../../util/buildClassName';\n\nimport WebPage from '../message/WebPage';\nimport Button from '../../ui/Button';\n\nimport './WebPagePreview.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageText: string;\n disabled?: boolean;\n};\n\ntype StateProps = {\n webPagePreview?: ApiWebPage;\n noWebPage?: boolean;\n};\ntype DispatchProps = Pick;\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nconst WebPagePreview: FC = ({\n chatId,\n threadId,\n messageText,\n disabled,\n webPagePreview,\n noWebPage,\n loadWebPagePreview,\n clearWebPagePreview,\n toggleMessageWebPage,\n}) => {\n const link = useMemo(() => {\n const { text, entities } = parseMessageInput(messageText);\n\n const linkEntity = entities && entities.find(({ type }) => type === ApiMessageEntityTypes.TextUrl);\n if (linkEntity) {\n return linkEntity.url;\n }\n\n const textMatch = text.match(RE_LINK);\n if (textMatch) {\n return textMatch[0];\n }\n\n return undefined;\n }, [messageText]);\n\n useEffect(() => {\n if (link) {\n loadWebPagePreview({ text: link });\n } else {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }\n }, [chatId, toggleMessageWebPage, clearWebPagePreview, link, loadWebPagePreview, threadId]);\n\n useOnChange(() => {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }, [chatId]);\n\n const isShown = Boolean(webPagePreview && messageText.length && !noWebPage && !disabled);\n const { shouldRender, transitionClassNames } = useShowTransition(isShown);\n\n const renderingWebPage = useCurrentOrPrev(webPagePreview);\n\n if (!shouldRender || !renderingWebPage) {\n return undefined;\n }\n\n const handleClearWebpagePreview = () => {\n toggleMessageWebPage({ chatId, threadId, noWebPage: true });\n };\n\n // TODO Refactor so `WebPage` can be used without message\n const { photo, ...webPageWithoutPhoto } = renderingWebPage;\n const messageStub = {\n content: {\n webPage: webPageWithoutPhoto,\n },\n } as ApiMessage;\n\n return (\n
\n
\n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId }): StateProps => {\n const noWebPage = selectNoWebPage(global, chatId, threadId);\n return {\n webPagePreview: global.webPagePreview,\n noWebPage,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWebPagePreview', 'clearWebPagePreview', 'toggleMessageWebPage',\n ]),\n)(WebPagePreview));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './CalendarModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst CalendarModalAsync: FC = (props) => {\n const { isOpen } = props;\n const CalendarModal = useModuleLoader(Bundles.Extra, 'CalendarModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CalendarModal ? : undefined;\n};\n\nexport default memo(CalendarModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './PaymentModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst PaymentModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PaymentModal = useModuleLoader(Bundles.Extra, 'PaymentModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PaymentModal ? : undefined;\n};\n\nexport default memo(PaymentModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ReceiptModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ReceiptModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ReceiptModal = useModuleLoader(Bundles.Extra, 'ReceiptModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ReceiptModal ? : undefined;\n};\n\nexport default memo(ReceiptModalAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState, MessageListType } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessage,\n ApiFormattedText,\n ApiChat,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { LangCode } from '../../../types';\n\nimport { EDITABLE_INPUT_ID, SCHEDULED_WHEN_ONLINE } from '../../../config';\nimport { IS_VOICE_RECORDING_SUPPORTED, IS_MOBILE_SCREEN, IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport {\n selectChat,\n selectIsChatWithBot,\n selectIsRightColumnShown,\n selectIsInSelectMode,\n selectNewestMessageWithBotKeyboardButtons,\n selectDraft,\n selectScheduledIds,\n selectEditingMessage,\n selectIsChatWithSelf,\n selectChatUser,\n selectEmojiKeywords,\n} from '../../../modules/selectors';\nimport {\n getAllowedAttachmentOptions,\n getChatSlowModeOptions,\n isChatGroup,\n isChatPrivate,\n isChatAdmin,\n} from '../../../modules/helpers';\nimport { formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport buildAttachment from './helpers/buildAttachment';\nimport renderText from '../../common/helpers/renderText';\nimport insertHtmlInSelection from '../../../util/insertHtmlInSelection';\nimport deleteLastCharacterOutsideSelection from '../../../util/deleteLastCharacterOutsideSelection';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { isSelectionInsideInput } from './helpers/selection';\n\nimport useFlag from '../../../hooks/useFlag';\nimport useVoiceRecording from './hooks/useVoiceRecording';\nimport useClipboardPaste from './hooks/useClipboardPaste';\nimport useDraft from './hooks/useDraft';\nimport useEditing from './hooks/useEditing';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useStickerTooltip from './hooks/useStickerTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLang from '../../../hooks/useLang';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal.async';\nimport Button from '../../ui/Button';\nimport ResponsiveHoverButton from '../../ui/ResponsiveHoverButton';\nimport Spinner from '../../ui/Spinner';\nimport AttachMenu from './AttachMenu.async';\nimport SymbolMenu from './SymbolMenu.async';\nimport MentionTooltip from './MentionTooltip.async';\nimport CustomSendMenu from './CustomSendMenu.async';\nimport StickerTooltip from './StickerTooltip.async';\nimport EmojiTooltip from './EmojiTooltip.async';\nimport BotKeyboardMenu from './BotKeyboardMenu.async';\nimport MessageInput from './MessageInput';\nimport ComposerEmbeddedMessage from './ComposerEmbeddedMessage';\nimport AttachmentModal from './AttachmentModal.async';\nimport PollModal from './PollModal.async';\nimport DropArea, { DropAreaState } from './DropArea.async';\nimport WebPagePreview from './WebPagePreview';\nimport Portal from '../../ui/Portal';\nimport CalendarModal from '../../common/CalendarModal.async';\nimport PaymentModal from '../../payment/PaymentModal.async';\nimport ReceiptModal from '../../payment/ReceiptModal.async';\n\nimport './Composer.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n dropAreaState: string;\n onDropHide: NoneToVoidFunction;\n};\n\ntype StateProps = {\n editingMessage?: ApiMessage;\n chat?: ApiChat;\n draft?: ApiFormattedText;\n isChatWithBot?: boolean;\n isChatWithSelf?: boolean;\n isRightColumnShown?: boolean;\n isSelectModeActive?: boolean;\n isForwarding?: boolean;\n canSuggestMembers?: boolean;\n isPollModalOpen?: boolean;\n isPaymentModalOpen?: boolean;\n isReceiptModalOpen?: boolean;\n botKeyboardMessageId?: number;\n withScheduledButton?: boolean;\n shouldSchedule?: boolean;\n canScheduleUntilOnline?: boolean;\n stickersForEmoji?: ApiSticker[];\n groupChatMembers?: ApiChatMember[];\n currentUserId?: number;\n usersById?: Record;\n recentEmojis: string[];\n lastSyncTime?: number;\n contentToBeScheduled?: GlobalState['messages']['contentToBeScheduled'];\n shouldSuggestStickers?: boolean;\n language: LangCode;\n emojiKeywords?: Record;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nenum MainButtonState {\n Send = 'send',\n Record = 'record',\n Edit = 'edit',\n}\n\nconst VOICE_RECORDING_FILENAME = 'wonderful-voice-message.ogg';\n// When voice recording is active, composer placeholder will hide to prevent overlapping\nconst SCREEN_WIDTH_TO_HIDE_PLACEHOLDER = 600; // px\n\nconst MOBILE_KEYBOARD_HIDE_DELAY_MS = 100;\nconst SELECT_MODE_TRANSITION_MS = 200;\nconst CAPTION_MAX_LENGTH = 1024;\nconst SENDING_ANIMATION_DURATION = 350;\n// eslint-disable-next-line max-len\nconst APPENDIX = '';\n\nconst Composer: FC = ({\n dropAreaState,\n shouldSchedule,\n canScheduleUntilOnline,\n onDropHide,\n editingMessage,\n chatId,\n threadId,\n messageListType,\n draft,\n chat,\n connectionState,\n isChatWithBot,\n isChatWithSelf,\n isRightColumnShown,\n isSelectModeActive,\n isForwarding,\n canSuggestMembers,\n isPollModalOpen,\n isPaymentModalOpen,\n isReceiptModalOpen,\n botKeyboardMessageId,\n withScheduledButton,\n stickersForEmoji,\n groupChatMembers,\n currentUserId,\n usersById,\n lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n language,\n emojiKeywords,\n recentEmojis,\n sendMessage,\n editMessage,\n saveDraft,\n clearDraft,\n showError,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n closePaymentModal,\n openChat,\n clearReceipt,\n addRecentEmoji,\n loadEmojiKeywords,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n const [html, setHtml] = useState('');\n const lastMessageSendTimeSeconds = useRef();\n const prevDropAreaState = usePrevious(dropAreaState);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n const [\n scheduledMessageArgs, setScheduledMessageArgs,\n ] = useState();\n\n // Cache for frequently updated state\n const htmlRef = useRef(html);\n useEffect(() => {\n htmlRef.current = html;\n }, [html]);\n\n useEffect(() => {\n lastMessageSendTimeSeconds.current = undefined;\n }, [chatId]);\n\n useEffect(() => {\n if (chatId && lastSyncTime && threadId === MAIN_THREAD_ID) {\n loadScheduledHistory();\n }\n }, [chatId, loadScheduledHistory, lastSyncTime, threadId]);\n\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\n\n appendixRef.current.innerHTML = APPENDIX;\n }, []);\n\n useEffect(() => {\n if (contentToBeScheduled) {\n setScheduledMessageArgs(contentToBeScheduled);\n openCalendar();\n }\n }, [contentToBeScheduled, openCalendar]);\n\n const [attachments, setAttachments] = useState([]);\n\n const [isBotKeyboardOpen, openBotKeyboard, closeBotKeyboard] = useFlag();\n const [isAttachMenuOpen, openAttachMenu, closeAttachMenu] = useFlag();\n const [isSymbolMenuOpen, openSymbolMenu, closeSymbolMenu] = useFlag();\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isSymbolMenuLoaded, onSymbolMenuLoadingComplete] = useFlag();\n const [isHoverDisabled, disableHover, enableHover] = useFlag();\n\n const {\n startRecordingVoice,\n stopRecordingVoice,\n pauseRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef: mainButtonRef,\n startRecordTimeRef,\n } = useVoiceRecording();\n\n const mainButtonState = editingMessage\n ? MainButtonState.Edit\n : !IS_VOICE_RECORDING_SUPPORTED || activeVoiceRecording || (html && !attachments.length) || isForwarding\n ? MainButtonState.Send\n : MainButtonState.Record;\n const canShowCustomSendMenu = !shouldSchedule;\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredMembers,\n } = useMentionTooltip(\n canSuggestMembers && !attachments.length,\n html,\n setHtml,\n undefined,\n groupChatMembers,\n currentUserId,\n usersById,\n );\n\n const {\n isContextMenuOpen: isCustomSendMenuOpen,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n } = useContextMenuHandlers(mainButtonRef, !(mainButtonState === MainButtonState.Send && canShowCustomSendMenu));\n\n const allowedAttachmentOptions = useMemo(() => {\n return getAllowedAttachmentOptions(chat, isChatWithBot);\n }, [chat, isChatWithBot]);\n\n const isAdmin = chat && isChatAdmin(chat);\n const slowMode = getChatSlowModeOptions(chat);\n\n const { isStickerTooltipOpen, closeStickerTooltip } = useStickerTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n stickersForEmoji,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n recentEmojis,\n undefined,\n setHtml,\n emojiKeywords,\n );\n\n const insertTextAndUpdateCursor = useCallback((text: string, inputId: string = EDITABLE_INPUT_ID) => {\n const selection = window.getSelection()!;\n const messageInput = document.getElementById(inputId)!;\n const newHtml = renderText(text, ['escape_html', 'emoji_html', 'br_html'])\n .join('')\n .replace(/\\u200b+/g, '\\u200b');\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange)) {\n if (IS_EMOJI_SUPPORTED) {\n // Insertion will trigger `onChange` in MessageInput, so no need to setHtml in state\n document.execCommand('insertText', false, text);\n } else {\n insertHtmlInSelection(newHtml);\n messageInput.dispatchEvent(new Event('input', { bubbles: true }));\n }\n return;\n }\n }\n\n setHtml(`${htmlRef.current!}${newHtml}`);\n\n if (!IS_MOBILE_SCREEN) {\n // If selection is outside of input, set cursor at the end of input\n requestAnimationFrame(() => {\n focusEditableElement(messageInput);\n });\n }\n }, []);\n\n const removeSymbol = useCallback(() => {\n const selection = window.getSelection()!;\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange)) {\n document.execCommand('delete', false);\n return;\n }\n }\n\n setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!));\n }, []);\n\n const resetComposer = useCallback(() => {\n setHtml('');\n setAttachments([]);\n closeStickerTooltip();\n closeCalendar();\n setScheduledMessageArgs(undefined);\n closeMentionTooltip();\n closeEmojiTooltip();\n\n if (IS_MOBILE_SCREEN) {\n // @perf\n setTimeout(() => closeSymbolMenu(), SENDING_ANIMATION_DURATION);\n } else {\n closeSymbolMenu();\n }\n }, [closeStickerTooltip, closeCalendar, closeMentionTooltip, closeEmojiTooltip, closeSymbolMenu]);\n\n // Handle chat change\n const prevChatId = usePrevious(chatId);\n useEffect(() => {\n if (!prevChatId || chatId === prevChatId) {\n return;\n }\n\n stopRecordingVoice();\n resetComposer();\n }, [chatId, prevChatId, resetComposer, stopRecordingVoice]);\n\n const handleEditComplete = useEditing(htmlRef, setHtml, editingMessage, resetComposer, openDeleteModal, editMessage);\n useDraft(draft, chatId, threadId, html, htmlRef, setHtml, editingMessage, saveDraft, clearDraft);\n useClipboardPaste(insertTextAndUpdateCursor, setAttachments, editingMessage);\n\n const handleFileSelect = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments(await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))));\n }, []);\n\n const handleAppendFiles = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments([\n ...attachments,\n ...await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))),\n ]);\n }, [attachments]);\n\n const handleClearAttachment = useCallback(() => {\n setAttachments([]);\n }, []);\n\n const handleSend = useCallback(async (isSilent = false, scheduledAt?: number) => {\n if (connectionState !== 'connectionStateReady') {\n return;\n }\n\n let currentAttachments = attachments;\n\n if (activeVoiceRecording) {\n const record = await stopRecordingVoice();\n if (record) {\n const { blob, duration, waveform } = record;\n currentAttachments = [await buildAttachment(\n VOICE_RECORDING_FILENAME,\n blob,\n false,\n { voice: { duration, waveform } },\n )];\n }\n }\n\n const { text, entities } = parseMessageInput(htmlRef.current!);\n if (!currentAttachments.length && !text && !isForwarding) {\n return;\n }\n\n if (currentAttachments.length && text && text.length > CAPTION_MAX_LENGTH) {\n const extraLength = text.length - CAPTION_MAX_LENGTH;\n showError({\n error: {\n message: 'CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS',\n textParams: {\n '{EXTRA_CHARS_COUNT}': extraLength,\n '{PLURAL_S}': extraLength > 1 ? 's' : '',\n },\n },\n });\n return;\n }\n\n if (currentAttachments.length || text) {\n if (slowMode && !isAdmin) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const secondsSinceLastMessage = lastMessageSendTimeSeconds.current\n && Math.floor(nowSeconds - lastMessageSendTimeSeconds.current);\n const nextSendDateNotReached = slowMode.nextSendDate && slowMode.nextSendDate > nowSeconds;\n\n if (\n (secondsSinceLastMessage && secondsSinceLastMessage < slowMode.seconds)\n || nextSendDateNotReached\n ) {\n const secondsRemaining = nextSendDateNotReached\n ? slowMode.nextSendDate! - nowSeconds\n : slowMode.seconds - secondsSinceLastMessage!;\n showError({\n error: {\n message: `A wait of ${secondsRemaining} seconds is required before sending another message in this chat`,\n isSlowMode: true,\n },\n });\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n messageInput.blur();\n\n return;\n }\n }\n\n sendMessage({\n text,\n entities,\n attachments: currentAttachments,\n scheduledAt,\n isSilent,\n });\n }\n if (isForwarding) {\n forwardMessages();\n }\n\n lastMessageSendTimeSeconds.current = Math.floor(Date.now() / 1000);\n\n clearDraft({ chatId, localOnly: true });\n\n // Wait until message animation starts\n requestAnimationFrame(resetComposer);\n }, [\n activeVoiceRecording, attachments, connectionState, chatId, slowMode, isForwarding, isAdmin,\n sendMessage, stopRecordingVoice, resetComposer, clearDraft, showError, forwardMessages,\n ]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n if (shouldSchedule) {\n setScheduledMessageArgs({ sticker });\n openCalendar();\n } else {\n sendMessage({ sticker });\n requestAnimationFrame(resetComposer);\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handleGifSelect = useCallback((gif: ApiVideo) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ gif });\n openCalendar();\n } else {\n sendMessage({ gif });\n requestAnimationFrame(resetComposer);\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handlePollSend = useCallback((poll: ApiNewPoll) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ poll });\n closePollModal();\n openCalendar();\n } else {\n sendMessage({ poll });\n closePollModal();\n }\n }, [closePollModal, openCalendar, sendMessage, shouldSchedule]);\n\n const handleSilentSend = useCallback(() => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ isSilent: true });\n openCalendar();\n } else {\n handleSend(true);\n }\n }, [handleSend, openCalendar, shouldSchedule]);\n\n const handleMessageSchedule = useCallback((date: Date) => {\n const { isSilent, ...restArgs } = scheduledMessageArgs || {};\n\n // Scheduled time can not be less than 10 seconds in future\n const scheduledAt = Math.round(Math.max(date.getTime(), Date.now() + 60 * 1000) / 1000);\n\n if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) {\n handleSend(!!isSilent, scheduledAt);\n } else {\n sendMessage({\n ...scheduledMessageArgs,\n scheduledAt,\n });\n requestAnimationFrame(resetComposer);\n }\n closeCalendar();\n }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage]);\n\n const handleMessageScheduleUntilOnline = useCallback(() => {\n handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000));\n }, [handleMessageSchedule]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n setScheduledMessageArgs(undefined);\n }, [closeCalendar]);\n\n const handleSearchOpen = useCallback((type: 'stickers' | 'gifs') => {\n if (type === 'stickers') {\n setStickerSearchQuery({ query: '' });\n setGifSearchQuery({ query: undefined });\n } else {\n setGifSearchQuery({ query: '' });\n setStickerSearchQuery({ query: undefined });\n }\n }, [setStickerSearchQuery, setGifSearchQuery]);\n\n const handleSymbolMenuOpen = useCallback(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (!IS_MOBILE_SCREEN || messageInput !== document.activeElement) {\n openSymbolMenu();\n return;\n }\n\n messageInput.blur();\n setTimeout(() => {\n openSymbolMenu();\n }, MOBILE_KEYBOARD_HIDE_DELAY_MS);\n }, [openSymbolMenu]);\n\n const handleAllScheduledClick = useCallback(() => {\n openChat({ id: chatId, threadId, type: 'scheduled' });\n }, [openChat, chatId, threadId]);\n\n useEffect(() => {\n if (isRightColumnShown && IS_MOBILE_SCREEN) {\n closeSymbolMenu();\n }\n }, [isRightColumnShown, closeSymbolMenu]);\n\n useEffect(() => {\n if (isSelectModeActive) {\n disableHover();\n } else {\n setTimeout(() => {\n enableHover();\n }, SELECT_MODE_TRANSITION_MS);\n }\n }, [isSelectModeActive, enableHover, disableHover]);\n\n const mainButtonHandler = useCallback(() => {\n switch (mainButtonState) {\n case MainButtonState.Send:\n if (shouldSchedule) {\n if (activeVoiceRecording) {\n pauseRecordingVoice();\n }\n openCalendar();\n } else {\n handleSend();\n requestAnimationFrame(resetComposer);\n }\n break;\n case MainButtonState.Record:\n startRecordingVoice();\n break;\n case MainButtonState.Edit:\n handleEditComplete();\n break;\n default:\n break;\n }\n }, [\n mainButtonState, resetComposer, shouldSchedule, startRecordingVoice, handleEditComplete,\n activeVoiceRecording, openCalendar, pauseRecordingVoice, handleSend,\n ]);\n\n const lang = useLang();\n\n const areVoiceMessagesNotAllowed = mainButtonState === MainButtonState.Record\n && !allowedAttachmentOptions.canAttachMedia;\n\n const prevEditedMessage = usePrevious(editingMessage, true);\n const renderedEditedMessage = editingMessage || prevEditedMessage;\n\n const scheduledDefaultDate = new Date();\n scheduledDefaultDate.setSeconds(0);\n scheduledDefaultDate.setMilliseconds(0);\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n let sendButtonAriaLabel = 'SendMessage';\n switch (mainButtonState) {\n case MainButtonState.Edit:\n sendButtonAriaLabel = 'Save edited message';\n break;\n case MainButtonState.Record:\n sendButtonAriaLabel = areVoiceMessagesNotAllowed\n ? 'Conversation.DefaultRestrictedMedia'\n : 'AccDescrVoiceMessage';\n }\n\n const className = buildClassName(\n 'Composer',\n !isSelectModeActive && 'shown',\n isHoverDisabled && 'hover-disabled',\n );\n\n const symbolMenuButtonClassName = buildClassName(\n 'mobile-symbol-menu-button',\n isSymbolMenuLoaded\n ? (isSymbolMenuOpen && 'menu-opened')\n : (isSymbolMenuOpen && 'is-loading'),\n );\n\n return (\n
\n {allowedAttachmentOptions.canAttachMedia && (\n \n \n \n )}\n \n \n \n \n {renderedEditedMessage && (\n \n )}\n \n
\n
\n \n \n
\n {IS_MOBILE_SCREEN ? (\n \n \n \n \n \n ) : (\n \n \n \n )}\n \n {withScheduledButton && (\n \n \n \n )}\n {botKeyboardMessageId && !activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {!activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {activeVoiceRecording && currentRecordTime && (\n \n {formatVoiceRecordDuration(currentRecordTime - startRecordTimeRef.current!)}\n \n )}\n \n \n \n {botKeyboardMessageId && (\n \n )}\n \n
\n
\n {activeVoiceRecording && (\n \n \n \n )}\n \n \n \n \n \n {canShowCustomSendMenu && (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const chatUser = chat && selectChatUser(global, chat);\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const messageWithActualBotKeyboard = isChatWithBot && selectNewestMessageWithBotKeyboardButtons(global, chatId);\n const scheduledIds = selectScheduledIds(global, chatId);\n const { language } = global.settings.byKey;\n const emojiKeywords = selectEmojiKeywords(global, language);\n\n return {\n editingMessage: selectEditingMessage(global, chatId, threadId, messageListType),\n connectionState: global.connectionState,\n draft: selectDraft(global, chatId, threadId),\n chat,\n isChatWithBot,\n isChatWithSelf,\n canScheduleUntilOnline: (\n !isChatWithSelf && !isChatWithBot\n && (chat && chatUser && isChatPrivate(chatId) && chatUser.status && Boolean(chatUser.status.wasOnline))\n ),\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n withScheduledButton: (\n threadId === MAIN_THREAD_ID\n && messageListType === 'thread'\n && Boolean(scheduledIds && scheduledIds.length)\n ),\n shouldSchedule: messageListType === 'scheduled',\n botKeyboardMessageId: messageWithActualBotKeyboard ? messageWithActualBotKeyboard.id : undefined,\n isForwarding: chatId === global.forwardMessages.toChatId,\n canSuggestMembers: chat && isChatGroup(chat),\n isPollModalOpen: global.isPollModalOpen,\n stickersForEmoji: global.stickers.forEmoji.stickers,\n groupChatMembers: chat && chat.fullInfo && chat.fullInfo.members,\n currentUserId: global.currentUserId,\n usersById: global.users.byId,\n lastSyncTime: global.lastSyncTime,\n contentToBeScheduled: global.messages.contentToBeScheduled,\n isPaymentModalOpen: global.payment.isPaymentModalOpen,\n isReceiptModalOpen: Boolean(global.payment.receipt),\n shouldSuggestStickers: global.settings.byKey.shouldSuggestStickers,\n recentEmojis: global.recentEmojis,\n language,\n emojiKeywords: emojiKeywords ? emojiKeywords.keywords : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendMessage',\n 'editMessage',\n 'saveDraft',\n 'clearDraft',\n 'showError',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'forwardMessages',\n 'openPollModal',\n 'closePollModal',\n 'closePaymentModal',\n 'clearReceipt',\n 'loadScheduledHistory',\n 'openChat',\n 'addRecentEmoji',\n 'loadEmojiKeywords',\n ]),\n)(Composer));\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\n\nimport { IS_IOS } from '../../../../util/environment';\nimport * as voiceRecording from '../../../../util/voiceRecording';\nimport captureEscKeyListener from '../../../../util/captureEscKeyListener';\n\ntype ActiveVoiceRecording = { stop: () => Promise; pause: NoneToVoidFunction } | undefined;\n\nexport default () => {\n // eslint-disable-next-line no-null/no-null\n const recordButtonRef = useRef(null);\n const [activeVoiceRecording, setActiveVoiceRecording] = useState();\n const startRecordTimeRef = useRef();\n const [currentRecordTime, setCurrentRecordTime] = useState();\n\n useEffect(() => {\n // Preloading worker fixes silent first record on iOS\n if (IS_IOS) {\n void voiceRecording.init();\n }\n }, []);\n\n const startRecordingVoice = useCallback(async () => {\n try {\n const { stop, pause } = await voiceRecording.start((tickVolume: number) => {\n if (recordButtonRef.current) {\n if (startRecordTimeRef.current && Date.now() % 4 === 0) {\n recordButtonRef.current.style.boxShadow = `0 0 0 ${(tickVolume || 0) * 50}px rgba(0,0,0,.15)`;\n }\n setCurrentRecordTime(Date.now());\n }\n });\n startRecordTimeRef.current = Date.now();\n setCurrentRecordTime(Date.now());\n\n setActiveVoiceRecording({ stop, pause });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }, []);\n\n const pauseRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n\n try {\n return activeVoiceRecording!.pause();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n const stopRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n setActiveVoiceRecording(undefined);\n startRecordTimeRef.current = undefined;\n setCurrentRecordTime(undefined);\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n try {\n return activeVoiceRecording!.stop();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n useEffect(() => {\n return activeVoiceRecording ? captureEscKeyListener(stopRecordingVoice) : undefined;\n }, [activeVoiceRecording, stopRecordingVoice]);\n\n return {\n startRecordingVoice,\n pauseRecordingVoice,\n stopRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef,\n startRecordTimeRef,\n };\n};\n","import { useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nimport parseEmojiOnlyString from '../../../common/helpers/parseEmojiOnlyString';\n\nexport default function useStickerTooltip(\n isAllowed: boolean,\n html: string,\n stickers?: ApiSticker[],\n) {\n const { loadStickersForEmoji, clearStickersForEmoji } = getDispatch();\n const isSingleEmoji = (\n (IS_EMOJI_SUPPORTED && parseEmojiOnlyString(html) === 1)\n || (!IS_EMOJI_SUPPORTED && Boolean(html.match(/^]*?>$/g)))\n );\n const hasStickers = Boolean(stickers) && isSingleEmoji;\n\n useEffect(() => {\n if (isAllowed && isSingleEmoji) {\n loadStickersForEmoji({ emoji: html });\n } else if (hasStickers || !isSingleEmoji) {\n clearStickersForEmoji();\n }\n // We omit `hasStickers` here to prevent re-fetching after manually closing tooltip (via ).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [html, isSingleEmoji, clearStickersForEmoji, loadStickersForEmoji, isAllowed]);\n\n return {\n isStickerTooltipOpen: hasStickers,\n closeStickerTooltip: clearStickersForEmoji,\n };\n}\n","export default function insertHtmlInSelection(html: string) {\n const selection = window.getSelection();\n\n if (selection && selection.getRangeAt && selection.rangeCount) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n\n const fragment = range.createContextualFragment(html);\n const lastInsertedNode = fragment.lastChild;\n range.insertNode(fragment);\n if (lastInsertedNode) {\n range.setStartAfter(lastInsertedNode);\n range.setEndAfter(lastInsertedNode);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n}\n","export default function deleteLastCharacterOutsideSelection(html: string) {\n const tempInput = document.createElement('div');\n tempInput.contentEditable = 'true';\n tempInput.style.position = 'absolute';\n tempInput.style.left = '-10000px';\n tempInput.style.top = '-10000px';\n tempInput.innerHTML = html;\n document.body.appendChild(tempInput);\n let element = tempInput.lastChild!;\n\n if (element.lastChild) {\n // Selects the last and the deepest child of the element.\n while (element.lastChild) {\n element = element.lastChild;\n }\n }\n\n // Gets length of the element's content.\n const textLength = element.textContent!.length;\n const range = document.createRange();\n const selection = window.getSelection()!;\n\n // Sets selection position to the end of the element.\n range.setStart(element, textLength);\n range.setEnd(element, textLength);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('delete', false);\n\n const result = tempInput.innerHTML;\n document.body.removeChild(tempInput);\n\n return result;\n}\n","import { useCallback, useEffect } from '../../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport { hasMessageMedia } from '../../../../modules/helpers';\n\nexport default (\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n resetComposer: () => void,\n openDeleteModal: () => void,\n editMessage: GlobalActions['editMessage'],\n) => {\n // TODO useOnChange\n // Handle editing message\n useEffect(() => {\n if (!editedMessage) {\n setHtml('');\n return;\n }\n\n setHtml(getMessageTextAsHtml(editedMessage.content.text));\n\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }, [editedMessage, setHtml]);\n\n const handleEditComplete = useCallback(() => {\n const { text, entities } = parseMessageInput(htmlRef.current!);\n\n if (!editedMessage) {\n return;\n }\n\n if (!text && !hasMessageMedia(editedMessage)) {\n openDeleteModal();\n return;\n }\n\n editMessage({\n messageId: editedMessage.id,\n text,\n entities,\n });\n\n resetComposer();\n }, [editMessage, editedMessage, htmlRef, openDeleteModal, resetComposer]);\n\n return handleEditComplete;\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './MobileSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MobileSearchAsync: FC = (props) => {\n const { isActive } = props;\n const MobileSearch = useModuleLoader(Bundles.Extra, 'MobileSearch', !isActive, true);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MobileSearch ? : undefined;\n};\n\nexport default memo(MobileSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './MessageSelectToolbar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MessageSelectToolbarAsync: FC = (props) => {\n const { isActive } = props;\n const MessageSelectToolbar = useModuleLoader(Bundles.Extra, 'MessageSelectToolbar', !isActive);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MessageSelectToolbar ? : undefined;\n};\n\nexport default memo(MessageSelectToolbarAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './UnpinAllMessagesModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst UnpinAllMessagesModalAsync: FC = (props) => {\n const { isOpen } = props;\n const UnpinAllMessagesModal = useModuleLoader(Bundles.Extra, 'UnpinAllMessagesModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return UnpinAllMessagesModal ? : undefined;\n};\n\nexport default memo(UnpinAllMessagesModalAsync);\n","import React, {\n FC, useEffect, useState, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { ThemeKey } from '../../types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n ANIMATION_LEVEL_MAX,\n ANIMATION_END_DELAY,\n DARK_THEME_BG_COLOR,\n LIGHT_THEME_BG_COLOR,\n} from '../../config';\nimport { IS_MOBILE_SCREEN, IS_TOUCH_ENV, MASK_IMAGE_DISABLED } from '../../util/environment';\nimport { DropAreaState } from './composer/DropArea';\nimport {\n selectChat,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectPinnedIds,\n} from '../../modules/selectors';\nimport { getCanPostInChat, getMessageSendingRestrictionReason, isChatPrivate } from '../../modules/helpers';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport useCustomBackground from '../../hooks/useCustomBackground';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport usePrevDuringAnimation from '../../hooks/usePrevDuringAnimation';\nimport calculateMiddleFooterTransforms from './helpers/calculateMiddleFooterTransforms';\nimport useLang from '../../hooks/useLang';\n\nimport Transition from '../ui/Transition';\nimport MiddleHeader from './MiddleHeader';\nimport MessageList from './MessageList';\nimport ScrollDownButton from './ScrollDownButton';\nimport Composer from './composer/Composer';\nimport Button from '../ui/Button';\nimport MobileSearch from './MobileSearch.async';\nimport MessageSelectToolbar from './MessageSelectToolbar.async';\nimport UnpinAllMessagesModal from '../common/UnpinAllMessagesModal.async';\n\nimport './MiddleColumn.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageListType?: MessageListType;\n isPrivate?: boolean;\n isPinnedMessageList?: boolean;\n canPost?: boolean;\n messageSendingRestrictionReason?: string;\n hasPinnedOrAudioMessage?: boolean;\n pinnedMessagesCount?: number;\n theme: ThemeKey;\n customBackground?: string;\n backgroundColor?: string;\n patternColor?: string;\n isRightColumnShown?: boolean;\n isBackgroundBlurred?: boolean;\n isMobileSearchActive?: boolean;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = IS_MOBILE_SCREEN ? 450 + ANIMATION_END_DELAY : undefined;\n\nfunction canBeQuicklyUploaded(item: DataTransferItem) {\n return item.kind === 'file' && item.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.includes(item.type);\n}\n\nconst MiddleColumn: FC = ({\n chatId,\n threadId,\n messageListType,\n isPrivate,\n isPinnedMessageList,\n canPost,\n messageSendingRestrictionReason,\n hasPinnedOrAudioMessage,\n pinnedMessagesCount,\n customBackground,\n theme,\n backgroundColor,\n patternColor,\n isRightColumnShown,\n isBackgroundBlurred,\n isMobileSearchActive,\n isSelectModeActive,\n animationLevel,\n openChat,\n unpinAllMessages,\n loadUser,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const [dropAreaState, setDropAreaState] = useState(DropAreaState.None);\n const [isFabShown, setIsFabShown] = useState();\n const [isNotchShown, setIsNotchShown] = useState();\n const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false);\n\n const hasTools = hasPinnedOrAudioMessage && (\n windowWidth < MOBILE_SCREEN_MAX_WIDTH\n || (\n isRightColumnShown && windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ) || (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n )\n );\n\n const renderingChatId = usePrevDuringAnimation(chatId, CLOSE_ANIMATION_DURATION);\n const renderingThreadId = usePrevDuringAnimation(threadId, CLOSE_ANIMATION_DURATION);\n const renderingMessageListType = usePrevDuringAnimation(messageListType, CLOSE_ANIMATION_DURATION);\n const renderingCanPost = usePrevDuringAnimation(canPost, CLOSE_ANIMATION_DURATION);\n const renderingHasTools = usePrevDuringAnimation(hasTools, CLOSE_ANIMATION_DURATION);\n const renderingIsFabShown = usePrevDuringAnimation(isFabShown, CLOSE_ANIMATION_DURATION);\n\n useEffect(() => {\n return chatId\n ? captureEscKeyListener(() => {\n openChat({ id: undefined });\n })\n : undefined;\n }, [chatId, openChat]);\n\n useEffect(() => {\n setDropAreaState(DropAreaState.None);\n setIsFabShown(undefined);\n setIsNotchShown(undefined);\n }, [chatId]);\n\n useEffect(() => {\n if (isPrivate) {\n loadUser({ userId: chatId });\n }\n }, [chatId, isPrivate, loadUser]);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n const { items } = e.dataTransfer || {};\n const shouldDrawQuick = items && Array.from(items).every(canBeQuicklyUploaded);\n\n setDropAreaState(shouldDrawQuick ? DropAreaState.QuickFile : DropAreaState.Document);\n }, []);\n\n const handleHideDropArea = useCallback(() => {\n setDropAreaState(DropAreaState.None);\n }, []);\n\n const handleOpenUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(true);\n }, []);\n\n const closeUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(false);\n }, []);\n\n const handleUnpinAllMessages = useCallback(() => {\n unpinAllMessages({ chatId });\n closeUnpinModal();\n openChat({ id: chatId });\n }, [unpinAllMessages, openChat, closeUnpinModal, chatId]);\n\n const customBackgroundValue = useCustomBackground(theme, customBackground);\n\n const className = buildClassName(\n renderingHasTools && 'has-header-tools',\n customBackground && 'custom-bg-image',\n backgroundColor && 'custom-bg-color',\n customBackground && isBackgroundBlurred && 'blurred',\n MASK_IMAGE_DISABLED ? 'mask-image-disabled' : 'mask-image-enabled',\n );\n\n const messagingDisabledClassName = buildClassName(\n 'messaging-disabled',\n !isSelectModeActive && 'shown',\n );\n\n // CSS Variables calculation doesn't work properly with transforms, so we calculate transform values in JS\n const {\n composerHiddenScale, toolbarHiddenScale,\n composerTranslateX, toolbarTranslateX,\n unpinHiddenScale, toolbarForUnpinHiddenScale,\n } = useMemo(\n () => calculateMiddleFooterTransforms(windowWidth, renderingCanPost),\n [renderingCanPost, windowWidth],\n );\n\n const lang = useLang();\n\n const footerClassName = buildClassName(\n 'middle-column-footer',\n !renderingCanPost && 'no-composer',\n renderingCanPost && isNotchShown && !isSelectModeActive && 'with-notch',\n );\n\n return (\n \n \n
\n {renderingChatId && renderingThreadId && (\n <>\n
\n \n \n {() => (\n <>\n \n
\n {renderingCanPost && (\n \n )}\n {isPinnedMessageList && (\n
\n \n \n {lang('Chat.Pinned.UnpinAll', pinnedMessagesCount, 'i')}\n \n
\n )}\n {!isPinnedMessageList && !renderingCanPost && messageSendingRestrictionReason && (\n
\n
\n \n {messageSendingRestrictionReason}\n \n
\n
\n )}\n \n
\n \n )}\n \n\n \n
\n {IS_MOBILE_SCREEN && }\n \n )}\n {chatId && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { theme } = global.settings.byKey;\n const {\n isBlurred: isBackgroundBlurred, background: customBackground, backgroundColor, patternColor,\n } = global.settings.themes[theme] || {};\n\n const currentMessageList = selectCurrentMessageList(global);\n const { chats: { listIds } } = global;\n\n const state: StateProps = {\n theme,\n customBackground,\n backgroundColor,\n patternColor,\n isRightColumnShown: selectIsRightColumnShown(global),\n isBackgroundBlurred,\n isMobileSearchActive: Boolean(IS_MOBILE_SCREEN && selectCurrentTextSearch(global)),\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n };\n\n if (!currentMessageList || !listIds.active) {\n return state;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const pinnedIds = selectPinnedIds(global, chatId);\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n\n const canPost = chat && getCanPostInChat(chat, threadId);\n const isBotNotStarted = selectIsChatBotNotStarted(global, chatId);\n const isPinnedMessageList = messageListType === 'pinned';\n\n return {\n ...state,\n chatId,\n threadId,\n messageListType,\n isPrivate: isChatPrivate(chatId),\n canPost: !isPinnedMessageList && (!chat || canPost) && (!isBotNotStarted || IS_MOBILE_SCREEN),\n isPinnedMessageList,\n messageSendingRestrictionReason: chat && getMessageSendingRestrictionReason(chat),\n hasPinnedOrAudioMessage: (\n threadId !== MAIN_THREAD_ID\n || Boolean(pinnedIds && pinnedIds.length)\n || Boolean(audioChatId && audioMessageId)\n ),\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser',\n ]),\n)(MiddleColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { ThemeKey } from '../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../config';\nimport * as cacheApi from '../util/cacheApi';\nimport { preloadImage } from '../util/files';\n\nexport default (theme: ThemeKey, settingValue?: string) => {\n const [value, setValue] = useState(settingValue);\n\n useEffect(() => {\n if (!settingValue) {\n return;\n }\n\n if (settingValue.startsWith('#')) {\n setValue(settingValue);\n } else {\n cacheApi.fetch(CUSTOM_BG_CACHE_NAME, theme, cacheApi.Type.Blob)\n .then((blob) => {\n const url = URL.createObjectURL(blob);\n preloadImage(url)\n .then(() => {\n setValue(`url(${url})`);\n });\n });\n }\n }, [settingValue, theme]);\n\n return settingValue ? value : undefined;\n};\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { debounce } from '../../util/schedulers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport {\n selectChat,\n selectCurrentGifSearch,\n selectCurrentStickerSearch,\n selectCurrentTextSearch,\n selectIsChatWithSelf,\n} from '../../modules/selectors';\nimport { isChatAdmin, isChatChannel, isChatPrivate } from '../../modules/helpers';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport useLang from '../../hooks/useLang';\n\nimport SearchInput from '../ui/SearchInput';\nimport Button from '../ui/Button';\nimport Transition from '../ui/Transition';\nimport './RightHeader.scss';\nimport { getDayStartAt } from '../../util/dateFormat';\n\ntype OwnProps = {\n chatId?: number;\n isColumnOpen?: boolean;\n isProfile?: boolean;\n isSearch?: boolean;\n isManagement?: boolean;\n isStickerSearch?: boolean;\n isGifSearch?: boolean;\n isPollResults?: boolean;\n profileState?: ProfileState;\n managementScreen?: ManagementScreens;\n onClose: () => void;\n};\n\ntype StateProps = {\n canManage?: boolean;\n isChannel?: boolean;\n messageSearchQuery?: string;\n stickerSearchQuery?: string;\n gifSearchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nenum HeaderContent {\n Profile,\n MemberList,\n SharedMedia,\n Search,\n Management,\n ManageInitial,\n ManageChannelSubscribers,\n ManageChatAdministrators,\n ManageChatPrivacyType,\n ManageDiscussion,\n ManageGroupPermissions,\n ManageGroupRemovedUsers,\n ManageGroupUserPermissionsCreate,\n ManageGroupUserPermissions,\n ManageGroupRecentActions,\n ManageGroupAdminRights,\n ManageGroupMembers,\n StickerSearch,\n GifSearch,\n PollResults,\n}\n\nconst RightHeader: FC = ({\n isColumnOpen,\n isProfile,\n isSearch,\n isManagement,\n isStickerSearch,\n isGifSearch,\n isPollResults,\n profileState,\n managementScreen,\n canManage,\n isChannel,\n onClose,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n setLocalTextSearchQuery,\n setStickerSearchQuery,\n setGifSearchQuery,\n searchTextMessagesLocal,\n toggleManagement,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backButtonRef = useRef(null);\n\n const handleMessageSearchQueryChange = useCallback((query: string) => {\n setLocalTextSearchQuery({ query });\n\n if (query.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleStickerSearchQueryChange = useCallback((query: string) => {\n setStickerSearchQuery({ query });\n }, [setStickerSearchQuery]);\n\n const handleGifSearchQueryChange = useCallback((query: string) => {\n setGifSearchQuery({ query });\n }, [setGifSearchQuery]);\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isColumnOpen);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isColumnOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isColumnOpen]);\n\n const lang = useLang();\n const contentKey = isProfile ? (\n profileState === ProfileState.Profile ? (\n HeaderContent.Profile\n ) : profileState === ProfileState.SharedMedia ? (\n HeaderContent.SharedMedia\n ) : profileState === ProfileState.MemberList ? (\n HeaderContent.MemberList\n ) : -1 // Never reached\n ) : isSearch ? (\n HeaderContent.Search\n ) : isPollResults ? (\n HeaderContent.PollResults\n ) : isStickerSearch ? (\n HeaderContent.StickerSearch\n ) : isGifSearch ? (\n HeaderContent.GifSearch\n ) : isManagement ? (\n managementScreen === ManagementScreens.Initial ? (\n HeaderContent.ManageInitial\n ) : managementScreen === ManagementScreens.ChatPrivacyType ? (\n HeaderContent.ManageChatPrivacyType\n ) : managementScreen === ManagementScreens.Discussion ? (\n HeaderContent.ManageDiscussion\n ) : managementScreen === ManagementScreens.ChannelSubscribers ? (\n HeaderContent.ManageChannelSubscribers\n ) : managementScreen === ManagementScreens.GroupPermissions ? (\n HeaderContent.ManageGroupPermissions\n ) : managementScreen === ManagementScreens.ChatAdministrators ? (\n HeaderContent.ManageChatAdministrators\n ) : managementScreen === ManagementScreens.GroupRemovedUsers ? (\n HeaderContent.ManageGroupRemovedUsers\n ) : managementScreen === ManagementScreens.GroupUserPermissionsCreate ? (\n HeaderContent.ManageGroupUserPermissionsCreate\n ) : managementScreen === ManagementScreens.GroupUserPermissions ? (\n HeaderContent.ManageGroupUserPermissions\n ) : managementScreen === ManagementScreens.GroupRecentActions ? (\n HeaderContent.ManageGroupRecentActions\n ) : managementScreen === ManagementScreens.ChatAdminRights ? (\n HeaderContent.ManageGroupAdminRights\n ) : managementScreen === ManagementScreens.GroupMembers ? (\n HeaderContent.ManageGroupMembers\n ) : undefined // Never reached\n ) : undefined; // When column is closed\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true) ?? -1;\n\n function renderHeaderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case HeaderContent.PollResults:\n return

{lang('PollResults')}

;\n case HeaderContent.Search:\n return (\n <>\n \n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n \n );\n case HeaderContent.ManageInitial:\n return

{lang('Edit')}

;\n case HeaderContent.ManageChatPrivacyType:\n return

{lang(isChannel ? 'ChannelTypeHeader' : 'GroupTypeHeader')}

;\n case HeaderContent.ManageDiscussion:\n return

{lang('Discussion')}

;\n case HeaderContent.ManageChatAdministrators:\n return

{lang('ChannelAdministrators')}

;\n case HeaderContent.ManageGroupRecentActions:\n return

{lang('Group.Info.AdminLog')}

;\n case HeaderContent.ManageGroupAdminRights:\n return

{lang('EditAdminRights')}

;\n case HeaderContent.ManageGroupPermissions:\n return

{lang('ChannelPermissions')}

;\n case HeaderContent.ManageGroupRemovedUsers:\n return

{lang('ChannelBlockedUsers')}

;\n case HeaderContent.ManageGroupUserPermissionsCreate:\n return

{lang('ChannelAddException')}

;\n case HeaderContent.ManageGroupUserPermissions:\n return

{lang('UserRestrictions')}

;\n case HeaderContent.StickerSearch:\n return (\n \n );\n case HeaderContent.GifSearch:\n return (\n \n );\n case HeaderContent.SharedMedia:\n return

{lang('SharedMedia')}

;\n case HeaderContent.ManageChannelSubscribers:\n return

{lang('ChannelSubscribers')}

;\n case HeaderContent.MemberList:\n case HeaderContent.ManageGroupMembers:\n return

{lang('GroupMembers')}

;\n default:\n return (\n <>\n

Profile

\n
\n {canManage && (\n \n \n \n )}\n
\n \n );\n }\n }\n\n const isBackButton = (\n IS_MOBILE_SCREEN\n || contentKey === HeaderContent.SharedMedia\n || contentKey === HeaderContent.MemberList\n || isManagement\n );\n\n const buttonClassName = buildClassName(\n 'animated-close-icon',\n shouldSkipTransition && 'no-transition',\n );\n\n // Add class in the next AF to synchronize with animation with Transition components\n useEffect(() => {\n backButtonRef.current!.classList.toggle('state-back', isBackButton);\n }, [isBackButton]);\n\n return (\n
\n \n
\n \n \n {renderHeaderContent}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, isProfile, isManagement }): StateProps => {\n const { query: messageSearchQuery } = selectCurrentTextSearch(global) || {};\n const { query: stickerSearchQuery } = selectCurrentStickerSearch(global) || {};\n const { query: gifSearchQuery } = selectCurrentGifSearch(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChannel = chat && isChatChannel(chat);\n\n const canManage = Boolean(\n !isManagement\n && isProfile\n && chat\n && !selectIsChatWithSelf(global, chat.id)\n // chat.isCreator is for Basic Groups\n && (isChatPrivate(chat.id) || ((isChatAdmin(chat) || chat.isCreator) && !chat.isNotJoined)),\n );\n\n return {\n canManage,\n isChannel,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'searchTextMessagesLocal',\n 'toggleManagement',\n 'openHistoryCalendar',\n ]),\n)(RightHeader));\n","import { useMemo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiChatMember, ApiMessage, ApiUser } from '../../../api/types';\nimport { ProfileTabType, SharedMediaType } from '../../../types';\n\nimport { MEMBERS_SLICE, MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { getMessageContentIds, sortUserIds } from '../../../modules/helpers';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nexport default function useProfileViewportIds(\n isRightColumnShown: boolean,\n loadMoreMembers: AnyToVoidFunction,\n searchMessages: AnyToVoidFunction,\n tabType: ProfileTabType,\n mediaSearchType?: SharedMediaType,\n groupChatMembers?: ApiChatMember[],\n usersById?: Record,\n chatMessages?: Record,\n foundIds?: number[],\n chatId?: number,\n lastSyncTime?: number,\n) {\n const resultType = tabType === 'members' || !mediaSearchType ? tabType : mediaSearchType;\n\n const memberIds = useMemo(() => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return sortUserIds(groupChatMembers.map(({ userId }) => userId), usersById);\n }, [groupChatMembers, usersById]);\n\n const [memberViewportIds, getMoreMembers, noProfileInfoForMembers] = useInfiniteScrollForMembers(\n resultType, loadMoreMembers, lastSyncTime, memberIds,\n );\n\n const [mediaViewportIds, getMoreMedia, noProfileInfoForMedia] = useInfiniteScrollForSharedMedia(\n 'media', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [documentViewportIds, getMoreDocuments, noProfileInfoForDocuments] = useInfiniteScrollForSharedMedia(\n 'documents', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [linkViewportIds, getMoreLinks, noProfileInfoForLinks] = useInfiniteScrollForSharedMedia(\n 'links', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [audioViewportIds, getMoreAudio, noProfileInfoForAudio] = useInfiniteScrollForSharedMedia(\n 'audio', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n let viewportIds: number[] | undefined;\n let getMore: AnyToVoidFunction | undefined;\n let noProfileInfo = false;\n\n switch (resultType) {\n case 'members':\n viewportIds = memberViewportIds;\n getMore = getMoreMembers;\n noProfileInfo = noProfileInfoForMembers;\n break;\n case 'media':\n viewportIds = mediaViewportIds;\n getMore = getMoreMedia;\n noProfileInfo = noProfileInfoForMedia;\n break;\n case 'documents':\n viewportIds = documentViewportIds;\n getMore = getMoreDocuments;\n noProfileInfo = noProfileInfoForDocuments;\n break;\n case 'links':\n viewportIds = linkViewportIds;\n getMore = getMoreLinks;\n noProfileInfo = noProfileInfoForLinks;\n break;\n case 'audio':\n viewportIds = audioViewportIds;\n getMore = getMoreAudio;\n noProfileInfo = noProfileInfoForAudio;\n break;\n }\n\n return [resultType, viewportIds, getMore, noProfileInfo] as const;\n}\n\nfunction useInfiniteScrollForMembers(\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n memberIds?: number[],\n) {\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n memberIds,\n undefined,\n MEMBERS_SLICE,\n );\n\n const isOnTop = !viewportIds || !memberIds || viewportIds[0] === memberIds[0];\n\n return [viewportIds, getMore, !isOnTop] as const;\n}\n\nfunction useInfiniteScrollForSharedMedia(\n forSharedMediaType: SharedMediaType,\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n chatMessages?: Record,\n foundIds?: number[],\n) {\n const messageIdsRef = useRef();\n\n useOnChange(() => {\n if (currentResultType === forSharedMediaType && chatMessages && foundIds) {\n messageIdsRef.current = getMessageContentIds(\n chatMessages,\n foundIds,\n forSharedMediaType,\n ).reverse();\n }\n }, [chatMessages, foundIds, currentResultType, forSharedMediaType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n messageIdsRef.current,\n undefined,\n forSharedMediaType === 'media' ? SHARED_MEDIA_SLICE : MESSAGE_SEARCH_SLICE,\n );\n\n const isOnTop = !viewportIds || !messageIdsRef.current || viewportIds[0] === messageIdsRef.current[0];\n\n return [viewportIds, getMore, !isOnTop] as const;\n}\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nimport { ProfileState } from '../../../types';\n\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport { throttle } from '../../../util/schedulers';\nimport useEffectWithPrevDeps from '../../../hooks/useEffectWithPrevDeps';\n\nconst TRANSITION_DURATION = 300;\nconst PROGRAMMATIC_SCROLL_TIMEOUT_MS = 350;\n\nconst runThrottledForScroll = throttle((cb) => cb(), 250, false);\n\nlet isScrollingProgrammatically = false;\n\nexport default function useProfileState(\n containerRef: { current: HTMLDivElement | null },\n tabType: string,\n profileState: ProfileState,\n onProfileStateChange: (state: ProfileState) => void,\n) {\n // Scroll to tabs if needed\n useEffectWithPrevDeps(([prevTabType]) => {\n if (prevTabType && prevTabType !== tabType) {\n const container = containerRef.current!;\n const tabsEl = container.querySelector('.TabList')!;\n if (container.scrollTop < tabsEl.offsetTop) {\n onProfileStateChange(tabType === 'members' ? ProfileState.MemberList : ProfileState.SharedMedia);\n isScrollingProgrammatically = true;\n fastSmoothScroll(container, tabsEl, 'start', undefined, undefined, undefined, TRANSITION_DURATION);\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n }\n }\n }, [tabType, onProfileStateChange]);\n\n // Scroll to top\n useEffectWithPrevDeps(([prevProfileState]) => {\n if (profileState !== ProfileState.Profile || profileState === prevProfileState) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl || tabListEl.offsetTop > container.scrollTop) {\n return;\n }\n\n isScrollingProgrammatically = true;\n fastSmoothScroll(\n container,\n container.firstElementChild as HTMLElement,\n 'start',\n undefined,\n container.offsetHeight * 2,\n );\n\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n\n onProfileStateChange(profileState);\n }, [profileState]);\n\n const determineProfileState = useCallback(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl) {\n return;\n }\n\n let state: ProfileState = ProfileState.Profile;\n if (container.scrollTop >= tabListEl.offsetTop) {\n state = tabType === 'members'\n ? ProfileState.MemberList\n : ProfileState.SharedMedia;\n }\n\n onProfileStateChange(state);\n }, [containerRef, onProfileStateChange, tabType]);\n\n // Determine profile state when switching tabs\n useEffect(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n determineProfileState();\n }, [determineProfileState, tabType]);\n\n // Determine profile state when scrolling\n const handleScroll = useCallback(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n runThrottledForScroll(determineProfileState);\n }, [determineProfileState]);\n\n return { handleScroll };\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport {\n ApiUser, ApiChat, ApiMediaFormat, ApiPhoto,\n} from '../../api/types';\n\nimport {\n getChatAvatarHash, isDeletedUser, getUserColorKey, getChatTitle, isChatPrivate, getUserFullName,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport { getFirstLetters } from '../../util/textFormat';\nimport useMedia from '../../hooks/useMedia';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ProfilePhoto.scss';\n\ntype OwnProps = {\n chat?: ApiChat;\n user?: ApiUser;\n isFirstPhoto?: boolean;\n isSavedMessages?: boolean;\n photo?: ApiPhoto;\n lastSyncTime?: number;\n onClick: NoneToVoidFunction;\n};\n\nconst ProfilePhoto: FC = ({\n chat,\n user,\n photo,\n isFirstPhoto,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const lang = useLang();\n const isDeleted = user && isDeletedUser(user);\n\n function getMediaHash(size: 'normal' | 'big' = 'big', forceAvatar?: boolean) {\n if (photo && !forceAvatar) {\n return `photo${photo.id}?size=c`;\n }\n\n let hash: string | undefined;\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n hash = getChatAvatarHash(user, size);\n } else if (chat) {\n hash = getChatAvatarHash(chat, size);\n }\n }\n\n return hash;\n }\n\n const imageHash = getMediaHash();\n const fullMediaData = useMedia(imageHash, false, ApiMediaFormat.BlobUrl, lastSyncTime);\n const avatarThumbnailData = useMedia(\n !fullMediaData && isFirstPhoto ? getMediaHash('normal', true) : undefined,\n false,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n const thumbDataUri = useBlurSync(!fullMediaData && photo && photo.thumbnail && photo.thumbnail.dataUri);\n const imageSrc = fullMediaData || avatarThumbnailData || thumbDataUri;\n const prevImageSrc = usePrevious(imageSrc);\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (imageSrc) {\n content = \"\";\n } else if (!imageSrc && user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (!imageSrc && chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isChatPrivate(chat.id) ? 2 : 1);\n } else {\n content = (\n
\n \n
\n );\n }\n\n const fullClassName = buildClassName(\n 'ProfilePhoto',\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n (!isSavedMessages && !(imageSrc)) && 'no-photo',\n );\n\n return (\n
\n {prevImageSrc && imageSrc && prevImageSrc !== imageSrc && (\n \"\"\n )}\n {typeof content === 'string' ? renderText(content, ['hq_emoji']) : content}\n
\n );\n};\n\nexport default memo(ProfilePhoto);\n","import React, {\n FC, useEffect, useCallback, memo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport {\n getUserFullName, getUserStatus, isChatChannel, isUserOnline,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport usePhotosPreload from './hooks/usePhotosPreload';\nimport useLang from '../../hooks/useLang';\n\nimport VerifiedIcon from '../common/VerifiedIcon';\nimport ProfilePhoto from './ProfilePhoto';\nimport Transition from '../ui/Transition';\n\nimport './ProfileInfo.scss';\n\ntype OwnProps = {\n userId: number;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n isSavedMessages?: boolean;\n animationLevel: 0 | 1 | 2;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n user,\n chat,\n isSavedMessages,\n lastSyncTime,\n animationLevel,\n loadFullUser,\n openMediaViewer,\n}) => {\n const { id: userId } = user || {};\n const { id: chatId } = chat || {};\n const fullName = user ? getUserFullName(user) : (chat ? chat.title : '');\n const photos = (user ? user.photos : (chat ? chat.photos : undefined)) || [];\n const slideAnimation = animationLevel >= 1 ? 'slide' : 'none';\n\n const [currentPhotoIndex, setCurrentPhotoIndex] = useState(0);\n const isFirst = isSavedMessages || photos.length <= 1 || currentPhotoIndex === 0;\n const isLast = isSavedMessages || photos.length <= 1 || currentPhotoIndex === photos.length - 1;\n\n // Deleting the last profile photo may result in an error\n useEffect(() => {\n if (currentPhotoIndex > photos.length) {\n setCurrentPhotoIndex(Math.max(0, photos.length - 1));\n }\n }, [currentPhotoIndex, photos.length]);\n\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime]);\n\n usePhotosPreload(user || chat, photos, currentPhotoIndex);\n\n const handleProfilePhotoClick = useCallback(() => {\n openMediaViewer({\n avatarOwnerId: userId || chatId,\n profilePhotoIndex: currentPhotoIndex,\n origin: MediaViewerOrigin.ProfileAvatar,\n });\n }, [openMediaViewer, userId, chatId, currentPhotoIndex]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n setCurrentPhotoIndex(currentPhotoIndex - 1);\n }, [currentPhotoIndex, isFirst]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n setCurrentPhotoIndex(currentPhotoIndex + 1);\n }, [currentPhotoIndex, isLast]);\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector(\n '.profile-slide-container > .active, .profile-slide-container > .to',\n );\n if (!element) {\n return undefined;\n }\n\n return captureEvents(element, {\n excludedClosestSelector: '.navigation',\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n }\n } : undefined,\n });\n }, [selectNextMedia, selectPreviousMedia]);\n\n if (!user && !chat) {\n return undefined;\n }\n\n function renderPhotoTabs() {\n if (isSavedMessages || !photos || photos.length <= 1) {\n return undefined;\n }\n\n return (\n
\n {photos.map((_, i) => (\n \n ))}\n
\n );\n }\n\n function renderPhoto() {\n const photo = !isSavedMessages && photos && photos.length > 0 ? photos[currentPhotoIndex] : undefined;\n\n return (\n \n );\n }\n\n function renderStatus() {\n if (user) {\n return (\n
\n {getUserStatus(lang, user)}\n
\n );\n }\n\n return (\n {\n isChatChannel(chat!)\n ? lang('Subscribers', chat!.membersCount, 'i')\n : lang('Members', chat!.membersCount, 'i')\n }\n \n );\n }\n\n const isVerifiedIconShown = (user && user.isVerified) || (chat && chat.isVerified);\n\n return (\n
\n
\n {renderPhotoTabs()}\n \n {renderPhoto}\n \n\n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n
\n\n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {isVerifiedIconShown && }\n
\n )}\n {!isSavedMessages && renderStatus()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { lastSyncTime } = global;\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const { animationLevel } = global.settings.byKey;\n\n return {\n lastSyncTime, user, chat, isSavedMessages, animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import {\n ApiChat, ApiMediaFormat, ApiPhoto, ApiUser,\n} from '../../../api/types';\nimport { useEffect } from '../../../lib/teact/teact';\nimport * as mediaLoader from '../../../util/mediaLoader';\n\nconst PHOTOS_TO_PRELOAD = 4;\n\nexport default function usePhotosPreload(\n profile: ApiUser | ApiChat | undefined,\n photos: ApiPhoto[],\n currentIndex: number,\n) {\n useEffect(() => {\n photos.slice(currentIndex, currentIndex + PHOTOS_TO_PRELOAD).forEach((photo) => {\n const mediaData = mediaLoader.getFromMemory(`photo${photo.id}?size=c`);\n if (!mediaData) {\n mediaLoader.fetch(`photo${photo.id}?size=c`, ApiMediaFormat.BlobUrl);\n }\n });\n }, [currentIndex, photos]);\n}\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isChatPrivate, isUserRightBanned,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport { copyTextToClipboard } from '../../util/clipboard';\nimport { formatPhoneNumberWithCode } from '../../util/phoneNumber';\nimport useLang from '../../hooks/useLang';\n\nimport SafeLink from '../common/SafeLink';\nimport ListItem from '../ui/ListItem';\nimport Switcher from '../ui/Switcher';\n\ntype OwnProps = {\n chatOrUserId: number;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n canInviteUsers?: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst ChatExtra: FC = ({\n lastSyncTime,\n user,\n chat,\n forceShowSelf,\n canInviteUsers,\n loadFullUser,\n showNotification,\n updateChatMutedState,\n}) => {\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n const {\n id: chatId,\n isMuted: currentIsMuted,\n username: chatUsername,\n } = chat || {};\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [loadFullUser, userId, lastSyncTime]);\n\n const handleNotificationChange = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !currentIsMuted });\n }, [chatId, currentIsMuted, updateChatMutedState]);\n\n if (!chat || chat.isRestricted || (isSelf && !forceShowSelf)) {\n return undefined;\n }\n\n function copy(text: string, entity: string) {\n copyTextToClipboard(text);\n showNotification({ message: `${entity} was copied` });\n }\n\n const formattedNumber = phoneNumber && formatPhoneNumberWithCode(phoneNumber);\n const link = getChatLink(chat);\n const url = link.indexOf('http') === 0 ? link : `http://${link}`;\n const printedUsername = username || chatUsername;\n const description = (fullInfo && fullInfo.bio) || getChatDescription(chat);\n\n return (\n
\n {formattedNumber && !!formattedNumber.length && (\n copy(formattedNumber, lang('Phone'))}>\n {formattedNumber}\n {lang('Phone')}\n \n )}\n {printedUsername && (\n copy(`@${printedUsername}`, lang('Username'))}\n >\n {renderText(printedUsername)}\n {lang('Username')}\n \n )}\n {description && !!description.length && (\n \n \n {renderText(description, ['br', 'links', 'emoji'])}\n \n {lang(userId ? 'UserBio' : 'Info')}\n \n )}\n {canInviteUsers && !printedUsername && !!link.length && (\n copy(link, lang('SetUrlPlaceholder'))}>\n
\n \n
\n {lang('SetUrlPlaceholder')}\n
\n )}\n \n {lang('Notifications')}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n const { lastSyncTime } = global;\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isChatPrivate(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n\n const canInviteUsers = chat && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return {\n lastSyncTime, chat, user, canInviteUsers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadFullUser', 'updateChatMutedState', 'showNotification',\n ]),\n)(ChatExtra));\n","import React, {\n FC, useCallback, useEffect, useMemo, useRef, useState, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiMessage,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport {\n MediaViewerOrigin, ProfileState, ProfileTabType, SharedMediaType,\n} from '../../types';\n\nimport {\n MEMBERS_SLICE,\n PROFILE_SENSITIVE_AREA,\n SHARED_MEDIA_SLICE,\n SLIDE_TRANSITION_DURATION,\n} from '../../config';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n isChatAdmin, isChatChannel, isChatGroup, isChatPrivate,\n} from '../../modules/helpers';\nimport {\n selectChatMessages,\n selectChat,\n selectCurrentMediaSearch,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport useCacheBuster from '../../hooks/useCacheBuster';\nimport useProfileViewportIds from './hooks/useProfileViewportIds';\nimport useProfileState from './hooks/useProfileState';\nimport useTransitionFixes from './hooks/useTransitionFixes';\nimport useAsyncRendering from './hooks/useAsyncRendering';\nimport useLang from '../../hooks/useLang';\n\nimport Transition from '../ui/Transition';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport TabList from '../ui/TabList';\nimport Spinner from '../ui/Spinner';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport ProfileInfo from './ProfileInfo';\nimport Document from '../common/Document';\nimport Audio from '../common/Audio';\nimport ChatExtra from './ChatExtra';\nimport Media from '../common/Media';\nimport WebLink from '../common/WebLink';\nimport NothingFound from '../common/NothingFound';\n\nimport './Profile.scss';\n\ntype OwnProps = {\n chatId: number;\n userId?: number;\n profileState: ProfileState;\n onProfileStateChange: (state: ProfileState) => void;\n};\n\ntype StateProps = {\n isChannel?: boolean;\n resolvedUserId?: number;\n chatMessages?: Record;\n foundIds?: number[];\n mediaSearchType?: SharedMediaType;\n hasMembersTab?: boolean;\n areMembersHidden?: boolean;\n members?: ApiChatMember[];\n usersById?: Record;\n isRightColumnShown: boolean;\n isRestricted?: boolean;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: 'media', title: 'SharedMediaTab2' },\n { type: 'documents', title: 'SharedFilesTab2' },\n { type: 'links', title: 'SharedLinksTab2' },\n { type: 'audio', title: 'SharedMusicTab2' },\n];\n\nconst HIDDEN_RENDER_DELAY = 1000;\n\nconst Profile: FC = ({\n chatId,\n profileState,\n onProfileStateChange,\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n members,\n usersById,\n isRightColumnShown,\n isRestricted,\n lastSyncTime,\n setLocalMediaSearchType,\n loadMoreMembers,\n searchMediaMessagesLocal,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n focusMessage,\n loadProfilePhotos,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(0);\n\n const tabs = useMemo(() => ([\n ...(hasMembersTab ? [{\n type: 'members', title: isChannel ? 'ChannelSubscribers' : 'GroupMembers',\n }] : []),\n ...TABS,\n ]), [hasMembersTab, isChannel]);\n const tabType = tabs[activeTab].type as ProfileTabType;\n\n const [resultType, viewportIds, getMore, noProfileInfo] = useProfileViewportIds(\n isRightColumnShown, loadMoreMembers, searchMediaMessagesLocal, tabType, mediaSearchType, members,\n usersById, chatMessages, foundIds, chatId, lastSyncTime,\n );\n const activeKey = tabs.findIndex(({ type }) => type === resultType);\n\n const { handleScroll } = useProfileState(containerRef, tabType, profileState, onProfileStateChange);\n\n const { applyTransitionFix, releaseTransitionFix } = useTransitionFixes(containerRef);\n\n const [cacheBuster, resetCacheBuster] = useCacheBuster();\n\n const handleTransitionStop = useCallback(() => {\n releaseTransitionFix();\n resetCacheBuster();\n }, [releaseTransitionFix, resetCacheBuster]);\n\n // Update search type when switching tabs\n useEffect(() => {\n setLocalMediaSearchType({ mediaType: tabType });\n }, [setLocalMediaSearchType, tabType]);\n\n const profileId = resolvedUserId || chatId;\n\n useEffect(() => {\n if (lastSyncTime) {\n loadProfilePhotos({ profileId });\n }\n }, [loadProfilePhotos, profileId, lastSyncTime]);\n\n const handleSelectMedia = useCallback((messageId: number) => {\n openMediaViewer({\n chatId: profileId,\n threadId: MAIN_THREAD_ID,\n messageId,\n origin: MediaViewerOrigin.SharedMedia,\n });\n }, [profileId, openMediaViewer]);\n\n const handlePlayAudio = useCallback((messageId: number) => {\n openAudioPlayer({ chatId: profileId, messageId });\n }, [profileId, openAudioPlayer]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n const handleMessageFocus = useCallback((messageId: number) => {\n focusMessage({ chatId: profileId, messageId });\n }, [profileId, focusMessage]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveTab(Math.min(activeTab + 1, tabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n }\n }),\n });\n }, [activeTab, tabs.length]);\n\n let renderingDelay;\n const isFirstTab = resultType === 'members' || (!hasMembersTab && resultType === 'media');\n // @optimization Used to unparallelize rendering of message list and profile media\n if (isFirstTab) {\n renderingDelay = !isRightColumnShown ? HIDDEN_RENDER_DELAY : 0;\n // @optimization Used to delay first render of secondary tabs while animating\n } else if (!viewportIds) {\n renderingDelay = SLIDE_TRANSITION_DURATION;\n }\n const canRenderContents = useAsyncRendering([chatId, resultType], renderingDelay);\n\n function renderSharedMedia() {\n if (!viewportIds || !canRenderContents || !chatMessages) {\n // This is just a single-frame delay so we do not show spinner\n const noSpinner = isFirstTab && viewportIds && !canRenderContents;\n\n return (\n
\n {!noSpinner && }\n
\n );\n }\n\n if (!viewportIds.length) {\n let text: string;\n\n switch (resultType) {\n case 'members':\n text = areMembersHidden ? 'You have no access to group members list.' : 'No members found';\n break;\n case 'documents':\n text = lang('lng_media_file_empty_search');\n break;\n case 'links':\n text = lang('lng_media_link_empty_search');\n break;\n case 'audio':\n text = lang('lng_media_song_empty_search');\n break;\n default:\n text = lang('SharedMedia.EmptyTitle');\n }\n\n return (\n
\n \n
\n );\n }\n\n return (\n \n {resultType === 'media' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'documents' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'links' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'audio' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'members' ? (\n viewportIds!.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : undefined}\n
\n );\n }\n\n return (\n \n {!noProfileInfo && renderProfileInfo(chatId, resolvedUserId)}\n {!isRestricted && (\n
\n \n {renderSharedMedia}\n \n \n
\n )}\n \n );\n};\n\nfunction renderProfileInfo(chatId: number, resolvedUserId?: number) {\n return (\n
\n \n \n
\n );\n}\n\nfunction buildInfiniteScrollItemSelector(resultType: string) {\n return [\n // Used on first render\n `.shared-media-transition > div:only-child > .${resultType}-list > .scroll-item`,\n // Used after transition\n `.shared-media-transition > div.active > .${resultType}-list > .scroll-item`,\n ].join(', ');\n}\n\nexport default memo(withGlobal(\n (global, { chatId, userId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n const chatMessages = selectChatMessages(global, userId || chatId);\n const { currentType: mediaSearchType, resultsByType } = selectCurrentMediaSearch(global) || {};\n const { foundIds } = (resultsByType && mediaSearchType && resultsByType[mediaSearchType]) || {};\n\n const { byId: usersById } = global.users;\n\n const isGroup = chat && isChatGroup(chat);\n const isChannel = chat && isChatChannel(chat);\n const hasMembersTab = isGroup || (isChannel && isChatAdmin(chat!));\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const areMembersHidden = hasMembersTab && chat && chat.fullInfo && !chat.fullInfo.canViewMembers;\n\n let resolvedUserId;\n if (userId) {\n resolvedUserId = userId;\n } else if (isChatPrivate(chatId)) {\n resolvedUserId = chatId;\n }\n\n return {\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n ...(hasMembersTab && members && {\n members,\n usersById,\n }),\n isRightColumnShown: selectIsRightColumnShown(global),\n isRestricted: chat && chat.isRestricted,\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalMediaSearchType',\n 'loadMoreMembers',\n 'searchMediaMessagesLocal',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'openUserInfo',\n 'focusMessage',\n 'loadProfilePhotos',\n ]),\n)(Profile));\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nexport default function useTransitionFixes(\n containerRef: { current: HTMLDivElement | null },\n transitionElSelector = '.Transition.shared-media-transition',\n) {\n // Set `min-height` for shared media container to prevent jumping when switching tabs\n useEffect(() => {\n function setMinHeight() {\n const container = containerRef.current!;\n const transitionEl = container.querySelector(transitionElSelector);\n const tabsEl = container.querySelector('.TabList');\n if (transitionEl && tabsEl) {\n transitionEl.style.minHeight = `${container.offsetHeight - tabsEl.offsetHeight}px`;\n }\n }\n\n setMinHeight();\n\n window.addEventListener('resize', setMinHeight, false);\n\n return () => {\n window.removeEventListener('resize', setMinHeight, false);\n };\n }, [containerRef, transitionElSelector]);\n\n // Workaround for scrollable content flickering during animation.\n const applyTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n if (container.style.overflowY !== 'hidden') {\n const scrollBarWidth = container.offsetWidth - container.clientWidth;\n container.style.overflowY = 'hidden';\n container.style.marginRight = `${scrollBarWidth}px`;\n }\n }, [containerRef]);\n\n const releaseTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n container.style.overflowY = 'scroll';\n container.style.marginRight = '0';\n }, [containerRef]);\n\n return { applyTransitionFix, releaseTransitionFix };\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [cacheBuster, setCacheBuster] = useState(false);\n\n const updateCacheBuster = useCallback(() => {\n setCacheBuster((current) => !current);\n }, []);\n\n return [cacheBuster, updateCacheBuster] as const;\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './RightSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst RightSearchAsync: FC = (props) => {\n const RightSearch = useModuleLoader(Bundles.Extra, 'RightSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return RightSearch ? : ;\n};\n\nexport default memo(RightSearchAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Management';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nimport Loading from '../../ui/Loading';\n\nconst ManagementAsync: FC = (props) => {\n const Management = useModuleLoader(Bundles.Extra, 'Management');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Management ? : ;\n};\n\nexport default memo(ManagementAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst StickerSearchAsync: FC = () => {\n const StickerSearch = useModuleLoader(Bundles.Extra, 'StickerSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSearch ? : ;\n};\n\nexport default memo(StickerSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst GifSearchAsync: FC = () => {\n const GifSearch = useModuleLoader(Bundles.Extra, 'GifSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return GifSearch ? : ;\n};\n\nexport default memo(GifSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst PollResultsAsync: FC = () => {\n const PollResults = useModuleLoader(Bundles.Extra, 'PollResults');\n\n return PollResults ? : ;\n};\n\nexport default memo(PollResultsAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState, RightColumnContent } from '../../types';\n\nimport { MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN } from '../../config';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport {\n selectAreActiveChatsLoaded,\n selectCurrentMessageList,\n selectRightColumnContentKey,\n} from '../../modules/selectors';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport RightHeader from './RightHeader';\nimport Profile from './Profile';\nimport Transition from '../ui/Transition';\nimport RightSearch from './RightSearch.async';\nimport Management from './management/Management.async';\nimport StickerSearch from './StickerSearch.async';\nimport GifSearch from './GifSearch.async';\nimport PollResults from './PollResults.async';\n\nimport './RightColumn.scss';\n\ntype StateProps = {\n contentKey?: RightColumnContent;\n chatId?: number;\n threadId?: number;\n currentProfileUserId?: number;\n isChatSelected: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst MAIN_SCREENS_COUNT = Object.keys(RightColumnContent).length / 2;\nconst MANAGEMENT_SCREENS_COUNT = Object.keys(ManagementScreens).length / 2;\n\nfunction blurSearchInput() {\n const searchInput = document.querySelector('.RightHeader .SearchInput input') as HTMLInputElement;\n if (searchInput) {\n searchInput.blur();\n }\n}\n\nconst RightColumn: FC = ({\n contentKey,\n chatId,\n threadId,\n currentProfileUserId,\n isChatSelected,\n toggleChatInfo,\n toggleManagement,\n openUserInfo,\n closeLocalTextSearch,\n setStickerSearchQuery,\n setGifSearchQuery,\n closePollResults,\n}) => {\n const { width: windowWidth } = useWindowSize();\n const [profileState, setProfileState] = useState(ProfileState.Profile);\n const [managementScreen, setManagementScreen] = useState(ManagementScreens.Initial);\n const [selectedChatMemberId, setSelectedChatMemberId] = useState();\n const [isPromotedByCurrentUser, setIsPromotedByCurrentUser] = useState();\n const isScrolledDown = profileState !== ProfileState.Profile;\n\n const isOpen = contentKey !== undefined;\n const isProfile = contentKey === RightColumnContent.ChatInfo || contentKey === RightColumnContent.UserInfo;\n const isSearch = contentKey === RightColumnContent.Search;\n const isManagement = contentKey === RightColumnContent.Management;\n const isStickerSearch = contentKey === RightColumnContent.StickerSearch;\n const isGifSearch = contentKey === RightColumnContent.GifSearch;\n const isPollResults = contentKey === RightColumnContent.PollResults;\n const isOverlaying = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN;\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isOpen);\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true, !isChatSelected) ?? -1;\n\n const close = useCallback(() => {\n switch (contentKey) {\n case RightColumnContent.ChatInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n break;\n }\n toggleChatInfo();\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown) {\n setProfileState(ProfileState.Profile);\n break;\n }\n openUserInfo({ id: undefined });\n break;\n case RightColumnContent.Management: {\n switch (managementScreen) {\n case ManagementScreens.Initial:\n toggleManagement();\n break;\n case ManagementScreens.ChatPrivacyType:\n case ManagementScreens.Discussion:\n case ManagementScreens.GroupPermissions:\n case ManagementScreens.GroupType:\n case ManagementScreens.ChatAdministrators:\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n setManagementScreen(ManagementScreens.Initial);\n break;\n case ManagementScreens.GroupUserPermissionsCreate:\n case ManagementScreens.GroupRemovedUsers:\n case ManagementScreens.GroupUserPermissions:\n setManagementScreen(ManagementScreens.GroupPermissions);\n setSelectedChatMemberId(undefined);\n setIsPromotedByCurrentUser(undefined);\n break;\n case ManagementScreens.ChatAdminRights:\n case ManagementScreens.GroupRecentActions:\n setManagementScreen(ManagementScreens.ChatAdministrators);\n break;\n }\n\n break;\n }\n case RightColumnContent.Search: {\n blurSearchInput();\n closeLocalTextSearch();\n break;\n }\n case RightColumnContent.StickerSearch:\n case RightColumnContent.GifSearch: {\n blurSearchInput();\n setStickerSearchQuery({ query: undefined });\n setGifSearchQuery({ query: undefined });\n break;\n }\n case RightColumnContent.PollResults:\n closePollResults();\n break;\n }\n }, [\n contentKey, isScrolledDown, toggleChatInfo, openUserInfo, closePollResults,\n managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery,\n ]);\n\n const handleSelectChatMember = useCallback((memberId, isPromoted) => {\n setSelectedChatMemberId(memberId);\n setIsPromotedByCurrentUser(isPromoted);\n }, []);\n\n useEffect(() => (isOpen ? captureEscKeyListener(close) : undefined), [isOpen, close]);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isOpen]);\n\n // Close Right Column when it transforms into overlayed state on screen resize\n useEffect(() => {\n if (isOpen && isOverlaying) {\n close();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOverlaying]);\n\n // We need to clear profile state and management screen state, when changing chats\n useLayoutEffectWithPrevDeps(([prevContentKey, prevChatId]) => {\n if (\n (prevContentKey === RightColumnContent.ChatInfo && contentKey === RightColumnContent.UserInfo)\n || (prevContentKey === RightColumnContent.UserInfo && contentKey === RightColumnContent.ChatInfo)\n || (prevChatId !== chatId)\n ) {\n setProfileState(ProfileState.Profile);\n setManagementScreen(ManagementScreens.Initial);\n }\n }, [contentKey, chatId]);\n\n // eslint-disable-next-line consistent-return\n function renderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case RightColumnContent.ChatInfo:\n case RightColumnContent.UserInfo:\n return (\n \n );\n case RightColumnContent.Search:\n return ;\n case RightColumnContent.Management:\n return (\n \n );\n case RightColumnContent.StickerSearch:\n return ;\n case RightColumnContent.GifSearch:\n return ;\n case RightColumnContent.PollResults:\n return ;\n }\n }\n\n return (\n \n {isOverlaying && (\n
\n )}\n
\n \n \n {renderContent}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n\n return {\n contentKey: selectRightColumnContentKey(global),\n chatId,\n threadId,\n currentProfileUserId: global.users.selectedId,\n isChatSelected: Boolean(chatId && areActiveChatsLoaded),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n 'toggleChatInfo',\n 'toggleManagement',\n 'closeLocalTextSearch',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'closePollResults',\n ]),\n)(RightColumn));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { Bundles } from '../../util/moduleLoader';\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\ninterface OwnProps {\n isOpen: boolean;\n}\n\nconst MediaViewerAsync: FC = ({ isOpen }) => {\n const MediaViewer = useModuleLoader(Bundles.Extra, 'MediaViewer', !isOpen);\n\n return MediaViewer ? : undefined;\n};\n\nexport default memo(MediaViewerAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst NotificationsAsync: FC = ({ isOpen }) => {\n const Notifications = useModuleLoader(Bundles.Extra, 'Notifications', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Notifications ? : undefined;\n};\n\nexport default memo(NotificationsAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ErrorsAsync: FC = ({ isOpen }) => {\n const Errors = useModuleLoader(Bundles.Extra, 'Errors', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Errors ? : undefined;\n};\n\nexport default memo(ErrorsAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './ForwardPicker';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ForwardPickerAsync: FC = (props) => {\n const { isOpen } = props;\n const ForwardPicker = useModuleLoader(Bundles.Extra, 'ForwardPicker', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ForwardPicker ? : undefined;\n};\n\nexport default memo(ForwardPickerAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './SafeLinkModal';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst SafeLinkModalAsync: FC = (props) => {\n const { url } = props;\n const SafeLinkModal = useModuleLoader(Bundles.Extra, 'SafeLinkModal', !url);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SafeLinkModal ? : undefined;\n};\n\nexport default memo(SafeLinkModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './HistoryCalendar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HistoryCalendarAsync: FC = (props) => {\n const { isOpen } = props;\n const HistoryCalendar = useModuleLoader(Bundles.Extra, 'HistoryCalendar', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HistoryCalendar ? : undefined;\n};\n\nexport default memo(HistoryCalendarAsync);\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport '../../modules/actions/all';\nimport {\n ANIMATION_END_DELAY, DEBUG, INACTIVE_MARKER, PAGE_TITLE,\n} from '../../config';\nimport { pick } from '../../util/iteratees';\nimport {\n selectChatMessage,\n selectCountNotMutedUnread,\n selectIsForwardModalOpen,\n selectIsMediaViewerOpen,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\nimport LeftColumn from '../left/LeftColumn';\nimport MiddleColumn from '../middle/MiddleColumn';\nimport RightColumn from '../right/RightColumn';\nimport MediaViewer from '../mediaViewer/MediaViewer.async';\nimport AudioPlayer from '../middle/AudioPlayer';\nimport Notifications from './Notifications.async';\nimport Errors from './Errors.async';\nimport ForwardPicker from './ForwardPicker.async';\nimport SafeLinkModal from './SafeLinkModal.async';\nimport HistoryCalendar from './HistoryCalendar.async';\n\nimport './Main.scss';\n\ntype StateProps = {\n animationLevel: number;\n lastSyncTime?: number;\n isLeftColumnShown: boolean;\n isRightColumnShown: boolean;\n isMediaViewerOpen: boolean;\n isForwardModalOpen: boolean;\n hasNotifications: boolean;\n hasErrors: boolean;\n audioMessage?: ApiMessage;\n safeLinkModalUrl?: string;\n isHistoryCalendarOpen: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\nconst NOTIFICATION_INTERVAL = 1000;\n\nlet rightColumnAnimationTimeout: number | undefined;\nlet notificationInterval: number | undefined;\n\nlet DEBUG_isLogged = false;\n\nconst Main: FC = ({\n lastSyncTime,\n isLeftColumnShown,\n isRightColumnShown,\n isMediaViewerOpen,\n isForwardModalOpen,\n animationLevel,\n hasNotifications,\n hasErrors,\n audioMessage,\n safeLinkModalUrl,\n isHistoryCalendarOpen,\n loadAnimatedEmojis,\n loadNotificationSettings,\n loadNotificationExceptions,\n}) => {\n if (DEBUG && !DEBUG_isLogged) {\n DEBUG_isLogged = true;\n // eslint-disable-next-line no-console\n console.log('>>> RENDER MAIN');\n }\n\n // Initial API calls\n useEffect(() => {\n if (lastSyncTime) {\n loadAnimatedEmojis();\n loadNotificationSettings();\n loadNotificationExceptions();\n }\n }, [lastSyncTime, loadAnimatedEmojis, loadNotificationExceptions, loadNotificationSettings]);\n\n const {\n transitionClassNames: middleColumnTransitionClassNames,\n } = useShowTransition(!isLeftColumnShown, undefined, true);\n\n const {\n transitionClassNames: rightColumnTransitionClassNames,\n } = useShowTransition(isRightColumnShown, undefined, true);\n\n const className = buildClassName(\n middleColumnTransitionClassNames.replace(/([\\w-]+)/g, 'middle-column-$1'),\n rightColumnTransitionClassNames.replace(/([\\w-]+)/g, 'right-column-$1'),\n );\n\n useEffect(() => {\n // For animating Symbol Menu on mobile\n document.body.classList.toggle('is-middle-column-open', className.includes('middle-column-open'));\n // For animating components in portals (i.e. Notification)\n document.body.classList.toggle('is-right-column-shown', className.includes('right-column-open'));\n }, [className]);\n\n // Add `body` classes when toggling right column\n useEffect(() => {\n if (animationLevel > 0) {\n document.body.classList.add('animating-right-column');\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n\n if (rightColumnAnimationTimeout) {\n clearTimeout(rightColumnAnimationTimeout);\n rightColumnAnimationTimeout = undefined;\n }\n\n rightColumnAnimationTimeout = window.setTimeout(() => {\n document.body.classList.remove('animating-right-column');\n rightColumnAnimationTimeout = undefined;\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [animationLevel, isRightColumnShown]);\n\n useBackgroundMode(() => {\n const initialUnread = selectCountNotMutedUnread(getGlobal());\n let index = 0;\n\n clearInterval(notificationInterval);\n notificationInterval = window.setInterval(() => {\n if (document.title.includes(INACTIVE_MARKER)) {\n updateIcon(false);\n return;\n }\n\n if (index % 2 === 0) {\n const newUnread = selectCountNotMutedUnread(getGlobal()) - initialUnread;\n if (newUnread > 0) {\n document.title = `${newUnread} notification${newUnread > 1 ? 's' : ''}`;\n updateIcon(true);\n }\n } else {\n document.title = PAGE_TITLE;\n updateIcon(false);\n }\n\n index++;\n }, NOTIFICATION_INTERVAL);\n }, () => {\n clearInterval(notificationInterval);\n notificationInterval = undefined;\n\n if (!document.title.includes(INACTIVE_MARKER)) {\n document.title = PAGE_TITLE;\n }\n\n updateIcon(false);\n });\n\n function stopEvent(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n return (\n
\n \n \n \n \n \n \n \n {audioMessage && }\n \n \n
\n );\n};\n\nfunction updateIcon(asUnread: boolean) {\n document.querySelectorAll('link[rel=\"icon\"]')\n .forEach((link) => {\n if (asUnread) {\n if (!link.href.includes('favicon-unread')) {\n link.href = link.href.replace('favicon', 'favicon-unread');\n }\n } else {\n link.href = link.href.replace('favicon-unread', 'favicon');\n }\n });\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n return {\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n isLeftColumnShown: global.isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isMediaViewerOpen: selectIsMediaViewerOpen(global),\n isForwardModalOpen: selectIsForwardModalOpen(global),\n hasNotifications: Boolean(global.notifications.length),\n hasErrors: Boolean(global.errors.length),\n audioMessage,\n safeLinkModalUrl: global.safeLinkModalUrl,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAnimatedEmojis', 'loadNotificationSettings', 'loadNotificationExceptions',\n ]),\n)(Main));\n","import { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { DEBUG } from '../config';\n\nexport { default as Main } from '../components/main/Main';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH LOAD MAIN BUNDLE');\n}\n\nif (!getGlobal().connectionState) {\n getDispatch().initApi();\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/5.c1959eb66d878675dbb0.css b/dist/5.aa91dcb7dfbeffe6a6d4.css similarity index 100% rename from dist/5.c1959eb66d878675dbb0.css rename to dist/5.aa91dcb7dfbeffe6a6d4.css diff --git a/dist/5.c1959eb66d878675dbb0.js b/dist/5.aa91dcb7dfbeffe6a6d4.js similarity index 99% rename from dist/5.c1959eb66d878675dbb0.js rename to dist/5.aa91dcb7dfbeffe6a6d4.js index b997905d6..8cc370f18 100644 --- a/dist/5.c1959eb66d878675dbb0.js +++ b/dist/5.aa91dcb7dfbeffe6a6d4.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{105:function(e,t,n){"use strict";n.r(t),n.d(t,"AuthCode",(function(){return b})),n.d(t,"AuthPassword",(function(){return g})),n.d(t,"AuthRegister",(function(){return O})),n.d(t,"AuthQrCode",(function(){return C}));var r=n(0),a=n(2),o=n(7),c=n(3),i=n(45),l=n(16),u=n(1),s=n(125),d=n(116);n(140);const f=o.g?u.rb:u.qb;var m=Object(r.h)(({code:e,codeLength:t,trackingDirection:n,isTracking:a,isBig:o})=>{const[c,i]=Object(r.r)(),[l,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),p=165/t;Object(r.n)(()=>{c||Object(s.a)("MonkeyIdle").then(i)},[c]),Object(r.n)(()=>{l||Object(s.a)("MonkeyTracking").then(m)},[l]);const v=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:o?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),c&&r.a.createElement(d.a,{id:"idleMonkey",size:o?u.Bb:f,className:a?"hidden":void 0,animationData:c,play:!a,onLoad:v}),l&&r.a.createElement(d.a,{id:"trackingMonkey",size:o?u.Bb:f,className:a?"shown":"hidden",animationData:l,playSegment:a?function(){const r=e&&e.length>1||n<0?15+p*(e.length-1):0,a=e.length===t?180:15+p*e.length;return n<1?[a,r]:[r,a]}():void 0,speed:2,noLoop:!0}))});function h(e){function t(){e()}return window.addEventListener("popstate",t),window.history.pushState({},""),()=>{window.removeEventListener("popstate",t),window.history.back()}}var b=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["setAuthCode","returnToAuthPhoneNumber","clearAuthError"]))(({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:n,authError:a,setAuthCode:c,returnToAuthPhoneNumber:u,clearAuthError:s})=>{const d=Object(r.q)(null),[f,b]=Object(r.r)(""),[p,v]=Object(r.r)(!1),[g,E]=Object(r.r)(1);Object(r.n)(()=>{o.l||d.current.focus()},[]),h(u);const j=Object(r.m)(e=>{a&&s();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==f&&(b(t.value),p?t.value.length||v(!1):v(!0),f&&f.length>t.value.length?E(-1):E(1),5===t.value.length&&c({code:t.value}))},[a,s,f,p,c]);return r.a.createElement("div",{id:"auth-code-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(m,{code:f,codeLength:5,isTracking:p,trackingDirection:g}),r.a.createElement("h2",null,e,r.a.createElement("div",{className:"auth-number-edit",onClick:u,role:"button",tabIndex:0,title:"Sign In with another phone number"},r.a.createElement("i",{className:"icon-edit"}))),r.a.createElement("p",{className:"note"},t?r.a.createElement(r.a.Fragment,null,"We have sent the code to the Telegram app",r.a.createElement("br",null),"on your other device."):r.a.createElement(r.a.Fragment,null,"We have sent you an SMS",r.a.createElement("br",null),"with the code.")),r.a.createElement(i.a,{ref:d,id:"sign-in-code",label:"Code",onInput:j,value:f,error:a,autoComplete:"off",inputMode:"decimal"}),n&&r.a.createElement(l.a,null)))})),p=n(148),v=n(149);var g=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError","authHint"]),(e,t)=>Object(c.l)(t,["setAuthPassword","clearAuthError"]))(({authIsLoading:e,authError:t,authHint:n,setAuthPassword:a,clearAuthError:o})=>{const[c,i]=Object(r.r)(!1),l=Object(r.m)(e=>{i(e)},[]),u=Object(r.m)(e=>{a({password:e})},[a]);return r.a.createElement("div",{id:"auth-password-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(p.a,{isPasswordVisible:c}),r.a.createElement("h2",null,"Enter Your Password"),r.a.createElement("p",{className:"note"},"Your account is protected with",r.a.createElement("br",null),"an additional password."),r.a.createElement(v.a,{clearError:o,error:t,hint:n,isLoading:e,isPasswordVisible:c,onChangePasswordVisibility:l,onSubmit:u})))})),E=n(32),j=n(130);var O=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["signUp","clearAuthError","uploadProfilePhoto"]))(({authIsLoading:e,authError:t,signUp:n,clearAuthError:a,uploadProfilePhoto:o})=>{const[c,l]=Object(r.r)(!1),[u,s]=Object(r.r)(),[d,f]=Object(r.r)(""),[m,h]=Object(r.r)("");return r.a.createElement("div",{id:"auth-registration-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("form",{action:"",method:"post",onSubmit:function(e){e.preventDefault(),n({firstName:d,lastName:m}),u&&o({file:u})}},r.a.createElement(j.a,{onChange:s}),r.a.createElement("h2",null,"Your Name"),r.a.createElement("p",{className:"note"},"Enter your name and add",r.a.createElement("br",null),"a profile picture."),r.a.createElement(i.a,{id:"registration-first-name",label:"Name",onChange:function(e){t&&a();const{target:n}=e;f(n.value),l(n.value.length>0)},value:d,error:t,autoComplete:"given-name"}),r.a.createElement(i.a,{id:"registration-last-name",label:"Last Name (optional)",onChange:function(e){const{target:t}=e;h(t.value)},value:m,autoComplete:"family-name"}),c&&r.a.createElement(E.a,{type:"submit",ripple:!0,isLoading:e},"Start Messaging"))))}));let y=null;class w{}w.render=function(e,t){y(e,t)},self.QrCreator=w,function(e){function t(t,n,r,a){var o={},c=e(r,n);c.u(t),c.J(),a=a||0;var i=c.h(),l=c.h()+2*a;return o.text=t,o.level=n,o.version=r,o.O=l,o.a=function(e,t){return t-=a,!(0>(e-=a)||e>=i||0>t||t>=i)&&c.a(e,t)},o}function n(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a,c,i,l){t?(e.lineTo(n+i,r+l),e.arcTo(n,r,a,c,o)):e.lineTo(n,r)}c?e.moveTo(t+o,n):e.moveTo(t,n),s(i,r,n,r,a,-o,0),s(l,r,a,t,a,0,-o),s(u,t,a,t,n,o,0),s(c,t,n,r,n,0,o)}function r(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+a),e.arcTo(t,n,t+r,n,o)}c&&s(t,n,o,o),i&&s(r,n,-o,o),l&&s(r,a,-o,-o),u&&s(t,a,o,-o)}function a(e,a){e:{var o=a.text,c=a.v,i=a.N,l=a.K,u=a.P;for(i=Math.max(1,i||1),l=Math.min(40,l||40);i<=l;i+=1)try{var s=t(o,c,i,u);break e}catch(e){}s=void 0}if(!s)return null;for(o=e.getContext("2d"),a.background&&(o.fillStyle=a.background,o.fillRect(a.left,a.top,a.size,a.size)),c=s.O,l=a.size/c,o.beginPath(),u=0;uMath.round(e*t.size)),"linear-gradient"===r)var o=e.createLinearGradient.apply(e,n);else{if("radial-gradient"!==r)throw Error("Unsupported fill");o=e.createRadialGradient.apply(e,n)}a.forEach(([e,t])=>{o.addColorStop(e,t)}),e.fillStyle=o}}(o,a),o.fill(),e}var o={minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:.5,quiet:0};y=function(e,t){var n={};Object.assign(n,o,e),n.N=n.minVersion,n.K=n.maxVersion,n.v=n.ecLevel,n.left=n.left,n.top=n.top,n.size=n.size,n.fill=n.fill,n.background=n.background,n.text=n.text,n.R=n.radius,n.P=n.quiet,t instanceof HTMLCanvasElement?(t.width===n.size&&t.height===n.size||(t.width=n.size,t.height=n.size),t.getContext("2d").clearRect(0,0,t.width,t.height),a(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=a(e,n),t.appendChild(n))}}(function(){function e(a,c){function i(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||d<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||d<=t+r||(s[e+n][t+r]=0<=n&&6>=n&&(0==r||6==r)||0<=r&&6>=r&&(0==n||6==n)||2<=n&&4>=n&&2<=r&&4>=r)}function l(e,n){for(var c=d=4*a+17,l=Array(c),h=0;h=v;v+=1)for(var g=-2;2>=g;g+=1)s[b+v][p+g]=-2==v||2==v||-2==g||2==g||0==v&&0==g}for(c=8;cl;l+=1)h=!e&&1==(c>>l&1),s[6>l?l:8>l?l+1:d-15+l][8]=h,s[8][8>l?d-l-1:9>l?15-l:14-l]=h;if(s[d-8][8]=!e,7<=a){for(c=r.A(a),l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[Math.floor(l/3)][l%3+d-8-3]=h;for(l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[l%3+d-8-3][Math.floor(l/3)]=h}if(null==f){for(e=o.I(a,u),c=function(){var e=[],t=0,n={B:function(){return e},c:function(t){return 1==(e[Math.floor(t/8)]>>>7-t%8&1)},put:function(e,t){for(var r=0;r>>t-r-1&1))},f:function(){return t},m:function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1}};return n}(),l=0;l8*h)throw Error("code length overflow. ("+c.f()+">"+8*h+")");for(c.f()+4<=8*h&&c.put(0,4);0!=c.f()%8;)c.m(!1);for(;!(c.f()>=8*h)&&(c.put(236,8),!(c.f()>=8*h));)c.put(17,8);var E=0;for(h=l=0,b=Array(e.length),p=Array(e.length),v=0;vv;v+=1)null==s[l][p-v]&&(g=!1,b>>h&1)),n(l,p-v)&&(g=!g),s[l][p-v]=g,-1==--h&&(b+=1,h=7));if(0>(l+=c)||d<=l){l-=c,c=-c;break}}}var u=n[c],s=null,d=0,f=null,m=[],h={u:function(t){t=function(t){var n=e.s(t);return{S:function(){return 4},b:function(){return n.length},write:function(e){for(var t=0;te||d<=e||0>t||d<=t)throw Error(e+","+t);return s[e][t]},h:function(){return d},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){l(!0,n);var a=r.D(h);(0==n||e>a)&&(e=a,t=n)}l(!1,t)}};return h}function t(e,n){if(void 0===e.length)throw Error(e.length+"/"+n);var r=function(){for(var t=0;to.b()-e.b())return o;for(var n=a.g(o.c(0))-a.g(e.c(0)),r=Array(o.b()),c=0;cr?t.push(r):2048>r?t.push(192|r>>6,128|63&r):55296>r||57344<=r?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t};var n={L:1,M:0,Q:3,H:2},r=function(){function e(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t}var n=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]];return{w:function(t){for(var n=t<<10;0<=e(n)-e(1335);)n^=1335<t||40t?8:16},D:function(e){for(var t=e.h(),n=0,r=0;r=i;i+=1)if(!(0>r+i||t<=r+i))for(var l=-1;1>=l;l+=1)0>a+l||t<=a+l||(0!=i||0!=l)&&c==e.a(r+i,a+l)&&(o+=1);5n;n+=1)e[n]=1<n;n+=1)e[n]=e[n-4]^e[n-5]^e[n-6]^e[n-8];for(n=0;255>n;n+=1)t[e[n]]=n;return{g:function(e){if(1>e)throw Error("glog("+e+")");return t[e]},i:function(t){for(;0>t;)t+=255;for(;256<=t;)t-=255;return e[t]}}}(),o=function(){function e(e,r){switch(r){case n.L:return t[4*(e-1)];case n.M:return t[4*(e-1)+1];case n.Q:return t[4*(e-1)+2];case n.H:return t[4*(e-1)+3]}}var t=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];return{I:function(t,n){var r=e(t,n);if(void 0===r)throw Error("bad rs block @ typeNumber:"+t+"/errorCorrectLevel:"+n);t=r.length/3,n=[];for(var a=0;aObject(c.l)(e,["connectionState","authQrCode"]),(e,t)=>Object(c.l)(t,["returnToAuthPhoneNumber"]))(({connectionState:e,authQrCode:t,returnToAuthPhoneNumber:n})=>{const a=Object(r.q)(null);return Object(r.n)(()=>{if(!t||"connectionStateReady"!==e)return;const n=a.current;n.innerHTML="",n.classList.remove("pre-animate"),N.render({text:"tg://login?token="+t.token,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},n)},[e,t]),h(n),r.a.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("div",{className:Object(k.a)("qr-container",t&&"pre-animate"),ref:a},!t&&r.a.createElement(l.a,null)),r.a.createElement("h3",null," Log in to Telegram by QR Code"),r.a.createElement("ol",null,r.a.createElement("li",null,r.a.createElement("span",null,"Open Telegram on your phone")),r.a.createElement("li",null,r.a.createElement("span",null,"Go to ",r.a.createElement("b",null,"Settings")," > ",r.a.createElement("b",null,"Devices")," > ",r.a.createElement("b",null,"Scan QR"))),r.a.createElement("li",null,r.a.createElement("span",null,"Point your phone at this screen to confirm login"))),r.a.createElement(E.a,{isText:!0,onClick:n},"Log in by phone number")))}))},110:function(e,t,n){"use strict";var r=n(0),a=n(55);var o=n(8),c=n(48),i=n(35),l=n(58),u=n(25),s=n(32),d=n(122);n(150);t.a=e=>{const{title:t,className:n,isOpen:f,header:m,hasCloseButton:h,noBackdrop:b,children:p,onClose:v,onCloseAnimationEnd:g,onEnter:E}=e,{shouldRender:j,transitionClassNames:O}=Object(i.a)(f,g),y=Object(r.q)(null);Object(r.n)(()=>f?Object(a.a)({onEsc:v,onEnter:E}):void 0,[f,v,E]),Object(r.n)(()=>f&&y.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const r=n.findIndex(e=>e.isSameNode(document.activeElement));let a=0;r>=0&&(a=t.shiftKey?r>0?r-1:n.length-1:r{document.removeEventListener("keydown",t,!1)}}(y.current):void 0,[f]),Object(l.a)(([e])=>(document.body.classList.toggle("has-open-dialog",f),(f||!f&&void 0!==e)&&Object(c.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[f]);const w=Object(u.a)();if(!j)return;const N=Object(o.a)("Modal",n,O,b&&"transparent-backdrop");return r.a.createElement(d.a,null,r.a.createElement("div",{ref:y,className:N,tabIndex:-1,role:"dialog"},r.a.createElement("div",{className:"modal-container"},r.a.createElement("div",{className:"modal-backdrop",onClick:v}),r.a.createElement("div",{className:"modal-dialog"},m||(t?r.a.createElement("div",{className:"modal-header"},h&&r.a.createElement(s.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:w("Close"),onClick:v},r.a.createElement("i",{className:"icon-close"})),r.a.createElement("div",{className:"modal-title"},t)):void 0),r.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}},116:function(e,t,n){"use strict";var r=n(0),a=n(9),o=n(8),c=n(48),i=n(131);let l,u;async function s(){return l||(l=n.e(7).then(n.bind(null,192)),u=(await l).default),l}setTimeout(s,5e3);t.a=Object(r.h)(({className:e,id:t,animationData:n,play:l,playSegment:d,speed:f,noLoop:m,size:h,quality:b,isLowPriority:p,onLoad:v})=>{const[g,E]=Object(r.r)(),j=Object(r.q)(null),O=Object(r.q)(!1),y=Object(r.q)(!1),w=Object(r.q)();w.current=l;const N=Object(r.q)();N.current=d,Object(r.n)(()=>{if(g||!n)return;const e=()=>{if(!j.current)return;const e=new u(t,j.current,n,{noLoop:m,size:h,quality:b,isLowPriority:p},v);f&&e.setSpeed(f),E(e)};u?e():s().then(()=>{Object(a.b)(()=>{j.current&&e()})})},[g,n,t,p,m,v,b,h,f]),Object(r.n)(()=>()=>{g&&g.destroy()},[g]);const k=Object(r.m)((e=!1)=>{g&&(w.current||N.current)&&(N.current?g.playSegment(N.current):e?g.goToAndPlay(0):g.play())},[g]),C=Object(r.m)(()=>{g&&g.pause()},[g]),L=Object(r.m)(()=>{y.current=!0,g&&(O.current||(O.current=g.isPlaying()),C())},[g,C]),A=Object(r.m)(()=>{O.current&&k(),O.current=!1,y.current=!1},[k]),M=Object(r.m)(()=>{Object(a.b)(A)},[A]);Object(r.n)(()=>{g&&(l||d?y.current?O.current=!0:k(m):y.current?O.current=!1:C())},[g,l,d,m,k,C]),Object(c.a)(L,A),Object(i.a)(L,M);const P=Object(o.a)("AnimatedSticker",e),T=h?`width: ${h}px; height: ${h}px;`:void 0;return r.a.createElement("div",{ref:j,className:P,style:T})})},122:function(e,t,n){"use strict";var r=n(0),a=n(66);t.a=({containerId:e,className:t,children:n})=>{const o=Object(r.q)(document.createElement("div"));return Object(r.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const r=o.current;return t&&r.classList.add(t),n.appendChild(r),()=>{a.a.render(void 0,r),n.removeChild(r)}},[t,e]),a.a.render(n,o.current)}},125:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var r=n(5),a=n(54);const o={MonkeyIdle:n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:n.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:n.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function c(e){const t=o[e].replace(window.location.origin,"");return a.b("file"+t,r.ApiMediaFormat.Lottie)}},130:function(e,t,n){"use strict";var r=n(0),a=n(8),o=n(1),c=n(13),i=n(25),l=n(32),u=n(110),s=n(16);n(151);const d={type:"blob",quality:.8,format:"jpeg",circle:!1};let f,m,h;var b=Object(r.h)(({file:e,onChange:t,onClose:a})=>{const[b,p]=Object(r.r)(!1);Object(r.n)(()=>{e&&(b?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:r}=t;h=new f(t,{enableZoom:!0,boundary:{width:n,height:r},viewport:{width:n-16,height:r-16,type:"circle"}});const a=await Object(c.a)(e);await h.bind({url:a})}catch(e){o.p&&console.error(e)}}(e):async function(){return m||(m=Promise.all([n.e(6),n.e(8)]).then(n.bind(null,315)),f=(await m).default),m}().then(()=>p(!0)))},[e,b]);const v=Object(i.a)();return r.a.createElement(u.a,{isOpen:Boolean(e),onClose:a,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},b?r.a.createElement("div",{id:"avatar-crop"}):r.a.createElement(s.a,null),r.a.createElement(l.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!h)return;const e=await h.result(d),n="string"==typeof e?e:Object(c.b)(e,"avatar.jpg");t(n)},ariaLabel:v("CropImage")},r.a.createElement("i",{className:"icon-check"})))});n(152);t.a=Object(r.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:o})=>{const[c,i]=Object(r.r)(),[l,u]=Object(r.r)(n);Object(r.n)(()=>{u(n)},[n]);const s=Object(a.a)(l&&"filled",t&&"disabled");return r.a.createElement("div",{className:"AvatarEditable"},r.a.createElement("label",{className:s,role:"button",tabIndex:0,title:e},r.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(i(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),r.a.createElement("i",{className:"icon-camera-add"}),l&&r.a.createElement("img",{src:l,alt:"Avatar"})),r.a.createElement(b,{file:c,onClose:function(){i(void 0)},onChange:function(e){i(void 0),o(e),l&&URL.revokeObjectURL(l),u(URL.createObjectURL(e))}}))})},131:function(e,t,n){"use strict";var r=n(0);t.a=(e,t)=>{Object(r.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},140:function(e,t,n){},148:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(125),i=n(116);n(140);const l=[0,50],u=[0,20],s=[20,0],d=o.g?a.rb:a.qb;t.a=Object(r.h)(({isPasswordVisible:e,isBig:t})=>{const[n,o]=Object(r.r)(),[f,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),[p,v]=Object(r.r)(!1);Object(r.n)(()=>{n?setTimeout(()=>v(!0),2e3):Object(c.a)("MonkeyClose").then(o)},[n]),Object(r.n)(()=>{f||Object(c.a)("MonkeyPeek").then(m)},[f]);const g=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:t?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),n&&r.a.createElement(i.a,{id:"closeMonkey",size:t?a.Bb:d,className:p?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:g}),f&&r.a.createElement(i.a,{id:"peekMonkey",size:t?a.Bb:d,className:p?"shown":"hidden",animationData:f,playSegment:e?u:s,noLoop:!0}))})},149:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(8),i=n(25),l=n(32);const u=o.g?550:400;t.a=Object(r.h)(({isLoading:e=!1,isPasswordVisible:t,error:n,hint:s,placeholder:d="Password",submitLabel:f="Next",clearError:m,onChangePasswordVisibility:h,onInputChange:b,onSubmit:p})=>{const v=Object(r.q)(null),g=Object(i.a)(),[E,j]=Object(r.r)(""),[O,y]=Object(r.r)(!1);return Object(r.n)(()=>{o.l||setTimeout(()=>{v.current.focus()},u)},[]),Object(r.n)(()=>{n&&requestAnimationFrame(()=>{v.current.focus(),v.current.select()})},[n]),r.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||O&&p(E)},autoComplete:"off"},r.a.createElement("div",{className:Object(c.a)("input-group password-input",E&&"touched",n&&"error"),dir:g.isRtl?"rtl":void 0},r.a.createElement("input",{ref:v,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:E||"",autoComplete:"current-password",onChange:function(e){n&&m();const{target:t}=e;j(t.value),y(t.value.length>=a.Y),b&&b(t.value)},dir:"auto"}),r.a.createElement("label",null,n||s||d),r.a.createElement("div",{className:"toggle-password",onClick:function(){h(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},r.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),O&&r.a.createElement(l.a,{type:"submit",ripple:!0,isLoading:e},f))})},150:function(e,t,n){},151:function(e,t,n){},152:function(e,t,n){}}]); -//# sourceMappingURL=5.c1959eb66d878675dbb0.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{105:function(e,t,n){"use strict";n.r(t),n.d(t,"AuthCode",(function(){return b})),n.d(t,"AuthPassword",(function(){return g})),n.d(t,"AuthRegister",(function(){return O})),n.d(t,"AuthQrCode",(function(){return C}));var r=n(0),a=n(2),o=n(7),c=n(3),i=n(45),l=n(16),u=n(1),s=n(125),d=n(116);n(140);const f=o.g?u.rb:u.qb;var m=Object(r.h)(({code:e,codeLength:t,trackingDirection:n,isTracking:a,isBig:o})=>{const[c,i]=Object(r.r)(),[l,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),p=165/t;Object(r.n)(()=>{c||Object(s.a)("MonkeyIdle").then(i)},[c]),Object(r.n)(()=>{l||Object(s.a)("MonkeyTracking").then(m)},[l]);const v=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:o?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),c&&r.a.createElement(d.a,{id:"idleMonkey",size:o?u.Bb:f,className:a?"hidden":void 0,animationData:c,play:!a,onLoad:v}),l&&r.a.createElement(d.a,{id:"trackingMonkey",size:o?u.Bb:f,className:a?"shown":"hidden",animationData:l,playSegment:a?function(){const r=e&&e.length>1||n<0?15+p*(e.length-1):0,a=e.length===t?180:15+p*e.length;return n<1?[a,r]:[r,a]}():void 0,speed:2,noLoop:!0}))});function h(e){function t(){e()}return window.addEventListener("popstate",t),window.history.pushState({},""),()=>{window.removeEventListener("popstate",t),window.history.back()}}var b=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["setAuthCode","returnToAuthPhoneNumber","clearAuthError"]))(({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:n,authError:a,setAuthCode:c,returnToAuthPhoneNumber:u,clearAuthError:s})=>{const d=Object(r.q)(null),[f,b]=Object(r.r)(""),[p,v]=Object(r.r)(!1),[g,E]=Object(r.r)(1);Object(r.n)(()=>{o.l||d.current.focus()},[]),h(u);const j=Object(r.m)(e=>{a&&s();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==f&&(b(t.value),p?t.value.length||v(!1):v(!0),f&&f.length>t.value.length?E(-1):E(1),5===t.value.length&&c({code:t.value}))},[a,s,f,p,c]);return r.a.createElement("div",{id:"auth-code-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(m,{code:f,codeLength:5,isTracking:p,trackingDirection:g}),r.a.createElement("h2",null,e,r.a.createElement("div",{className:"auth-number-edit",onClick:u,role:"button",tabIndex:0,title:"Sign In with another phone number"},r.a.createElement("i",{className:"icon-edit"}))),r.a.createElement("p",{className:"note"},t?r.a.createElement(r.a.Fragment,null,"We have sent the code to the Telegram app",r.a.createElement("br",null),"on your other device."):r.a.createElement(r.a.Fragment,null,"We have sent you an SMS",r.a.createElement("br",null),"with the code.")),r.a.createElement(i.a,{ref:d,id:"sign-in-code",label:"Code",onInput:j,value:f,error:a,autoComplete:"off",inputMode:"decimal"}),n&&r.a.createElement(l.a,null)))})),p=n(148),v=n(149);var g=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError","authHint"]),(e,t)=>Object(c.l)(t,["setAuthPassword","clearAuthError"]))(({authIsLoading:e,authError:t,authHint:n,setAuthPassword:a,clearAuthError:o})=>{const[c,i]=Object(r.r)(!1),l=Object(r.m)(e=>{i(e)},[]),u=Object(r.m)(e=>{a({password:e})},[a]);return r.a.createElement("div",{id:"auth-password-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement(p.a,{isPasswordVisible:c}),r.a.createElement("h2",null,"Enter Your Password"),r.a.createElement("p",{className:"note"},"Your account is protected with",r.a.createElement("br",null),"an additional password."),r.a.createElement(v.a,{clearError:o,error:t,hint:n,isLoading:e,isPasswordVisible:c,onChangePasswordVisibility:l,onSubmit:u})))})),E=n(32),j=n(130);var O=Object(r.h)(Object(a.h)(e=>Object(c.l)(e,["authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["signUp","clearAuthError","uploadProfilePhoto"]))(({authIsLoading:e,authError:t,signUp:n,clearAuthError:a,uploadProfilePhoto:o})=>{const[c,l]=Object(r.r)(!1),[u,s]=Object(r.r)(),[d,f]=Object(r.r)(""),[m,h]=Object(r.r)("");return r.a.createElement("div",{id:"auth-registration-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("form",{action:"",method:"post",onSubmit:function(e){e.preventDefault(),n({firstName:d,lastName:m}),u&&o({file:u})}},r.a.createElement(j.a,{onChange:s}),r.a.createElement("h2",null,"Your Name"),r.a.createElement("p",{className:"note"},"Enter your name and add",r.a.createElement("br",null),"a profile picture."),r.a.createElement(i.a,{id:"registration-first-name",label:"Name",onChange:function(e){t&&a();const{target:n}=e;f(n.value),l(n.value.length>0)},value:d,error:t,autoComplete:"given-name"}),r.a.createElement(i.a,{id:"registration-last-name",label:"Last Name (optional)",onChange:function(e){const{target:t}=e;h(t.value)},value:m,autoComplete:"family-name"}),c&&r.a.createElement(E.a,{type:"submit",ripple:!0,isLoading:e},"Start Messaging"))))}));let y=null;class w{}w.render=function(e,t){y(e,t)},self.QrCreator=w,function(e){function t(t,n,r,a){var o={},c=e(r,n);c.u(t),c.J(),a=a||0;var i=c.h(),l=c.h()+2*a;return o.text=t,o.level=n,o.version=r,o.O=l,o.a=function(e,t){return t-=a,!(0>(e-=a)||e>=i||0>t||t>=i)&&c.a(e,t)},o}function n(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a,c,i,l){t?(e.lineTo(n+i,r+l),e.arcTo(n,r,a,c,o)):e.lineTo(n,r)}c?e.moveTo(t+o,n):e.moveTo(t,n),s(i,r,n,r,a,-o,0),s(l,r,a,t,a,0,-o),s(u,t,a,t,n,o,0),s(c,t,n,r,n,0,o)}function r(e,t,n,r,a,o,c,i,l,u){function s(t,n,r,a){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+a),e.arcTo(t,n,t+r,n,o)}c&&s(t,n,o,o),i&&s(r,n,-o,o),l&&s(r,a,-o,-o),u&&s(t,a,o,-o)}function a(e,a){e:{var o=a.text,c=a.v,i=a.N,l=a.K,u=a.P;for(i=Math.max(1,i||1),l=Math.min(40,l||40);i<=l;i+=1)try{var s=t(o,c,i,u);break e}catch(e){}s=void 0}if(!s)return null;for(o=e.getContext("2d"),a.background&&(o.fillStyle=a.background,o.fillRect(a.left,a.top,a.size,a.size)),c=s.O,l=a.size/c,o.beginPath(),u=0;uMath.round(e*t.size)),"linear-gradient"===r)var o=e.createLinearGradient.apply(e,n);else{if("radial-gradient"!==r)throw Error("Unsupported fill");o=e.createRadialGradient.apply(e,n)}a.forEach(([e,t])=>{o.addColorStop(e,t)}),e.fillStyle=o}}(o,a),o.fill(),e}var o={minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:.5,quiet:0};y=function(e,t){var n={};Object.assign(n,o,e),n.N=n.minVersion,n.K=n.maxVersion,n.v=n.ecLevel,n.left=n.left,n.top=n.top,n.size=n.size,n.fill=n.fill,n.background=n.background,n.text=n.text,n.R=n.radius,n.P=n.quiet,t instanceof HTMLCanvasElement?(t.width===n.size&&t.height===n.size||(t.width=n.size,t.height=n.size),t.getContext("2d").clearRect(0,0,t.width,t.height),a(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=a(e,n),t.appendChild(n))}}(function(){function e(a,c){function i(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||d<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||d<=t+r||(s[e+n][t+r]=0<=n&&6>=n&&(0==r||6==r)||0<=r&&6>=r&&(0==n||6==n)||2<=n&&4>=n&&2<=r&&4>=r)}function l(e,n){for(var c=d=4*a+17,l=Array(c),h=0;h=v;v+=1)for(var g=-2;2>=g;g+=1)s[b+v][p+g]=-2==v||2==v||-2==g||2==g||0==v&&0==g}for(c=8;cl;l+=1)h=!e&&1==(c>>l&1),s[6>l?l:8>l?l+1:d-15+l][8]=h,s[8][8>l?d-l-1:9>l?15-l:14-l]=h;if(s[d-8][8]=!e,7<=a){for(c=r.A(a),l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[Math.floor(l/3)][l%3+d-8-3]=h;for(l=0;18>l;l+=1)h=!e&&1==(c>>l&1),s[l%3+d-8-3][Math.floor(l/3)]=h}if(null==f){for(e=o.I(a,u),c=function(){var e=[],t=0,n={B:function(){return e},c:function(t){return 1==(e[Math.floor(t/8)]>>>7-t%8&1)},put:function(e,t){for(var r=0;r>>t-r-1&1))},f:function(){return t},m:function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1}};return n}(),l=0;l8*h)throw Error("code length overflow. ("+c.f()+">"+8*h+")");for(c.f()+4<=8*h&&c.put(0,4);0!=c.f()%8;)c.m(!1);for(;!(c.f()>=8*h)&&(c.put(236,8),!(c.f()>=8*h));)c.put(17,8);var E=0;for(h=l=0,b=Array(e.length),p=Array(e.length),v=0;vv;v+=1)null==s[l][p-v]&&(g=!1,b>>h&1)),n(l,p-v)&&(g=!g),s[l][p-v]=g,-1==--h&&(b+=1,h=7));if(0>(l+=c)||d<=l){l-=c,c=-c;break}}}var u=n[c],s=null,d=0,f=null,m=[],h={u:function(t){t=function(t){var n=e.s(t);return{S:function(){return 4},b:function(){return n.length},write:function(e){for(var t=0;te||d<=e||0>t||d<=t)throw Error(e+","+t);return s[e][t]},h:function(){return d},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){l(!0,n);var a=r.D(h);(0==n||e>a)&&(e=a,t=n)}l(!1,t)}};return h}function t(e,n){if(void 0===e.length)throw Error(e.length+"/"+n);var r=function(){for(var t=0;to.b()-e.b())return o;for(var n=a.g(o.c(0))-a.g(e.c(0)),r=Array(o.b()),c=0;cr?t.push(r):2048>r?t.push(192|r>>6,128|63&r):55296>r||57344<=r?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t};var n={L:1,M:0,Q:3,H:2},r=function(){function e(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t}var n=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]];return{w:function(t){for(var n=t<<10;0<=e(n)-e(1335);)n^=1335<t||40t?8:16},D:function(e){for(var t=e.h(),n=0,r=0;r=i;i+=1)if(!(0>r+i||t<=r+i))for(var l=-1;1>=l;l+=1)0>a+l||t<=a+l||(0!=i||0!=l)&&c==e.a(r+i,a+l)&&(o+=1);5n;n+=1)e[n]=1<n;n+=1)e[n]=e[n-4]^e[n-5]^e[n-6]^e[n-8];for(n=0;255>n;n+=1)t[e[n]]=n;return{g:function(e){if(1>e)throw Error("glog("+e+")");return t[e]},i:function(t){for(;0>t;)t+=255;for(;256<=t;)t-=255;return e[t]}}}(),o=function(){function e(e,r){switch(r){case n.L:return t[4*(e-1)];case n.M:return t[4*(e-1)+1];case n.Q:return t[4*(e-1)+2];case n.H:return t[4*(e-1)+3]}}var t=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];return{I:function(t,n){var r=e(t,n);if(void 0===r)throw Error("bad rs block @ typeNumber:"+t+"/errorCorrectLevel:"+n);t=r.length/3,n=[];for(var a=0;aObject(c.l)(e,["connectionState","authQrCode"]),(e,t)=>Object(c.l)(t,["returnToAuthPhoneNumber"]))(({connectionState:e,authQrCode:t,returnToAuthPhoneNumber:n})=>{const a=Object(r.q)(null);return Object(r.n)(()=>{if(!t||"connectionStateReady"!==e)return;const n=a.current;n.innerHTML="",n.classList.remove("pre-animate"),N.render({text:"tg://login?token="+t.token,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},n)},[e,t]),h(n),r.a.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},r.a.createElement("div",{className:"auth-form"},r.a.createElement("div",{className:Object(k.a)("qr-container",t&&"pre-animate"),ref:a},!t&&r.a.createElement(l.a,null)),r.a.createElement("h3",null," Log in to Telegram by QR Code"),r.a.createElement("ol",null,r.a.createElement("li",null,r.a.createElement("span",null,"Open Telegram on your phone")),r.a.createElement("li",null,r.a.createElement("span",null,"Go to ",r.a.createElement("b",null,"Settings")," > ",r.a.createElement("b",null,"Devices")," > ",r.a.createElement("b",null,"Scan QR"))),r.a.createElement("li",null,r.a.createElement("span",null,"Point your phone at this screen to confirm login"))),r.a.createElement(E.a,{isText:!0,onClick:n},"Log in by phone number")))}))},110:function(e,t,n){"use strict";var r=n(0),a=n(55);var o=n(8),c=n(48),i=n(35),l=n(58),u=n(25),s=n(32),d=n(122);n(150);t.a=e=>{const{title:t,className:n,isOpen:f,header:m,hasCloseButton:h,noBackdrop:b,children:p,onClose:v,onCloseAnimationEnd:g,onEnter:E}=e,{shouldRender:j,transitionClassNames:O}=Object(i.a)(f,g),y=Object(r.q)(null);Object(r.n)(()=>f?Object(a.a)({onEsc:v,onEnter:E}):void 0,[f,v,E]),Object(r.n)(()=>f&&y.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const r=n.findIndex(e=>e.isSameNode(document.activeElement));let a=0;r>=0&&(a=t.shiftKey?r>0?r-1:n.length-1:r{document.removeEventListener("keydown",t,!1)}}(y.current):void 0,[f]),Object(l.a)(([e])=>(document.body.classList.toggle("has-open-dialog",f),(f||!f&&void 0!==e)&&Object(c.b)(200),()=>{document.body.classList.remove("has-open-dialog")}),[f]);const w=Object(u.a)();if(!j)return;const N=Object(o.a)("Modal",n,O,b&&"transparent-backdrop");return r.a.createElement(d.a,null,r.a.createElement("div",{ref:y,className:N,tabIndex:-1,role:"dialog"},r.a.createElement("div",{className:"modal-container"},r.a.createElement("div",{className:"modal-backdrop",onClick:v}),r.a.createElement("div",{className:"modal-dialog"},m||(t?r.a.createElement("div",{className:"modal-header"},h&&r.a.createElement(s.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:w("Close"),onClick:v},r.a.createElement("i",{className:"icon-close"})),r.a.createElement("div",{className:"modal-title"},t)):void 0),r.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}},116:function(e,t,n){"use strict";var r=n(0),a=n(9),o=n(8),c=n(48),i=n(131);let l,u;async function s(){return l||(l=n.e(7).then(n.bind(null,193)),u=(await l).default),l}setTimeout(s,5e3);t.a=Object(r.h)(({className:e,id:t,animationData:n,play:l,playSegment:d,speed:f,noLoop:m,size:h,quality:b,isLowPriority:p,onLoad:v})=>{const[g,E]=Object(r.r)(),j=Object(r.q)(null),O=Object(r.q)(!1),y=Object(r.q)(!1),w=Object(r.q)();w.current=l;const N=Object(r.q)();N.current=d,Object(r.n)(()=>{if(g||!n)return;const e=()=>{if(!j.current)return;const e=new u(t,j.current,n,{noLoop:m,size:h,quality:b,isLowPriority:p},v);f&&e.setSpeed(f),E(e)};u?e():s().then(()=>{Object(a.b)(()=>{j.current&&e()})})},[g,n,t,p,m,v,b,h,f]),Object(r.n)(()=>()=>{g&&g.destroy()},[g]);const k=Object(r.m)((e=!1)=>{g&&(w.current||N.current)&&(N.current?g.playSegment(N.current):e?g.goToAndPlay(0):g.play())},[g]),C=Object(r.m)(()=>{g&&g.pause()},[g]),L=Object(r.m)(()=>{y.current=!0,g&&(O.current||(O.current=g.isPlaying()),C())},[g,C]),A=Object(r.m)(()=>{O.current&&k(),O.current=!1,y.current=!1},[k]),M=Object(r.m)(()=>{Object(a.b)(A)},[A]);Object(r.n)(()=>{g&&(l||d?y.current?O.current=!0:k(m):y.current?O.current=!1:C())},[g,l,d,m,k,C]),Object(c.a)(L,A),Object(i.a)(L,M);const P=Object(o.a)("AnimatedSticker",e),T=h?`width: ${h}px; height: ${h}px;`:void 0;return r.a.createElement("div",{ref:j,className:P,style:T})})},122:function(e,t,n){"use strict";var r=n(0),a=n(66);t.a=({containerId:e,className:t,children:n})=>{const o=Object(r.q)(document.createElement("div"));return Object(r.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const r=o.current;return t&&r.classList.add(t),n.appendChild(r),()=>{a.a.render(void 0,r),n.removeChild(r)}},[t,e]),a.a.render(n,o.current)}},125:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var r=n(5),a=n(54);const o={MonkeyIdle:n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:n.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:n.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function c(e){const t=o[e].replace(window.location.origin,"");return a.b("file"+t,r.ApiMediaFormat.Lottie)}},130:function(e,t,n){"use strict";var r=n(0),a=n(8),o=n(1),c=n(13),i=n(25),l=n(32),u=n(110),s=n(16);n(151);const d={type:"blob",quality:.8,format:"jpeg",circle:!1};let f,m,h;var b=Object(r.h)(({file:e,onChange:t,onClose:a})=>{const[b,p]=Object(r.r)(!1);Object(r.n)(()=>{e&&(b?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:r}=t;h=new f(t,{enableZoom:!0,boundary:{width:n,height:r},viewport:{width:n-16,height:r-16,type:"circle"}});const a=await Object(c.a)(e);await h.bind({url:a})}catch(e){o.p&&console.error(e)}}(e):async function(){return m||(m=Promise.all([n.e(6),n.e(8)]).then(n.bind(null,316)),f=(await m).default),m}().then(()=>p(!0)))},[e,b]);const v=Object(i.a)();return r.a.createElement(u.a,{isOpen:Boolean(e),onClose:a,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},b?r.a.createElement("div",{id:"avatar-crop"}):r.a.createElement(s.a,null),r.a.createElement(l.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!h)return;const e=await h.result(d),n="string"==typeof e?e:Object(c.b)(e,"avatar.jpg");t(n)},ariaLabel:v("CropImage")},r.a.createElement("i",{className:"icon-check"})))});n(152);t.a=Object(r.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:o})=>{const[c,i]=Object(r.r)(),[l,u]=Object(r.r)(n);Object(r.n)(()=>{u(n)},[n]);const s=Object(a.a)(l&&"filled",t&&"disabled");return r.a.createElement("div",{className:"AvatarEditable"},r.a.createElement("label",{className:s,role:"button",tabIndex:0,title:e},r.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(i(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),r.a.createElement("i",{className:"icon-camera-add"}),l&&r.a.createElement("img",{src:l,alt:"Avatar"})),r.a.createElement(b,{file:c,onClose:function(){i(void 0)},onChange:function(e){i(void 0),o(e),l&&URL.revokeObjectURL(l),u(URL.createObjectURL(e))}}))})},131:function(e,t,n){"use strict";var r=n(0);t.a=(e,t)=>{Object(r.n)(()=>(document.hasFocus()||e(),window.addEventListener("blur",e),window.addEventListener("focus",t),()=>{window.removeEventListener("focus",t),window.removeEventListener("blur",e)}),[e,t])}},140:function(e,t,n){},148:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(125),i=n(116);n(140);const l=[0,50],u=[0,20],s=[20,0],d=o.g?a.rb:a.qb;t.a=Object(r.h)(({isPasswordVisible:e,isBig:t})=>{const[n,o]=Object(r.r)(),[f,m]=Object(r.r)(),[h,b]=Object(r.r)(!1),[p,v]=Object(r.r)(!1);Object(r.n)(()=>{n?setTimeout(()=>v(!0),2e3):Object(c.a)("MonkeyClose").then(o)},[n]),Object(r.n)(()=>{f||Object(c.a)("MonkeyPeek").then(m)},[f]);const g=Object(r.m)(()=>b(!0),[]);return r.a.createElement("div",{id:"monkey",className:t?"big":""},!h&&r.a.createElement("div",{className:"monkey-preview"}),n&&r.a.createElement(i.a,{id:"closeMonkey",size:t?a.Bb:d,className:p?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:g}),f&&r.a.createElement(i.a,{id:"peekMonkey",size:t?a.Bb:d,className:p?"shown":"hidden",animationData:f,playSegment:e?u:s,noLoop:!0}))})},149:function(e,t,n){"use strict";var r=n(0),a=n(1),o=n(7),c=n(8),i=n(25),l=n(32);const u=o.g?550:400;t.a=Object(r.h)(({isLoading:e=!1,isPasswordVisible:t,error:n,hint:s,placeholder:d="Password",submitLabel:f="Next",clearError:m,onChangePasswordVisibility:h,onInputChange:b,onSubmit:p})=>{const v=Object(r.q)(null),g=Object(i.a)(),[E,j]=Object(r.r)(""),[O,y]=Object(r.r)(!1);return Object(r.n)(()=>{o.l||setTimeout(()=>{v.current.focus()},u)},[]),Object(r.n)(()=>{n&&requestAnimationFrame(()=>{v.current.focus(),v.current.select()})},[n]),r.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||O&&p(E)},autoComplete:"off"},r.a.createElement("div",{className:Object(c.a)("input-group password-input",E&&"touched",n&&"error"),dir:g.isRtl?"rtl":void 0},r.a.createElement("input",{ref:v,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:E||"",autoComplete:"current-password",onChange:function(e){n&&m();const{target:t}=e;j(t.value),y(t.value.length>=a.Y),b&&b(t.value)},dir:"auto"}),r.a.createElement("label",null,n||s||d),r.a.createElement("div",{className:"toggle-password",onClick:function(){h(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},r.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),O&&r.a.createElement(l.a,{type:"submit",ripple:!0,isLoading:e},f))})},150:function(e,t,n){},151:function(e,t,n){},152:function(e,t,n){}}]); +//# sourceMappingURL=5.aa91dcb7dfbeffe6a6d4.js.map \ No newline at end of file diff --git a/dist/5.c1959eb66d878675dbb0.js.map b/dist/5.aa91dcb7dfbeffe6a6d4.js.map similarity index 99% rename from dist/5.c1959eb66d878675dbb0.js.map rename to dist/5.aa91dcb7dfbeffe6a6d4.js.map index 2d4c0c60e..1725d7791 100644 --- a/dist/5.c1959eb66d878675dbb0.js.map +++ b/dist/5.aa91dcb7dfbeffe6a6d4.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/components/common/TrackingMonkey.tsx","webpack:///./src/hooks/useHistoryBack.ts","webpack:///./src/components/auth/AuthCode.tsx","webpack:///./src/components/auth/AuthPassword.tsx","webpack:///./src/components/auth/AuthRegister.tsx","webpack:///./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack:///./src/components/auth/AuthQrCode.tsx","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/components/ui/Portal.ts","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["STICKER_SIZE","IS_MOBILE_SCREEN","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","memo","code","codeLength","trackingDirection","isTracking","isBig","idleMonkeyData","setIdleMonkeyData","useState","trackingMonkeyData","setTrackingMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","TRACKING_FRAMES_PER_SYMBOL","useEffect","getAnimationData","then","handleFirstMonkeyLoad","useCallback","id","className","AnimatedSticker","size","STICKER_SIZE_TWO_FA","undefined","animationData","play","onLoad","playSegment","startFrame","length","endFrame","getTrackingFrames","speed","noLoop","useHistoryBack","handler","handlePopState","window","addEventListener","history","pushState","removeEventListener","back","withGlobal","global","pick","setGlobal","actions","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","inputRef","useRef","setCode","setIsTracking","setTrackingDirection","IS_TOUCH_ENV","current","focus","onCodeChange","e","currentTarget","target","value","replace","substr","onClick","role","tabIndex","title","InputText","ref","label","onInput","error","autoComplete","inputMode","Loading","authHint","setAuthPassword","showPassword","setShowPassword","handleChangePasswordVisibility","isVisible","handleSubmit","password","isPasswordVisible","PasswordForm","clearError","hint","isLoading","onChangePasswordVisibility","onSubmit","signUp","uploadProfilePhoto","isButtonShown","setIsButtonShown","croppedFile","setCroppedFile","firstName","setFirstName","lastName","setLastName","action","method","event","preventDefault","file","AvatarEditable","onChange","Button","type","ripple","G","H","render","w","B","self","QrCreator","t","c","a","b","h","u","J","r","d","text","level","version","O","C","g","x","f","lineTo","arcTo","moveTo","z","y","v","N","K","P","Math","max","min","getContext","background","fillStyle","fillRect","left","top","beginPath","p","q","k","m","D","E","n","l","floor","R","I","F","round","fill","colorStops","position","map","createLinearGradient","apply","Error","createRadialGradient","forEach","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","Object","assign","HTMLCanvasElement","width","height","clearRect","document","createElement","appendChild","Array","put","push","write","j","o","s","S","multiply","i","charCodeAt","L","M","Q","abs","connectionState","authQrCode","qrCodeRef","container","innerHTML","classList","remove","token","buildClassName","isText","Modal","props","isOpen","header","hasCloseButton","noBackdrop","children","onClose","onCloseAnimationEnd","onEnter","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","stopPropagation","focusableElements","from","querySelectorAll","currentFocusedIndex","findIndex","em","isSameNode","activeElement","newFocusedIndex","shiftKey","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","toggle","dispatchHeavyAnimationEvent","lang","useLang","fullClassName","Portal","color","ariaLabel","lottiePromise","RLottie","async","ensureLottie","default","setTimeout","quality","isLowPriority","animation","setAnimation","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","fastRaf","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useHeavyAnimationCheck","useBackgroundMode","style","containerId","elementRef","useLayoutEffect","querySelector","add","TeactDOM","removeChild","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","name","path","location","origin","mediaLoader","ApiMediaFormat","Lottie","cropperResultOptions","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","viewport","dataUri","blobToDataUri","bind","url","err","DEBUG","console","initCropper","ensureCroppie","Boolean","result","croppedImg","blobToFile","disabled","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","files","accept","src","alt","URL","revokeObjectURL","createObjectURL","onBlur","onFocus","hasFocus","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isPeekShown","setIsPeekShown","FOCUS_DELAY_TIMEOUT_MS","placeholder","submitLabel","onInputChange","setPassword","canSubmit","setCanSubmit","requestAnimationFrame","select","dir","isRtl","MIN_PASSWORD_LENGTH"],"mappings":"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AE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GACnf,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EACrf,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAChf,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAClf,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,KACzO,MADgP,CAAC4C,EAAE,SAAS3C,EAAED,GAAG,IAAI9D,EAAE6D,EAAEE,EAAED,GAAG,QAAG,IACje9D,EAAE,MAAMmH,MAAM,6BAA6BpD,EAAE,sBAAsBD,GAAGC,EAAE/D,EAAEnC,OAAO,EAAEiG,EAAE,GAAG,IAAI,IAAIM,EAAE,EAAEA,EAAEL,EAAEK,GAAG,EAAE,IAAI,IAAIM,EAAE1E,EAAE,EAAEoE,GAAGJ,EAAEhE,EAAE,EAAEoE,EAAE,GAAGR,EAAE5D,EAAE,EAAEoE,EAAE,GAAG4B,EAAE,EAAEA,EAAEtB,EAAEsB,GAAG,EAAE,CAAC,IAAIC,EAAErC,EAAEgB,EAAE,GAAGA,EAAE+D,EAAE3E,EAAEY,EAAE8D,EAAEzC,EAAEnC,EAAE0E,KAAK5D,GAAG,OAAOd,IAPkQ,GAOlP,OAAOW,EAnBoE,IAoB/R,gB,OCoCA1I,kBAAK4C,YACjBC,GAAuBC,YAAKD,EAAQ,CAAC,kBAAmB,eACzD,CAACE,EAAWC,IAA2BF,YAAKE,EAAS,CAAC,4BAFpCJ,CA5C6B,EAC/C0K,kBAAiBC,aAAYjK,8BAG7B,MAAMkK,EAAY/J,YAAuB,MAsBzC,OApBA3C,YAAU,KACR,IAAKyM,GAAkC,yBAApBD,EACjB,OAGF,MAAMG,EAAYD,EAAU1J,QAE5B2J,EAAUC,UAAY,GACtBD,EAAUE,UAAUC,OAAO,eAC3BhG,EAAUJ,OAAO,CACfc,KAAO,oBAAgBiF,EAAWM,MAClCjC,OAAQ,GACRD,QAAS,IACTb,KAAM,UACNxJ,KAAM,KACLmM,IACF,CAACH,EAAiBC,IAErBpL,EAAemB,GAGb,yBAAKnC,GAAG,eAAeC,UAAU,iBAC/B,yBAAKA,UAAU,aACb,yBAAKA,UAAW0M,YAAe,eAAgBP,GAAc,eAAgB3I,IAAK4I,IAC9ED,GAAc,kBAACrI,EAAA,EAAD,OAElB,8DACA,4BACE,4BAAI,8DACJ,4BAAI,uCAAiB,uCAAjB,MAAgD,sCAAhD,MAA8E,wCAClF,4BAAI,oFAEN,kBAACiC,EAAA,EAAD,CAAQ4G,QAAM,EAACxJ,QAASjB,GAAxB,gC,uHCqEO0K,IAhGcC,IAC3B,MAAM,MACJvJ,EADI,UAEJtD,EAFI,OAGJ8M,EAHI,OAIJC,EAJI,eAKJC,EALI,WAMJC,EANI,SAOJC,EAPI,QAQJC,EARI,oBASJC,EATI,QAUJC,GACER,GACE,aAAES,EAAF,qBAAgBC,GAAyBC,YAAkBV,EAAQM,GAEnEK,EAAWpL,YAAuB,MAExC3C,YAAU,IAAOoN,EACbY,YAAyB,CAAEC,MAAOR,EAASE,iBAC3CjN,EAAY,CAAC0M,EAAQK,EAASE,IAClC3N,YAAU,IAAOoN,GAAUW,EAAS/K,QClDvB,SAAmBkL,GAChC,SAASC,EAAchL,GACrB,GAAc,QAAVA,EAAEiL,IACJ,OAGFjL,EAAE8C,iBACF9C,EAAEkL,kBAEF,MAAMC,EAAoB7C,MAAM8C,KAC9BL,EAAQM,iBAAiB,6EAE3B,IAAKF,EAAkBtN,OACrB,OAGF,MAAMyN,EAAsBH,EAAkBI,UAAWC,GAAOA,EAAGC,WAAWtD,SAASuD,gBACvF,IAAIC,EAAkB,EAClBL,GAAuB,IAEvBK,EADE3L,EAAE4L,SACcN,EAAsB,EACpCA,EAAsB,EACtBH,EAAkBtN,OAAS,EAEbyN,EAAsBH,EAAkBtN,OAAS,EAC/DyN,EAAsB,EACtB,GAIRH,EAAkBQ,GAAiB7L,QAKrC,OAFAqI,SAAS7J,iBAAiB,UAAW0M,GAAe,GAE7C,KACL7C,SAAS1J,oBAAoB,UAAWuM,GAAe,IDcXa,CAAUjB,EAAS/K,cAAWtC,EAAY,CAAC0M,IAEzF6B,YAAsB,EAAEC,MACtB5D,SAAS6D,KAAKtC,UAAUuC,OAAO,kBAAmBhC,IAE9CA,IAAYA,QAAyB1M,IAAfwO,IACxBG,YAzCqB,KA4ChB,KACL/D,SAAS6D,KAAKtC,UAAUC,OAAO,qBAEhC,CAACM,IAEJ,MAAMkC,EAAOC,cAEb,IAAK3B,EACH,OA8BF,MAAM4B,EAAgBxC,YACpB,QACA1M,EACAuN,EACAN,GAAc,wBAGhB,OACE,kBAACkC,EAAA,EAAD,KACE,yBACE3L,IAAKiK,EACLzN,UAAWkP,EACX7L,UAAW,EACXD,KAAK,UAEL,yBAAKpD,UAAU,mBACb,yBAAKA,UAAU,iBAAiBmD,QAASgK,IACzC,yBAAKnN,UAAU,gBA3CjB+M,IAICzJ,EAKH,yBAAKtD,UAAU,gBACZgN,GACC,kBAACjH,EAAA,EAAD,CACE0D,OAAK,EACL2F,MAAM,cACNlP,KAAK,UACLmP,UAAWL,EAAK,SAChB7L,QAASgK,GAET,uBAAGnN,UAAU,gBAGjB,yBAAKA,UAAU,eAAesD,SAjBlC,GAyCQ,yBAAKtD,UAAU,+BACZkN,S,iCErHf,0CAyBA,IAAIoC,EACAC,EAKJC,eAAeC,IAMb,OALKH,IACHA,EAAgB,8BAChBC,SAAiBD,GAAsBI,SAGlCJ,EAGTK,WAAWF,EAXe,KAgLX7Q,gBAnKuB,EACpCoB,YACAD,KACAM,gBACAC,OACAE,cACAK,QACAC,SACAZ,OACA0P,UACAC,gBACAtP,aAEA,MAAOuP,EAAWC,GAAgB3Q,cAE5BiN,EAAYhK,YAAuB,MACnC2N,EAAa3N,aAAO,GACpB4N,EAAW5N,aAAO,GAElB6N,EAAU7N,cAChB6N,EAAQxN,QAAUpC,EAClB,MAAM6P,EAAiB9N,cACvB8N,EAAezN,QAAUlC,EAEzBd,YAAU,KACR,GAAIoQ,IAAczP,EAChB,OAGF,MAAM+P,EAAO,KACX,IAAK/D,EAAU3J,QACb,OAGF,MAAM2N,EAAe,IAAId,EACvBxP,EACAsM,EAAU3J,QACVrC,EACA,CACES,SACAZ,OACA0P,UACAC,iBAEFtP,GAGEM,GACFwP,EAAaC,SAASzP,GAGxBkP,EAAaM,IAGXd,EACFa,IAEAX,IAAe7P,KAAK,KAClB2Q,YAAQ,KACFlE,EAAU3J,SACZ0N,SAKP,CAACN,EAAWzP,EAAeN,EAAI8P,EAAe/O,EAAQP,EAAQqP,EAAS1P,EAAMW,IAEhFnB,YAAU,IACD,KACDoQ,GACFA,EAAUU,WAGb,CAACV,IAEJ,MAAMW,EAAgB3Q,YAAY,CAAC4Q,GAAgB,KAC7CZ,IAAcI,EAAQxN,SAAWyN,EAAezN,WAC9CyN,EAAezN,QACjBoN,EAAUtP,YAAY2P,EAAezN,SAC5BgO,EACTZ,EAAUa,YAAY,GAEtBb,EAAUxP,SAGb,CAACwP,IAEEc,EAAiB9Q,YAAY,KAC5BgQ,GAILA,EAAUe,SACT,CAACf,IAEEgB,EAAkBhR,YAAY,KAClCmQ,EAASvN,SAAU,EAEdoN,IAIAE,EAAWtN,UACdsN,EAAWtN,QAAUoN,EAAUiB,aAGjCH,MACC,CAACd,EAAWc,IAETI,EAAoBlR,YAAY,KAChCkQ,EAAWtN,SACb+N,IAGFT,EAAWtN,SAAU,EACrBuN,EAASvN,SAAU,GAClB,CAAC+N,IAEEQ,EAAyBnR,YAAY,KACzCyQ,YAAQS,IACP,CAACA,IAEJtR,YAAU,KACHoQ,IAIDxP,GAAQE,EACNyP,EAASvN,QACXsN,EAAWtN,SAAU,EAErB+N,EAAc3P,GAIZmP,EAASvN,QACXsN,EAAWtN,SAAU,EAErBkO,MAGH,CAACd,EAAWxP,EAAME,EAAaM,EAAQ2P,EAAeG,IAEzDM,YAAuBJ,EAAiBE,GAIxCG,YAAkBL,EAAiBG,GAEnC,MAAM/B,EAAgBxC,YAAe,kBAAmB1M,GAElDoR,EAAQlR,EAAQ,UAASA,gBAAmBA,YAAYE,EAE9D,OACE,yBACEoD,IAAK6I,EACLrM,UAAWkP,EAEXkC,MAAOA,O,iCCxMb,mBAkCejC,IAzBc,EAAGkC,cAAarR,YAAWkN,eACtD,MAAMoE,EAAajP,YAAO2I,SAASC,cAAc,QAqBjD,OAnBAsG,YAAgB,KACd,MAAMlF,EAAYrB,SAASwG,cAA8BH,GAAe,YACxE,IAAKhF,EACH,OAGF,MAAMuB,EAAU0D,EAAW5O,QAO3B,OANI1C,GACF4N,EAAQrB,UAAUkF,IAAIzR,GAGxBqM,EAAUnB,YAAY0C,GAEf,KACL8D,IAAStL,YAAOhG,EAAWwN,GAC3BvB,EAAUsF,YAAY/D,KAEvB,CAAC5N,EAAWqR,IAERK,IAAStL,OAAO8G,EAAUoE,EAAW5O,W,sFCZvC,MAAMkP,EAA0B,CACrCC,WCpBa,IAA0B,gEDqBvCC,eErBa,IAA0B,oEFsBvCC,YGtBa,IAA0B,iEHuBvCC,WIvBa,IAA0B,gEJwBvCC,WKxBa,IAA0B,kDLyBvCC,WMzBa,IAA0B,kDN0BvCC,iBO1Ba,IAA0B,8DP6B1B,SAASxS,EAAiByS,GACvC,MAAMC,EAAOT,EAAwBQ,GAAMnP,QAAQ/B,OAAOoR,SAASC,OAAQ,IAE3E,OAAOC,IAAmB,OAAMH,EAAQI,iBAAeC,U,0GQjBzD,MAAMC,EAAiE,CACrE3M,KAAM,OACN4J,QAAS,GACTgD,OAAQ,OACRC,QAAQ,GAIV,IAAIC,EACAC,EAWAC,EAgGWpU,kBAxDiB,EAAGgH,OAAME,WAAUqH,cACjD,MAAO8F,EAAgBC,GAAqB9T,aAAS,GAErDM,YAAU,KACHkG,IAIAqN,EA9CTzD,eAA2B2D,GACzB,IACE,MAAMC,EAAgBpI,SAASqI,eAAe,eAC9C,IAAKD,EACH,OAGF,MAAM,YAAEE,EAAF,aAAeC,GAAiBH,EAEtCJ,EAAU,IAAIF,EAAQM,EAAe,CACnCI,YAAY,EACZC,SAAU,CACR5I,MAAOyI,EACPxI,OAAQyI,GAEVG,SAAU,CACR7I,MAAOyI,EAAc,GACrBxI,OAAQyI,EAAe,GACvBvN,KAAM,YAIV,MAAM2N,QAAgBC,YAAcT,SAC9BH,EAAQa,KAAK,CAAEC,IAAKH,IAC1B,MAAOI,GACHC,KAEFC,QAAQtQ,MAAMoQ,IAyBhBG,CAAYtO,GA/DhB4J,iBAME,OALKuD,IACHA,EAAiB,oDACjBD,SAAiBC,GAAgBrD,SAG5BqD,EAoDHoB,GAAgBvU,KAAK,IAAMsT,GAAkB,MAM9C,CAACtN,EAAMqN,IAEV,MAAMjE,EAAOC,cAab,OACE,kBAACrC,EAAA,EAAD,CACEE,OAAQsH,QAAQxO,GAChBuH,QAASA,EACT7J,MAAM,qBACNtD,UAAU,YACVgN,gBAAc,GAEbiG,EACC,yBAAKlT,GAAG,gBAER,kBAAC+D,EAAA,EAAD,MAEF,kBAACiC,EAAA,EAAD,CACE/F,UAAU,iBACVyJ,OAAK,EACL2F,MAAM,UACNjM,QA5BNqM,iBACE,IAAKwD,EACH,OAGF,MAAMqB,QAA8BrB,EAAQqB,OAAO1B,GAC7C2B,EAA+B,iBAAXD,EAAsBA,EAASE,YAAWF,EAAQ,cAE5EvO,EAASwO,IAqBLjF,UAAWL,EAAK,cAEhB,uBAAGhP,UAAU,mB,OC3CNpB,gBAhEsB,EACnC0E,QAAQ,8BACRkR,WACAC,uBACA3O,eAEA,MAAO4O,EAAcC,GAAmBvV,eACjCwV,EAAgBC,GAAqBzV,YAA6BqV,GAEzE/U,YAAU,KACRmV,EAAkBJ,IACjB,CAACA,IA2BJ,MAAMK,EAAiBpI,YACrBkI,GAAkB,SAClBJ,GAAY,YAGd,OACE,yBAAKxU,UAAU,kBACb,2BACEA,UAAW8U,EACX1R,KAAK,SACLC,SAAU,EACVC,MAAOA,GAEP,2BACE0C,KAAK,OACLF,SAxCR,SAA0BJ,GACxB,MAAM3C,EAAS2C,EAAM3C,OAEhBA,GAAWA,EAAOgS,OAAUhS,EAAOgS,MAAM,KAI9CJ,EAAgB5R,EAAOgS,MAAM,IAC7BhS,EAAOC,MAAQ,KAiCTgS,OAAO,0BAET,uBAAGhV,UAAU,oBACZ4U,GAAkB,yBAAKK,IAAKL,EAAgBM,IAAI,YAEnD,kBAAC,EAAD,CAAWtP,KAAM8O,EAAcvH,QAzBnC,WACEwH,OAAgBvU,IAwB4C0F,SAnC9D,SAA0BwO,GACxBK,OAAgBvU,GAChB0F,EAASwO,GAELM,GACFO,IAAIC,gBAAgBR,GAEtBC,EAAkBM,IAAIE,gBAAgBf,W,iCCjD1C,WAEe,KACbgB,EACAC,KAEA7V,YAAU,KACHsL,SAASwK,YACZF,IAGFpU,OAAOC,iBAAiB,OAAQmU,GAChCpU,OAAOC,iBAAiB,QAASoU,GAE1B,KACLrU,OAAOI,oBAAoB,QAASiU,GACpCrU,OAAOI,oBAAoB,OAAQgU,KAEpC,CAACA,EAAQC,M,uDClBd,kDAiBA,MACME,EAAuC,CAAC,EAAG,IAC3CC,EAAwC,CAAC,EAAG,IAC5CC,EAAsC,CAAC,GAAI,GAC3CnX,EAAeC,IAAmBC,KAA2BC,KAsDpDC,gBApDsB,EAAG2F,oBAAmBtF,YACzD,MAAO2W,EAAiBC,GAAsBzW,eACvC0W,EAAgBC,GAAqB3W,eACrCG,EAAqBC,GAA0BJ,aAAS,IACxD4W,EAAaC,GAAkB7W,aAAS,GAE/CM,YAAU,KACHkW,EAGHjG,WAAW,IAAMsG,GAAe,GAhBP,KAczBtW,YAAiB,eAAeC,KAAKiW,IAItC,CAACD,IAEJlW,YAAU,KACHoW,GACHnW,YAAiB,cAAcC,KAAKmW,IAErC,CAACD,IAEJ,MAAMjW,EAAwBC,YAAY,IAAMN,GAAuB,GAAO,IAE9E,OACE,yBAAKO,GAAG,SAASC,UAAWf,EAAQ,MAAQ,KACxCM,GACA,yBAAKS,UAAU,mBAEhB4V,GACC,kBAAC,IAAD,CACE7V,GAAG,cACHG,KAAMjB,EAAQkB,KAAsB3B,EACpCwB,UAAWgW,EAAc,SAAW,QACpC3V,cAAeuV,EACfpV,YAAaiV,EACb3U,QAAM,EACNP,OAAQV,IAGXiW,GACC,kBAAC,IAAD,CACE/V,GAAG,aACHG,KAAMjB,EAAQkB,KAAsB3B,EACpCwB,UAAWgW,EAAc,QAAU,SACnC3V,cAAeyV,EACftV,YAAa+D,EAAoBmR,EAAsBC,EACvD7U,QAAM,Q,iCCnEhB,gDAwBA,MAAMoV,EAAyBzX,IAAmB,IAAM,IAuGzCG,gBArGoB,EACjC+F,aAAY,EACZJ,oBACAZ,QACAe,OACAyR,cAAc,WACdC,cAAc,OACd3R,aACAG,6BACAyR,gBACAxR,eAGA,MAAMzC,EAAWC,YAAyB,MACpC2M,EAAOC,eAEN3K,EAAUgS,GAAelX,YAAS,KAClCmX,EAAWC,GAAgBpX,aAAS,GAgD3C,OA9CAM,YAAU,KACH+C,KACHkN,WAAW,KACTvN,EAASM,QAASC,SACjBuT,IAEJ,IAEHxW,YAAU,KACJiE,GACF8S,sBAAsB,KACpBrU,EAASM,QAASC,QAClBP,EAASM,QAASgU,YAGrB,CAAC/S,IAgCF,0BAAM6B,OAAO,GAAGX,SAblB,SAAsBa,GACpBA,EAAMC,iBAEFhB,GAIA4R,GACF1R,EAASP,IAK6BV,aAAa,OACnD,yBACE5D,UAAW0M,YAAe,6BAA8BpI,GAAY,UAAWX,GAAS,SACxFgT,IAAK3H,EAAK4H,MAAQ,WAAQxW,GAE1B,2BACEoD,IAAKpB,EACLpC,UAAU,eACVgG,KAAMzB,EAAoB,OAAS,WACnCxE,GAAG,mBACHiD,MAAOsB,GAAY,GACnBV,aAAa,mBACbkC,SA1CR,SAA0BjD,GACpBc,GACFc,IAGF,MAAM,OAAE1B,GAAWF,EACnByT,EAAYvT,EAAOC,OACnBwT,EAAazT,EAAOC,MAAMtC,QAAUmW,KAChCR,GACFA,EAActT,EAAOC,QAkCjB2T,IAAI,SAEN,+BAAQhT,GAASe,GAAQyR,GACzB,yBACEnW,UAAU,kBACVmD,QAnCR,WACEyB,GAA4BL,IAmCtBnB,KAAK,SACLC,SAAU,EACVC,MAAM,8BAEN,uBAAGtD,UAAWuE,EAAoB,WAAa,sBAGlDgS,GACC,kBAAC,IAAD,CAAQvQ,KAAK,SAASC,QAAM,EAACtB,UAAWA,GACrCyR,O","file":"5.c1959eb66d878675dbb0.js","sourcesContent":["import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n code: string;\n codeLength: number;\n trackingDirection: number;\n isTracking: boolean;\n isBig?: boolean;\n};\n\nconst TRACKING_START_FRAME = 15;\nconst TRACKING_END_FRAME = 180;\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst TrackingMonkey: FC = ({\n code,\n codeLength,\n trackingDirection,\n isTracking,\n isBig,\n}) => {\n const [idleMonkeyData, setIdleMonkeyData] = useState>();\n const [trackingMonkeyData, setTrackingMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const TRACKING_FRAMES_PER_SYMBOL = (TRACKING_END_FRAME - TRACKING_START_FRAME) / codeLength;\n\n useEffect(() => {\n if (!idleMonkeyData) {\n getAnimationData('MonkeyIdle').then(setIdleMonkeyData);\n }\n }, [idleMonkeyData]);\n\n useEffect(() => {\n if (!trackingMonkeyData) {\n getAnimationData('MonkeyTracking').then(setTrackingMonkeyData);\n }\n }, [trackingMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n function getTrackingFrames(): [number, number] {\n const startFrame = (code && code.length > 1) || trackingDirection < 0\n ? TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * (code.length - 1)\n : 0;\n const endFrame = code.length === codeLength\n ? TRACKING_END_FRAME\n : TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * code.length;\n\n if (trackingDirection < 1) {\n return [\n endFrame,\n startFrame,\n ];\n }\n\n return [\n startFrame,\n endFrame,\n ];\n }\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {idleMonkeyData && (\n \n )}\n {trackingMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(TrackingMonkey);\n","// This is unsafe and can be not chained as `popstate` event is asynchronous\n\nexport default function useHistoryBack(handler: NoneToVoidFunction) {\n function handlePopState() {\n handler();\n }\n\n window.addEventListener('popstate', handlePopState);\n window.history.pushState({}, '');\n\n return () => {\n window.removeEventListener('popstate', handlePopState);\n window.history.back();\n };\n}\n","import { FormEvent } from 'react';\nimport React, {\n FC, useState, useEffect, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\n\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport TrackingMonkey from '../common/TrackingMonkey';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC = ({\n authPhoneNumber, authIsCodeViaApp, authIsLoading, authError, setAuthCode, returnToAuthPhoneNumber, clearAuthError,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [code, setCode] = useState('');\n const [isTracking, setIsTracking] = useState(false);\n const [trackingDirection, setTrackingDirection] = useState(1);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, []);\n\n useHistoryBack(returnToAuthPhoneNumber);\n\n const onCodeChange = useCallback((e: FormEvent) => {\n if (authError) {\n clearAuthError();\n }\n\n const { currentTarget: target } = e;\n target.value = target.value.replace(/[^\\d]+/, '').substr(0, CODE_LENGTH);\n\n if (target.value === code) {\n return;\n }\n\n setCode(target.value);\n\n if (!isTracking) {\n setIsTracking(true);\n } else if (!target.value.length) {\n setIsTracking(false);\n }\n\n if (code && code.length > target.value.length) {\n setTrackingDirection(-1);\n } else {\n setTrackingDirection(1);\n }\n\n if (target.value.length === CODE_LENGTH) {\n setAuthCode({ code: target.value });\n }\n }, [authError, clearAuthError, code, isTracking, setAuthCode]);\n\n return (\n
\n
\n \n

\n {authPhoneNumber}\n \n \n

\n \n

\n {authIsCodeViaApp ? (\n <>\n We have sent the code to the Telegram app\n
on your other device.\n \n ) : (\n <>\n We have sent you an SMS\n
with the code.\n \n )}\n

\n \n {authIsLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authPhoneNumber', 'authIsCodeViaApp', 'authIsLoading', 'authError']),\n (setGlobal, actions): DispatchProps => pick(actions, ['setAuthCode', 'returnToAuthPhoneNumber', 'clearAuthError']),\n)(AuthCode));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport MonkeyPassword from '../common/PasswordMonkey';\nimport PasswordForm from '../common/PasswordForm';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst AuthPassword: FC = ({\n authIsLoading, authError, authHint, setAuthPassword, clearAuthError,\n}) => {\n const [showPassword, setShowPassword] = useState(false);\n\n const handleChangePasswordVisibility = useCallback((isVisible) => {\n setShowPassword(isVisible);\n }, []);\n\n const handleSubmit = useCallback((password: string) => {\n setAuthPassword({ password });\n }, [setAuthPassword]);\n\n return (\n
\n
\n \n

Enter Your Password

\n

\n Your account is protected with\n
an additional password.\n

\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError', 'authHint']),\n (setGlobal, actions): DispatchProps => pick(actions, ['setAuthPassword', 'clearAuthError']),\n)(AuthPassword));\n","import { ChangeEvent } from 'react';\nimport React, { FC, useState, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Button from '../ui/Button';\nimport InputText from '../ui/InputText';\nimport AvatarEditable from '../ui/AvatarEditable';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst AuthRegister: FC = ({\n authIsLoading, authError, signUp, clearAuthError, uploadProfilePhoto,\n}) => {\n const [isButtonShown, setIsButtonShown] = useState(false);\n const [croppedFile, setCroppedFile] = useState();\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n\n function handleFirstNameChange(event: ChangeEvent) {\n if (authError) {\n clearAuthError();\n }\n\n const { target } = event;\n\n setFirstName(target.value);\n setIsButtonShown(target.value.length > 0);\n }\n\n function handleLastNameChange(event: ChangeEvent) {\n const { target } = event;\n\n setLastName(target.value);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n signUp({ firstName, lastName });\n\n if (croppedFile) {\n uploadProfilePhoto({ file: croppedFile });\n }\n }\n\n return (\n
\n
\n
\n \n

Your Name

\n

\n Enter your name and add\n
a profile picture.\n

\n \n \n {isButtonShown && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError']),\n (setGlobal, actions): DispatchProps => pick(actions, ['signUp', 'clearAuthError', 'uploadProfilePhoto']),\n)(AuthRegister));\n","/*\n jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */\n'use strict';let G=null;class H{}H.render=function(w,B){G(w,B)};self.QrCreator=H;\n(function(w){function B(t,c,a,e){var b={},h=w(a,c);h.u(t);h.J();e=e||0;var r=h.h(),d=h.h()+2*e;b.text=t;b.level=c;b.version=a;b.O=d;b.a=function(b,a){b-=e;a-=e;return 0>b||b>=r||0>a||a>=r?!1:h.a(b,a)};return b}function C(t,c,a,e,b,h,r,d,g,x){function u(b,a,f,c,d,r,g){b?(t.lineTo(a+r,f+g),t.arcTo(a,f,c,d,h)):t.lineTo(a,f)}r?t.moveTo(c+h,a):t.moveTo(c,a);u(d,e,a,e,b,-h,0);u(g,e,b,c,b,0,-h);u(x,c,b,c,a,h,0);u(r,c,a,e,a,0,h)}function z(t,c,a,e,b,h,r,d,g,x){function u(b,a,c,d){t.moveTo(b+c,a);t.lineTo(b,\na);t.lineTo(b,a+d);t.arcTo(b,a,b+c,a,h)}r&&u(c,a,h,h);d&&u(e,a,-h,h);g&&u(e,b,-h,-h);x&&u(c,b,h,-h)}function A(t,c){var a=c.fill;if(\"string\"===typeof a)t.fillStyle=a;else{var e=a.type,b=a.colorStops;a=a.position.map((b)=>Math.round(b*c.size));if(\"linear-gradient\"===e)var h=t.createLinearGradient.apply(t,a);else if(\"radial-gradient\"===e)h=t.createRadialGradient.apply(t,a);else throw Error(\"Unsupported fill\");b.forEach(([b,a])=>{h.addColorStop(b,a)});t.fillStyle=h}}function y(t,c){a:{var a=c.text,e=\nc.v,b=c.N,h=c.K,r=c.P;b=Math.max(1,b||1);for(h=Math.min(40,h||40);b<=h;b+=1)try{var d=B(a,e,b,r);break a}catch(J){}d=void 0}if(!d)return null;a=t.getContext(\"2d\");c.background&&(a.fillStyle=c.background,a.fillRect(c.left,c.top,c.size,c.size));e=d.O;h=c.size/e;a.beginPath();for(r=0;r>>7-b%8&1)},put:function(b,h){for(var a=0;a>>h-a-1&1))},f:function(){return a},m:function(b){var h=Math.floor(a/8);c.length<=h&&c.push(0);b&&(c[h]|=128>>>a%8);a+=1}};return e}function C(c,a){function e(b,h){for(var a=-1;7>=a;a+=1)if(!(-1>=b+a||d<=b+a))for(var c=-1;7>=c;c+=1)-1>=h+c||d<=h+c||(r[b+a][h+c]=0<=a&&6>=a&&(0==c||6==c)||0<=c&&6>=c&&(0==a||6==a)||2<=a&&4>=a&&2<=c&&4>=c?!0:!1)}function b(b,a){for(var f=d=4*c+17,k=Array(f),m=0;m<\nf;m+=1){k[m]=Array(f);for(var p=0;p=n;n+=1)for(var l=-2;2>=l;l+=1)r[p+n][q+l]=-2==n||2==n||-2==l||2==l||0==n&&0==l}for(f=8;fk;k+=1)m=!b&&1==(f>>k&1),r[6>k?k:8>k?k+1:d-15+k][8]=m,r[8][8>k?d-k-1:9>k?15-k:14-k]=m;r[d-8][8]=!b;if(7<=\nc){f=y.A(c);for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[Math.floor(k/3)][k%3+d-8-3]=m;for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[k%3+d-8-3][Math.floor(k/3)]=m}if(null==g){b=t.I(c,h);f=B();for(k=0;k8*m)throw Error(\"code length overflow. (\"+f.f()+\">\"+8*m+\")\");for(f.f()+4<=8*m&&f.put(0,4);0!=f.f()%8;)f.m(!1);for(;!(f.f()>=8*m);){f.put(236,8);if(f.f()>=8*m)break;f.put(17,8)}var u=0;m=k=0;p=Array(b.length);\nq=Array(b.length);for(n=0;nn;n+=1)null==r[k][q-n]&&(l=!1,p>>m&1)),a(k,q-n)&&(l=!l),r[k][q-n]=l,--m,-1==m&&(p+=1,m=7));k+=f;if(0>k||d<=k){k-=f;f=-f;break}}}var h=A[a],r=null,d=0,g=null,x=[],u={u:function(b){b=w(b);x.push(b);g=null},a:function(b,a){if(0>b||d<=b||0>a||d<=a)throw Error(b+\",\"+a);return r[b][a]},h:function(){return d},J:function(){for(var a=0,h=0,c=0;8>c;c+=1){b(!0,c);var d=y.D(u);if(0==c||a>d)a=d,h=c}b(!1,h)}};return u}\nfunction z(c,a){if(\"undefined\"==typeof c.length)throw Error(c.length+\"/\"+a);var e=function(){for(var b=0;bb.b()-a.b())return b;for(var c=v.g(b.c(0))-v.g(a.c(0)),h=Array(b.b()),\ng=0;gb?a.push(b):2048>b?a.push(192|b>>6,128|b&63):55296>b||57344<=b?a.push(224|b>>12,128|b>>6&63,128|b&63):(e++,b=65536+((b&1023)<<10|c.charCodeAt(e)&1023),a.push(240|b>>18,128|b>>12&63,128|b>>6&63,128|b&63))}return a};var A={L:1,M:0,Q:3,H:2},y=function(){function c(b){for(var a=0;0!=b;)a+=1,b>>>=1;return a}var a=[[],[6,18],\n[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],\n[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e={w:function(b){for(var a=b<<10;0<=c(a)-c(1335);)a^=1335<a||40a?8:16},D:function(b){for(var a=b.h(),c=0,\nd=0;d=p;p+=1)if(!(0>d+p||a<=d+p))for(var q=-1;1>=q;q+=1)0>g+q||a<=g+q||(0!=p||0!=q)&&t==b.a(d+p,g+q)&&(e+=1);5e;e+=1)c[e]=1<e;e+=1)c[e]=c[e-4]^c[e-5]^c[e-6]^c[e-8];for(e=0;255>e;e+=1)a[c[e]]=e;return{g:function(b){if(1>b)throw Error(\"glog(\"+b+\")\");return a[b]},i:function(b){for(;0>b;)b+=255;for(;256<=b;)b-=255;return c[b]}}}(),t=function(){function c(b,c){switch(c){case A.L:return a[4*\n(b-1)];case A.M:return a[4*(b-1)+1];case A.Q:return a[4*(b-1)+2];case A.H:return a[4*(b-1)+3]}}var a=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,\n2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,\n45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,\n151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],\n[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],\n[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],e={I:function(b,a){var e=c(b,a);if(\"undefined\"==\ntypeof e)throw Error(\"bad rs block @ typeNumber:\"+b+\"/errorCorrectLevel:\"+a);b=e.length/3;a=[];for(var d=0;d;\ntype DispatchProps = Pick;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState, authQrCode, returnToAuthPhoneNumber,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef(null);\n\n useEffect(() => {\n if (!authQrCode || connectionState !== 'connectionStateReady') {\n return;\n }\n\n const container = qrCodeRef.current!;\n\n container.innerHTML = '';\n container.classList.remove('pre-animate');\n QrCreator.render({\n text: `${DATA_PREFIX}${authQrCode.token}`,\n radius: 0.5,\n ecLevel: 'M',\n fill: '#4E96D4',\n size: 280,\n }, container);\n }, [connectionState, authQrCode]);\n\n useHistoryBack(returnToAuthPhoneNumber);\n\n return (\n
\n
\n
\n {!authQrCode && }\n
\n

Log in to Telegram by QR Code

\n
    \n
  1. Open Telegram on your phone
  2. \n
  3. Go to Settings > Devices > Scan QR
  4. \n
  5. Point your phone at this screen to confirm login
  6. \n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['connectionState', 'authQrCode']),\n (setGlobal, actions): DispatchProps => pick(actions, ['returnToAuthPhoneNumber']),\n)(AuthCode));\n","import React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n}) => {\n const [animation, setAnimation] = useState();\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName('AnimatedSticker', className);\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef(document.createElement('div'));\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\n};\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const lang = useLang();\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n \n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/components/common/TrackingMonkey.tsx","webpack:///./src/hooks/useHistoryBack.ts","webpack:///./src/components/auth/AuthCode.tsx","webpack:///./src/components/auth/AuthPassword.tsx","webpack:///./src/components/auth/AuthRegister.tsx","webpack:///./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack:///./src/components/auth/AuthQrCode.tsx","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/components/ui/Portal.ts","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["STICKER_SIZE","IS_MOBILE_SCREEN","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","memo","code","codeLength","trackingDirection","isTracking","isBig","idleMonkeyData","setIdleMonkeyData","useState","trackingMonkeyData","setTrackingMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","TRACKING_FRAMES_PER_SYMBOL","useEffect","getAnimationData","then","handleFirstMonkeyLoad","useCallback","id","className","AnimatedSticker","size","STICKER_SIZE_TWO_FA","undefined","animationData","play","onLoad","playSegment","startFrame","length","endFrame","getTrackingFrames","speed","noLoop","useHistoryBack","handler","handlePopState","window","addEventListener","history","pushState","removeEventListener","back","withGlobal","global","pick","setGlobal","actions","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","inputRef","useRef","setCode","setIsTracking","setTrackingDirection","IS_TOUCH_ENV","current","focus","onCodeChange","e","currentTarget","target","value","replace","substr","onClick","role","tabIndex","title","InputText","ref","label","onInput","error","autoComplete","inputMode","Loading","authHint","setAuthPassword","showPassword","setShowPassword","handleChangePasswordVisibility","isVisible","handleSubmit","password","isPasswordVisible","PasswordForm","clearError","hint","isLoading","onChangePasswordVisibility","onSubmit","signUp","uploadProfilePhoto","isButtonShown","setIsButtonShown","croppedFile","setCroppedFile","firstName","setFirstName","lastName","setLastName","action","method","event","preventDefault","file","AvatarEditable","onChange","Button","type","ripple","G","H","render","w","B","self","QrCreator","t","c","a","b","h","u","J","r","d","text","level","version","O","C","g","x","f","lineTo","arcTo","moveTo","z","y","v","N","K","P","Math","max","min","getContext","background","fillStyle","fillRect","left","top","beginPath","p","q","k","m","D","E","n","l","floor","R","I","F","round","fill","colorStops","position","map","createLinearGradient","apply","Error","createRadialGradient","forEach","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","Object","assign","HTMLCanvasElement","width","height","clearRect","document","createElement","appendChild","Array","put","push","write","j","o","s","S","multiply","i","charCodeAt","L","M","Q","abs","connectionState","authQrCode","qrCodeRef","container","innerHTML","classList","remove","token","buildClassName","isText","Modal","props","isOpen","header","hasCloseButton","noBackdrop","children","onClose","onCloseAnimationEnd","onEnter","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","stopPropagation","focusableElements","from","querySelectorAll","currentFocusedIndex","findIndex","em","isSameNode","activeElement","newFocusedIndex","shiftKey","trapFocus","useEffectWithPrevDeps","prevIsOpen","body","toggle","dispatchHeavyAnimationEvent","lang","useLang","fullClassName","Portal","color","ariaLabel","lottiePromise","RLottie","async","ensureLottie","default","setTimeout","quality","isLowPriority","animation","setAnimation","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","fastRaf","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useHeavyAnimationCheck","useBackgroundMode","style","containerId","elementRef","useLayoutEffect","querySelector","add","TeactDOM","removeChild","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","name","path","location","origin","mediaLoader","ApiMediaFormat","Lottie","cropperResultOptions","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","viewport","dataUri","blobToDataUri","bind","url","err","DEBUG","console","initCropper","ensureCroppie","Boolean","result","croppedImg","blobToFile","disabled","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","files","accept","src","alt","URL","revokeObjectURL","createObjectURL","onBlur","onFocus","hasFocus","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isPeekShown","setIsPeekShown","FOCUS_DELAY_TIMEOUT_MS","placeholder","submitLabel","onInputChange","setPassword","canSubmit","setCanSubmit","requestAnimationFrame","select","dir","isRtl","MIN_PASSWORD_LENGTH"],"mappings":"+VAoBA,MAEMA,EAAeC,IAAmBC,KAA2BC,KA+EpDC,kBA7EsB,EACnCC,OACAC,aACAC,oBACAC,aACAC,YAEA,MAAOC,EAAgBC,GAAqBC,eACrCC,EAAoBC,GAAyBF,eAC7CG,EAAqBC,GAA0BJ,aAAS,GACzDK,EAA6B,IAA8CX,EAEjFY,YAAU,KACHR,GACHS,YAAiB,cAAcC,KAAKT,IAErC,CAACD,IAEJQ,YAAU,KACHL,GACHM,YAAiB,kBAAkBC,KAAKN,IAEzC,CAACD,IAEJ,MAAMQ,EAAwBC,YAAY,IAAMN,GAAuB,GAAO,IAuB9E,OACE,yBAAKO,GAAG,SAASC,UAAWf,EAAQ,MAAQ,KACxCM,GACA,yBAAKS,UAAU,mBAEhBd,GACC,kBAACe,EAAA,EAAD,CACEF,GAAG,aACHG,KAAMjB,EAAQkB,KAAsB3B,EACpCwB,UAAWhB,EAAa,cAAWoB,EACnCC,cAAenB,EACfoB,MAAOtB,EACPuB,OAAQV,IAGXR,GACC,kBAACY,EAAA,EAAD,CACEF,GAAG,iBACHG,KAAMjB,EAAQkB,KAAsB3B,EACpCwB,UAAYhB,EAAwB,QAAX,SACzBqB,cAAehB,EACfmB,YAAaxB,EA1CrB,WACE,MAAMyB,EAAc5B,GAAQA,EAAK6B,OAAS,GAAM3B,EAAoB,EA/B3C,GAgCEU,GAA8BZ,EAAK6B,OAAS,GACnE,EACEC,EAAW9B,EAAK6B,SAAW5B,EAjCV,IADE,GAoCEW,EAA6BZ,EAAK6B,OAE7D,OAAI3B,EAAoB,EACf,CACL4B,EACAF,GAIG,CACLA,EACAE,GAyB8BC,QAAsBR,EAChDS,MAAO,EACPC,QAAM,OC5FD,SAASC,EAAeC,GACrC,SAASC,IACPD,IAMF,OAHAE,OAAOC,iBAAiB,WAAYF,GACpCC,OAAOE,QAAQC,UAAU,GAAI,IAEtB,KACLH,OAAOI,oBAAoB,WAAYL,GACvCC,OAAOE,QAAQG,QC2GJ3C,kBAAK4C,YACjBC,GAAuBC,YAAKD,EAAQ,CAAC,kBAAmB,mBAAoB,gBAAiB,cAC9F,CAACE,EAAWC,IAA2BF,YAAKE,EAAS,CAAC,cAAe,0BAA2B,mBAF9EJ,CAnG6B,EAC/CK,kBAAiBC,mBAAkBC,gBAAeC,YAAWC,cAAaC,0BAAyBC,qBAGnG,MAAMC,EAAWC,YAAyB,OAEnCxD,EAAMyD,GAAWlD,YAAiB,KAClCJ,EAAYuD,GAAiBnD,aAAS,IACtCL,EAAmByD,GAAwBpD,YAAS,GAE3DM,YAAU,KACH+C,KACHL,EAASM,QAASC,SAEnB,IAEH5B,EAAemB,GAEf,MAAMU,EAAe9C,YAAa+C,IAC5Bb,GACFG,IAGF,MAAQW,cAAeC,GAAWF,EAClCE,EAAOC,MAAQD,EAAOC,MAAMC,QAAQ,SAAU,IAAIC,OAAO,EA1BzC,GA4BZH,EAAOC,QAAUnE,IAIrByD,EAAQS,EAAOC,OAEVhE,EAEO+D,EAAOC,MAAMtC,QACvB6B,GAAc,GAFdA,GAAc,GAKZ1D,GAAQA,EAAK6B,OAASqC,EAAOC,MAAMtC,OACrC8B,GAAsB,GAEtBA,EAAqB,GA3CP,IA8CZO,EAAOC,MAAMtC,QACfuB,EAAY,CAAEpD,KAAMkE,EAAOC,UAE5B,CAAChB,EAAWG,EAAgBtD,EAAMG,EAAYiD,IAEjD,OACE,yBAAKlC,GAAG,iBAAiBC,UAAU,iBACjC,yBAAKA,UAAU,aACb,kBAAC,EAAD,CACEnB,KAAMA,EACNC,WAxDU,EAyDVE,WAAYA,EACZD,kBAAmBA,IAErB,4BACG8C,EACD,yBACE7B,UAAU,mBACVmD,QAASjB,EACTkB,KAAK,SACLC,SAAU,EACVC,MAAM,qCAEN,uBAAGtD,UAAU,gBAGjB,uBAAGA,UAAU,QACV8B,EACC,gFAEE,6BAFF,yBAKA,8DAEE,6BAFF,mBAMJ,kBAACyB,EAAA,EAAD,CACEC,IAAKpB,EACLrC,GAAG,eACH0D,MAAM,OACNC,QAASd,EACTI,MAAOnE,EACP8E,MAAO3B,EACP4B,aAAa,MACbC,UAAU,YAEX9B,GAAiB,kBAAC+B,EAAA,EAAD,W,kBC9DXlF,kBAAK4C,YACjBC,GAAuBC,YAAKD,EAAQ,CAAC,gBAAiB,YAAa,aACpE,CAACE,EAAWC,IAA2BF,YAAKE,EAAS,CAAC,kBAAmB,mBAFvDJ,CApCiC,EACnDO,gBAAeC,YAAW+B,WAAUC,kBAAiB7B,qBAErD,MAAO8B,EAAcC,GAAmB9E,aAAS,GAE3C+E,EAAiCrE,YAAasE,IAClDF,EAAgBE,IACf,IAEGC,EAAevE,YAAawE,IAChCN,EAAgB,CAAEM,cACjB,CAACN,IAEJ,OACE,yBAAKjE,GAAG,qBAAqBC,UAAU,iBACrC,yBAAKA,UAAU,aACb,kBAAC,IAAD,CAAgBuE,kBAAmBN,IACnC,mDACA,uBAAGjE,UAAU,QAAb,iCAEE,6BAFF,2BAIA,kBAACwE,EAAA,EAAD,CACEC,WAAYtC,EACZwB,MAAO3B,EACP0C,KAAMX,EACNY,UAAW5C,EACXwC,kBAAmBN,EACnBW,2BAA4BT,EAC5BU,SAAUR,S,iBCwCLzF,kBAAK4C,YACjBC,GAAuBC,YAAKD,EAAQ,CAAC,gBAAiB,cACvD,CAACE,EAAWC,IAA2BF,YAAKE,EAAS,CAAC,SAAU,iBAAkB,uBAFhEJ,CArEiC,EACnDO,gBAAeC,YAAW8C,SAAQ3C,iBAAgB4C,yBAElD,MAAOC,EAAeC,GAAoB7F,aAAS,IAC5C8F,EAAaC,GAAkB/F,eAC/BgG,EAAWC,GAAgBjG,YAAS,KACpCkG,EAAUC,GAAenG,YAAS,IA6BzC,OACE,yBAAKW,GAAG,yBAAyBC,UAAU,iBACzC,yBAAKA,UAAU,aACb,0BAAMwF,OAAO,GAAGC,OAAO,OAAOZ,SAbpC,SAAsBa,GACpBA,EAAMC,iBAENb,EAAO,CAAEM,YAAWE,aAEhBJ,GACFH,EAAmB,CAAEa,KAAMV,MAQvB,kBAACW,EAAA,EAAD,CAAgBC,SAAUX,IAC1B,yCACA,uBAAGnF,UAAU,QAAb,0BAEE,6BAFF,sBAIA,kBAACuD,EAAA,EAAD,CACExD,GAAG,0BACH0D,MAAM,OACNqC,SAxCV,SAA+BJ,GACzB1D,GACFG,IAGF,MAAM,OAAEY,GAAW2C,EAEnBL,EAAatC,EAAOC,OACpBiC,EAAiBlC,EAAOC,MAAMtC,OAAS,IAiC/BsC,MAAOoC,EACPzB,MAAO3B,EACP4B,aAAa,eAEf,kBAACL,EAAA,EAAD,CACExD,GAAG,yBACH0D,MAAM,uBACNqC,SArCV,SAA8BJ,GAC5B,MAAM,OAAE3C,GAAW2C,EAEnBH,EAAYxC,EAAOC,QAmCXA,MAAOsC,EACP1B,aAAa,gBAEdoB,GACC,kBAACe,EAAA,EAAD,CAAQC,KAAK,SAASC,QAAM,EAACtB,UAAW5C,GAAxC,yBC1EC,IAAImE,EAAE,KAAK,MAAMC,GAAGA,EAAEC,OAAO,SAASC,EAAEC,GAAGJ,EAAEG,EAAEC,IAAIC,KAAKC,UAAUL,EAC/E,SAAUE,GAAG,SAASC,EAAEG,EAAEC,EAAEC,EAAE9D,GAAG,IAAI+D,EAAE,GAAGC,EAAER,EAAEM,EAAED,GAAGG,EAAEC,EAAEL,GAAGI,EAAEE,IAAIlE,EAAEA,GAAG,EAAE,IAAImE,EAAEH,EAAEA,IAAII,EAAEJ,EAAEA,IAAI,EAAEhE,EAA4G,OAA1G+D,EAAEM,KAAKT,EAAEG,EAAEO,MAAMT,EAAEE,EAAEQ,QAAQT,EAAEC,EAAES,EAAEJ,EAAEL,EAAED,EAAE,SAASC,EAAED,GAAa,OAALA,GAAG9D,IAAS,GAAjB+D,GAAG/D,IAAmB+D,GAAGI,GAAG,EAAEL,GAAGA,GAAGK,IAAKH,EAAEF,EAAEC,EAAED,IAAWC,EAAE,SAASU,EAAEb,EAAEC,EAAEC,EAAE9D,EAAE+D,EAAEC,EAAEG,EAAEC,EAAEM,EAAEC,GAAG,SAASV,EAAEF,EAAED,EAAEc,EAAEf,EAAEO,EAAED,EAAEO,GAAGX,GAAGH,EAAEiB,OAAOf,EAAEK,EAAES,EAAEF,GAAGd,EAAEkB,MAAMhB,EAAEc,EAAEf,EAAEO,EAAEJ,IAAIJ,EAAEiB,OAAOf,EAAEc,GAAGT,EAAEP,EAAEmB,OAAOlB,EAAEG,EAAEF,GAAGF,EAAEmB,OAAOlB,EAAEC,GAAGG,EAAEG,EAAEpE,EAAE8D,EAAE9D,EAAE+D,GAAGC,EAAE,GAAGC,EAAES,EAAE1E,EAAE+D,EAAEF,EAAEE,EAAE,GAAGC,GAAGC,EAAEU,EAAEd,EAAEE,EAAEF,EAAEC,EAAEE,EAAE,GAAGC,EAAEE,EAAEN,EAAEC,EAAE9D,EAAE8D,EAAE,EAAEE,GAAG,SAASgB,EAAEpB,EAAEC,EAAEC,EAAE9D,EAAE+D,EAAEC,EAAEG,EAAEC,EAAEM,EAAEC,GAAG,SAASV,EAAEF,EAAED,EAAED,EAAEO,GAAGR,EAAEmB,OAAOhB,EAAEF,EAAEC,GAAGF,EAAEiB,OAAOd,EACtfD,GAAGF,EAAEiB,OAAOd,EAAED,EAAEM,GAAGR,EAAEkB,MAAMf,EAAED,EAAEC,EAAEF,EAAEC,EAAEE,GAAGG,GAAGF,EAAEJ,EAAEC,EAAEE,EAAEA,GAAGI,GAAGH,EAAEjE,EAAE8D,GAAGE,EAAEA,GAAGU,GAAGT,EAAEjE,EAAE+D,GAAGC,GAAGA,GAAGW,GAAGV,EAAEJ,EAAEE,EAAEC,GAAGA,GAAmX,SAASiB,EAAErB,EAAEC,GAAGC,EAAE,CAAC,IAAIA,EAAED,EAAEQ,KAAKrE,EACpf6D,EAAEqB,EAAEnB,EAAEF,EAAEsB,EAAEnB,EAAEH,EAAEuB,EAAEjB,EAAEN,EAAEwB,EAAqB,IAAnBtB,EAAEuB,KAAKC,IAAI,EAAExB,GAAG,GAAOC,EAAEsB,KAAKE,IAAI,GAAGxB,GAAG,IAAID,GAAGC,EAAED,GAAG,EAAE,IAAI,IAAIK,EAAEX,EAAEK,EAAE9D,EAAE+D,EAAEI,GAAG,MAAML,EAAE,MAAMI,IAAIE,OAAE,EAAO,IAAIA,EAAE,OAAO,KAAyI,IAApIN,EAAEF,EAAE6B,WAAW,MAAM5B,EAAE6B,aAAa5B,EAAE6B,UAAU9B,EAAE6B,WAAW5B,EAAE8B,SAAS/B,EAAEgC,KAAKhC,EAAEiC,IAAIjC,EAAExG,KAAKwG,EAAExG,OAAO2C,EAAEoE,EAAEI,EAAER,EAAEH,EAAExG,KAAK2C,EAAE8D,EAAEiC,YAAgB5B,EAAE,EAAEA,EAAEnE,EAAEmE,GAAG,EAAE,IAAIJ,EAAE,EAAEA,EAAE/D,EAAE+D,GAAG,EAAE,CAAC,IAAIW,EAAEZ,EAAEa,EAAEd,EAAEgC,KAAK9B,EAAEC,EAAEC,EAAEJ,EAAEiC,IAAI3B,EAAEH,EAAEgC,EAAE7B,EAAE8B,EAAElC,EAAEa,EAAER,EAAEN,EAAEoC,EAAEvB,EAAEX,EAAEmC,EAAElC,EAAED,EAAEoC,EAAEJ,EAAE,EAAEK,EAAEL,EAAE,EAAEM,EAAEL,EAAE,EAAEM,EAAEN,EAAE,EAAEhB,EAAEK,KAAKkB,MAAMlB,KAAKE,IAAI,GAAGF,KAAKC,IAAI,EAAE1B,EAAE4C,IAAIzC,GAAGkB,EAAEN,EAAEoB,EAAEC,GAAGS,EAAE9B,EAAEwB,EAAEE,GAAG9C,EAAEoB,EAAEwB,EAAEH,GAAGG,EAAExB,EAAEwB,EAAEG,GAAG,IAAII,EAAE/B,EAAEoB,EAAEO,GAAGA,EAAE3B,EAAEyB,EAAEE,GAAGN,EAAErB,EAAEyB,EACnfJ,GAAGI,EAAEzB,EAAEyB,EAAEC,GAAGN,EAAEpB,EAAEoB,EAAEM,GAAG3B,EAAEW,KAAKsB,MAAMjC,GAAGV,EAAEqB,KAAKsB,MAAM3C,GAAGiC,EAAEZ,KAAKsB,MAAMV,GAAGC,EAAEb,KAAKsB,MAAMT,GAAGjB,EAAET,EAAEC,EAAEC,EAAEV,EAAEiC,EAAEC,EAAElB,GAAGzB,IAAIwC,GAAGxC,IAAImD,GAAGV,IAAIU,GAAGV,IAAID,GAAGhB,EAAEN,EAAEC,EAAEV,EAAEiC,EAAEC,EAAElB,EAAEzB,GAAGwC,GAAGU,EAAElD,GAAGmD,GAAGP,EAAEH,GAAGU,GAAGJ,EAAEN,GAAGD,GAAGK,GAAmB,OAF7F,SAAWzC,EAAEC,GAAG,IAAIC,EAAED,EAAEgD,KAAK,GAAG,iBAAkB/C,EAAEF,EAAE+B,UAAU7B,MAAM,CAAC,IAAI9D,EAAE8D,EAAEX,KAAKY,EAAED,EAAEgD,WAAuD,GAA5ChD,EAAEA,EAAEiD,SAASC,IAAKjD,GAAIuB,KAAKsB,MAAM7C,EAAEF,EAAExG,OAAU,oBAAoB2C,EAAE,IAAIgE,EAAEJ,EAAEqD,qBAAqBC,MAAMtD,EAAEE,OAAQ,IAAG,oBAAoB9D,EAA2C,MAAMmH,MAAM,oBAArDnD,EAAEJ,EAAEwD,qBAAqBF,MAAMtD,EAAEE,GAAwCC,EAAEsD,QAAQ,EAAEtD,EAAED,MAAME,EAAEsD,aAAavD,EAAED,KAAKF,EAAE+B,UAAU3B,GAEhSuD,CAAEzD,EAAED,GAAGC,EAAE+C,OAAcjD,EAAE,IAAIsB,EAAE,CAACsC,WAAW,EAAEC,WAAW,GAAGC,QAAQ,IAAI7B,KAAK,EAAEC,IAAI,EAAEzI,KAAK,IAAIwJ,KAAK,OAAOnB,WAAW,KAAKrB,KAAK,UAAUsD,OAAO,GAAGC,MAAM,GAAGvE,EAAE,SAASO,EAAEC,GAAG,IAAIC,EAAE,GAAG+D,OAAOC,OAAOhE,EAAEoB,EAAEtB,GAAGE,EAAEqB,EAAErB,EAAE0D,WAAW1D,EAAEsB,EAAEtB,EAAE2D,WAAW3D,EAAEoB,EAAEpB,EAAE4D,QAAQ5D,EAAE+B,KAAK/B,EAAE+B,KAAK/B,EAAEgC,IAAIhC,EAAEgC,IAAIhC,EAAEzG,KAAKyG,EAAEzG,KAAKyG,EAAE+C,KAAK/C,EAAE+C,KAAK/C,EAAE4B,WAAW5B,EAAE4B,WAC/e5B,EAAEO,KAAKP,EAAEO,KAAKP,EAAE2C,EAAE3C,EAAE6D,OAAO7D,EAAEuB,EAAEvB,EAAE8D,MAAS/D,aAAakE,mBAAsBlE,EAAEmE,QAAQlE,EAAEzG,MAAMwG,EAAEoE,SAASnE,EAAEzG,OAAKwG,EAAEmE,MAAMlE,EAAEzG,KAAKwG,EAAEoE,OAAOnE,EAAEzG,MAAKwG,EAAE4B,WAAW,MAAMyC,UAAU,EAAE,EAAErE,EAAEmE,MAAMnE,EAAEoE,QAAQhD,EAAEpB,EAAEC,MAAQF,EAAEuE,SAASC,cAAc,WAAYJ,MAAMlE,EAAEzG,KAAKuG,EAAEqE,OAAOnE,EAAEzG,KAAKyG,EAAEmB,EAAErB,EAAEE,GAAGD,EAAEwE,YAAYvE,KAJxS,CAI8S,WACjE,SAASW,EAAEZ,EAAEC,GAAG,SAAS9D,EAAE+D,EAAEC,GAAG,IAAI,IAAIF,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,MAAM,GAAGC,EAAED,GAAGM,GAAGL,EAAED,GAAG,IAAI,IAAID,GAAG,EAAE,GAAGA,EAAEA,GAAG,GAAG,GAAGG,EAAEH,GAAGO,GAAGJ,EAAEH,IAAIM,EAAEJ,EAAED,GAAGE,EAAEH,GAAG,GAAGC,GAAG,GAAGA,IAAI,GAAGD,GAAG,GAAGA,IAAI,GAAGA,GAAG,GAAGA,IAAI,GAAGC,GAAG,GAAGA,IAAI,GAAGA,GAAG,GAAGA,GAAG,GAAGD,GAAG,GAAGA,GAAS,SAASE,EAAEA,EAAED,GAAG,IAAI,IAAIc,EAAER,EAAE,EAAEP,EAAE,GAAGqC,EAAEoC,MAAM1D,GAAGuB,EAAE,EAAEA,EACnfvB,EAAEuB,GAAG,EAAE,CAACD,EAAEC,GAAGmC,MAAM1D,GAAG,IAAI,IAAIoB,EAAE,EAAEA,EAAEpB,EAAEoB,GAAG,EAAEE,EAAEC,GAAGH,GAAG,KAA2C,IAAtC7B,EAAE+B,EAAElG,EAAE,EAAE,GAAGA,EAAEoE,EAAE,EAAE,GAAGpE,EAAE,EAAEoE,EAAE,GAAGQ,EAAEK,EAAE5B,EAAEQ,GAAOqC,EAAE,EAAEA,EAAEtB,EAAE/G,OAAOqI,GAAG,EAAE,IAAIC,EAAE,EAAEA,EAAEvB,EAAE/G,OAAOsI,GAAG,EAAE,CAACH,EAAEpB,EAAEsB,GAAG,IAAID,EAAErB,EAAEuB,GAAG,GAAG,MAAMhC,EAAE6B,GAAGC,GAAG,IAAI,IAAIK,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,IAAI,IAAIC,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAEpC,EAAE6B,EAAEM,GAAGL,EAAEM,IAAI,GAAGD,GAAG,GAAGA,IAAI,GAAGC,GAAG,GAAGA,GAAG,GAAGD,GAAG,GAAGC,EAAE,IAAI3B,EAAE,EAAEA,EAAER,EAAE,EAAEQ,GAAG,EAAE,MAAMT,EAAES,GAAG,KAAKT,EAAES,GAAG,GAAG,GAAGA,EAAE,GAAG,IAAIA,EAAE,EAAEA,EAAER,EAAE,EAAEQ,GAAG,EAAE,MAAMT,EAAE,GAAGS,KAAKT,EAAE,GAAGS,GAAG,GAAGA,EAAE,GAAiB,IAAdA,EAAEK,EAAEzB,EAAEQ,GAAG,EAAEF,GAAOoC,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEC,GAAGpC,GAAG,IAAIa,GAAGsB,EAAE,GAAG/B,EAAE,EAAE+B,EAAEA,EAAE,EAAEA,EAAEA,EAAE,EAAE9B,EAAE,GAAG8B,GAAG,GAAGC,EAAEhC,EAAE,GAAG,EAAE+B,EAAE9B,EAAE8B,EAAE,EAAE,EAAEA,EAAE,GAAGA,EAAE,GAAGA,GAAGC,EAAe,GAAbhC,EAAEC,EAAE,GAAG,IAAIL,EAAK,GACtfF,EAAE,CAAU,IAATe,EAAEK,EAAEsC,EAAE1D,GAAOqC,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEC,GAAGpC,GAAG,IAAIa,GAAGsB,EAAE,GAAG/B,EAAEmB,KAAKkB,MAAMN,EAAE,IAAIA,EAAE,EAAE9B,EAAE,EAAE,GAAG+B,EAAE,IAAID,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEC,GAAGpC,GAAG,IAAIa,GAAGsB,EAAE,GAAG/B,EAAE+B,EAAE,EAAE9B,EAAE,EAAE,GAAGkB,KAAKkB,MAAMN,EAAE,IAAIC,EAAE,GAAG,MAAMzB,EAAE,CAAkB,IAAjBX,EAAEH,EAAE8C,EAAE7C,EAAEG,GAAGY,EAHmS,WAAa,IAAIf,EAAE,GAAGC,EAAE,EAAE9D,EAAE,CAACyD,EAAE,WAAW,OAAOI,GAC/fA,EAAE,SAASE,GAAG,OAAO,IAAIF,EAAEyB,KAAKkB,MAAMzC,EAAE,MAAM,EAAEA,EAAE,EAAE,IAAIwE,IAAI,SAASxE,EAAEC,GAAG,IAAI,IAAIF,EAAE,EAAEA,EAAEE,EAAEF,GAAG,EAAE9D,EAAEmG,EAAE,IAAIpC,IAAIC,EAAEF,EAAE,EAAE,KAAKc,EAAE,WAAW,OAAOd,GAAGqC,EAAE,SAASpC,GAAG,IAAIC,EAAEsB,KAAKkB,MAAM1C,EAAE,GAAGD,EAAEhG,QAAQmG,GAAGH,EAAE2E,KAAK,GAAGzE,IAAIF,EAAEG,IAAI,MAAMF,EAAE,GAAGA,GAAG,IAAI,OAAO9D,EAE9DyD,GAAQyC,EAAE,EAAEA,EAAEvB,EAAE9G,OAAOqI,GAAG,EAAEC,EAAExB,EAAEuB,GAAGtB,EAAE2D,IAAI,EAAE,GAAG3D,EAAE2D,IAAIpC,EAAEpC,IAAIkB,EAAEL,EAAE,EAAEf,IAAIsC,EAAEsC,MAAM7D,GAAG,IAAIsB,EAAEC,EAAE,EAAED,EAAEnC,EAAElG,OAAOqI,GAAG,EAAEC,GAAGpC,EAAEmC,GAAGwC,EAAE,GAAG9D,EAAEA,IAAI,EAAEuB,EAAE,MAAMgB,MAAM,0BAA0BvC,EAAEA,IAAI,IAAI,EAAEuB,EAAE,KAAK,IAAIvB,EAAEA,IAAI,GAAG,EAAEuB,GAAGvB,EAAE2D,IAAI,EAAE,GAAG,GAAG3D,EAAEA,IAAI,GAAGA,EAAEuB,GAAE,GAAI,OAAOvB,EAAEA,KAAK,EAAEuB,KAAKvB,EAAE2D,IAAI,IAAI,KAAM3D,EAAEA,KAAK,EAAEuB,KAAQvB,EAAE2D,IAAI,GAAG,GAAG,IAAItE,EAAE,EAC7c,IAD+ckC,EAAED,EAAE,EAAEF,EAAEsC,MAAMvE,EAAElG,QACjfoI,EAAEqC,MAAMvE,EAAElG,QAAYyI,EAAE,EAAEA,EAAEvC,EAAElG,OAAOyI,GAAG,EAAE,CAAC,IAAIpB,EAAEnB,EAAEuC,GAAGoC,EAAElF,EAAEO,EAAEuC,GAAGqC,EAAEzD,EAAgD,IAA9CgB,EAAEZ,KAAKC,IAAIW,EAAEhB,GAAGiB,EAAEb,KAAKC,IAAIY,EAAE3C,GAAGwC,EAAEM,GAAGgC,MAAMpD,GAAOqB,EAAE,EAAEA,EAAEP,EAAEM,GAAGzI,OAAO0I,GAAG,EAAEP,EAAEM,GAAGC,GAAG,IAAI3B,EAAEnB,IAAI8C,EAAEtC,GAA4D,IAAzDA,GAAGiB,EAAEqB,EAAEtB,EAAER,EAAEjB,GAAG0B,EAAEF,EAAEgB,EAAEM,GAAGC,EAAExC,IAAI,GAAGwC,EAAEA,GAAGN,EAAEK,GAAGgC,MAAM/B,EAAExC,IAAI,GAAOwC,EAAE,EAAEA,EAAEN,EAAEK,GAAGzI,OAAO0I,GAAG,EAAE/C,EAAE+C,EAAErB,EAAEnB,IAAIkC,EAAEK,GAAGzI,OAAOoI,EAAEK,GAAGC,GAAG,GAAG/C,EAAE0B,EAAErB,EAAEL,GAAG,EAAE,IAAI+C,EAAE3B,EAAE,EAAE2B,EAAExC,EAAElG,OAAO0I,GAAG,EAAE3B,GAAGb,EAAEwC,GAAGoC,EAAa,IAAX/D,EAAE0D,MAAM1D,GAAO2B,EAAEtC,EAAE,EAAEsC,EAAEL,EAAEK,GAAG,EAAE,IAAID,EAAE,EAAEA,EAAEvC,EAAElG,OAAOyI,GAAG,EAAEC,EAAEP,EAAEM,GAAGzI,SAAS+G,EAAEX,GAAG+B,EAAEM,GAAGC,GAAGtC,GAAG,GAAG,IAAIsC,EAAE,EAAEA,EAAEJ,EAAEI,GAAG,EAAE,IAAID,EAAE,EAAEA,EAAEvC,EAAElG,OAAOyI,GAAG,EAAEC,EAAEN,EAAEK,GAAGzI,SAAS+G,EAAEX,GAAGgC,EAAEK,GAAGC,GAAGtC,GAAG,GAAGS,EAAEE,EACpd,IADsdb,EAAEW,EAAEE,GACnf,EAAEsB,EAAE9B,EAAE,EAAE+B,EAAE,EAAEH,EAAE,EAAElC,EAAEmB,EAAE0B,EAAE7C,GAAOmC,EAAE7B,EAAE,EAAE,EAAE6B,EAAEA,GAAG,EAAE,IAAI,GAAGA,KAAKA,IAAI,CAAC,IAAIK,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAE,MAAMnC,EAAE+B,GAAGD,EAAEK,KAAKC,GAAE,EAAGP,EAAEjC,EAAElG,SAAS0I,EAAE,IAAIxC,EAAEiC,KAAKG,EAAE,IAAIrC,EAAEoC,EAAED,EAAEK,KAAKC,GAAGA,GAAGpC,EAAE+B,GAAGD,EAAEK,GAAGC,GAAO,KAAHJ,IAAUH,GAAG,EAAEG,EAAE,IAAS,GAAG,GAARD,GAAGtB,IAAUR,GAAG8B,EAAE,CAACA,GAAGtB,EAAEA,GAAGA,EAAE,QAAQ,IAAIZ,EAAEuD,EAAEzD,GAAGK,EAAE,KAAKC,EAAE,EAAEM,EAAE,KAAKC,EAAE,GAAGV,EAAE,CAACA,EAAE,SAASF,GAAGA,EALuC,SAAWF,GAAG,IAAIC,EAAEW,EAAEmE,EAAE/E,GAAG,MAAM,CAACgF,EAAE,WAAW,OAAO,GAAG9E,EAAE,WAAW,OAAOD,EAAEjG,QAAQ4K,MAAM,SAAS5E,GAAG,IAAI,IAAIE,EAAE,EAAEA,EAAED,EAAEjG,OAAOkG,GAAG,EAAEF,EAAE0E,IAAIzE,EAAEC,GAAG,KAKrLP,CAAEO,GAAGY,EAAE6D,KAAKzE,GAAGW,EAAE,MAAMZ,EAAE,SAASC,EAAED,GAAG,GAAG,EAAEC,GAAGK,GAAGL,GAAG,EAAED,GAAGM,GAAGN,EAAE,MAAMqD,MAAMpD,EAAE,IAAID,GAAG,OAAOK,EAAEJ,GAAGD,IAAIE,EAAE,WAAW,OAAOI,GAAGF,EAAE,WAAW,IAAI,IAAIJ,EAAE,EAAEE,EAAE,EAAEH,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAE,CAACE,GAAE,EAAGF,GAAG,IAAIO,EAAEa,EAAEmB,EAAEnC,IAAM,GAAGJ,GAAGC,EAAEM,KAAEN,EAAEM,EAAEJ,EAAEH,GAAEE,GAAE,EAAGC,KAAK,OAAOC,EACrf,SAASe,EAAEnB,EAAEC,GAAG,QAAG,IAAoBD,EAAEhG,OAAO,MAAMsJ,MAAMtD,EAAEhG,OAAO,IAAIiG,GAAG,IAAI9D,EAAE,WAAW,IAAI,IAAI+D,EAAE,EAAEA,EAAEF,EAAEhG,QAAQ,GAAGgG,EAAEE,IAAIA,GAAG,EAAE,IAAI,IAAII,EAAEmE,MAAMzE,EAAEhG,OAAOkG,EAAED,GAAGM,EAAE,EAAEA,EAAEP,EAAEhG,OAAOkG,EAAEK,GAAG,EAAED,EAAEC,GAAGP,EAAEO,EAAEL,GAAG,OAAOI,EAAxH,GAA6HJ,EAAE,CAACF,EAAE,SAASE,GAAG,OAAO/D,EAAE+D,IAAIA,EAAE,WAAW,OAAO/D,EAAEnC,QAAQiL,SAAS,SAAShF,GAAG,IAAI,IAAIE,EAAEsE,MAAMvE,EAAEA,IAAID,EAAEC,IAAI,GAAGF,EAAE,EAAEA,EAAEE,EAAEA,IAAIF,GAAG,EAAE,IAAI,IAAIa,EAAE,EAAEA,EAAEZ,EAAEC,IAAIW,GAAG,EAAEV,EAAEH,EAAEa,IAAIQ,EAAE6D,EAAE7D,EAAER,EAAEX,EAAEF,EAAEA,IAAIqB,EAAER,EAAEZ,EAAED,EAAEa,KAAK,OAAOM,EAAEhB,EAAE,IAAIuC,EAAE,SAASzC,GAAG,GAAG,EAAEC,EAAEA,IAAID,EAAEC,IAAI,OAAOA,EAAE,IAAI,IAAIF,EAAEqB,EAAER,EAAEX,EAAEF,EAAE,IAAIqB,EAAER,EAAEZ,EAAED,EAAE,IAAIG,EAAEsE,MAAMvE,EAAEA,KACjfW,EAAE,EAAEA,EAAEX,EAAEA,IAAIW,GAAG,EAAEV,EAAEU,GAAGX,EAAEF,EAAEa,GAAG,IAAIA,EAAE,EAAEA,EAAEZ,EAAEC,IAAIW,GAAG,EAAEV,EAAEU,IAAIQ,EAAE6D,EAAE7D,EAAER,EAAEZ,EAAED,EAAEa,IAAIb,GAAG,OAAOmB,EAAEhB,EAAE,GAAGuC,EAAEzC,KAAK,OAAOC,EAAEU,EAAEmE,EAAE,SAAS/E,GAAG,IAAI,IAAIC,EAAE,GAAG9D,EAAE,EAAEA,EAAE6D,EAAEhG,OAAOmC,IAAI,CAAC,IAAI+D,EAAEF,EAAEmF,WAAWhJ,GAAG,IAAI+D,EAAED,EAAE0E,KAAKzE,GAAG,KAAKA,EAAED,EAAE0E,KAAK,IAAIzE,GAAG,EAAE,IAAM,GAAFA,GAAM,MAAMA,GAAG,OAAOA,EAAED,EAAE0E,KAAK,IAAIzE,GAAG,GAAG,IAAIA,GAAG,EAAE,GAAG,IAAM,GAAFA,IAAO/D,IAAI+D,EAAE,QAAU,KAAFA,IAAS,GAAmB,KAAhBF,EAAEmF,WAAWhJ,IAAS8D,EAAE0E,KAAK,IAAIzE,GAAG,GAAG,IAAIA,GAAG,GAAG,GAAG,IAAIA,GAAG,EAAE,GAAG,IAAM,GAAFA,IAAO,OAAOD,GAAG,IAAIyD,EAAE,CAAC0B,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAE7F,EAAE,GAAG2B,EAAE,WAAW,SAASpB,EAAEE,GAAG,IAAI,IAAID,EAAE,EAAE,GAAGC,GAAGD,GAAG,EAAEC,KAAK,EAAE,OAAOD,EAAE,IAAIA,EAAE,CAAC,GAAG,CAAC,EAAE,IACjf,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KACjf,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,MAGyE,MAHjE,CAACN,EAAE,SAASO,GAAG,IAAI,IAAID,EAAEC,GAAG,GAAG,GAAGF,EAAEC,GAAGD,EAAE,OAAOC,GAAG,MAAMD,EAAEC,GAAGD,EAAE,MAAM,OAAgB,OAATE,GAAG,GAAGD,IAAUyD,EAAE,SAASxD,GAAG,IAAI,IAAID,EAAEC,GAAG,GAAG,GAAGF,EAAEC,GAAGD,EAAE,OAAOC,GAAG,MAAMD,EAAEC,GAAGD,EAAE,MAAM,OAAOE,GAAG,GAAGD,GAAGT,EAAE,SAASU,GAAG,OAAOD,EAAEC,EAAE,IAAI4C,EAAE,SAAS5C,GAAG,OAAOA,GAAG,KAAK,EAAE,OAAO,SAASA,EAAED,GAAG,OAAO,IAAIC,EAAED,GAAG,GAAG,KAAK,EAAE,OAAO,SAASC,GAAG,OAAO,GAAGA,EAAE,GAAG,KAAK,EAAE,OAAO,SAASA,EAAED,GAAG,OAAO,GAAGA,EAAE,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IACnfC,EAAED,GAAG,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IAAIwB,KAAKkB,MAAMzC,EAAE,GAAGuB,KAAKkB,MAAM1C,EAAE,IAAI,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,GAAGC,EAAED,EAAE,EAAEC,EAAED,EAAE,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IAAIC,EAAED,EAAE,EAAEC,EAAED,EAAE,GAAG,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IAAIC,EAAED,EAAE,GAAGC,EAAED,GAAG,GAAG,GAAG,QAAQ,MAAMqD,MAAM,mBAAmBpD,KAAMU,EAAE,SAASV,GAAG,IAAI,IAAID,EAAEkB,EAAE,CAAC,GAAG,GAAGnB,EAAE,EAAEA,EAAEE,EAAEF,GAAG,EAAEC,EAAEA,EAAEgF,SAAS9D,EAAE,CAAC,EAAEE,EAAE6D,EAAElF,IAAI,IAAI,OAAOC,GAAGc,EAAE,SAASb,EAAED,GAAG,GAAG,GAAGC,GAAG,EAAED,GAAG,GAAGA,EAAE,MAAMqD,MAAM,SAASpD,EAAE,WAAWD,GAAG,OAAO,GAAGA,EAAE,EAAE,IAAIsC,EAAE,SAASrC,GAAG,IAAI,IAAID,EAAEC,EAAEC,IAAIH,EAAE,EACpfO,EAAE,EAAEA,EAAEN,EAAEM,GAAG,EAAE,IAAI,IAAIM,EAAE,EAAEA,EAAEZ,EAAEY,GAAG,EAAE,CAAC,IAAI,IAAI1E,EAAE,EAAE4D,EAAEG,EAAED,EAAEM,EAAEM,GAAGsB,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,KAAK,EAAE5B,EAAE4B,GAAGlC,GAAGM,EAAE4B,GAAG,IAAI,IAAIC,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,EAAEvB,EAAEuB,GAAGnC,GAAGY,EAAEuB,IAAI,GAAGD,GAAG,GAAGC,IAAIrC,GAAGG,EAAED,EAAEM,EAAE4B,EAAEtB,EAAEuB,KAAKjG,GAAG,GAAG,EAAEA,IAAI6D,GAAG,EAAE7D,EAAE,GAAG,IAAIoE,EAAE,EAAEA,EAAEN,EAAE,EAAEM,GAAG,EAAE,IAAIM,EAAE,EAAEA,EAAEZ,EAAE,EAAEY,GAAG,EAAK1E,EAAE,EAAE+D,EAAED,EAAEM,EAAEM,KAAK1E,GAAG,GAAG+D,EAAED,EAAEM,EAAE,EAAEM,KAAK1E,GAAG,GAAG+D,EAAED,EAAEM,EAAEM,EAAE,KAAK1E,GAAG,GAAG+D,EAAED,EAAEM,EAAE,EAAEM,EAAE,KAAK1E,GAAG,IAAG,GAAGA,GAAG,GAAGA,KAAE6D,GAAG,GAAE,IAAIO,EAAE,EAAEA,EAAEN,EAAEM,GAAG,EAAE,IAAIM,EAAE,EAAEA,EAAEZ,EAAE,EAAEY,GAAG,EAAEX,EAAED,EAAEM,EAAEM,KAAKX,EAAED,EAAEM,EAAEM,EAAE,IAAIX,EAAED,EAAEM,EAAEM,EAAE,IAAIX,EAAED,EAAEM,EAAEM,EAAE,IAAIX,EAAED,EAAEM,EAAEM,EAAE,KAAKX,EAAED,EAAEM,EAAEM,EAAE,IAAIX,EAAED,EAAEM,EAAEM,EAAE,KAAKb,GAAG,IAAI,IAAIa,EAAE,EAAEA,EAAEZ,EAAEY,GAAG,EAAE,IAAIN,EAAE,EAAEA,EAAEN,EAAE,EAAEM,GAAG,EAAEL,EAAED,EAAEM,EAAEM,KAAKX,EAAED,EAAEM,EACrf,EAAEM,IAAIX,EAAED,EAAEM,EAAE,EAAEM,IAAIX,EAAED,EAAEM,EAAE,EAAEM,IAAIX,EAAED,EAAEM,EAAE,EAAEM,KAAKX,EAAED,EAAEM,EAAE,EAAEM,IAAIX,EAAED,EAAEM,EAAE,EAAEM,KAAKb,GAAG,IAAI,IAAIa,EAAE1E,EAAE,EAAE0E,EAAEZ,EAAEY,GAAG,EAAE,IAAIN,EAAE,EAAEA,EAAEN,EAAEM,GAAG,EAAEL,EAAED,EAAEM,EAAEM,KAAK1E,GAAG,GAAG,OAAO6D,EAAGyB,KAAK8D,IAAI,IAAIpJ,EAAE8D,EAAEA,EAAE,IAAI,EAAE,KALiQ,GAKhPoB,EAAE,WAAW,IAAI,IAAIrB,EAAEyE,MAAM,KAAKxE,EAAEwE,MAAM,KAAKtI,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAE6D,EAAE7D,GAAG,GAAGA,EAAE,IAAIA,EAAE,EAAE,IAAIA,EAAEA,GAAG,EAAE6D,EAAE7D,GAAG6D,EAAE7D,EAAE,GAAG6D,EAAE7D,EAAE,GAAG6D,EAAE7D,EAAE,GAAG6D,EAAE7D,EAAE,GAAG,IAAIA,EAAE,EAAE,IAAIA,EAAEA,GAAG,EAAE8D,EAAED,EAAE7D,IAAIA,EAAE,MAAM,CAAC0E,EAAE,SAASX,GAAG,GAAG,EAAEA,EAAE,MAAMoD,MAAM,QAAQpD,EAAE,KAAK,OAAOD,EAAEC,IAAIgF,EAAE,SAAShF,GAAG,KAAK,EAAEA,GAAGA,GAAG,IAAI,KAAK,KAAKA,GAAGA,GAAG,IAAI,OAAOF,EAAEE,KAArR,GAA6RH,EAAE,WAAW,SAASC,EAAEE,EAAEF,GAAG,OAAOA,GAAG,KAAK0D,EAAE0B,EAAE,OAAOnF,EAAE,GAC3gBC,EAAE,IAAI,KAAKwD,EAAE2B,EAAE,OAAOpF,EAAE,GAAGC,EAAE,GAAG,GAAG,KAAKwD,EAAE4B,EAAE,OAAOrF,EAAE,GAAGC,EAAE,GAAG,GAAG,KAAKwD,EAAEjE,EAAE,OAAOQ,EAAE,GAAGC,EAAE,GAAG,IAAI,IAAID,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAClf,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GACnf,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EACrf,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAChf,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAClf,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAA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","file":"5.aa91dcb7dfbeffe6a6d4.js","sourcesContent":["import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n code: string;\n codeLength: number;\n trackingDirection: number;\n isTracking: boolean;\n isBig?: boolean;\n};\n\nconst TRACKING_START_FRAME = 15;\nconst TRACKING_END_FRAME = 180;\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst TrackingMonkey: FC = ({\n code,\n codeLength,\n trackingDirection,\n isTracking,\n isBig,\n}) => {\n const [idleMonkeyData, setIdleMonkeyData] = useState>();\n const [trackingMonkeyData, setTrackingMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const TRACKING_FRAMES_PER_SYMBOL = (TRACKING_END_FRAME - TRACKING_START_FRAME) / codeLength;\n\n useEffect(() => {\n if (!idleMonkeyData) {\n getAnimationData('MonkeyIdle').then(setIdleMonkeyData);\n }\n }, [idleMonkeyData]);\n\n useEffect(() => {\n if (!trackingMonkeyData) {\n getAnimationData('MonkeyTracking').then(setTrackingMonkeyData);\n }\n }, [trackingMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n function getTrackingFrames(): [number, number] {\n const startFrame = (code && code.length > 1) || trackingDirection < 0\n ? TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * (code.length - 1)\n : 0;\n const endFrame = code.length === codeLength\n ? TRACKING_END_FRAME\n : TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * code.length;\n\n if (trackingDirection < 1) {\n return [\n endFrame,\n startFrame,\n ];\n }\n\n return [\n startFrame,\n endFrame,\n ];\n }\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {idleMonkeyData && (\n \n )}\n {trackingMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(TrackingMonkey);\n","// This is unsafe and can be not chained as `popstate` event is asynchronous\n\nexport default function useHistoryBack(handler: NoneToVoidFunction) {\n function handlePopState() {\n handler();\n }\n\n window.addEventListener('popstate', handlePopState);\n window.history.pushState({}, '');\n\n return () => {\n window.removeEventListener('popstate', handlePopState);\n window.history.back();\n };\n}\n","import { FormEvent } from 'react';\nimport React, {\n FC, useState, useEffect, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\n\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport TrackingMonkey from '../common/TrackingMonkey';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC = ({\n authPhoneNumber, authIsCodeViaApp, authIsLoading, authError, setAuthCode, returnToAuthPhoneNumber, clearAuthError,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [code, setCode] = useState('');\n const [isTracking, setIsTracking] = useState(false);\n const [trackingDirection, setTrackingDirection] = useState(1);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, []);\n\n useHistoryBack(returnToAuthPhoneNumber);\n\n const onCodeChange = useCallback((e: FormEvent) => {\n if (authError) {\n clearAuthError();\n }\n\n const { currentTarget: target } = e;\n target.value = target.value.replace(/[^\\d]+/, '').substr(0, CODE_LENGTH);\n\n if (target.value === code) {\n return;\n }\n\n setCode(target.value);\n\n if (!isTracking) {\n setIsTracking(true);\n } else if (!target.value.length) {\n setIsTracking(false);\n }\n\n if (code && code.length > target.value.length) {\n setTrackingDirection(-1);\n } else {\n setTrackingDirection(1);\n }\n\n if (target.value.length === CODE_LENGTH) {\n setAuthCode({ code: target.value });\n }\n }, [authError, clearAuthError, code, isTracking, setAuthCode]);\n\n return (\n
\n
\n \n

\n {authPhoneNumber}\n \n \n

\n \n

\n {authIsCodeViaApp ? (\n <>\n We have sent the code to the Telegram app\n
on your other device.\n \n ) : (\n <>\n We have sent you an SMS\n
with the code.\n \n )}\n

\n \n {authIsLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authPhoneNumber', 'authIsCodeViaApp', 'authIsLoading', 'authError']),\n (setGlobal, actions): DispatchProps => pick(actions, ['setAuthCode', 'returnToAuthPhoneNumber', 'clearAuthError']),\n)(AuthCode));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport MonkeyPassword from '../common/PasswordMonkey';\nimport PasswordForm from '../common/PasswordForm';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst AuthPassword: FC = ({\n authIsLoading, authError, authHint, setAuthPassword, clearAuthError,\n}) => {\n const [showPassword, setShowPassword] = useState(false);\n\n const handleChangePasswordVisibility = useCallback((isVisible) => {\n setShowPassword(isVisible);\n }, []);\n\n const handleSubmit = useCallback((password: string) => {\n setAuthPassword({ password });\n }, [setAuthPassword]);\n\n return (\n
\n
\n \n

Enter Your Password

\n

\n Your account is protected with\n
an additional password.\n

\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError', 'authHint']),\n (setGlobal, actions): DispatchProps => pick(actions, ['setAuthPassword', 'clearAuthError']),\n)(AuthPassword));\n","import { ChangeEvent } from 'react';\nimport React, { FC, useState, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Button from '../ui/Button';\nimport InputText from '../ui/InputText';\nimport AvatarEditable from '../ui/AvatarEditable';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst AuthRegister: FC = ({\n authIsLoading, authError, signUp, clearAuthError, uploadProfilePhoto,\n}) => {\n const [isButtonShown, setIsButtonShown] = useState(false);\n const [croppedFile, setCroppedFile] = useState();\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n\n function handleFirstNameChange(event: ChangeEvent) {\n if (authError) {\n clearAuthError();\n }\n\n const { target } = event;\n\n setFirstName(target.value);\n setIsButtonShown(target.value.length > 0);\n }\n\n function handleLastNameChange(event: ChangeEvent) {\n const { target } = event;\n\n setLastName(target.value);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n signUp({ firstName, lastName });\n\n if (croppedFile) {\n uploadProfilePhoto({ file: croppedFile });\n }\n }\n\n return (\n
\n
\n
\n \n

Your Name

\n

\n Enter your name and add\n
a profile picture.\n

\n \n \n {isButtonShown && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError']),\n (setGlobal, actions): DispatchProps => pick(actions, ['signUp', 'clearAuthError', 'uploadProfilePhoto']),\n)(AuthRegister));\n","/*\n jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */\n'use strict';let G=null;class H{}H.render=function(w,B){G(w,B)};self.QrCreator=H;\n(function(w){function B(t,c,a,e){var b={},h=w(a,c);h.u(t);h.J();e=e||0;var r=h.h(),d=h.h()+2*e;b.text=t;b.level=c;b.version=a;b.O=d;b.a=function(b,a){b-=e;a-=e;return 0>b||b>=r||0>a||a>=r?!1:h.a(b,a)};return b}function C(t,c,a,e,b,h,r,d,g,x){function u(b,a,f,c,d,r,g){b?(t.lineTo(a+r,f+g),t.arcTo(a,f,c,d,h)):t.lineTo(a,f)}r?t.moveTo(c+h,a):t.moveTo(c,a);u(d,e,a,e,b,-h,0);u(g,e,b,c,b,0,-h);u(x,c,b,c,a,h,0);u(r,c,a,e,a,0,h)}function z(t,c,a,e,b,h,r,d,g,x){function u(b,a,c,d){t.moveTo(b+c,a);t.lineTo(b,\na);t.lineTo(b,a+d);t.arcTo(b,a,b+c,a,h)}r&&u(c,a,h,h);d&&u(e,a,-h,h);g&&u(e,b,-h,-h);x&&u(c,b,h,-h)}function A(t,c){var a=c.fill;if(\"string\"===typeof a)t.fillStyle=a;else{var e=a.type,b=a.colorStops;a=a.position.map((b)=>Math.round(b*c.size));if(\"linear-gradient\"===e)var h=t.createLinearGradient.apply(t,a);else if(\"radial-gradient\"===e)h=t.createRadialGradient.apply(t,a);else throw Error(\"Unsupported fill\");b.forEach(([b,a])=>{h.addColorStop(b,a)});t.fillStyle=h}}function y(t,c){a:{var a=c.text,e=\nc.v,b=c.N,h=c.K,r=c.P;b=Math.max(1,b||1);for(h=Math.min(40,h||40);b<=h;b+=1)try{var d=B(a,e,b,r);break a}catch(J){}d=void 0}if(!d)return null;a=t.getContext(\"2d\");c.background&&(a.fillStyle=c.background,a.fillRect(c.left,c.top,c.size,c.size));e=d.O;h=c.size/e;a.beginPath();for(r=0;r>>7-b%8&1)},put:function(b,h){for(var a=0;a>>h-a-1&1))},f:function(){return a},m:function(b){var h=Math.floor(a/8);c.length<=h&&c.push(0);b&&(c[h]|=128>>>a%8);a+=1}};return e}function C(c,a){function e(b,h){for(var a=-1;7>=a;a+=1)if(!(-1>=b+a||d<=b+a))for(var c=-1;7>=c;c+=1)-1>=h+c||d<=h+c||(r[b+a][h+c]=0<=a&&6>=a&&(0==c||6==c)||0<=c&&6>=c&&(0==a||6==a)||2<=a&&4>=a&&2<=c&&4>=c?!0:!1)}function b(b,a){for(var f=d=4*c+17,k=Array(f),m=0;m<\nf;m+=1){k[m]=Array(f);for(var p=0;p=n;n+=1)for(var l=-2;2>=l;l+=1)r[p+n][q+l]=-2==n||2==n||-2==l||2==l||0==n&&0==l}for(f=8;fk;k+=1)m=!b&&1==(f>>k&1),r[6>k?k:8>k?k+1:d-15+k][8]=m,r[8][8>k?d-k-1:9>k?15-k:14-k]=m;r[d-8][8]=!b;if(7<=\nc){f=y.A(c);for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[Math.floor(k/3)][k%3+d-8-3]=m;for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[k%3+d-8-3][Math.floor(k/3)]=m}if(null==g){b=t.I(c,h);f=B();for(k=0;k8*m)throw Error(\"code length overflow. (\"+f.f()+\">\"+8*m+\")\");for(f.f()+4<=8*m&&f.put(0,4);0!=f.f()%8;)f.m(!1);for(;!(f.f()>=8*m);){f.put(236,8);if(f.f()>=8*m)break;f.put(17,8)}var u=0;m=k=0;p=Array(b.length);\nq=Array(b.length);for(n=0;nn;n+=1)null==r[k][q-n]&&(l=!1,p>>m&1)),a(k,q-n)&&(l=!l),r[k][q-n]=l,--m,-1==m&&(p+=1,m=7));k+=f;if(0>k||d<=k){k-=f;f=-f;break}}}var h=A[a],r=null,d=0,g=null,x=[],u={u:function(b){b=w(b);x.push(b);g=null},a:function(b,a){if(0>b||d<=b||0>a||d<=a)throw Error(b+\",\"+a);return r[b][a]},h:function(){return d},J:function(){for(var a=0,h=0,c=0;8>c;c+=1){b(!0,c);var d=y.D(u);if(0==c||a>d)a=d,h=c}b(!1,h)}};return u}\nfunction z(c,a){if(\"undefined\"==typeof c.length)throw Error(c.length+\"/\"+a);var e=function(){for(var b=0;bb.b()-a.b())return b;for(var c=v.g(b.c(0))-v.g(a.c(0)),h=Array(b.b()),\ng=0;gb?a.push(b):2048>b?a.push(192|b>>6,128|b&63):55296>b||57344<=b?a.push(224|b>>12,128|b>>6&63,128|b&63):(e++,b=65536+((b&1023)<<10|c.charCodeAt(e)&1023),a.push(240|b>>18,128|b>>12&63,128|b>>6&63,128|b&63))}return a};var A={L:1,M:0,Q:3,H:2},y=function(){function c(b){for(var a=0;0!=b;)a+=1,b>>>=1;return a}var a=[[],[6,18],\n[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],\n[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e={w:function(b){for(var a=b<<10;0<=c(a)-c(1335);)a^=1335<a||40a?8:16},D:function(b){for(var a=b.h(),c=0,\nd=0;d=p;p+=1)if(!(0>d+p||a<=d+p))for(var q=-1;1>=q;q+=1)0>g+q||a<=g+q||(0!=p||0!=q)&&t==b.a(d+p,g+q)&&(e+=1);5e;e+=1)c[e]=1<e;e+=1)c[e]=c[e-4]^c[e-5]^c[e-6]^c[e-8];for(e=0;255>e;e+=1)a[c[e]]=e;return{g:function(b){if(1>b)throw Error(\"glog(\"+b+\")\");return a[b]},i:function(b){for(;0>b;)b+=255;for(;256<=b;)b-=255;return c[b]}}}(),t=function(){function c(b,c){switch(c){case A.L:return a[4*\n(b-1)];case A.M:return a[4*(b-1)+1];case A.Q:return a[4*(b-1)+2];case A.H:return a[4*(b-1)+3]}}var a=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,\n2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,\n45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,\n151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],\n[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],\n[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],e={I:function(b,a){var e=c(b,a);if(\"undefined\"==\ntypeof e)throw Error(\"bad rs block @ typeNumber:\"+b+\"/errorCorrectLevel:\"+a);b=e.length/3;a=[];for(var d=0;d;\ntype DispatchProps = Pick;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState, authQrCode, returnToAuthPhoneNumber,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef(null);\n\n useEffect(() => {\n if (!authQrCode || connectionState !== 'connectionStateReady') {\n return;\n }\n\n const container = qrCodeRef.current!;\n\n container.innerHTML = '';\n container.classList.remove('pre-animate');\n QrCreator.render({\n text: `${DATA_PREFIX}${authQrCode.token}`,\n radius: 0.5,\n ecLevel: 'M',\n fill: '#4E96D4',\n size: 280,\n }, container);\n }, [connectionState, authQrCode]);\n\n useHistoryBack(returnToAuthPhoneNumber);\n\n return (\n
\n
\n
\n {!authQrCode && }\n
\n

Log in to Telegram by QR Code

\n
    \n
  1. Open Telegram on your phone
  2. \n
  3. Go to Settings > Devices > Scan QR
  4. \n
  5. Point your phone at this screen to confirm login
  6. \n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['connectionState', 'authQrCode']),\n (setGlobal, actions): DispatchProps => pick(actions, ['returnToAuthPhoneNumber']),\n)(AuthCode));\n","import React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string;\n className?: string;\n isOpen?: boolean;\n header?: FC;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\nconst Modal: FC = (props) => {\n const {\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n } = props;\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n}) => {\n const [animation, setAnimation] = useState();\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName('AnimatedSticker', className);\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef(document.createElement('div'));\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (\n onBlur: AnyToVoidFunction,\n onFocus: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (!document.hasFocus()) {\n onBlur();\n }\n\n window.addEventListener('blur', onBlur);\n window.addEventListener('focus', onFocus);\n\n return () => {\n window.removeEventListener('focus', onFocus);\n window.removeEventListener('blur', onBlur);\n };\n }, [onBlur, onFocus]);\n};\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const lang = useLang();\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n \n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/6.63a48d34eed627347217.css b/dist/6.f1076ac830ca341fe8f5.css similarity index 100% rename from dist/6.63a48d34eed627347217.css rename to dist/6.f1076ac830ca341fe8f5.css diff --git a/dist/6.63a48d34eed627347217.js b/dist/6.f1076ac830ca341fe8f5.js similarity index 98% rename from dist/6.63a48d34eed627347217.js rename to dist/6.f1076ac830ca341fe8f5.js index 11edc1aba..a4f0f2870 100644 --- a/dist/6.63a48d34eed627347217.js +++ b/dist/6.f1076ac830ca341fe8f5.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{188:function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},310:function(e,t,n){(function(i){var o,a;"undefined"!=typeof self&&self,void 0===(a="function"==typeof(o=function(){"function"!=typeof Promise&&function(t){function n(e,t){return function(){e.apply(t,arguments)}}function o(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],c(e,n(r,this),n(s,this))}function a(e){var t=this;return null===this._state?void this._deferreds.push(e):void p((function(){var n=t._state?e.onFulfilled:e.onRejected;if(null!==n){var i;try{i=n(t._value)}catch(t){return void e.reject(t)}e.resolve(i)}else(t._state?e.resolve:e.reject)(t._value)}))}function r(e){try{if(e===this)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var t=e.then;if("function"==typeof t)return void c(n(t,e),n(r,this),n(s,this))}this._state=!0,this._value=e,l.call(this)}catch(e){s.call(this,e)}}function s(e){this._state=!1,this._value=e,l.call(this)}function l(){for(var e=0,t=this._deferreds.length;t>e;e++)a.call(this,this._deferreds[e]);this._deferreds=null}function h(e,t,n,i){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=i}function c(e,t,n){var i=!1;try{e((function(e){i||(i=!0,t(e))}),(function(e){i||(i=!0,n(e))}))}catch(e){if(i)return;i=!0,n(e)}}var u=setTimeout,p="function"==typeof i&&i||function(e){u(e,1)},d=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){var n=this;return new o((function(i,o){a.call(n,new h(e,t,i,o))}))},o.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&d(arguments[0])?arguments[0]:arguments);return new o((function(t,n){function i(a,r){try{if(r&&("object"==typeof r||"function"==typeof r)){var s=r.then;if("function"==typeof s)return void s.call(r,(function(e){i(a,e)}),n)}e[a]=r,0==--o&&t(e)}catch(e){n(e)}}if(0===e.length)return t([]);for(var o=e.length,a=0;ai;i++)e[i].then(t,n)}))},o._setImmediateFn=function(e){p=e},e.exports?e.exports=o:t.Promise||(t.Promise=o)}(this),"function"!=typeof window.CustomEvent&&function(){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}e.prototype=window.Event.prototype,window.CustomEvent=e}(),HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,n){for(var i=atob(this.toDataURL(t,n).split(",")[1]),o=i.length,a=new Uint8Array(o),r=0;r=5){var a=n;n=i,i=a}return{width:n,height:i}}n=h("transform"),t=h("transformOrigin"),o=h("userSelect");var w={translate3d:{suffix:", 0px"},translate:{suffix:""}},y=function(e,t,n){this.x=parseFloat(e),this.y=parseFloat(t),this.scale=parseFloat(n)};y.parse=function(e){return e.style?y.parse(e.style[n]):e.indexOf("matrix")>-1||e.indexOf("none")>-1?y.fromMatrix(e):y.fromString(e)},y.fromMatrix=function(e){var t=e.substring(7).split(",");return t.length&&"none"!==e||(t=[1,0,0,1,0,0]),new y(v(t[4]),v(t[5]),parseFloat(t[0]))},y.fromString=function(e){var t=e.split(") "),n=t[0].substring(re.globals.translate.length+1).split(","),i=t.length>1?t[1].substring(6):1,o=n.length>1?n[0]:0,a=n.length>1?n[1]:0;return new y(o,a,i)},y.prototype.toString=function(){var e=w[re.globals.translate].suffix||"";return re.globals.translate+"("+this.x+"px, "+this.y+"px"+e+") scale("+this.scale+")"};var b=function(e){if(!e||!e.style[t])return this.x=0,void(this.y=0);var n=e.style[t].split(" ");this.x=parseFloat(n[0]),this.y=parseFloat(n[1])};function x(e){return e.exifdata&&e.exifdata.Orientation?v(e.exifdata.Orientation):1}function C(e,t,n){var i=t.width,o=t.height,a=e.getContext("2d");switch(e.width=t.width,e.height=t.height,a.save(),n){case 2:a.translate(i,0),a.scale(-1,1);break;case 3:a.translate(i,o),a.rotate(180*Math.PI/180);break;case 4:a.translate(0,o),a.scale(1,-1);break;case 5:e.width=o,e.height=i,a.rotate(90*Math.PI/180),a.scale(1,-1);break;case 6:e.width=o,e.height=i,a.rotate(90*Math.PI/180),a.translate(0,-o);break;case 7:e.width=o,e.height=i,a.rotate(-90*Math.PI/180),a.translate(-i,o),a.scale(1,-1);break;case 8:e.width=o,e.height=i,a.translate(0,i),a.rotate(-90*Math.PI/180)}a.drawImage(t,0,0,i,o),a.restore()}function E(){var e,t,n,i,o,a,r=this.options.viewport.type?"cr-vp-"+this.options.viewport.type:null;this.options.useCanvas=this.options.enableOrientation||_.call(this),this.data={},this.elements={},e=this.elements.boundary=document.createElement("div"),n=this.elements.viewport=document.createElement("div"),t=this.elements.img=document.createElement("img"),i=this.elements.overlay=document.createElement("div"),this.options.useCanvas?(this.elements.canvas=document.createElement("canvas"),this.elements.preview=this.elements.canvas):this.elements.preview=t,m(e,"cr-boundary"),e.setAttribute("aria-dropeffect","none"),o=this.options.boundary.width,a=this.options.boundary.height,d(e,{width:o+(isNaN(o)?"":"px"),height:a+(isNaN(a)?"":"px")}),m(n,"cr-viewport"),r&&m(n,r),d(n,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),n.setAttribute("tabindex",0),m(this.elements.preview,"cr-image"),f(this.elements.preview,{alt:"preview","aria-grabbed":"false"}),m(i,"cr-overlay"),this.element.appendChild(e),e.appendChild(this.elements.preview),e.appendChild(n),e.appendChild(i),m(this.element,"croppie-container"),this.options.customClass&&m(this.element,this.options.customClass),Z.call(this),this.options.enableZoom&&M.call(this),this.options.enableResize&&I.call(this)}function _(){return this.options.enableExif&&window.EXIF}function I(){var e,t,n,i,a,r,s,l=this,h=document.createElement("div"),c=!1;function u(r){if((void 0===r.button||0===r.button)&&(r.preventDefault(),!c)){var s=l.elements.overlay.getBoundingClientRect();if(c=!0,t=r.pageX,n=r.pageY,e=-1!==r.currentTarget.className.indexOf("vertical")?"v":"h",i=s.width,a=s.height,r.touches){var h=r.touches[0];t=h.pageX,n=h.pageY}window.addEventListener("mousemove",p),window.addEventListener("touchmove",p),window.addEventListener("mouseup",f),window.addEventListener("touchend",f),document.body.style[o]="none"}}function p(o){var r=o.pageX,s=o.pageY;if(o.preventDefault(),o.touches){var c=o.touches[0];r=c.pageX,s=c.pageY}var u=r-t,p=s-n,m=l.options.viewport.height+p,f=l.options.viewport.width+u;"v"===e&&m>=50&&m<=a?(d(h,{height:m+"px"}),l.options.boundary.height+=p,d(l.elements.boundary,{height:l.options.boundary.height+"px"}),l.options.viewport.height+=p,d(l.elements.viewport,{height:l.options.viewport.height+"px"})):"h"===e&&f>=50&&f<=i&&(d(h,{width:f+"px"}),l.options.boundary.width+=u,d(l.elements.boundary,{width:l.options.boundary.width+"px"}),l.options.viewport.width+=u,d(l.elements.viewport,{width:l.options.viewport.width+"px"})),k.call(l),S.call(l),B.call(l),j.call(l),n=s,t=r}function f(){c=!1,window.removeEventListener("mousemove",p),window.removeEventListener("touchmove",p),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]=""}m(h,"cr-resizer"),d(h,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),this.options.resizeControls.height&&(m(r=document.createElement("div"),"cr-resizer-vertical"),h.appendChild(r)),this.options.resizeControls.width&&(m(s=document.createElement("div"),"cr-resizer-horisontal"),h.appendChild(s)),r&&(r.addEventListener("mousedown",u),r.addEventListener("touchstart",u)),s&&(s.addEventListener("mousedown",u),s.addEventListener("touchstart",u)),this.elements.boundary.appendChild(h)}function L(e){if(this.options.enableZoom){var t=this.elements.zoomer,n=Q(e,4);t.value=Math.max(parseFloat(t.min),Math.min(parseFloat(t.max),n)).toString()}}function M(){var e=this,t=e.elements.zoomerWrap=document.createElement("div"),n=e.elements.zoomer=document.createElement("input");function i(){T.call(e,{value:parseFloat(n.value),origin:new b(e.elements.preview),viewportRect:e.elements.viewport.getBoundingClientRect(),transform:y.parse(e.elements.preview)})}function o(t){var n,o;if("ctrl"===e.options.mouseWheelZoom&&!0!==t.ctrlKey)return 0;n=t.wheelDelta?t.wheelDelta/1200:t.deltaY?t.deltaY/1060:t.detail?t.detail/-60:0,o=e._currentZoom+n*e._currentZoom,t.preventDefault(),L.call(e,o),i.call(e)}m(t,"cr-slider-wrap"),m(n,"cr-slider"),n.type="range",n.step="0.0001",n.value="1",n.style.display=e.options.showZoomer?"":"none",n.setAttribute("aria-label","zoom"),e.element.appendChild(t),t.appendChild(n),e._currentZoom=1,e.elements.zoomer.addEventListener("input",i),e.elements.zoomer.addEventListener("change",i),e.options.mouseWheelZoom&&(e.elements.boundary.addEventListener("mousewheel",o),e.elements.boundary.addEventListener("DOMMouseScroll",o))}function T(e){var i=this,o=e?e.transform:y.parse(i.elements.preview),a=e?e.viewportRect:i.elements.viewport.getBoundingClientRect(),r=e?e.origin:new b(i.elements.preview);function s(){var e={};e[n]=o.toString(),e[t]=r.toString(),d(i.elements.preview,e)}if(i._currentZoom=e?e.value:i._currentZoom,o.scale=i._currentZoom,i.elements.zoomer.setAttribute("aria-valuenow",i._currentZoom),s(),i.options.enforceBoundary){var l=R.call(i,a),h=l.translate,c=l.origin;o.x>=h.maxX&&(r.x=c.minX,o.x=h.maxX),o.x<=h.minX&&(r.x=c.maxX,o.x=h.minX),o.y>=h.maxY&&(r.y=c.minY,o.y=h.maxY),o.y<=h.minY&&(r.y=c.maxY,o.y=h.minY)}s(),Y.call(i),j.call(i)}function R(e){var t=this._currentZoom,n=e.width,i=e.height,o=this.elements.boundary.clientWidth/2,a=this.elements.boundary.clientHeight/2,r=this.elements.preview.getBoundingClientRect(),s=r.width,l=r.height,h=n/2,c=i/2,u=-1*(h/t-o),p=-1*(c/t-a),d=1/t*h,m=1/t*c;return{translate:{maxX:u,minX:u-(s*(1/t)-n*(1/t)),maxY:p,minY:p-(l*(1/t)-i*(1/t))},origin:{maxX:s*(1/t)-d,minX:d,maxY:l*(1/t)-m,minY:m}}}function B(e){var i=this._currentZoom,o=this.elements.preview.getBoundingClientRect(),a=this.elements.viewport.getBoundingClientRect(),r=y.parse(this.elements.preview.style[n]),s=new b(this.elements.preview),l=a.top-o.top+a.height/2,h=a.left-o.left+a.width/2,c={},u={};if(e){var p=s.x,m=s.y,f=r.x,v=r.y;c.y=p,c.x=m,r.y=f,r.x=v}else c.y=l/i,c.x=h/i,u.y=(c.y-s.y)*(1-i),u.x=(c.x-s.x)*(1-i),r.x-=u.x,r.y-=u.y;var g={};g[t]=c.x+"px "+c.y+"px",g[n]=r.toString(),d(this.elements.preview,g)}function Z(){var e,t,i,a,r,s=this,l=!1;function h(e,t){var n=s.elements.preview.getBoundingClientRect(),i=r.y+t,o=r.x+e;s.options.enforceBoundary?(a.top>n.top+t&&a.bottomn.left+e&&a.right1){var v=o.touches[0],g=o.touches[1],w=Math.sqrt((v.pageX-g.pageX)*(v.pageX-g.pageX)+(v.pageY-g.pageY)*(v.pageY-g.pageY));i||(i=w/s._currentZoom);var y=w/i;return L.call(s,y),void p(s.elements.zoomer)}h(u,m),f[n]=r.toString(),d(s.elements.preview,f),k.call(s),t=l,e=a}function f(){c(l=!1),window.removeEventListener("mousemove",m),window.removeEventListener("touchmove",m),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]="",B.call(s),j.call(s),i=0}s.elements.overlay.addEventListener("mousedown",u),s.elements.viewport.addEventListener("keydown",(function(e){var t;if(!e.shiftKey||38!==e.keyCode&&40!==e.keyCode){if(s.options.enableKeyMovement&&e.keyCode>=37&&e.keyCode<=40){e.preventDefault();var l=function(e){switch(e){case 37:return[1,0];case 38:return[0,1];case 39:return[-1,0];case 40:return[0,-1]}}(e.keyCode);r=y.parse(s.elements.preview),document.body.style[o]="none",a=s.elements.viewport.getBoundingClientRect(),function(e){var t=e[0],a=e[1],l={};h(t,a),l[n]=r.toString(),d(s.elements.preview,l),k.call(s),document.body.style[o]="",B.call(s),j.call(s),i=0}(l)}}else t=38===e.keyCode?parseFloat(s.elements.zoomer.value)+parseFloat(s.elements.zoomer.step):parseFloat(s.elements.zoomer.value)-parseFloat(s.elements.zoomer.step),s.setZoom(t)})),s.elements.overlay.addEventListener("touchstart",u)}function k(){if(this.elements){var e=this.elements.boundary.getBoundingClientRect(),t=this.elements.preview.getBoundingClientRect();d(this.elements.overlay,{width:t.width+"px",height:t.height+"px",top:t.top-e.top+"px",left:t.left-e.left+"px"})}}b.prototype.toString=function(){return this.x+"px "+this.y+"px"};var F,z,O,X,Y=(F=k,z=500,function(){var e=this,t=arguments,n=function(){X=null,O||F.apply(e,t)},i=O&&!X;clearTimeout(X),X=setTimeout(n,z),i&&F.apply(e,t)});function j(){var e,t=this.get();A.call(this)&&(this.options.update.call(this,t),this.$&&"undefined"==typeof Prototype?this.$(this.element).trigger("update.croppie",t):(window.CustomEvent?e=new CustomEvent("update",{detail:t}):(e=document.createEvent("CustomEvent")).initCustomEvent("update",!0,!0,t),this.element.dispatchEvent(e)))}function A(){return this.elements.preview.offsetHeight>0&&this.elements.preview.offsetWidth>0}function W(){var e,i={},o=this.elements.preview,a=new y(0,0,1),r=new b;A.call(this)&&!this.data.bound&&(this.data.bound=!0,i[n]=a.toString(),i[t]=r.toString(),i.opacity=1,d(o,i),e=this.elements.preview.getBoundingClientRect(),this._originalImageWidth=e.width,this._originalImageHeight=e.height,this.data.orientation=x(this.elements.img),this.options.enableZoom?S.call(this,!0):this._currentZoom=1,a.scale=this._currentZoom,i[n]=a.toString(),d(o,i),this.data.points.length?H.call(this,this.data.points):N.call(this),B.call(this),k.call(this))}function S(e){var t,n,i,o,a=Math.max(this.options.minZoom,0)||0,r=this.options.maxZoom||1.5,s=this.elements.zoomer,l=parseFloat(s.value),h=this.elements.boundary.getBoundingClientRect(),c=g(this.elements.img,this.data.orientation),u=this.elements.viewport.getBoundingClientRect();this.options.enforceBoundary&&(i=u.width/c.width,o=u.height/c.height,a=Math.max(i,o)),a>=r&&(r=a+1),s.min=Q(a,4),s.max=Q(r,4),!e&&(ls.max)?L.call(this,lthis._originalImageWidth&&(w=(d=this._originalImageWidth-u)/o*h),i<0&&(p=0,g=Math.abs(i)/a*c),m+p>this._originalImageHeight&&(y=(m=this._originalImageHeight-p)/a*c),l.drawImage(this.elements.preview,u,p,d,m,f,g,w,y),r&&(l.fillStyle="#fff",l.globalCompositeOperation="destination-in",l.beginPath(),l.arc(s.width/2,s.height/2,s.width/2,0,2*Math.PI,!0),l.closePath(),l.fill()),s}function q(e){var t=e.points,n=document.createElement("div"),i=document.createElement("img"),o=t[2]-t[0],a=t[3]-t[1];return m(n,"croppie-result"),n.appendChild(i),d(i,{left:-1*t[0]+"px",top:-1*t[1]+"px"}),i.src=e.url,d(n,{width:o+"px",height:a+"px"}),n}function $(e){return D.call(this,e).toDataURL(e.format,e.quality)}function K(e){var t=this;return new Promise((function(n){D.call(t,e).toBlob((function(e){n(e)}),e.format,e.quality)}))}function U(e){this.elements.img.parentNode&&(Array.prototype.forEach.call(this.elements.img.classList,(function(t){e.classList.add(t)})),this.elements.img.parentNode.replaceChild(e,this.elements.img),this.elements.preview=e),this.elements.img=e}function J(e,t){var n,i,o,a,r=this,s=[],l=null,h=_.call(r);if("string"==typeof e)n=e,e={};else if(Array.isArray(e))s=e.slice();else{if(void 0===e&&r.data.url)return W.call(r),j.call(r),null;n=e.url,s=e.points||[],l=void 0===e.zoom?null:e.zoom}return r.data.bound=!1,r.data.url=n||r.data.url,r.data.boundZoom=l,(i=n,o=h,a=new Image,a.style.opacity="0",new Promise((function(e,t){function n(){a.style.opacity="1",setTimeout((function(){e(a)}),1)}a.removeAttribute("crossOrigin"),i.match(/^https?:\/\/|^\/\//)&&a.setAttribute("crossOrigin","anonymous"),a.onload=function(){o?EXIF.getData(a,(function(){n()})):n()},a.onerror=function(e){a.style.opacity=1,setTimeout((function(){t(e)}),1)},a.src=i}))).then((function(n){if(U.call(r,n),s.length)r.options.relative&&(s=[s[0]*n.naturalWidth/100,s[1]*n.naturalHeight/100,s[2]*n.naturalWidth/100,s[3]*n.naturalHeight/100]);else{var i,o,a=g(n),l=r.elements.viewport.getBoundingClientRect(),h=l.width/l.height;a.width/a.height>h?i=(o=a.height)*h:(i=a.width,o=a.height/h);var c=(a.width-i)/2,u=(a.height-o)/2,p=c+i,d=u+o;r.data.points=[c,u,p,d]}r.data.points=s.map((function(e){return parseFloat(e)})),r.options.useCanvas&&P.call(r,e.orientation),W.call(r),j.call(r),t&&t()}))}function Q(e,t){return parseFloat(e).toFixed(t||0)}function G(){var e=this.elements.preview.getBoundingClientRect(),t=this.elements.viewport.getBoundingClientRect(),n=t.left-e.left,i=t.top-e.top,o=(t.width-this.elements.viewport.offsetWidth)/2,a=(t.height-this.elements.viewport.offsetHeight)/2,r=n+this.elements.viewport.offsetWidth+o,s=i+this.elements.viewport.offsetHeight+a,l=this._currentZoom;(l===1/0||isNaN(l))&&(l=1);var h=this.options.enforceBoundary?0:Number.NEGATIVE_INFINITY;return n=Math.max(h,n/l),i=Math.max(h,i/l),r=Math.max(h,r/l),s=Math.max(h,s/l),{points:[Q(n),Q(i),Q(r),Q(s)],zoom:l,orientation:this.data.orientation}}var V={type:"canvas",format:"png",quality:1},ee=["jpeg","webp","png"];function te(e){var t=this,n=G.call(t),i=c(u(V),u(e)),o="string"==typeof e?e:i.type||"base64",a=i.size||"viewport",r=i.format,s=i.quality,l=i.backgroundColor,h="boolean"==typeof i.circle?i.circle:"circle"===t.options.viewport.type,p=t.elements.viewport.getBoundingClientRect(),d=p.width/p.height;return"viewport"===a?(n.outputWidth=p.width,n.outputHeight=p.height):"object"==typeof a&&(a.width&&a.height?(n.outputWidth=a.width,n.outputHeight=a.height):a.width?(n.outputWidth=a.width,n.outputHeight=a.width/d):a.height&&(n.outputWidth=a.height*d,n.outputHeight=a.height)),ee.indexOf(r)>-1&&(n.format="image/"+r,n.quality=s),n.circle=h,n.url=t.data.url,n.backgroundColor=l,new Promise((function(e){switch(o.toLowerCase()){case"rawcanvas":e(D.call(t,n));break;case"canvas":case"base64":e($.call(t,n));break;case"blob":K.call(t,n).then(e);break;default:e(q.call(t,n))}}))}function ne(){W.call(this)}function ie(e){if(!this.options.useCanvas||!this.options.enableOrientation)throw"Croppie: Cannot rotate without enableOrientation && EXIF.js included";var t,n,i,o,a,r=this.elements.canvas;this.data.orientation=(t=this.data.orientation,n=e,i=s.indexOf(t)>-1?s:l,o=i.indexOf(t),a=n/90%i.length,i[(i.length+o+a%i.length)%i.length]),C(r,this.elements.img,this.data.orientation),B.call(this,!0),S.call(this)}function oe(){var e,t;this.element.removeChild(this.elements.boundary),e=this.element,t="croppie-container",e.classList?e.classList.remove(t):e.className=e.className.replace(t,""),this.options.enableZoom&&this.element.removeChild(this.elements.zoomerWrap),delete this.elements}if(window.jQuery){var ae=window.jQuery;ae.fn.croppie=function(e){var t=typeof e;if("string"===t){var n=Array.prototype.slice.call(arguments,1),i=ae(this).data("croppie");return"get"===e?i.get():"result"===e?i.result.apply(i,n):"bind"===e?i.bind.apply(i,n):this.each((function(){var t=ae(this).data("croppie");if(t){var i=t[e];if(!ae.isFunction(i))throw"Croppie "+e+" method not found";i.apply(t,n),"destroy"===e&&ae(this).removeData("croppie")}}))}return this.each((function(){var t=new re(this,e);t.$=ae,ae(this).data("croppie",t)}))}}function re(e,t){if(e.className.indexOf("croppie-container")>-1)throw new Error("Croppie: Can't initialize croppie more than once");if(this.element=e,this.options=c(u(re.defaults),t),"img"===this.element.tagName.toLowerCase()){var n=this.element;m(n,"cr-original-image"),f(n,{"aria-hidden":"true",alt:""});var i=document.createElement("div");this.element.parentNode.appendChild(i),i.appendChild(n),this.element=i,this.options.url=this.options.url||n.src}if(E.call(this),this.options.url){var o={url:this.options.url,points:this.options.points};delete this.options.url,delete this.options.points,J.call(this,o)}}return re.defaults={viewport:{width:100,height:100,type:"square"},boundary:{},orientationControls:{enabled:!0,leftClass:"",rightClass:""},resizeControls:{width:!0,height:!0},customClass:"",showZoomer:!0,enableZoom:!0,enableResize:!1,mouseWheelZoom:!0,enableExif:!1,enforceBoundary:!0,enableOrientation:!1,enableKeyMovement:!0,update:function(){}},re.globals={translate:"translate3d"},c(re.prototype,{bind:function(e,t){return J.call(this,e,t)},get:function(){var e=G.call(this),t=e.points;return this.options.relative&&(t[0]/=this.elements.img.naturalWidth/100,t[1]/=this.elements.img.naturalHeight/100,t[2]/=this.elements.img.naturalWidth/100,t[3]/=this.elements.img.naturalHeight/100),e},result:function(e){return te.call(this,e)},refresh:function(){return ne.call(this)},setZoom:function(e){L.call(this,e),p(this.elements.zoomer)},rotate:function(e){ie.call(this,e)},destroy:function(){return oe.call(this)}}),re})?o.call(t,n,t,e):o)||(e.exports=a)}).call(this,n(311).setImmediate)},311:function(e,t,n){(function(e){var i=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function a(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new a(o.call(setTimeout,i,arguments),clearTimeout)},t.setInterval=function(){return new a(o.call(setInterval,i,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},a.prototype.unref=a.prototype.ref=function(){},a.prototype.close=function(){this._clearFn.call(i,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(312),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(188))},312:function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var i,o,a,r,s,l=1,h={},c=!1,u=e.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(e);p=p&&p.setTimeout?p:e,"[object process]"==={}.toString.call(e.process)?i=function(e){t.nextTick((function(){m(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((a=new MessageChannel).port1.onmessage=function(e){m(e.data)},i=function(e){a.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,i=function(e){var t=u.createElement("script");t.onreadystatechange=function(){m(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):i=function(e){setTimeout(m,0,e)}:(r="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(r)&&m(+t.data.slice(r.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),i=function(t){e.postMessage(r+t,"*")}),p.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;ne;e++)a.call(this,this._deferreds[e]);this._deferreds=null}function h(e,t,n,i){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=i}function c(e,t,n){var i=!1;try{e((function(e){i||(i=!0,t(e))}),(function(e){i||(i=!0,n(e))}))}catch(e){if(i)return;i=!0,n(e)}}var u=setTimeout,p="function"==typeof i&&i||function(e){u(e,1)},d=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){var n=this;return new o((function(i,o){a.call(n,new h(e,t,i,o))}))},o.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&d(arguments[0])?arguments[0]:arguments);return new o((function(t,n){function i(a,r){try{if(r&&("object"==typeof r||"function"==typeof r)){var s=r.then;if("function"==typeof s)return void s.call(r,(function(e){i(a,e)}),n)}e[a]=r,0==--o&&t(e)}catch(e){n(e)}}if(0===e.length)return t([]);for(var o=e.length,a=0;ai;i++)e[i].then(t,n)}))},o._setImmediateFn=function(e){p=e},e.exports?e.exports=o:t.Promise||(t.Promise=o)}(this),"function"!=typeof window.CustomEvent&&function(){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}e.prototype=window.Event.prototype,window.CustomEvent=e}(),HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,n){for(var i=atob(this.toDataURL(t,n).split(",")[1]),o=i.length,a=new Uint8Array(o),r=0;r=5){var a=n;n=i,i=a}return{width:n,height:i}}n=h("transform"),t=h("transformOrigin"),o=h("userSelect");var w={translate3d:{suffix:", 0px"},translate:{suffix:""}},y=function(e,t,n){this.x=parseFloat(e),this.y=parseFloat(t),this.scale=parseFloat(n)};y.parse=function(e){return e.style?y.parse(e.style[n]):e.indexOf("matrix")>-1||e.indexOf("none")>-1?y.fromMatrix(e):y.fromString(e)},y.fromMatrix=function(e){var t=e.substring(7).split(",");return t.length&&"none"!==e||(t=[1,0,0,1,0,0]),new y(v(t[4]),v(t[5]),parseFloat(t[0]))},y.fromString=function(e){var t=e.split(") "),n=t[0].substring(re.globals.translate.length+1).split(","),i=t.length>1?t[1].substring(6):1,o=n.length>1?n[0]:0,a=n.length>1?n[1]:0;return new y(o,a,i)},y.prototype.toString=function(){var e=w[re.globals.translate].suffix||"";return re.globals.translate+"("+this.x+"px, "+this.y+"px"+e+") scale("+this.scale+")"};var b=function(e){if(!e||!e.style[t])return this.x=0,void(this.y=0);var n=e.style[t].split(" ");this.x=parseFloat(n[0]),this.y=parseFloat(n[1])};function x(e){return e.exifdata&&e.exifdata.Orientation?v(e.exifdata.Orientation):1}function C(e,t,n){var i=t.width,o=t.height,a=e.getContext("2d");switch(e.width=t.width,e.height=t.height,a.save(),n){case 2:a.translate(i,0),a.scale(-1,1);break;case 3:a.translate(i,o),a.rotate(180*Math.PI/180);break;case 4:a.translate(0,o),a.scale(1,-1);break;case 5:e.width=o,e.height=i,a.rotate(90*Math.PI/180),a.scale(1,-1);break;case 6:e.width=o,e.height=i,a.rotate(90*Math.PI/180),a.translate(0,-o);break;case 7:e.width=o,e.height=i,a.rotate(-90*Math.PI/180),a.translate(-i,o),a.scale(1,-1);break;case 8:e.width=o,e.height=i,a.translate(0,i),a.rotate(-90*Math.PI/180)}a.drawImage(t,0,0,i,o),a.restore()}function E(){var e,t,n,i,o,a,r=this.options.viewport.type?"cr-vp-"+this.options.viewport.type:null;this.options.useCanvas=this.options.enableOrientation||_.call(this),this.data={},this.elements={},e=this.elements.boundary=document.createElement("div"),n=this.elements.viewport=document.createElement("div"),t=this.elements.img=document.createElement("img"),i=this.elements.overlay=document.createElement("div"),this.options.useCanvas?(this.elements.canvas=document.createElement("canvas"),this.elements.preview=this.elements.canvas):this.elements.preview=t,m(e,"cr-boundary"),e.setAttribute("aria-dropeffect","none"),o=this.options.boundary.width,a=this.options.boundary.height,d(e,{width:o+(isNaN(o)?"":"px"),height:a+(isNaN(a)?"":"px")}),m(n,"cr-viewport"),r&&m(n,r),d(n,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),n.setAttribute("tabindex",0),m(this.elements.preview,"cr-image"),f(this.elements.preview,{alt:"preview","aria-grabbed":"false"}),m(i,"cr-overlay"),this.element.appendChild(e),e.appendChild(this.elements.preview),e.appendChild(n),e.appendChild(i),m(this.element,"croppie-container"),this.options.customClass&&m(this.element,this.options.customClass),Z.call(this),this.options.enableZoom&&M.call(this),this.options.enableResize&&I.call(this)}function _(){return this.options.enableExif&&window.EXIF}function I(){var e,t,n,i,a,r,s,l=this,h=document.createElement("div"),c=!1;function u(r){if((void 0===r.button||0===r.button)&&(r.preventDefault(),!c)){var s=l.elements.overlay.getBoundingClientRect();if(c=!0,t=r.pageX,n=r.pageY,e=-1!==r.currentTarget.className.indexOf("vertical")?"v":"h",i=s.width,a=s.height,r.touches){var h=r.touches[0];t=h.pageX,n=h.pageY}window.addEventListener("mousemove",p),window.addEventListener("touchmove",p),window.addEventListener("mouseup",f),window.addEventListener("touchend",f),document.body.style[o]="none"}}function p(o){var r=o.pageX,s=o.pageY;if(o.preventDefault(),o.touches){var c=o.touches[0];r=c.pageX,s=c.pageY}var u=r-t,p=s-n,m=l.options.viewport.height+p,f=l.options.viewport.width+u;"v"===e&&m>=50&&m<=a?(d(h,{height:m+"px"}),l.options.boundary.height+=p,d(l.elements.boundary,{height:l.options.boundary.height+"px"}),l.options.viewport.height+=p,d(l.elements.viewport,{height:l.options.viewport.height+"px"})):"h"===e&&f>=50&&f<=i&&(d(h,{width:f+"px"}),l.options.boundary.width+=u,d(l.elements.boundary,{width:l.options.boundary.width+"px"}),l.options.viewport.width+=u,d(l.elements.viewport,{width:l.options.viewport.width+"px"})),k.call(l),S.call(l),B.call(l),j.call(l),n=s,t=r}function f(){c=!1,window.removeEventListener("mousemove",p),window.removeEventListener("touchmove",p),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]=""}m(h,"cr-resizer"),d(h,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),this.options.resizeControls.height&&(m(r=document.createElement("div"),"cr-resizer-vertical"),h.appendChild(r)),this.options.resizeControls.width&&(m(s=document.createElement("div"),"cr-resizer-horisontal"),h.appendChild(s)),r&&(r.addEventListener("mousedown",u),r.addEventListener("touchstart",u)),s&&(s.addEventListener("mousedown",u),s.addEventListener("touchstart",u)),this.elements.boundary.appendChild(h)}function L(e){if(this.options.enableZoom){var t=this.elements.zoomer,n=Q(e,4);t.value=Math.max(parseFloat(t.min),Math.min(parseFloat(t.max),n)).toString()}}function M(){var e=this,t=e.elements.zoomerWrap=document.createElement("div"),n=e.elements.zoomer=document.createElement("input");function i(){T.call(e,{value:parseFloat(n.value),origin:new b(e.elements.preview),viewportRect:e.elements.viewport.getBoundingClientRect(),transform:y.parse(e.elements.preview)})}function o(t){var n,o;if("ctrl"===e.options.mouseWheelZoom&&!0!==t.ctrlKey)return 0;n=t.wheelDelta?t.wheelDelta/1200:t.deltaY?t.deltaY/1060:t.detail?t.detail/-60:0,o=e._currentZoom+n*e._currentZoom,t.preventDefault(),L.call(e,o),i.call(e)}m(t,"cr-slider-wrap"),m(n,"cr-slider"),n.type="range",n.step="0.0001",n.value="1",n.style.display=e.options.showZoomer?"":"none",n.setAttribute("aria-label","zoom"),e.element.appendChild(t),t.appendChild(n),e._currentZoom=1,e.elements.zoomer.addEventListener("input",i),e.elements.zoomer.addEventListener("change",i),e.options.mouseWheelZoom&&(e.elements.boundary.addEventListener("mousewheel",o),e.elements.boundary.addEventListener("DOMMouseScroll",o))}function T(e){var i=this,o=e?e.transform:y.parse(i.elements.preview),a=e?e.viewportRect:i.elements.viewport.getBoundingClientRect(),r=e?e.origin:new b(i.elements.preview);function s(){var e={};e[n]=o.toString(),e[t]=r.toString(),d(i.elements.preview,e)}if(i._currentZoom=e?e.value:i._currentZoom,o.scale=i._currentZoom,i.elements.zoomer.setAttribute("aria-valuenow",i._currentZoom),s(),i.options.enforceBoundary){var l=R.call(i,a),h=l.translate,c=l.origin;o.x>=h.maxX&&(r.x=c.minX,o.x=h.maxX),o.x<=h.minX&&(r.x=c.maxX,o.x=h.minX),o.y>=h.maxY&&(r.y=c.minY,o.y=h.maxY),o.y<=h.minY&&(r.y=c.maxY,o.y=h.minY)}s(),Y.call(i),j.call(i)}function R(e){var t=this._currentZoom,n=e.width,i=e.height,o=this.elements.boundary.clientWidth/2,a=this.elements.boundary.clientHeight/2,r=this.elements.preview.getBoundingClientRect(),s=r.width,l=r.height,h=n/2,c=i/2,u=-1*(h/t-o),p=-1*(c/t-a),d=1/t*h,m=1/t*c;return{translate:{maxX:u,minX:u-(s*(1/t)-n*(1/t)),maxY:p,minY:p-(l*(1/t)-i*(1/t))},origin:{maxX:s*(1/t)-d,minX:d,maxY:l*(1/t)-m,minY:m}}}function B(e){var i=this._currentZoom,o=this.elements.preview.getBoundingClientRect(),a=this.elements.viewport.getBoundingClientRect(),r=y.parse(this.elements.preview.style[n]),s=new b(this.elements.preview),l=a.top-o.top+a.height/2,h=a.left-o.left+a.width/2,c={},u={};if(e){var p=s.x,m=s.y,f=r.x,v=r.y;c.y=p,c.x=m,r.y=f,r.x=v}else c.y=l/i,c.x=h/i,u.y=(c.y-s.y)*(1-i),u.x=(c.x-s.x)*(1-i),r.x-=u.x,r.y-=u.y;var g={};g[t]=c.x+"px "+c.y+"px",g[n]=r.toString(),d(this.elements.preview,g)}function Z(){var e,t,i,a,r,s=this,l=!1;function h(e,t){var n=s.elements.preview.getBoundingClientRect(),i=r.y+t,o=r.x+e;s.options.enforceBoundary?(a.top>n.top+t&&a.bottomn.left+e&&a.right1){var v=o.touches[0],g=o.touches[1],w=Math.sqrt((v.pageX-g.pageX)*(v.pageX-g.pageX)+(v.pageY-g.pageY)*(v.pageY-g.pageY));i||(i=w/s._currentZoom);var y=w/i;return L.call(s,y),void p(s.elements.zoomer)}h(u,m),f[n]=r.toString(),d(s.elements.preview,f),k.call(s),t=l,e=a}function f(){c(l=!1),window.removeEventListener("mousemove",m),window.removeEventListener("touchmove",m),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]="",B.call(s),j.call(s),i=0}s.elements.overlay.addEventListener("mousedown",u),s.elements.viewport.addEventListener("keydown",(function(e){var t;if(!e.shiftKey||38!==e.keyCode&&40!==e.keyCode){if(s.options.enableKeyMovement&&e.keyCode>=37&&e.keyCode<=40){e.preventDefault();var l=function(e){switch(e){case 37:return[1,0];case 38:return[0,1];case 39:return[-1,0];case 40:return[0,-1]}}(e.keyCode);r=y.parse(s.elements.preview),document.body.style[o]="none",a=s.elements.viewport.getBoundingClientRect(),function(e){var t=e[0],a=e[1],l={};h(t,a),l[n]=r.toString(),d(s.elements.preview,l),k.call(s),document.body.style[o]="",B.call(s),j.call(s),i=0}(l)}}else t=38===e.keyCode?parseFloat(s.elements.zoomer.value)+parseFloat(s.elements.zoomer.step):parseFloat(s.elements.zoomer.value)-parseFloat(s.elements.zoomer.step),s.setZoom(t)})),s.elements.overlay.addEventListener("touchstart",u)}function k(){if(this.elements){var e=this.elements.boundary.getBoundingClientRect(),t=this.elements.preview.getBoundingClientRect();d(this.elements.overlay,{width:t.width+"px",height:t.height+"px",top:t.top-e.top+"px",left:t.left-e.left+"px"})}}b.prototype.toString=function(){return this.x+"px "+this.y+"px"};var F,z,O,X,Y=(F=k,z=500,function(){var e=this,t=arguments,n=function(){X=null,O||F.apply(e,t)},i=O&&!X;clearTimeout(X),X=setTimeout(n,z),i&&F.apply(e,t)});function j(){var e,t=this.get();A.call(this)&&(this.options.update.call(this,t),this.$&&"undefined"==typeof Prototype?this.$(this.element).trigger("update.croppie",t):(window.CustomEvent?e=new CustomEvent("update",{detail:t}):(e=document.createEvent("CustomEvent")).initCustomEvent("update",!0,!0,t),this.element.dispatchEvent(e)))}function A(){return this.elements.preview.offsetHeight>0&&this.elements.preview.offsetWidth>0}function W(){var e,i={},o=this.elements.preview,a=new y(0,0,1),r=new b;A.call(this)&&!this.data.bound&&(this.data.bound=!0,i[n]=a.toString(),i[t]=r.toString(),i.opacity=1,d(o,i),e=this.elements.preview.getBoundingClientRect(),this._originalImageWidth=e.width,this._originalImageHeight=e.height,this.data.orientation=x(this.elements.img),this.options.enableZoom?S.call(this,!0):this._currentZoom=1,a.scale=this._currentZoom,i[n]=a.toString(),d(o,i),this.data.points.length?H.call(this,this.data.points):N.call(this),B.call(this),k.call(this))}function S(e){var t,n,i,o,a=Math.max(this.options.minZoom,0)||0,r=this.options.maxZoom||1.5,s=this.elements.zoomer,l=parseFloat(s.value),h=this.elements.boundary.getBoundingClientRect(),c=g(this.elements.img,this.data.orientation),u=this.elements.viewport.getBoundingClientRect();this.options.enforceBoundary&&(i=u.width/c.width,o=u.height/c.height,a=Math.max(i,o)),a>=r&&(r=a+1),s.min=Q(a,4),s.max=Q(r,4),!e&&(ls.max)?L.call(this,lthis._originalImageWidth&&(w=(d=this._originalImageWidth-u)/o*h),i<0&&(p=0,g=Math.abs(i)/a*c),m+p>this._originalImageHeight&&(y=(m=this._originalImageHeight-p)/a*c),l.drawImage(this.elements.preview,u,p,d,m,f,g,w,y),r&&(l.fillStyle="#fff",l.globalCompositeOperation="destination-in",l.beginPath(),l.arc(s.width/2,s.height/2,s.width/2,0,2*Math.PI,!0),l.closePath(),l.fill()),s}function q(e){var t=e.points,n=document.createElement("div"),i=document.createElement("img"),o=t[2]-t[0],a=t[3]-t[1];return m(n,"croppie-result"),n.appendChild(i),d(i,{left:-1*t[0]+"px",top:-1*t[1]+"px"}),i.src=e.url,d(n,{width:o+"px",height:a+"px"}),n}function $(e){return D.call(this,e).toDataURL(e.format,e.quality)}function K(e){var t=this;return new Promise((function(n){D.call(t,e).toBlob((function(e){n(e)}),e.format,e.quality)}))}function U(e){this.elements.img.parentNode&&(Array.prototype.forEach.call(this.elements.img.classList,(function(t){e.classList.add(t)})),this.elements.img.parentNode.replaceChild(e,this.elements.img),this.elements.preview=e),this.elements.img=e}function J(e,t){var n,i,o,a,r=this,s=[],l=null,h=_.call(r);if("string"==typeof e)n=e,e={};else if(Array.isArray(e))s=e.slice();else{if(void 0===e&&r.data.url)return W.call(r),j.call(r),null;n=e.url,s=e.points||[],l=void 0===e.zoom?null:e.zoom}return r.data.bound=!1,r.data.url=n||r.data.url,r.data.boundZoom=l,(i=n,o=h,a=new Image,a.style.opacity="0",new Promise((function(e,t){function n(){a.style.opacity="1",setTimeout((function(){e(a)}),1)}a.removeAttribute("crossOrigin"),i.match(/^https?:\/\/|^\/\//)&&a.setAttribute("crossOrigin","anonymous"),a.onload=function(){o?EXIF.getData(a,(function(){n()})):n()},a.onerror=function(e){a.style.opacity=1,setTimeout((function(){t(e)}),1)},a.src=i}))).then((function(n){if(U.call(r,n),s.length)r.options.relative&&(s=[s[0]*n.naturalWidth/100,s[1]*n.naturalHeight/100,s[2]*n.naturalWidth/100,s[3]*n.naturalHeight/100]);else{var i,o,a=g(n),l=r.elements.viewport.getBoundingClientRect(),h=l.width/l.height;a.width/a.height>h?i=(o=a.height)*h:(i=a.width,o=a.height/h);var c=(a.width-i)/2,u=(a.height-o)/2,p=c+i,d=u+o;r.data.points=[c,u,p,d]}r.data.points=s.map((function(e){return parseFloat(e)})),r.options.useCanvas&&P.call(r,e.orientation),W.call(r),j.call(r),t&&t()}))}function Q(e,t){return parseFloat(e).toFixed(t||0)}function G(){var e=this.elements.preview.getBoundingClientRect(),t=this.elements.viewport.getBoundingClientRect(),n=t.left-e.left,i=t.top-e.top,o=(t.width-this.elements.viewport.offsetWidth)/2,a=(t.height-this.elements.viewport.offsetHeight)/2,r=n+this.elements.viewport.offsetWidth+o,s=i+this.elements.viewport.offsetHeight+a,l=this._currentZoom;(l===1/0||isNaN(l))&&(l=1);var h=this.options.enforceBoundary?0:Number.NEGATIVE_INFINITY;return n=Math.max(h,n/l),i=Math.max(h,i/l),r=Math.max(h,r/l),s=Math.max(h,s/l),{points:[Q(n),Q(i),Q(r),Q(s)],zoom:l,orientation:this.data.orientation}}var V={type:"canvas",format:"png",quality:1},ee=["jpeg","webp","png"];function te(e){var t=this,n=G.call(t),i=c(u(V),u(e)),o="string"==typeof e?e:i.type||"base64",a=i.size||"viewport",r=i.format,s=i.quality,l=i.backgroundColor,h="boolean"==typeof i.circle?i.circle:"circle"===t.options.viewport.type,p=t.elements.viewport.getBoundingClientRect(),d=p.width/p.height;return"viewport"===a?(n.outputWidth=p.width,n.outputHeight=p.height):"object"==typeof a&&(a.width&&a.height?(n.outputWidth=a.width,n.outputHeight=a.height):a.width?(n.outputWidth=a.width,n.outputHeight=a.width/d):a.height&&(n.outputWidth=a.height*d,n.outputHeight=a.height)),ee.indexOf(r)>-1&&(n.format="image/"+r,n.quality=s),n.circle=h,n.url=t.data.url,n.backgroundColor=l,new Promise((function(e){switch(o.toLowerCase()){case"rawcanvas":e(D.call(t,n));break;case"canvas":case"base64":e($.call(t,n));break;case"blob":K.call(t,n).then(e);break;default:e(q.call(t,n))}}))}function ne(){W.call(this)}function ie(e){if(!this.options.useCanvas||!this.options.enableOrientation)throw"Croppie: Cannot rotate without enableOrientation && EXIF.js included";var t,n,i,o,a,r=this.elements.canvas;this.data.orientation=(t=this.data.orientation,n=e,i=s.indexOf(t)>-1?s:l,o=i.indexOf(t),a=n/90%i.length,i[(i.length+o+a%i.length)%i.length]),C(r,this.elements.img,this.data.orientation),B.call(this,!0),S.call(this)}function oe(){var e,t;this.element.removeChild(this.elements.boundary),e=this.element,t="croppie-container",e.classList?e.classList.remove(t):e.className=e.className.replace(t,""),this.options.enableZoom&&this.element.removeChild(this.elements.zoomerWrap),delete this.elements}if(window.jQuery){var ae=window.jQuery;ae.fn.croppie=function(e){var t=typeof e;if("string"===t){var n=Array.prototype.slice.call(arguments,1),i=ae(this).data("croppie");return"get"===e?i.get():"result"===e?i.result.apply(i,n):"bind"===e?i.bind.apply(i,n):this.each((function(){var t=ae(this).data("croppie");if(t){var i=t[e];if(!ae.isFunction(i))throw"Croppie "+e+" method not found";i.apply(t,n),"destroy"===e&&ae(this).removeData("croppie")}}))}return this.each((function(){var t=new re(this,e);t.$=ae,ae(this).data("croppie",t)}))}}function re(e,t){if(e.className.indexOf("croppie-container")>-1)throw new Error("Croppie: Can't initialize croppie more than once");if(this.element=e,this.options=c(u(re.defaults),t),"img"===this.element.tagName.toLowerCase()){var n=this.element;m(n,"cr-original-image"),f(n,{"aria-hidden":"true",alt:""});var i=document.createElement("div");this.element.parentNode.appendChild(i),i.appendChild(n),this.element=i,this.options.url=this.options.url||n.src}if(E.call(this),this.options.url){var o={url:this.options.url,points:this.options.points};delete this.options.url,delete this.options.points,J.call(this,o)}}return re.defaults={viewport:{width:100,height:100,type:"square"},boundary:{},orientationControls:{enabled:!0,leftClass:"",rightClass:""},resizeControls:{width:!0,height:!0},customClass:"",showZoomer:!0,enableZoom:!0,enableResize:!1,mouseWheelZoom:!0,enableExif:!1,enforceBoundary:!0,enableOrientation:!1,enableKeyMovement:!0,update:function(){}},re.globals={translate:"translate3d"},c(re.prototype,{bind:function(e,t){return J.call(this,e,t)},get:function(){var e=G.call(this),t=e.points;return this.options.relative&&(t[0]/=this.elements.img.naturalWidth/100,t[1]/=this.elements.img.naturalHeight/100,t[2]/=this.elements.img.naturalWidth/100,t[3]/=this.elements.img.naturalHeight/100),e},result:function(e){return te.call(this,e)},refresh:function(){return ne.call(this)},setZoom:function(e){L.call(this,e),p(this.elements.zoomer)},rotate:function(e){ie.call(this,e)},destroy:function(){return oe.call(this)}}),re})?o.call(t,n,t,e):o)||(e.exports=a)}).call(this,n(312).setImmediate)},312:function(e,t,n){(function(e){var i=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function a(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new a(o.call(setTimeout,i,arguments),clearTimeout)},t.setInterval=function(){return new a(o.call(setInterval,i,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},a.prototype.unref=a.prototype.ref=function(){},a.prototype.close=function(){this._clearFn.call(i,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(313),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(189))},313:function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var i,o,a,r,s,l=1,h={},c=!1,u=e.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(e);p=p&&p.setTimeout?p:e,"[object process]"==={}.toString.call(e.process)?i=function(e){t.nextTick((function(){m(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((a=new MessageChannel).port1.onmessage=function(e){m(e.data)},i=function(e){a.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,i=function(e){var t=u.createElement("script");t.onreadystatechange=function(){m(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):i=function(e){setTimeout(m,0,e)}:(r="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(r)&&m(+t.data.slice(r.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),i=function(t){e.postMessage(r+t,"*")}),p.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;na;a++)d.call(this,this._deferreds[a]);this._deferreds=null}function h(a,b,c,d){this.onFulfilled=\"function\"===typeof a?a:null,this.onRejected=\"function\"===typeof b?b:null,this.resolve=c,this.reject=d}function i(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}var j=setTimeout,k=\"function\"===typeof setImmediate&&setImmediate||function(a){j(a,1)},l=Array.isArray||function(a){return\"[object Array]\"===Object.prototype.toString.call(a)};c.prototype[\"catch\"]=function(a){return this.then(null,a)},c.prototype.then=function(a,b){var e=this;return new c(function(c,f){d.call(e,new h(a,b,c,f))})},c.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&l(arguments[0])?arguments[0]:arguments);return new c(function(b,c){function d(f,g){try{if(g&&(\"object\"===typeof g||\"function\"===typeof g)){var h=g.then;if(\"function\"===typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;fd;d++)a[d].then(b,c)})},c._setImmediateFn=function(a){k=a},\"undefined\"!==typeof module&&module.exports?module.exports=c:a.Promise||(a.Promise=c)}(this);\r\n }\r\n\r\n if ( typeof window.CustomEvent !== \"function\" ) {\r\n (function(){\r\n function CustomEvent ( event, params ) {\r\n params = params || { bubbles: false, cancelable: false, detail: undefined };\r\n var evt = document.createEvent( 'CustomEvent' );\r\n evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );\r\n return evt;\r\n }\r\n CustomEvent.prototype = window.Event.prototype;\r\n window.CustomEvent = CustomEvent;\r\n }());\r\n }\r\n\r\n if (!HTMLCanvasElement.prototype.toBlob) {\r\n Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {\r\n value: function (callback, type, quality) {\r\n var binStr = atob( this.toDataURL(type, quality).split(',')[1] ),\r\n len = binStr.length,\r\n arr = new Uint8Array(len);\r\n\r\n for (var i=0; i -1 ? EXIF_NORM : EXIF_FLIP,\r\n index = arr.indexOf(ornt),\r\n offset = (rotate / 90) % arr.length;// 180 = 2%4 = 2 shift exif by 2 indexes\r\n\r\n return arr[(arr.length + index + (offset % arr.length)) % arr.length];\r\n }\r\n\r\n // Credits to : Andrew Dupont - http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/\r\n function deepExtend(destination, source) {\r\n destination = destination || {};\r\n for (var property in source) {\r\n if (source[property] && source[property].constructor && source[property].constructor === Object) {\r\n destination[property] = destination[property] || {};\r\n deepExtend(destination[property], source[property]);\r\n } else {\r\n destination[property] = source[property];\r\n }\r\n }\r\n return destination;\r\n }\r\n\r\n function clone(object) {\r\n return deepExtend({}, object);\r\n }\r\n\r\n function debounce(func, wait, immediate) {\r\n var timeout;\r\n return function () {\r\n var context = this, args = arguments;\r\n var later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n var callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n }\r\n\r\n function dispatchChange(element) {\r\n if (\"createEvent\" in document) {\r\n var evt = document.createEvent(\"HTMLEvents\");\r\n evt.initEvent(\"change\", false, true);\r\n element.dispatchEvent(evt);\r\n }\r\n else {\r\n element.fireEvent(\"onchange\");\r\n }\r\n }\r\n\r\n //http://jsperf.com/vanilla-css\r\n function css(el, styles, val) {\r\n if (typeof (styles) === 'string') {\r\n var tmp = styles;\r\n styles = {};\r\n styles[tmp] = val;\r\n }\r\n\r\n for (var prop in styles) {\r\n el.style[prop] = styles[prop];\r\n }\r\n }\r\n\r\n function addClass(el, c) {\r\n if (el.classList) {\r\n el.classList.add(c);\r\n }\r\n else {\r\n el.className += ' ' + c;\r\n }\r\n }\r\n\r\n function removeClass(el, c) {\r\n if (el.classList) {\r\n el.classList.remove(c);\r\n }\r\n else {\r\n el.className = el.className.replace(c, '');\r\n }\r\n }\r\n\r\n function setAttributes(el, attrs) {\r\n for (var key in attrs) {\r\n el.setAttribute(key, attrs[key]);\r\n }\r\n }\r\n\r\n function num(v) {\r\n return parseInt(v, 10);\r\n }\r\n\r\n /* Utilities */\r\n function loadImage(src, doExif) {\r\n var img = new Image();\r\n img.style.opacity = '0';\r\n return new Promise(function (resolve, reject) {\r\n function _resolve() {\r\n img.style.opacity = '1';\r\n setTimeout(function () {\r\n resolve(img);\r\n }, 1);\r\n }\r\n\r\n img.removeAttribute('crossOrigin');\r\n if (src.match(/^https?:\\/\\/|^\\/\\//)) {\r\n img.setAttribute('crossOrigin', 'anonymous');\r\n }\r\n\r\n img.onload = function () {\r\n if (doExif) {\r\n EXIF.getData(img, function () {\r\n _resolve();\r\n });\r\n }\r\n else {\r\n _resolve();\r\n }\r\n };\r\n img.onerror = function (ev) {\r\n img.style.opacity = 1;\r\n setTimeout(function () {\r\n reject(ev);\r\n }, 1);\r\n };\r\n img.src = src;\r\n });\r\n }\r\n\r\n function naturalImageDimensions(img, ornt) {\r\n var w = img.naturalWidth;\r\n var h = img.naturalHeight;\r\n var orient = ornt || getExifOrientation(img);\r\n if (orient && orient >= 5) {\r\n var x= w;\r\n w = h;\r\n h = x;\r\n }\r\n return { width: w, height: h };\r\n }\r\n\r\n /* CSS Transform Prototype */\r\n var TRANSLATE_OPTS = {\r\n 'translate3d': {\r\n suffix: ', 0px'\r\n },\r\n 'translate': {\r\n suffix: ''\r\n }\r\n };\r\n var Transform = function (x, y, scale) {\r\n this.x = parseFloat(x);\r\n this.y = parseFloat(y);\r\n this.scale = parseFloat(scale);\r\n };\r\n\r\n Transform.parse = function (v) {\r\n if (v.style) {\r\n return Transform.parse(v.style[CSS_TRANSFORM]);\r\n }\r\n else if (v.indexOf('matrix') > -1 || v.indexOf('none') > -1) {\r\n return Transform.fromMatrix(v);\r\n }\r\n else {\r\n return Transform.fromString(v);\r\n }\r\n };\r\n\r\n Transform.fromMatrix = function (v) {\r\n var vals = v.substring(7).split(',');\r\n if (!vals.length || v === 'none') {\r\n vals = [1, 0, 0, 1, 0, 0];\r\n }\r\n\r\n return new Transform(num(vals[4]), num(vals[5]), parseFloat(vals[0]));\r\n };\r\n\r\n Transform.fromString = function (v) {\r\n var values = v.split(') '),\r\n translate = values[0].substring(Croppie.globals.translate.length + 1).split(','),\r\n scale = values.length > 1 ? values[1].substring(6) : 1,\r\n x = translate.length > 1 ? translate[0] : 0,\r\n y = translate.length > 1 ? translate[1] : 0;\r\n\r\n return new Transform(x, y, scale);\r\n };\r\n\r\n Transform.prototype.toString = function () {\r\n var suffix = TRANSLATE_OPTS[Croppie.globals.translate].suffix || '';\r\n return Croppie.globals.translate + '(' + this.x + 'px, ' + this.y + 'px' + suffix + ') scale(' + this.scale + ')';\r\n };\r\n\r\n var TransformOrigin = function (el) {\r\n if (!el || !el.style[CSS_TRANS_ORG]) {\r\n this.x = 0;\r\n this.y = 0;\r\n return;\r\n }\r\n var css = el.style[CSS_TRANS_ORG].split(' ');\r\n this.x = parseFloat(css[0]);\r\n this.y = parseFloat(css[1]);\r\n };\r\n\r\n TransformOrigin.prototype.toString = function () {\r\n return this.x + 'px ' + this.y + 'px';\r\n };\r\n\r\n function getExifOrientation (img) {\r\n return img.exifdata && img.exifdata.Orientation ? num(img.exifdata.Orientation) : 1;\r\n }\r\n\r\n function drawCanvas(canvas, img, orientation) {\r\n var width = img.width,\r\n height = img.height,\r\n ctx = canvas.getContext('2d');\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.save();\r\n switch (orientation) {\r\n case 2:\r\n ctx.translate(width, 0);\r\n ctx.scale(-1, 1);\r\n break;\r\n\r\n case 3:\r\n ctx.translate(width, height);\r\n ctx.rotate(180*Math.PI/180);\r\n break;\r\n\r\n case 4:\r\n ctx.translate(0, height);\r\n ctx.scale(1, -1);\r\n break;\r\n\r\n case 5:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.rotate(90*Math.PI/180);\r\n ctx.scale(1, -1);\r\n break;\r\n\r\n case 6:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.rotate(90*Math.PI/180);\r\n ctx.translate(0, -height);\r\n break;\r\n\r\n case 7:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.rotate(-90*Math.PI/180);\r\n ctx.translate(-width, height);\r\n ctx.scale(1, -1);\r\n break;\r\n\r\n case 8:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.translate(0, width);\r\n ctx.rotate(-90*Math.PI/180);\r\n break;\r\n }\r\n ctx.drawImage(img, 0,0, width, height);\r\n ctx.restore();\r\n }\r\n\r\n /* Private Methods */\r\n function _create() {\r\n var self = this,\r\n contClass = 'croppie-container',\r\n customViewportClass = self.options.viewport.type ? 'cr-vp-' + self.options.viewport.type : null,\r\n boundary, img, viewport, overlay, bw, bh;\r\n\r\n self.options.useCanvas = self.options.enableOrientation || _hasExif.call(self);\r\n // Properties on class\r\n self.data = {};\r\n self.elements = {};\r\n\r\n boundary = self.elements.boundary = document.createElement('div');\r\n viewport = self.elements.viewport = document.createElement('div');\r\n img = self.elements.img = document.createElement('img');\r\n overlay = self.elements.overlay = document.createElement('div');\r\n\r\n if (self.options.useCanvas) {\r\n self.elements.canvas = document.createElement('canvas');\r\n self.elements.preview = self.elements.canvas;\r\n }\r\n else {\r\n self.elements.preview = img;\r\n }\r\n\r\n addClass(boundary, 'cr-boundary');\r\n boundary.setAttribute('aria-dropeffect', 'none');\r\n bw = self.options.boundary.width;\r\n bh = self.options.boundary.height;\r\n css(boundary, {\r\n width: (bw + (isNaN(bw) ? '' : 'px')),\r\n height: (bh + (isNaN(bh) ? '' : 'px'))\r\n });\r\n\r\n addClass(viewport, 'cr-viewport');\r\n if (customViewportClass) {\r\n addClass(viewport, customViewportClass);\r\n }\r\n css(viewport, {\r\n width: self.options.viewport.width + 'px',\r\n height: self.options.viewport.height + 'px'\r\n });\r\n viewport.setAttribute('tabindex', 0);\r\n\r\n addClass(self.elements.preview, 'cr-image');\r\n setAttributes(self.elements.preview, { 'alt': 'preview', 'aria-grabbed': 'false' });\r\n addClass(overlay, 'cr-overlay');\r\n\r\n self.element.appendChild(boundary);\r\n boundary.appendChild(self.elements.preview);\r\n boundary.appendChild(viewport);\r\n boundary.appendChild(overlay);\r\n\r\n addClass(self.element, contClass);\r\n if (self.options.customClass) {\r\n addClass(self.element, self.options.customClass);\r\n }\r\n\r\n _initDraggable.call(this);\r\n\r\n if (self.options.enableZoom) {\r\n _initializeZoom.call(self);\r\n }\r\n\r\n // if (self.options.enableOrientation) {\r\n // _initRotationControls.call(self);\r\n // }\r\n\r\n if (self.options.enableResize) {\r\n _initializeResize.call(self);\r\n }\r\n }\r\n\r\n // function _initRotationControls () {\r\n // var self = this,\r\n // wrap, btnLeft, btnRight, iLeft, iRight;\r\n\r\n // wrap = document.createElement('div');\r\n // self.elements.orientationBtnLeft = btnLeft = document.createElement('button');\r\n // self.elements.orientationBtnRight = btnRight = document.createElement('button');\r\n\r\n // wrap.appendChild(btnLeft);\r\n // wrap.appendChild(btnRight);\r\n\r\n // iLeft = document.createElement('i');\r\n // iRight = document.createElement('i');\r\n // btnLeft.appendChild(iLeft);\r\n // btnRight.appendChild(iRight);\r\n\r\n // addClass(wrap, 'cr-rotate-controls');\r\n // addClass(btnLeft, 'cr-rotate-l');\r\n // addClass(btnRight, 'cr-rotate-r');\r\n\r\n // self.elements.boundary.appendChild(wrap);\r\n\r\n // btnLeft.addEventListener('click', function () {\r\n // self.rotate(-90);\r\n // });\r\n // btnRight.addEventListener('click', function () {\r\n // self.rotate(90);\r\n // });\r\n // }\r\n\r\n function _hasExif() {\r\n return this.options.enableExif && window.EXIF;\r\n }\r\n\r\n function _initializeResize () {\r\n var self = this;\r\n var wrap = document.createElement('div');\r\n var isDragging = false;\r\n var direction;\r\n var originalX;\r\n var originalY;\r\n var minSize = 50;\r\n var maxWidth;\r\n var maxHeight;\r\n var vr;\r\n var hr;\r\n\r\n addClass(wrap, 'cr-resizer');\r\n css(wrap, {\r\n width: this.options.viewport.width + 'px',\r\n height: this.options.viewport.height + 'px'\r\n });\r\n\r\n if (this.options.resizeControls.height) {\r\n vr = document.createElement('div');\r\n addClass(vr, 'cr-resizer-vertical');\r\n wrap.appendChild(vr);\r\n }\r\n\r\n if (this.options.resizeControls.width) {\r\n hr = document.createElement('div');\r\n addClass(hr, 'cr-resizer-horisontal');\r\n wrap.appendChild(hr);\r\n }\r\n\r\n function mouseDown(ev) {\r\n if (ev.button !== undefined && ev.button !== 0) return;\r\n\r\n ev.preventDefault();\r\n if (isDragging) {\r\n return;\r\n }\r\n\r\n var overlayRect = self.elements.overlay.getBoundingClientRect();\r\n\r\n isDragging = true;\r\n originalX = ev.pageX;\r\n originalY = ev.pageY;\r\n direction = ev.currentTarget.className.indexOf('vertical') !== -1 ? 'v' : 'h';\r\n maxWidth = overlayRect.width;\r\n maxHeight = overlayRect.height;\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n originalX = touches.pageX;\r\n originalY = touches.pageY;\r\n }\r\n\r\n window.addEventListener('mousemove', mouseMove);\r\n window.addEventListener('touchmove', mouseMove);\r\n window.addEventListener('mouseup', mouseUp);\r\n window.addEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = 'none';\r\n }\r\n\r\n function mouseMove(ev) {\r\n var pageX = ev.pageX;\r\n var pageY = ev.pageY;\r\n\r\n ev.preventDefault();\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n pageX = touches.pageX;\r\n pageY = touches.pageY;\r\n }\r\n\r\n var deltaX = pageX - originalX;\r\n var deltaY = pageY - originalY;\r\n var newHeight = self.options.viewport.height + deltaY;\r\n var newWidth = self.options.viewport.width + deltaX;\r\n\r\n if (direction === 'v' && newHeight >= minSize && newHeight <= maxHeight) {\r\n css(wrap, {\r\n height: newHeight + 'px'\r\n });\r\n\r\n self.options.boundary.height += deltaY;\r\n css(self.elements.boundary, {\r\n height: self.options.boundary.height + 'px'\r\n });\r\n\r\n self.options.viewport.height += deltaY;\r\n css(self.elements.viewport, {\r\n height: self.options.viewport.height + 'px'\r\n });\r\n }\r\n else if (direction === 'h' && newWidth >= minSize && newWidth <= maxWidth) {\r\n css(wrap, {\r\n width: newWidth + 'px'\r\n });\r\n\r\n self.options.boundary.width += deltaX;\r\n css(self.elements.boundary, {\r\n width: self.options.boundary.width + 'px'\r\n });\r\n\r\n self.options.viewport.width += deltaX;\r\n css(self.elements.viewport, {\r\n width: self.options.viewport.width + 'px'\r\n });\r\n }\r\n\r\n _updateOverlay.call(self);\r\n _updateZoomLimits.call(self);\r\n _updateCenterPoint.call(self);\r\n _triggerUpdate.call(self);\r\n originalY = pageY;\r\n originalX = pageX;\r\n }\r\n\r\n function mouseUp() {\r\n isDragging = false;\r\n window.removeEventListener('mousemove', mouseMove);\r\n window.removeEventListener('touchmove', mouseMove);\r\n window.removeEventListener('mouseup', mouseUp);\r\n window.removeEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = '';\r\n }\r\n\r\n if (vr) {\r\n vr.addEventListener('mousedown', mouseDown);\r\n vr.addEventListener('touchstart', mouseDown);\r\n }\r\n\r\n if (hr) {\r\n hr.addEventListener('mousedown', mouseDown);\r\n hr.addEventListener('touchstart', mouseDown);\r\n }\r\n\r\n this.elements.boundary.appendChild(wrap);\r\n }\r\n\r\n function _setZoomerVal(v) {\r\n if (this.options.enableZoom) {\r\n var z = this.elements.zoomer,\r\n val = fix(v, 4);\r\n\r\n z.value = Math.max(parseFloat(z.min), Math.min(parseFloat(z.max), val)).toString();\r\n }\r\n }\r\n\r\n function _initializeZoom() {\r\n var self = this,\r\n wrap = self.elements.zoomerWrap = document.createElement('div'),\r\n zoomer = self.elements.zoomer = document.createElement('input');\r\n\r\n addClass(wrap, 'cr-slider-wrap');\r\n addClass(zoomer, 'cr-slider');\r\n zoomer.type = 'range';\r\n zoomer.step = '0.0001';\r\n zoomer.value = '1';\r\n zoomer.style.display = self.options.showZoomer ? '' : 'none';\r\n zoomer.setAttribute('aria-label', 'zoom');\r\n\r\n self.element.appendChild(wrap);\r\n wrap.appendChild(zoomer);\r\n\r\n self._currentZoom = 1;\r\n\r\n function change() {\r\n _onZoom.call(self, {\r\n value: parseFloat(zoomer.value),\r\n origin: new TransformOrigin(self.elements.preview),\r\n viewportRect: self.elements.viewport.getBoundingClientRect(),\r\n transform: Transform.parse(self.elements.preview)\r\n });\r\n }\r\n\r\n function scroll(ev) {\r\n var delta, targetZoom;\r\n\r\n if(self.options.mouseWheelZoom === 'ctrl' && ev.ctrlKey !== true){\r\n return 0; \r\n } else if (ev.wheelDelta) {\r\n delta = ev.wheelDelta / 1200; //wheelDelta min: -120 max: 120 // max x 10 x 2\r\n } else if (ev.deltaY) {\r\n delta = ev.deltaY / 1060; //deltaY min: -53 max: 53 // max x 10 x 2\r\n } else if (ev.detail) {\r\n delta = ev.detail / -60; //delta min: -3 max: 3 // max x 10 x 2\r\n } else {\r\n delta = 0;\r\n }\r\n\r\n targetZoom = self._currentZoom + (delta * self._currentZoom);\r\n\r\n ev.preventDefault();\r\n _setZoomerVal.call(self, targetZoom);\r\n change.call(self);\r\n }\r\n\r\n self.elements.zoomer.addEventListener('input', change);// this is being fired twice on keypress\r\n self.elements.zoomer.addEventListener('change', change);\r\n\r\n if (self.options.mouseWheelZoom) {\r\n self.elements.boundary.addEventListener('mousewheel', scroll);\r\n self.elements.boundary.addEventListener('DOMMouseScroll', scroll);\r\n }\r\n }\r\n\r\n function _onZoom(ui) {\r\n var self = this,\r\n transform = ui ? ui.transform : Transform.parse(self.elements.preview),\r\n vpRect = ui ? ui.viewportRect : self.elements.viewport.getBoundingClientRect(),\r\n origin = ui ? ui.origin : new TransformOrigin(self.elements.preview);\r\n\r\n function applyCss() {\r\n var transCss = {};\r\n transCss[CSS_TRANSFORM] = transform.toString();\r\n transCss[CSS_TRANS_ORG] = origin.toString();\r\n css(self.elements.preview, transCss);\r\n }\r\n\r\n self._currentZoom = ui ? ui.value : self._currentZoom;\r\n transform.scale = self._currentZoom;\r\n self.elements.zoomer.setAttribute('aria-valuenow', self._currentZoom);\r\n applyCss();\r\n\r\n if (self.options.enforceBoundary) {\r\n var boundaries = _getVirtualBoundaries.call(self, vpRect),\r\n transBoundaries = boundaries.translate,\r\n oBoundaries = boundaries.origin;\r\n\r\n if (transform.x >= transBoundaries.maxX) {\r\n origin.x = oBoundaries.minX;\r\n transform.x = transBoundaries.maxX;\r\n }\r\n\r\n if (transform.x <= transBoundaries.minX) {\r\n origin.x = oBoundaries.maxX;\r\n transform.x = transBoundaries.minX;\r\n }\r\n\r\n if (transform.y >= transBoundaries.maxY) {\r\n origin.y = oBoundaries.minY;\r\n transform.y = transBoundaries.maxY;\r\n }\r\n\r\n if (transform.y <= transBoundaries.minY) {\r\n origin.y = oBoundaries.maxY;\r\n transform.y = transBoundaries.minY;\r\n }\r\n }\r\n applyCss();\r\n _debouncedOverlay.call(self);\r\n _triggerUpdate.call(self);\r\n }\r\n\r\n function _getVirtualBoundaries(viewport) {\r\n var self = this,\r\n scale = self._currentZoom,\r\n vpWidth = viewport.width,\r\n vpHeight = viewport.height,\r\n centerFromBoundaryX = self.elements.boundary.clientWidth / 2,\r\n centerFromBoundaryY = self.elements.boundary.clientHeight / 2,\r\n imgRect = self.elements.preview.getBoundingClientRect(),\r\n curImgWidth = imgRect.width,\r\n curImgHeight = imgRect.height,\r\n halfWidth = vpWidth / 2,\r\n halfHeight = vpHeight / 2;\r\n\r\n var maxX = ((halfWidth / scale) - centerFromBoundaryX) * -1;\r\n var minX = maxX - ((curImgWidth * (1 / scale)) - (vpWidth * (1 / scale)));\r\n\r\n var maxY = ((halfHeight / scale) - centerFromBoundaryY) * -1;\r\n var minY = maxY - ((curImgHeight * (1 / scale)) - (vpHeight * (1 / scale)));\r\n\r\n var originMinX = (1 / scale) * halfWidth;\r\n var originMaxX = (curImgWidth * (1 / scale)) - originMinX;\r\n\r\n var originMinY = (1 / scale) * halfHeight;\r\n var originMaxY = (curImgHeight * (1 / scale)) - originMinY;\r\n\r\n return {\r\n translate: {\r\n maxX: maxX,\r\n minX: minX,\r\n maxY: maxY,\r\n minY: minY\r\n },\r\n origin: {\r\n maxX: originMaxX,\r\n minX: originMinX,\r\n maxY: originMaxY,\r\n minY: originMinY\r\n }\r\n };\r\n }\r\n\r\n function _updateCenterPoint(rotate) {\r\n var self = this,\r\n scale = self._currentZoom,\r\n data = self.elements.preview.getBoundingClientRect(),\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n transform = Transform.parse(self.elements.preview.style[CSS_TRANSFORM]),\r\n pc = new TransformOrigin(self.elements.preview),\r\n top = (vpData.top - data.top) + (vpData.height / 2),\r\n left = (vpData.left - data.left) + (vpData.width / 2),\r\n center = {},\r\n adj = {};\r\n\r\n if (rotate) {\r\n var cx = pc.x;\r\n var cy = pc.y;\r\n var tx = transform.x;\r\n var ty = transform.y;\r\n\r\n center.y = cx;\r\n center.x = cy;\r\n transform.y = tx;\r\n transform.x = ty;\r\n }\r\n else {\r\n center.y = top / scale;\r\n center.x = left / scale;\r\n\r\n adj.y = (center.y - pc.y) * (1 - scale);\r\n adj.x = (center.x - pc.x) * (1 - scale);\r\n\r\n transform.x -= adj.x;\r\n transform.y -= adj.y;\r\n }\r\n\r\n var newCss = {};\r\n newCss[CSS_TRANS_ORG] = center.x + 'px ' + center.y + 'px';\r\n newCss[CSS_TRANSFORM] = transform.toString();\r\n css(self.elements.preview, newCss);\r\n }\r\n\r\n function _initDraggable() {\r\n var self = this,\r\n isDragging = false,\r\n originalX,\r\n originalY,\r\n originalDistance,\r\n vpRect,\r\n transform;\r\n\r\n function assignTransformCoordinates(deltaX, deltaY) {\r\n var imgRect = self.elements.preview.getBoundingClientRect(),\r\n top = transform.y + deltaY,\r\n left = transform.x + deltaX;\r\n\r\n if (self.options.enforceBoundary) {\r\n if (vpRect.top > imgRect.top + deltaY && vpRect.bottom < imgRect.bottom + deltaY) {\r\n transform.y = top;\r\n }\r\n\r\n if (vpRect.left > imgRect.left + deltaX && vpRect.right < imgRect.right + deltaX) {\r\n transform.x = left;\r\n }\r\n }\r\n else {\r\n transform.y = top;\r\n transform.x = left;\r\n }\r\n }\r\n\r\n function toggleGrabState(isDragging) {\r\n self.elements.preview.setAttribute('aria-grabbed', isDragging);\r\n self.elements.boundary.setAttribute('aria-dropeffect', isDragging? 'move': 'none');\r\n }\r\n\r\n function keyDown(ev) {\r\n var LEFT_ARROW = 37,\r\n UP_ARROW = 38,\r\n RIGHT_ARROW = 39,\r\n DOWN_ARROW = 40;\r\n\r\n if (ev.shiftKey && (ev.keyCode === UP_ARROW || ev.keyCode === DOWN_ARROW)) {\r\n var zoom;\r\n if (ev.keyCode === UP_ARROW) {\r\n zoom = parseFloat(self.elements.zoomer.value) + parseFloat(self.elements.zoomer.step)\r\n }\r\n else {\r\n zoom = parseFloat(self.elements.zoomer.value) - parseFloat(self.elements.zoomer.step)\r\n }\r\n self.setZoom(zoom);\r\n }\r\n else if (self.options.enableKeyMovement && (ev.keyCode >= 37 && ev.keyCode <= 40)) {\r\n ev.preventDefault();\r\n var movement = parseKeyDown(ev.keyCode);\r\n\r\n transform = Transform.parse(self.elements.preview);\r\n document.body.style[CSS_USERSELECT] = 'none';\r\n vpRect = self.elements.viewport.getBoundingClientRect();\r\n keyMove(movement);\r\n }\r\n\r\n function parseKeyDown(key) {\r\n switch (key) {\r\n case LEFT_ARROW:\r\n return [1, 0];\r\n case UP_ARROW:\r\n return [0, 1];\r\n case RIGHT_ARROW:\r\n return [-1, 0];\r\n case DOWN_ARROW:\r\n return [0, -1];\r\n }\r\n }\r\n }\r\n\r\n function keyMove(movement) {\r\n var deltaX = movement[0],\r\n deltaY = movement[1],\r\n newCss = {};\r\n\r\n assignTransformCoordinates(deltaX, deltaY);\r\n\r\n newCss[CSS_TRANSFORM] = transform.toString();\r\n css(self.elements.preview, newCss);\r\n _updateOverlay.call(self);\r\n document.body.style[CSS_USERSELECT] = '';\r\n _updateCenterPoint.call(self);\r\n _triggerUpdate.call(self);\r\n originalDistance = 0;\r\n }\r\n\r\n function mouseDown(ev) {\r\n if (ev.button !== undefined && ev.button !== 0) return;\r\n\r\n ev.preventDefault();\r\n if (isDragging) return;\r\n isDragging = true;\r\n originalX = ev.pageX;\r\n originalY = ev.pageY;\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n originalX = touches.pageX;\r\n originalY = touches.pageY;\r\n }\r\n toggleGrabState(isDragging);\r\n transform = Transform.parse(self.elements.preview);\r\n window.addEventListener('mousemove', mouseMove);\r\n window.addEventListener('touchmove', mouseMove);\r\n window.addEventListener('mouseup', mouseUp);\r\n window.addEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = 'none';\r\n vpRect = self.elements.viewport.getBoundingClientRect();\r\n }\r\n\r\n function mouseMove(ev) {\r\n ev.preventDefault();\r\n var pageX = ev.pageX,\r\n pageY = ev.pageY;\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n pageX = touches.pageX;\r\n pageY = touches.pageY;\r\n }\r\n\r\n var deltaX = pageX - originalX,\r\n deltaY = pageY - originalY,\r\n newCss = {};\r\n\r\n if (ev.type === 'touchmove') {\r\n if (ev.touches.length > 1) {\r\n var touch1 = ev.touches[0];\r\n var touch2 = ev.touches[1];\r\n var dist = Math.sqrt((touch1.pageX - touch2.pageX) * (touch1.pageX - touch2.pageX) + (touch1.pageY - touch2.pageY) * (touch1.pageY - touch2.pageY));\r\n\r\n if (!originalDistance) {\r\n originalDistance = dist / self._currentZoom;\r\n }\r\n\r\n var scale = dist / originalDistance;\r\n\r\n _setZoomerVal.call(self, scale);\r\n dispatchChange(self.elements.zoomer);\r\n return;\r\n }\r\n }\r\n\r\n assignTransformCoordinates(deltaX, deltaY);\r\n\r\n newCss[CSS_TRANSFORM] = transform.toString();\r\n css(self.elements.preview, newCss);\r\n _updateOverlay.call(self);\r\n originalY = pageY;\r\n originalX = pageX;\r\n }\r\n\r\n function mouseUp() {\r\n isDragging = false;\r\n toggleGrabState(isDragging);\r\n window.removeEventListener('mousemove', mouseMove);\r\n window.removeEventListener('touchmove', mouseMove);\r\n window.removeEventListener('mouseup', mouseUp);\r\n window.removeEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = '';\r\n _updateCenterPoint.call(self);\r\n _triggerUpdate.call(self);\r\n originalDistance = 0;\r\n }\r\n\r\n self.elements.overlay.addEventListener('mousedown', mouseDown);\r\n self.elements.viewport.addEventListener('keydown', keyDown);\r\n self.elements.overlay.addEventListener('touchstart', mouseDown);\r\n }\r\n\r\n function _updateOverlay() {\r\n if (!this.elements) return; // since this is debounced, it can be fired after destroy\r\n var self = this,\r\n boundRect = self.elements.boundary.getBoundingClientRect(),\r\n imgData = self.elements.preview.getBoundingClientRect();\r\n\r\n css(self.elements.overlay, {\r\n width: imgData.width + 'px',\r\n height: imgData.height + 'px',\r\n top: (imgData.top - boundRect.top) + 'px',\r\n left: (imgData.left - boundRect.left) + 'px'\r\n });\r\n }\r\n var _debouncedOverlay = debounce(_updateOverlay, 500);\r\n\r\n function _triggerUpdate() {\r\n var self = this,\r\n data = self.get();\r\n\r\n if (!_isVisible.call(self)) {\r\n return;\r\n }\r\n\r\n self.options.update.call(self, data);\r\n if (self.$ && typeof Prototype === 'undefined') {\r\n self.$(self.element).trigger('update.croppie', data);\r\n }\r\n else {\r\n var ev;\r\n if (window.CustomEvent) {\r\n ev = new CustomEvent('update', { detail: data });\r\n } else {\r\n ev = document.createEvent('CustomEvent');\r\n ev.initCustomEvent('update', true, true, data);\r\n }\r\n\r\n self.element.dispatchEvent(ev);\r\n }\r\n }\r\n\r\n function _isVisible() {\r\n return this.elements.preview.offsetHeight > 0 && this.elements.preview.offsetWidth > 0;\r\n }\r\n\r\n function _updatePropertiesFromImage() {\r\n var self = this,\r\n initialZoom = 1,\r\n cssReset = {},\r\n img = self.elements.preview,\r\n imgData,\r\n transformReset = new Transform(0, 0, initialZoom),\r\n originReset = new TransformOrigin(),\r\n isVisible = _isVisible.call(self);\r\n\r\n if (!isVisible || self.data.bound) {// if the croppie isn't visible or it doesn't need binding\r\n return;\r\n }\r\n\r\n self.data.bound = true;\r\n cssReset[CSS_TRANSFORM] = transformReset.toString();\r\n cssReset[CSS_TRANS_ORG] = originReset.toString();\r\n cssReset['opacity'] = 1;\r\n css(img, cssReset);\r\n\r\n imgData = self.elements.preview.getBoundingClientRect();\r\n\r\n self._originalImageWidth = imgData.width;\r\n self._originalImageHeight = imgData.height;\r\n self.data.orientation = getExifOrientation(self.elements.img);\r\n\r\n if (self.options.enableZoom) {\r\n _updateZoomLimits.call(self, true);\r\n }\r\n else {\r\n self._currentZoom = initialZoom;\r\n }\r\n\r\n transformReset.scale = self._currentZoom;\r\n cssReset[CSS_TRANSFORM] = transformReset.toString();\r\n css(img, cssReset);\r\n\r\n if (self.data.points.length) {\r\n _bindPoints.call(self, self.data.points);\r\n }\r\n else {\r\n _centerImage.call(self);\r\n }\r\n\r\n _updateCenterPoint.call(self);\r\n _updateOverlay.call(self);\r\n }\r\n\r\n function _updateZoomLimits (initial) {\r\n var self = this,\r\n minZoom = Math.max(self.options.minZoom, 0) || 0,\r\n maxZoom = self.options.maxZoom || 1.5,\r\n initialZoom,\r\n defaultInitialZoom,\r\n zoomer = self.elements.zoomer,\r\n scale = parseFloat(zoomer.value),\r\n boundaryData = self.elements.boundary.getBoundingClientRect(),\r\n imgData = naturalImageDimensions(self.elements.img, self.data.orientation),\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n minW,\r\n minH;\r\n if (self.options.enforceBoundary) {\r\n minW = vpData.width / imgData.width;\r\n minH = vpData.height / imgData.height;\r\n minZoom = Math.max(minW, minH);\r\n }\r\n\r\n if (minZoom >= maxZoom) {\r\n maxZoom = minZoom + 1;\r\n }\r\n\r\n zoomer.min = fix(minZoom, 4);\r\n zoomer.max = fix(maxZoom, 4);\r\n \r\n if (!initial && (scale < zoomer.min || scale > zoomer.max)) {\r\n _setZoomerVal.call(self, scale < zoomer.min ? zoomer.min : zoomer.max);\r\n }\r\n else if (initial) {\r\n defaultInitialZoom = Math.max((boundaryData.width / imgData.width), (boundaryData.height / imgData.height));\r\n initialZoom = self.data.boundZoom !== null ? self.data.boundZoom : defaultInitialZoom;\r\n _setZoomerVal.call(self, initialZoom);\r\n }\r\n\r\n dispatchChange(zoomer);\r\n }\r\n\r\n function _bindPoints(points) {\r\n if (points.length !== 4) {\r\n throw \"Croppie - Invalid number of points supplied: \" + points;\r\n }\r\n var self = this,\r\n pointsWidth = points[2] - points[0],\r\n // pointsHeight = points[3] - points[1],\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n boundRect = self.elements.boundary.getBoundingClientRect(),\r\n vpOffset = {\r\n left: vpData.left - boundRect.left,\r\n top: vpData.top - boundRect.top\r\n },\r\n scale = vpData.width / pointsWidth,\r\n originTop = points[1],\r\n originLeft = points[0],\r\n transformTop = (-1 * points[1]) + vpOffset.top,\r\n transformLeft = (-1 * points[0]) + vpOffset.left,\r\n newCss = {};\r\n\r\n newCss[CSS_TRANS_ORG] = originLeft + 'px ' + originTop + 'px';\r\n newCss[CSS_TRANSFORM] = new Transform(transformLeft, transformTop, scale).toString();\r\n css(self.elements.preview, newCss);\r\n\r\n _setZoomerVal.call(self, scale);\r\n self._currentZoom = scale;\r\n }\r\n\r\n function _centerImage() {\r\n var self = this,\r\n imgDim = self.elements.preview.getBoundingClientRect(),\r\n vpDim = self.elements.viewport.getBoundingClientRect(),\r\n boundDim = self.elements.boundary.getBoundingClientRect(),\r\n vpLeft = vpDim.left - boundDim.left,\r\n vpTop = vpDim.top - boundDim.top,\r\n w = vpLeft - ((imgDim.width - vpDim.width) / 2),\r\n h = vpTop - ((imgDim.height - vpDim.height) / 2),\r\n transform = new Transform(w, h, self._currentZoom);\r\n\r\n css(self.elements.preview, CSS_TRANSFORM, transform.toString());\r\n }\r\n\r\n function _transferImageToCanvas(customOrientation) {\r\n var self = this,\r\n canvas = self.elements.canvas,\r\n img = self.elements.img,\r\n ctx = canvas.getContext('2d');\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n var orientation = self.options.enableOrientation && customOrientation || getExifOrientation(img);\r\n drawCanvas(canvas, img, orientation);\r\n }\r\n\r\n function _getCanvas(data) {\r\n var self = this,\r\n points = data.points,\r\n left = num(points[0]),\r\n top = num(points[1]),\r\n right = num(points[2]),\r\n bottom = num(points[3]),\r\n width = right-left,\r\n height = bottom-top,\r\n circle = data.circle,\r\n canvas = document.createElement('canvas'),\r\n ctx = canvas.getContext('2d'),\r\n startX = 0,\r\n startY = 0,\r\n canvasWidth = data.outputWidth || width,\r\n canvasHeight = data.outputHeight || height;\r\n\r\n canvas.width = canvasWidth;\r\n canvas.height = canvasHeight;\r\n\r\n if (data.backgroundColor) {\r\n ctx.fillStyle = data.backgroundColor;\r\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\r\n }\r\n\r\n // By default assume we're going to draw the entire\r\n // source image onto the destination canvas.\r\n var sx = left,\r\n sy = top,\r\n sWidth = width,\r\n sHeight = height,\r\n dx = 0,\r\n dy = 0,\r\n dWidth = canvasWidth,\r\n dHeight = canvasHeight;\r\n\r\n //\r\n // Do not go outside of the original image's bounds along the x-axis.\r\n // Handle translations when projecting onto the destination canvas.\r\n //\r\n\r\n // The smallest possible source x-position is 0.\r\n if (left < 0) {\r\n sx = 0;\r\n dx = (Math.abs(left) / width) * canvasWidth;\r\n }\r\n\r\n // The largest possible source width is the original image's width.\r\n if (sWidth + sx > self._originalImageWidth) {\r\n sWidth = self._originalImageWidth - sx;\r\n dWidth = (sWidth / width) * canvasWidth;\r\n }\r\n\r\n //\r\n // Do not go outside of the original image's bounds along the y-axis.\r\n //\r\n\r\n // The smallest possible source y-position is 0.\r\n if (top < 0) {\r\n sy = 0;\r\n dy = (Math.abs(top) / height) * canvasHeight;\r\n }\r\n\r\n // The largest possible source height is the original image's height.\r\n if (sHeight + sy > self._originalImageHeight) {\r\n sHeight = self._originalImageHeight - sy;\r\n dHeight = (sHeight / height) * canvasHeight;\r\n }\r\n\r\n // console.table({ left, right, top, bottom, canvasWidth, canvasHeight, width, height, startX, startY, circle, sx, sy, dx, dy, sWidth, sHeight, dWidth, dHeight });\r\n\r\n ctx.drawImage(this.elements.preview, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);\r\n if (circle) {\r\n ctx.fillStyle = '#fff';\r\n ctx.globalCompositeOperation = 'destination-in';\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2, true);\r\n ctx.closePath();\r\n ctx.fill();\r\n }\r\n return canvas;\r\n }\r\n\r\n function _getHtmlResult(data) {\r\n var points = data.points,\r\n div = document.createElement('div'),\r\n img = document.createElement('img'),\r\n width = points[2] - points[0],\r\n height = points[3] - points[1];\r\n\r\n addClass(div, 'croppie-result');\r\n div.appendChild(img);\r\n css(img, {\r\n left: (-1 * points[0]) + 'px',\r\n top: (-1 * points[1]) + 'px'\r\n });\r\n img.src = data.url;\r\n css(div, {\r\n width: width + 'px',\r\n height: height + 'px'\r\n });\r\n\r\n return div;\r\n }\r\n\r\n function _getBase64Result(data) {\r\n return _getCanvas.call(this, data).toDataURL(data.format, data.quality);\r\n }\r\n\r\n function _getBlobResult(data) {\r\n var self = this;\r\n return new Promise(function (resolve) {\r\n _getCanvas.call(self, data).toBlob(function (blob) {\r\n resolve(blob);\r\n }, data.format, data.quality);\r\n });\r\n }\r\n\r\n function _replaceImage(img) {\r\n if (this.elements.img.parentNode) {\r\n Array.prototype.forEach.call(this.elements.img.classList, function(c) { img.classList.add(c); });\r\n this.elements.img.parentNode.replaceChild(img, this.elements.img);\r\n this.elements.preview = img; // if the img is attached to the DOM, they're not using the canvas\r\n }\r\n this.elements.img = img;\r\n }\r\n\r\n function _bind(options, cb) {\r\n var self = this,\r\n url,\r\n points = [],\r\n zoom = null,\r\n hasExif = _hasExif.call(self);\r\n\r\n if (typeof (options) === 'string') {\r\n url = options;\r\n options = {};\r\n }\r\n else if (Array.isArray(options)) {\r\n points = options.slice();\r\n }\r\n else if (typeof (options) === 'undefined' && self.data.url) { //refreshing\r\n _updatePropertiesFromImage.call(self);\r\n _triggerUpdate.call(self);\r\n return null;\r\n }\r\n else {\r\n url = options.url;\r\n points = options.points || [];\r\n zoom = typeof(options.zoom) === 'undefined' ? null : options.zoom;\r\n }\r\n\r\n self.data.bound = false;\r\n self.data.url = url || self.data.url;\r\n self.data.boundZoom = zoom;\r\n\r\n return loadImage(url, hasExif).then(function (img) {\r\n _replaceImage.call(self, img);\r\n if (!points.length) {\r\n var natDim = naturalImageDimensions(img);\r\n var rect = self.elements.viewport.getBoundingClientRect();\r\n var aspectRatio = rect.width / rect.height;\r\n var imgAspectRatio = natDim.width / natDim.height;\r\n var width, height;\r\n\r\n if (imgAspectRatio > aspectRatio) {\r\n height = natDim.height;\r\n width = height * aspectRatio;\r\n }\r\n else {\r\n width = natDim.width;\r\n height = natDim.height / aspectRatio;\r\n }\r\n\r\n var x0 = (natDim.width - width) / 2;\r\n var y0 = (natDim.height - height) / 2;\r\n var x1 = x0 + width;\r\n var y1 = y0 + height;\r\n self.data.points = [x0, y0, x1, y1];\r\n }\r\n else if (self.options.relative) {\r\n points = [\r\n points[0] * img.naturalWidth / 100,\r\n points[1] * img.naturalHeight / 100,\r\n points[2] * img.naturalWidth / 100,\r\n points[3] * img.naturalHeight / 100\r\n ];\r\n }\r\n\r\n self.data.points = points.map(function (p) {\r\n return parseFloat(p);\r\n });\r\n if (self.options.useCanvas) {\r\n _transferImageToCanvas.call(self, options.orientation);\r\n }\r\n _updatePropertiesFromImage.call(self);\r\n _triggerUpdate.call(self);\r\n cb && cb();\r\n });\r\n }\r\n\r\n function fix(v, decimalPoints) {\r\n return parseFloat(v).toFixed(decimalPoints || 0);\r\n }\r\n\r\n function _get() {\r\n var self = this,\r\n imgData = self.elements.preview.getBoundingClientRect(),\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n x1 = vpData.left - imgData.left,\r\n y1 = vpData.top - imgData.top,\r\n widthDiff = (vpData.width - self.elements.viewport.offsetWidth) / 2, //border\r\n heightDiff = (vpData.height - self.elements.viewport.offsetHeight) / 2,\r\n x2 = x1 + self.elements.viewport.offsetWidth + widthDiff,\r\n y2 = y1 + self.elements.viewport.offsetHeight + heightDiff,\r\n scale = self._currentZoom;\r\n\r\n if (scale === Infinity || isNaN(scale)) {\r\n scale = 1;\r\n }\r\n\r\n var max = self.options.enforceBoundary ? 0 : Number.NEGATIVE_INFINITY;\r\n x1 = Math.max(max, x1 / scale);\r\n y1 = Math.max(max, y1 / scale);\r\n x2 = Math.max(max, x2 / scale);\r\n y2 = Math.max(max, y2 / scale);\r\n\r\n return {\r\n points: [fix(x1), fix(y1), fix(x2), fix(y2)],\r\n zoom: scale,\r\n orientation: self.data.orientation\r\n };\r\n }\r\n\r\n var RESULT_DEFAULTS = {\r\n type: 'canvas',\r\n format: 'png',\r\n quality: 1\r\n },\r\n RESULT_FORMATS = ['jpeg', 'webp', 'png'];\r\n\r\n function _result(options) {\r\n var self = this,\r\n data = _get.call(self),\r\n opts = deepExtend(clone(RESULT_DEFAULTS), clone(options)),\r\n resultType = (typeof (options) === 'string' ? options : (opts.type || 'base64')),\r\n size = opts.size || 'viewport',\r\n format = opts.format,\r\n quality = opts.quality,\r\n backgroundColor = opts.backgroundColor,\r\n circle = typeof opts.circle === 'boolean' ? opts.circle : (self.options.viewport.type === 'circle'),\r\n vpRect = self.elements.viewport.getBoundingClientRect(),\r\n ratio = vpRect.width / vpRect.height,\r\n prom;\r\n\r\n if (size === 'viewport') {\r\n data.outputWidth = vpRect.width;\r\n data.outputHeight = vpRect.height;\r\n } else if (typeof size === 'object') {\r\n if (size.width && size.height) {\r\n data.outputWidth = size.width;\r\n data.outputHeight = size.height;\r\n } else if (size.width) {\r\n data.outputWidth = size.width;\r\n data.outputHeight = size.width / ratio;\r\n } else if (size.height) {\r\n data.outputWidth = size.height * ratio;\r\n data.outputHeight = size.height;\r\n }\r\n }\r\n\r\n if (RESULT_FORMATS.indexOf(format) > -1) {\r\n data.format = 'image/' + format;\r\n data.quality = quality;\r\n }\r\n\r\n data.circle = circle;\r\n data.url = self.data.url;\r\n data.backgroundColor = backgroundColor;\r\n\r\n prom = new Promise(function (resolve) {\r\n switch(resultType.toLowerCase())\r\n {\r\n case 'rawcanvas':\r\n resolve(_getCanvas.call(self, data));\r\n break;\r\n case 'canvas':\r\n case 'base64':\r\n resolve(_getBase64Result.call(self, data));\r\n break;\r\n case 'blob':\r\n _getBlobResult.call(self, data).then(resolve);\r\n break;\r\n default:\r\n resolve(_getHtmlResult.call(self, data));\r\n break;\r\n }\r\n });\r\n return prom;\r\n }\r\n\r\n function _refresh() {\r\n _updatePropertiesFromImage.call(this);\r\n }\r\n\r\n function _rotate(deg) {\r\n if (!this.options.useCanvas || !this.options.enableOrientation) {\r\n throw 'Croppie: Cannot rotate without enableOrientation && EXIF.js included';\r\n }\r\n\r\n var self = this,\r\n canvas = self.elements.canvas;\r\n\r\n self.data.orientation = getExifOffset(self.data.orientation, deg);\r\n drawCanvas(canvas, self.elements.img, self.data.orientation);\r\n _updateCenterPoint.call(self, true);\r\n _updateZoomLimits.call(self);\r\n }\r\n\r\n function _destroy() {\r\n var self = this;\r\n self.element.removeChild(self.elements.boundary);\r\n removeClass(self.element, 'croppie-container');\r\n if (self.options.enableZoom) {\r\n self.element.removeChild(self.elements.zoomerWrap);\r\n }\r\n delete self.elements;\r\n }\r\n\r\n if (window.jQuery) {\r\n var $ = window.jQuery;\r\n $.fn.croppie = function (opts) {\r\n var ot = typeof opts;\r\n\r\n if (ot === 'string') {\r\n var args = Array.prototype.slice.call(arguments, 1);\r\n var singleInst = $(this).data('croppie');\r\n\r\n if (opts === 'get') {\r\n return singleInst.get();\r\n }\r\n else if (opts === 'result') {\r\n return singleInst.result.apply(singleInst, args);\r\n }\r\n else if (opts === 'bind') {\r\n return singleInst.bind.apply(singleInst, args);\r\n }\r\n\r\n return this.each(function () {\r\n var i = $(this).data('croppie');\r\n if (!i) return;\r\n\r\n var method = i[opts];\r\n if ($.isFunction(method)) {\r\n method.apply(i, args);\r\n if (opts === 'destroy') {\r\n $(this).removeData('croppie');\r\n }\r\n }\r\n else {\r\n throw 'Croppie ' + opts + ' method not found';\r\n }\r\n });\r\n }\r\n else {\r\n return this.each(function () {\r\n var i = new Croppie(this, opts);\r\n i.$ = $;\r\n $(this).data('croppie', i);\r\n });\r\n }\r\n };\r\n }\r\n\r\n function Croppie(element, opts) {\r\n if (element.className.indexOf('croppie-container') > -1) {\r\n throw new Error(\"Croppie: Can't initialize croppie more than once\");\r\n }\r\n this.element = element;\r\n this.options = deepExtend(clone(Croppie.defaults), opts);\r\n\r\n if (this.element.tagName.toLowerCase() === 'img') {\r\n var origImage = this.element;\r\n addClass(origImage, 'cr-original-image');\r\n setAttributes(origImage, {'aria-hidden' : 'true', 'alt' : '' });\r\n var replacementDiv = document.createElement('div');\r\n this.element.parentNode.appendChild(replacementDiv);\r\n replacementDiv.appendChild(origImage);\r\n this.element = replacementDiv;\r\n this.options.url = this.options.url || origImage.src;\r\n }\r\n\r\n _create.call(this);\r\n if (this.options.url) {\r\n var bindOpts = {\r\n url: this.options.url,\r\n points: this.options.points\r\n };\r\n delete this.options['url'];\r\n delete this.options['points'];\r\n _bind.call(this, bindOpts);\r\n }\r\n }\r\n\r\n Croppie.defaults = {\r\n viewport: {\r\n width: 100,\r\n height: 100,\r\n type: 'square'\r\n },\r\n boundary: { },\r\n orientationControls: {\r\n enabled: true,\r\n leftClass: '',\r\n rightClass: ''\r\n },\r\n resizeControls: {\r\n width: true,\r\n height: true\r\n },\r\n customClass: '',\r\n showZoomer: true,\r\n enableZoom: true,\r\n enableResize: false,\r\n mouseWheelZoom: true,\r\n enableExif: false,\r\n enforceBoundary: true,\r\n enableOrientation: false,\r\n enableKeyMovement: true,\r\n update: function () { }\r\n };\r\n\r\n Croppie.globals = {\r\n translate: 'translate3d'\r\n };\r\n\r\n deepExtend(Croppie.prototype, {\r\n bind: function (options, cb) {\r\n return _bind.call(this, options, cb);\r\n },\r\n get: function () {\r\n var data = _get.call(this);\r\n var points = data.points;\r\n if (this.options.relative) {\r\n points[0] /= this.elements.img.naturalWidth / 100;\r\n points[1] /= this.elements.img.naturalHeight / 100;\r\n points[2] /= this.elements.img.naturalWidth / 100;\r\n points[3] /= this.elements.img.naturalHeight / 100;\r\n }\r\n return data;\r\n },\r\n result: function (type) {\r\n return _result.call(this, type);\r\n },\r\n refresh: function () {\r\n return _refresh.call(this);\r\n },\r\n setZoom: function (v) {\r\n _setZoomerVal.call(this, v);\r\n dispatchChange(this.elements.zoomer);\r\n },\r\n rotate: function (deg) {\r\n _rotate.call(this, deg);\r\n },\r\n destroy: function () {\r\n return _destroy.call(this);\r\n }\r\n });\r\n return Croppie;\r\n}));\r\n","var scope = (typeof global !== \"undefined\" && global) ||\n (typeof self !== \"undefined\" && self) ||\n window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto. Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n (typeof global !== \"undefined\" && global.setImmediate) ||\n (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n (typeof global !== \"undefined\" && global.clearImmediate) ||\n (this && this.clearImmediate);\n","(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a \ No newline at end of file +Telegram
\ No newline at end of file diff --git a/dist/main.06f68f8f23df64b5d8e1.js b/dist/main.06f68f8f23df64b5d8e1.js deleted file mode 100644 index c8f08abdf..000000000 --- a/dist/main.06f68f8f23df64b5d8e1.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e){function t(t){for(var n,r,d=t[0],o=t[1],c=0,a=[];c=0&&w(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),I[n].renderTimes.push(t),I[n].renderCount++}}catch(t){Object(c.a)(t),u=e.renderedValue}if(e.isMounted&&u===e.renderedValue)return e.$element;e.renderedValue=u;const d=O(u);return e.$element=y(e,[d]),e.$element}function C(e,t){return typeof e!=typeof t||(e.type!==t.type||(b(e)&&b(t)?e.value!==t.value:h(e)&&h(t)?e.tag!==t.tag||e.props.key!==t.props.key:!(!m(e)||!m(t))&&(e.componentInstance.Component!==t.componentInstance.Component||e.props.key!==t.props.key)))}function E(e){p(e)&&(m(e)?function(e){if(!e.isMounted)return;e.hooks.memos.byCursor.forEach(e=>{e.current=null}),e.hooks.effects.byCursor.forEach(({cleanup:e})=>{if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}}),e.isMounted=!1,function(e){e.hooks.effects.byCursor.forEach(e=>{e.cleanup=null,e.effect=null,e.dependencies=null}),e.hooks.state.byCursor.forEach(e=>{e.value=null,e.nextValue=null,e.setter=null}),e.hooks.memos.byCursor.forEach(e=>{e.dependencies=null}),e.hooks=null,e.$element=null,e.Component=null,e.props=null,e.forceUpdate=null,e.onUpdate=null}(e)}(e.componentInstance):e.target&&(Object(a.b)(e.target),e.target=null),e.children.forEach(E))}function S(e){return j(e),e.isMounted=!0,e.$element}function M(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;j(e),e.$element!==t&&e.onUpdate()}function A(e){return m(e)?A(e.children[0]):e.target}function k(e,t){m(e)?k(e.children[0],t):e.target=t}function N(e){const{cursor:t,byCursor:n}=f.hooks.state;var d;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(d=f,e=>{n[t].nextValue!==e&&(n[t].nextValue="function"==typeof e?e(n[t].value):e,d.prepareForFrame&&d.forceUpdate||(d.prepareForFrame=Object(u.h)(()=>function e(t){t.isMounted&&(t.hooks.state.byCursor.forEach(e=>{e.value=e.nextValue}),t.prepareForFrame=Object(u.h)(()=>e(t)),t.forceUpdate=Object(u.i)(()=>M(t)))}(d)),d.forceUpdate=Object(u.i)(()=>M(d))),d.prepareForFrame(),d.forceUpdate(),r.r&&console.log("[Teact.useState]",d.name,d.Component&&d.Component.DEBUG_contentComponentName?"> "+d.Component.DEBUG_contentComponentName:"",`Forced update at cursor #${t}, next value: `,n[t].nextValue))})}),f.hooks.state.cursor++,[n[t].value,n[t].setter]}function T(e,t,n){const{cursor:r,byCursor:u}=f.hooks.effects,d=f,o=()=>{if(!d.isMounted)return;const{cleanup:e}=u[r];if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}u[r].cleanup=t()};void 0!==u[r]&&n&&u[r].dependencies?n.some((e,t)=>e!==u[r].dependencies[t])&&e(o):e(o),u[r]={effect:t,dependencies:n,cleanup:u[r]?u[r].cleanup:void 0},f.hooks.effects.cursor++}function P(e,t){return T(u.b,e,t)}function D(e,t){return T(u.d,e,t)}function F(e,t){const{cursor:n,byCursor:r}=f.hooks.memos;let{current:u}=r[n]||{};return(void 0===r[n]||t.some((e,t)=>e!==r[n].dependencies[t]))&&(u=e()),r[n]={current:u,dependencies:t},f.hooks.memos.cursor++,u}function L(e,t){return F(()=>e,t)}function B(e){return F(()=>({current:e}),[])}function x(e,t=o.a,n=!1){return function(u){const d=B(u),c=B();return(!c.current||d.current&&!t(d.current,u))&&(r.p&&n&&console.log(`[Teact.memo] ${e.name}: Update is caused by:`,Object(o.b)(d.current,u).join(", ")),d.current=u,c.current=g(e,u)),c.current}}document.addEventListener("dblclick",()=>{console.log("COMPONENTS",Object(d.k)(Object.values(I),"renderCount","desc"))}),t.a={createElement:g,Fragment:s}},function(e,t,n){"use strict";n.d(t,"eb",(function(){return r})),n.d(t,"D",(function(){return u})),n.d(t,"f",(function(){return d})),n.d(t,"g",(function(){return o})),n.d(t,"p",(function(){return c})),n.d(t,"r",(function(){return a})),n.d(t,"E",(function(){return i})),n.d(t,"q",(function(){return s})),n.d(t,"nb",(function(){return f})),n.d(t,"H",(function(){return l})),n.d(t,"A",(function(){return b})),n.d(t,"B",(function(){return h})),n.d(t,"z",(function(){return m})),n.d(t,"C",(function(){return p})),n.d(t,"M",(function(){return g})),n.d(t,"N",(function(){return y})),n.d(t,"O",(function(){return v})),n.d(t,"P",(function(){return w})),n.d(t,"m",(function(){return O})),n.d(t,"F",(function(){return I})),n.d(t,"Y",(function(){return C})),n.d(t,"U",(function(){return E})),n.d(t,"V",(function(){return S})),n.d(t,"W",(function(){return M})),n.d(t,"i",(function(){return A})),n.d(t,"k",(function(){return k})),n.d(t,"j",(function(){return N})),n.d(t,"ob",(function(){return T})),n.d(t,"X",(function(){return P})),n.d(t,"y",(function(){return D})),n.d(t,"R",(function(){return F})),n.d(t,"Q",(function(){return L})),n.d(t,"fb",(function(){return B})),n.d(t,"Db",(function(){return x})),n.d(t,"a",(function(){return R})),n.d(t,"e",(function(){return U})),n.d(t,"d",(function(){return _})),n.d(t,"s",(function(){return G})),n.d(t,"u",(function(){return $})),n.d(t,"v",(function(){return W})),n.d(t,"w",(function(){return H})),n.d(t,"kb",(function(){return K})),n.d(t,"jb",(function(){return z})),n.d(t,"ab",(function(){return V})),n.d(t,"Z",(function(){return q})),n.d(t,"db",(function(){return J})),n.d(t,"cb",(function(){return Y})),n.d(t,"bb",(function(){return Q})),n.d(t,"J",(function(){return Z})),n.d(t,"c",(function(){return X})),n.d(t,"vb",(function(){return ee})),n.d(t,"wb",(function(){return te})),n.d(t,"qb",(function(){return ne})),n.d(t,"rb",(function(){return re})),n.d(t,"yb",(function(){return ue})),n.d(t,"ub",(function(){return de})),n.d(t,"zb",(function(){return oe})),n.d(t,"Ab",(function(){return ce})),n.d(t,"xb",(function(){return ae})),n.d(t,"Bb",(function(){return ie})),n.d(t,"sb",(function(){return se})),n.d(t,"tb",(function(){return fe})),n.d(t,"S",(function(){return le})),n.d(t,"T",(function(){return be})),n.d(t,"pb",(function(){return he})),n.d(t,"l",(function(){return me})),n.d(t,"gb",(function(){return pe})),n.d(t,"ib",(function(){return ge})),n.d(t,"hb",(function(){return ye})),n.d(t,"mb",(function(){return ve})),n.d(t,"b",(function(){return we})),n.d(t,"h",(function(){return Oe})),n.d(t,"L",(function(){return Ie})),n.d(t,"K",(function(){return je})),n.d(t,"lb",(function(){return Ce})),n.d(t,"G",(function(){return Ee})),n.d(t,"Cb",(function(){return Se})),n.d(t,"x",(function(){return Me})),n.d(t,"I",(function(){return Ae})),n.d(t,"n",(function(){return ke})),n.d(t,"o",(function(){return Ne})),n.d(t,"t",(function(){return Te}));const r="Telegram",u=" [Inactive]",d="Telegram WebZ",o="1.0.15",c=!1,a=!1,i=!1,s="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",f="user_auth",l="GramJs:sessionId",b=!1,h="tt-global-state",m=30,p=5e3,g=!1,y="tt-media",v="tt-media-avatars",w="tt-media-progressive",O="tt-custom-bg",I="tt-lang-packs-v4",j=(new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),"undefined"!=typeof window&&window.innerHeight>=900),C=1,E=500,S=j?60:40,M=2*S,A=72,k=j?30:25,N=100,T=42,P=42,D=20,F=30,L=200,B=500,x=20,R=!1,U=2,_=U,G=16,$=1e4,W="editable-message-text",H="editable-message-text-modal",K=1440,z=1150,V=1275,q=925,J=600,Y=950,Q=450,Z=1e9,X=100,ee=13,te=11,ne=160,re=120,ue=64,de=48,oe=32,ce=64,ae=64,ie=160,se=140,fe=80,le="MEMOJI_STICKER",be=200,he=450,me="image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime",pe="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",ge=/^(?:https?:\/\/)?(?:t\.me\/)([\d\w_]+)(?:\/([\d]+))?$/gm,ye=/^(?:https?:\/\/)?(?:t\.me\/joinchat\/)([\d\w_]+)?$/gm,ve=777e3,we=0,Oe=1,Ie=10,je=5,Ce=2147483646,Ee=["android","ios","tdesktop","macos"],Se="TelegramTips",Me="https://bugs.telegram.org/?tag_ids=41&sort=time",Ae="#A2AF8E",ke="#0F0F0F",Ne="#0a0a0a8c",Te="rgba(90, 110, 70, 0.6)"},function(e,t,n){"use strict";n.d(t,"g",(function(){return y})),n.d(t,"e",(function(){return v})),n.d(t,"d",(function(){return w})),n.d(t,"b",(function(){return O})),n.d(t,"a",(function(){return I})),n.d(t,"f",(function(){return j})),n.d(t,"h",(function(){return C}));var r=n(0),u=n(1),d=n(26),o=n(28),c=n(9),a=n(24),i=n(3),s=n(22);function f(){return(f=Object.assign||function(e){for(var t=1;t7&&console.warn(`[TeactN] Slow containers update: ${Math.round(t)} ms`)}}],m={},p=new Map;const g=Object(c.i)((function(){h.forEach(e=>e(l))}));function y(e){"object"==typeof e&&e!==l&&(l=e,g())}function v(){return l}function w(){return m}function O(e,t){b[e]||(b[e]=[],m[e]=t=>{!function(e,t){b[e]&&b[e].forEach(e=>{const n=e(l,m,t);n&&y(n)})}(e,t)}),b[e].push(t)}function I(e){h.push(e)}function j(e){const t=h.indexOf(e);-1!==t&&h.splice(t,1)}function C(e=(()=>({})),t=(()=>({}))){return n=>function u(c){u.DEBUG_contentComponentName=n.name;const[i]=Object(r.r)(Object(o.a)(p)),b=Object(d.a)();Object(r.n)(()=>()=>{p.delete(i)},[i]);let h=p.get(i);if(h||(h={mapStateToProps:e,mapReducersToProps:t,ownProps:c,areMappedPropsChanged:!1,forceUpdate:b,DEBUG_updates:0,DEBUG_componentName:n.name},p.set(i,h)),h.areMappedPropsChanged&&(h.areMappedPropsChanged=!1),!h.mappedProps||!Object(a.a)(h.ownProps,c)){h.ownProps=c;try{h.mappedProps={...e(l,c),...t(y,m)}}catch(e){Object(s.a)(e)}}return r.a.createElement(n,f({},h.mappedProps,c))}}u.p&&(window.getGlobal=v,document.addEventListener("dblclick",()=>{console.log("GLOBAL CONTAINERS",Object(i.k)(Object.values(p),"DEBUG_updates","desc"))}))},function(e,t,n){"use strict";function r(e,t){return e.reduce((e,n)=>(e[n[t]]=n,e),{})}function u(e,t){return Object.keys(e).reduce((n,r,u)=>(n[r]=t(e[r],r,u,e),n),{})}function d(e,t){return t.reduce((t,n)=>(t[n]=e[n],t),{})}function o(e,t){return t.reduce((t,n)=>(e[n]&&(t[n]=e[n]),t),{})}function c(e,t){const n=new Set(t.map(String));return d(e,Object.keys(e).filter(e=>!n.has(e)))}function a(e,t,n="asc"){return e.sort((e,r)=>{if(Array.isArray(t)){const[u,d]=Array.isArray(n)?n:[n,n],[o,c]=t;let a,i;if("function"==typeof o?(a=o(e)||0,i=o(r)||0):"string"==typeof o&&(a=e[o]||0,i=r[o]||0),a!==i)return"asc"===u?a-i:i-a;{let t,n;return"function"==typeof c?(t=c(e)||0,n=c(r)||0):"string"==typeof c&&(t=e[c]||0,n=r[c]||0),"asc"===d?t-n:n-t}}let u,d;return"function"==typeof t?(u=t(e)||0,d=t(r)||0):"string"==typeof t&&(u=e[t]||0,d=r[t]||0),"asc"===n?u-d:d-u})}function i(e){return e.reduce((e,t)=>Array.isArray(t)?e.concat(t):(e.push(t),e),[])}function s(e){return Array.from(new Set(e))}function f(e){return e.filter(Boolean)}function l(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function b(e,t){return e[0]<=t[t.length-1]&&e[e.length-1]>=t[0]}function h(e,t){return e.filter(e=>t.has(e))}function m(e,t){const n=[];for(let r=0;r(t[n]=p(e[n]),t),{})}function g(e,t){let n=e.length;for(;n--;)if(t(e[n],n,e))return e[n]}n.d(t,"c",(function(){return r})),n.d(t,"i",(function(){return u})),n.d(t,"l",(function(){return d})),n.d(t,"m",(function(){return o})),n.d(t,"j",(function(){return c})),n.d(t,"k",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"o",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return b})),n.d(t,"f",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"d",(function(){return p})),n.d(t,"g",(function(){return g}))},function(e,t,n){"use strict";n.d(t,"Y",(function(){return r.b})),n.d(t,"Z",(function(){return r.c})),n.d(t,"ab",(function(){return r.d})),n.d(t,"xb",(function(){return r.g})),n.d(t,"pb",(function(){return r.e})),n.d(t,"wb",(function(){return r.f})),n.d(t,"Eb",(function(){return r.h})),n.d(t,"X",(function(){return r.a})),n.d(t,"lb",(function(){return u.w})),n.d(t,"kb",(function(){return u.v})),n.d(t,"ib",(function(){return u.t})),n.d(t,"nb",(function(){return u.y})),n.d(t,"jb",(function(){return u.u})),n.d(t,"ob",(function(){return u.z})),n.d(t,"m",(function(){return u.j})),n.d(t,"U",(function(){return u.p})),n.d(t,"l",(function(){return u.i})),n.d(t,"g",(function(){return u.e})),n.d(t,"h",(function(){return u.f})),n.d(t,"f",(function(){return u.d})),n.d(t,"mb",(function(){return u.x})),n.d(t,"gb",(function(){return u.r})),n.d(t,"q",(function(){return u.m})),n.d(t,"yb",(function(){return u.A})),n.d(t,"e",(function(){return u.c})),n.d(t,"c",(function(){return u.a})),n.d(t,"K",(function(){return u.o})),n.d(t,"k",(function(){return u.h})),n.d(t,"j",(function(){return u.g})),n.d(t,"hb",(function(){return u.s})),n.d(t,"Cb",(function(){return u.D})),n.d(t,"d",(function(){return u.b})),n.d(t,"Bb",(function(){return u.C})),n.d(t,"Ab",(function(){return u.B})),n.d(t,"p",(function(){return u.l})),n.d(t,"o",(function(){return u.k})),n.d(t,"fb",(function(){return u.q})),n.d(t,"J",(function(){return u.n})),n.d(t,"Db",(function(){return u.E})),n.d(t,"A",(function(){return i})),n.d(t,"zb",(function(){return s})),n.d(t,"F",(function(){return f})),n.d(t,"N",(function(){return l})),n.d(t,"O",(function(){return b})),n.d(t,"x",(function(){return h})),n.d(t,"L",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"tb",(function(){return g})),n.d(t,"ub",(function(){return y})),n.d(t,"qb",(function(){return v})),n.d(t,"db",(function(){return w})),n.d(t,"vb",(function(){return O})),n.d(t,"eb",(function(){return I})),n.d(t,"V",(function(){return j})),n.d(t,"W",(function(){return C})),n.d(t,"sb",(function(){return E})),n.d(t,"rb",(function(){return S})),n.d(t,"v",(function(){return k})),n.d(t,"cb",(function(){return N})),n.d(t,"G",(function(){return T})),n.d(t,"P",(function(){return P})),n.d(t,"I",(function(){return D})),n.d(t,"t",(function(){return F})),n.d(t,"u",(function(){return L})),n.d(t,"M",(function(){return B})),n.d(t,"y",(function(){return x})),n.d(t,"H",(function(){return R})),n.d(t,"z",(function(){return U})),n.d(t,"Q",(function(){return _})),n.d(t,"R",(function(){return G})),n.d(t,"E",(function(){return $})),n.d(t,"D",(function(){return W})),n.d(t,"C",(function(){return K})),n.d(t,"B",(function(){return z})),n.d(t,"b",(function(){return q})),n.d(t,"i",(function(){return J})),n.d(t,"S",(function(){return Y})),n.d(t,"T",(function(){return Q})),n.d(t,"bb",(function(){return Z})),n.d(t,"s",(function(){return X})),n.d(t,"w",(function(){return ee})),n.d(t,"r",(function(){return te})),n.d(t,"a",(function(){return ne}));var r=n(30),u=n(31),d=n(5),o=n(1),c=n(64);const a=new RegExp(o.gb,"i");function i(e){const{chatId:t,id:n}=e;return`msg${t}-${n}`}function s(e){const t=e.match(/^msg(-?\d+)-(\d+)/);return{chatId:Number(t[1]),messageId:Number(t[2])}}function f(e){return e.previousLocalId||e.id}function l(e,t,n=!1){const{text:r,photo:u,video:d,audio:o,voice:c,document:a,sticker:i,contact:s,poll:f,invoice:l}=t.content;if(t.groupedId)return`${n?"":"🖼 "}${r?r.text:e("lng_in_dlg_album")}`;if(u)return`${n?"":"🖼 "}${r?r.text:e("AttachPhoto")}`;if(d)return`${n?"":"📹 "}${r?r.text:e(d.isGif?"AttachGif":"AttachVideo")}`;if(i)return`${i.emoji} ${e("AttachSticker")} `;if(o){return`${n?"":"🎧 "}${[o.title,o.performer].filter(Boolean).join(" — ")||r&&r.text||e("AttachMusic")}`}return c?`${n?"":"🎤 "}${r?r.text:e("AttachAudio")}`:a?`${n?"":"📎 "}${r?r.text:a.fileName}`:s?e("AttachContact"):f?`${n?"":"📊 "}${f.summary.question}`:l?"Invoice":r?r.text:"The message is not supported on this version of Telegram"}function b(e){const{text:t,sticker:n,photo:r,video:u,audio:d,voice:o,document:c,poll:a,webPage:i,contact:s,invoice:f}=e.content;return t?t.text:n||r||u||d||o||c||s||a||i||f?void 0:"The message is not supported on this version of Telegram"}function h(e){const{text:t,sticker:n,photo:r,video:u,audio:d,voice:o,document:a,poll:i,webPage:s,contact:f}=e.content;return!!(n||u&&u.isRound)||!(!t||r||u||d||o||a||i||s||f)&&(Object(c.a)(t.text)||!1)}function m(e){const{text:t}=e.content;if(t&&t.text.length<=6&&1===h(e))return t.text}function p(e){const{text:t}=e.content;let n;if(t&&t.entities){let e=t.entities.find(e=>e.type===d.ApiMessageEntityTypes.TextUrl);if(e&&(n=e.url.match(a)),!n&&(e=t.entities.find(e=>e.type===d.ApiMessageEntityTypes.Url),e)){const{offset:r,length:u}=e;n=t.text.substring(r,r+u).match(a)}}if(!n&&t&&(n=t.text.match(a)),n)return{url:n[0],domain:n[3]}}function g(e){return e.isOutgoing}function y(e){return Boolean(e.replyToMessageId)}function v(e){return Boolean(e.forwardInfo)}function w(e){return!!e.content.action}function O(e){return e.chatId===o.mb&&E(e)}function I(e){return Boolean(e.senderId)&&e.senderId<0&&g(e)}function j(e,t){return t.id>0?Object(r.c)(t):Object(u.i)(e,t)}function C(e){return e.sendingState?"messageSendingStateFailed"===e.sendingState?"failed":"pending":"succeeded"}function E(e){return e.id>=o.J}function S(e){return e.content.action&&"historyClear"===e.content.action.type}var M=n(7),A=n(59);function k(e){return e.content}function N(e){return Boolean(T(e)||P(e)||x(e)||B(e)||function(e){return e.content.contact}(e)||R(e)||F(e)||L(e)||function(e){return e.content.voice}(e))}function T(e){return e.content.photo}function P(e){return e.content.video}function D(e){const{video:t}=e.content;return t&&t.isRound?t:void 0}function F(e){return e.content.action}function L(e){return e.content.audio}function B(e){return e.content.sticker}function x(e){return e.content.document}function R(e){return e.content.poll}function U(e){return e.content.invoice}function _(e){return e.content.webPage}function G(e){const t=_(e);return t?t.photo:void 0}function $(e){const t=function(e){const t=T(e)||P(e)||x(e)||B(e)||G(e);if(t)return t.thumbnail}(e);return t?t.dataUri:void 0}function W(e,t){const{photo:n,video:r,sticker:u,audio:d,voice:o,document:c}=e.content,a=G(e);if(!(n||r||u||a||d||o||c))return;const s=i(e);if(n||a)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(V(e))return;return s+"?size=x";case"viewerPreview":return s+"?size=x";case"viewerFull":return s+"?size=z"}if(r)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(V(e))return;return q(r)?H(r,s):s+"?size=z";case"viewerPreview":return s+"?size=m";case"viewerFull":return H(r,s);case"download":return s+"?download"}if(c)switch(t){case"micro":case"pictogram":case"inline":if(!Object(A.c)(c)||V(e))return;return s+"?size=m";default:return s}if(u)switch(t){case"micro":return;case"pictogram":return s+"?size=m";default:return s}if(d)switch(t){case"micro":case"pictogram":return;default:return H(d,s)}if(o)switch(t){case"micro":case"pictogram":return;default:return s}}function H(e,t){return M.i&&M.j?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function K(e,t){const{sticker:n,video:r,audio:u,voice:o}=e.content;return n&&"inline"===t&&n.isAnimated?d.ApiMediaFormat.Lottie:r&&M.i&&("viewerFull"===t||"inline"===t&&q(r))?d.ApiMediaFormat.Progressive:u||o?o&&!M.h?d.ApiMediaFormat.BlobUrl:d.ApiMediaFormat.Progressive:d.ApiMediaFormat.BlobUrl}function z(e){const{photo:t,video:n,webPage:r}=e.content;return t||r&&r.photo?`photo${e.date}.jpeg`:n?n.fileName:void 0}function V(e){const{photo:t,video:n,document:r}=e.content;return t&&t.blobUrl||n&&n.blobUrl||r&&r.previewBlobUrl}function q(e){return e.isGif||e.isRound||e.size<=10485760}function J(e,t,n=!1){const r=ee(e,t,"media");return n?r.reverse():r}function Y(e){return e.sizes.find(e=>"z"===e.type)||e.sizes.find(e=>"y"===e.type)||Q(e)}function Q(e){return e.sizes.find(e=>"x"===e.type)||e.sizes.find(e=>"m"===e.type)||e.sizes.find(e=>"s"===e.type)||e.thumbnail}function Z(e){if(e.width&&e.height)return e}function X(e,t,n=!1){const r=E(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ee(e,t,n){let r;switch(n){case"media":r=e=>{const t=P(e);return T(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=x;break;case"links":r=e=>_(e)||function(e){const{text:t}=e.content,n=t&&t.text.match(a);if(n)return{url:n[0],domain:n[3]}}(e);break;case"audio":r=L;break;default:return[]}return t.reduce((t,n)=>(e[n]&&r(e[n])&&t.push(n),t),[])}function te(e){const{audio:t,voice:n,video:r}=k(e),u=t||n||r;if(u)return u.duration}function ne(e,t){return`${e}_${t}`}n(60)},function(e,t,n){"use strict";var r=n(68);n.o(r,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return r.ApiMediaFormat})),n.o(r,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return r.ApiMessageEntityTypes})),n.o(r,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return r.MAIN_THREAD_ID})),n.o(r,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return r.MESSAGE_DELETED}));var u=n(69);n.o(u,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return u.ApiMediaFormat})),n.o(u,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return u.ApiMessageEntityTypes})),n.o(u,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return u.MAIN_THREAD_ID})),n.o(u,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return u.MESSAGE_DELETED}));var d=n(70);n.d(t,"ApiMessageEntityTypes",(function(){return d.a})),n.d(t,"MAIN_THREAD_ID",(function(){return d.b})),n.d(t,"MESSAGE_DELETED",(function(){return d.c}));var o=n(71);n.o(o,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return o.ApiMediaFormat}));var c=n(72);n.d(t,"ApiMediaFormat",(function(){return c.a}));n(73),n(74),n(75)},function(e,t,n){"use strict";n.d(t,"T",(function(){return Fe})),n.d(t,"nb",(function(){return Le})),n.d(t,"W",(function(){return Be})),n.d(t,"Gb",(function(){return a})),n.d(t,"f",(function(){return f})),n.d(t,"o",(function(){return l})),n.d(t,"P",(function(){return b})),n.d(t,"O",(function(){return h})),n.d(t,"Ab",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"g",(function(){return g})),n.d(t,"L",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"M",(function(){return w})),n.d(t,"j",(function(){return O})),n.d(t,"i",(function(){return I})),n.d(t,"N",(function(){return j})),n.d(t,"h",(function(){return C})),n.d(t,"q",(function(){return E})),n.d(t,"y",(function(){return D})),n.d(t,"r",(function(){return F})),n.d(t,"m",(function(){return L})),n.d(t,"qb",(function(){return B})),n.d(t,"Y",(function(){return R})),n.d(t,"gb",(function(){return U})),n.d(t,"x",(function(){return _})),n.d(t,"Hb",(function(){return G})),n.d(t,"jb",(function(){return $})),n.d(t,"ob",(function(){return W})),n.d(t,"rb",(function(){return H})),n.d(t,"mb",(function(){return K})),n.d(t,"C",(function(){return z})),n.d(t,"E",(function(){return V})),n.d(t,"B",(function(){return q})),n.d(t,"cb",(function(){return J})),n.d(t,"Cb",(function(){return Y})),n.d(t,"G",(function(){return Q})),n.d(t,"Db",(function(){return Z})),n.d(t,"Eb",(function(){return X})),n.d(t,"Bb",(function(){return ee})),n.d(t,"a",(function(){return te})),n.d(t,"X",(function(){return ne})),n.d(t,"k",(function(){return re})),n.d(t,"pb",(function(){return ue})),n.d(t,"D",(function(){return de})),n.d(t,"l",(function(){return oe})),n.d(t,"I",(function(){return ce})),n.d(t,"U",(function(){return ae})),n.d(t,"fb",(function(){return ie})),n.d(t,"tb",(function(){return se})),n.d(t,"K",(function(){return fe})),n.d(t,"b",(function(){return le})),n.d(t,"e",(function(){return be})),n.d(t,"Fb",(function(){return he})),n.d(t,"lb",(function(){return me})),n.d(t,"H",(function(){return pe})),n.d(t,"R",(function(){return ge})),n.d(t,"p",(function(){return ye})),n.d(t,"S",(function(){return ve})),n.d(t,"V",(function(){return we})),n.d(t,"J",(function(){return Oe})),n.d(t,"ab",(function(){return Ie})),n.d(t,"Q",(function(){return je})),n.d(t,"sb",(function(){return Ce})),n.d(t,"bb",(function(){return Ee})),n.d(t,"ub",(function(){return Se})),n.d(t,"vb",(function(){return Me})),n.d(t,"wb",(function(){return Ae})),n.d(t,"t",(function(){return xe})),n.d(t,"A",(function(){return ke})),n.d(t,"w",(function(){return Ne})),n.d(t,"v",(function(){return Te})),n.d(t,"Z",(function(){return Pe})),n.d(t,"u",(function(){return De})),n.d(t,"z",(function(){return M})),n.d(t,"s",(function(){return A})),n.d(t,"xb",(function(){return k})),n.d(t,"yb",(function(){return N})),n.d(t,"c",(function(){return T})),n.d(t,"F",(function(){return P})),n.d(t,"hb",(function(){return Re})),n.d(t,"ib",(function(){return Ue})),n.d(t,"kb",(function(){return _e})),n.d(t,"zb",(function(){return Ge})),n.d(t,"eb",(function(){return i})),n.d(t,"db",(function(){return s}));var r=n(20),u=n(7),d=n(5),o=n(1),c=n(4);function a(e,t){return e.users.byId[t]}function i(e){return e.settings.byKey}function s(e){return e.settings.notifyExceptions}function f(e,t){return e.chats.byId[t]}function l(e,t){const n=Object(c.U)(t);return!!n&&a(e,n)}function b(e,t){return t===e.currentUserId}function h(e,t){const n=l(e,t);return n&&Object(c.wb)(n)}function m(e){return Object.values(e.chats.byId).find(({isSupport:e})=>e)}function p(e,t){if(!Object(c.lb)(t.id)&&!Object(c.jb)(t)&&t.fullInfo)return t.fullInfo.members&&t.fullInfo.members.length!==o.Q?t.fullInfo.members.reduce((t,{userId:n})=>e.users.byId[n]&&Object(c.xb)(e.users.byId[n])&&n!==e.currentUserId?t+1:t,0):t.fullInfo.onlineCount}function g(e,t){const n=f(e,t),r=n&&Object(c.U)(n),u=r&&a(e,r);if(u&&Object(c.wb)(u))return u}function y(e,t){const n=f(e,t),r=g(e,t);if(!n||!r)return!1;if(n.lastMessage&&Object(c.rb)(n.lastMessage))return!0;const u=e.messages.byChatId[t];if(!u)return!1;const{listedIds:o}=u.threadsById[d.MAIN_THREAD_ID]||{};return o&&!o.length}function v(e){return Boolean(e.chats.listIds.active)}function w(e,t,n){const{listIds:r}=e.chats;if(n){const e=r[n];return Boolean(e&&e.includes(t))}return Object.values(r).some(e=>e&&e.includes(t))}function O(e,t){const n=f(e,t);if(n&&w(e,t))return n.folderId===o.h?"archived":"active"}function I(e,t){return e.chatFolders.byId[t]}function j(e,t,n=o.b){const{active:r,archived:u}=e.chats.orderedPinnedIds;if(n===o.b)return!!r&&r.includes(t);if(n===o.h)return!!u&&u.includes(t);const{byId:d}=e.chatFolders,{pinnedChatIds:c}=d[n]||{};return!!c&&c.includes(t)}function C(e,t){const n=t.toLowerCase();return Object.values(e.chats.byId).find(e=>e.username&&e.username.toLowerCase()===n)}function E(e){const t=e.chats.listIds.active;if(!t)return 0;const n=e.chats.byId;return t.reduce((t,r)=>{const u=n[r];return u&&u.unreadCount&&!Object(c.Cb)(u,i(e),s(e))?t+u.unreadCount:t},0)}var S=n(3);function M(e){return e.stickers.search}function A(e){return e.gifs.search}function k(e,t){return e.stickers.setsById[t]}function N(e,t){const n=Object.values(e.stickers.setsById);let r=[];return n.forEach(({packs:e})=>{if(!e)return;const n=e[t];n&&(r=r.concat(n))}),r}function T(e,t){const{animatedEmojis:n}=e;if(!n||!n.stickers)return;const r=t.replace("️","");return n.stickers.find(e=>e.emoji===t||e.emoji===r)}function P(e,t){return e.emojiKeywords[t]&&void 0!==e.emojiKeywords[t]?e.emojiKeywords[t]:void 0}function D(e){const{messageLists:t}=e.messages;if(t&&t.length)return t[t.length-1]}function F(e){const{chatId:t}=D(e)||{};return t?f(e,t):void 0}function L(e,t){const n=e.messages.byChatId[t];return n?n.byId:void 0}function B(e,t){const n=e.scheduledMessages.byChatId[t];return n?n.byId:void 0}function x(e,t,n,r){const u=e.messages.byChatId[t];if(!u)return;const d=u.threadsById[n];return d?d[r]:void 0}function R(e,t,n){return x(e,t,n,"listedIds")}function U(e,t,n){return x(e,t,n,"outlyingIds")}function _(e,t,n,r){switch(r){case"thread":return G(e,t,n);case"pinned":return $(e,t);case"scheduled":return W(e,t)}}function G(e,t,n){return x(e,t,n,"viewportIds")}function $(e,t){return x(e,t,d.MAIN_THREAD_ID,"pinnedIds")}function W(e,t){return x(e,t,d.MAIN_THREAD_ID,"scheduledIds")}function H(e,t,n){return x(e,t,n,"scrollOffset")}function K(e,t,n){return x(e,t,n,"replyingToId")}function z(e,t,n){return x(e,t,n,"editingId")}function V(e,t){return x(e,t,d.MAIN_THREAD_ID,"editingScheduledId")}function q(e,t,n){return x(e,t,n,"draft")}function J(e,t,n){return x(e,t,n,"noWebPage")}function Y(e,t,n){return x(e,t,n,"threadInfo")}function Q(e,t,n){return x(e,t,n,"firstMessageId")}function Z(e,t,n){if(n===d.MAIN_THREAD_ID)return f(e,t);const r=Y(e,t,n);return r?f(e,r.originChannelId||t):void 0}function X(e,t,n){if(n===d.MAIN_THREAD_ID)return;const r=Y(e,t,n);return r?r.topMessageId:void 0}function ee(e,t,n){const r=e.messages.byChatId[t];if(!r)return;const{replyToMessageId:u,replyToTopMessageId:d}=n;return u||d?Object.values(r.threadsById).find(e=>e.threadInfo&&(u&&u===e.threadInfo.topMessageId||d&&d===e.threadInfo.topMessageId)):void 0}function te(e,t,n){const r=D(e);if(!r)return!1;const{threadInfo:u}=ee(e,t,n)||{};return t===r.chatId&&(r.threadId===d.MAIN_THREAD_ID||u&&r.threadId===u.threadId)}function ne(e,t,n){const r=G(e,t,n);if(!r||!r.length)return!0;let u;if(n===d.MAIN_THREAD_ID){const n=f(e,t);if(!n||!n.lastMessage)return!0;u=n.lastMessage.id}else{const r=Y(e,t,n);if(!r||!r.lastMessageId)return;u=r.lastMessageId}return u>=o.J&&!re(e,t,u)||r[r.length-1]>=u}function re(e,t,n){const r=L(e,t);return r?r[n]:void 0}function ue(e,t,n){const r=B(e,t);return r?r[n]:void 0}function de(e,t,n,r){if("scheduled"===r){const n=V(e,t);return n?ue(e,t,n):void 0}{const r=z(e,t,n);return r?re(e,t,r):void 0}}function oe(e,t){let n;for(const r of Object.values(e.messages.byChatId)){const{byId:e}=r;if(n=Object.values(e).find(e=>e.content.poll&&e.content.poll.id===t),n)break}return n}function ce(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function ae(e,t){const n=ce(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function ie(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=f(e,t.chatId)||{};return Object(c.sb)(t)||!n||n0?a(e,n):f(e,n)}function fe(e,t){const{forwardInfo:n}=t;if(n)return n.isChannelPost&&n.fromChatId?f(e,n.fromChatId):n.senderUserId?a(e,n.senderUserId):void 0}function le(e,t,n){const r=f(e,t.chatId);if(!r||r.isRestricted)return{};const u=Object(c.lb)(r.id),d=b(e,t.chatId),o=Object(c.ib)(r),a=Object(c.nb)(r),i=Object(c.jb)(r),s=Object(c.vb)(t),l=Object(c.tb)(t),h=Object(c.db)(t),{content:m}=t,p=(d||Date.now()-1e3*t.date<1728e5)&&!(m.sticker||m.contact||m.poll||m.action||m.audio||m.video&&m.video.isRound)&&!Object(c.qb)(t)&&!t.viaBotId,g=Object(c.e)(r,n)&&!s,y=u||r.isCreator||!i&&!Object(c.yb)(r,"pinMessages")||Object(c.q)(r,"pinMessages");let v=!h&&y,w=!1;const O=$(e,r.id);v&&(w=Boolean(O&&O.includes(t.id)),v=!w);const I=u||l||o||r.isCreator||Object(c.q)(r,"deleteMessages"),j=I&&!s&&(u&&!d||o&&(l||Object(c.q)(r,"deleteMessages"))),C=!h&&p&&(l||i&&(r.isCreator||Object(c.q)(r,"editMessages"))),E=!h&&!s,S=Boolean(t.content.sticker),M=S&&function(e,t){const{stickers:n}=e.stickers.favorite;return n&&n.some(({id:e})=>e===t.id)}(e,t.content.sticker),A=!h&&S&&!M,k=!h&&M,N=!h,T=!h&&(i||a),P=!h;return{noOptions:[g,C,v,w,I,j,E,A,k,N,T,P].every(e=>!e),canReply:g,canEdit:C,canPin:v,canUnpin:w,canDelete:I,canDeleteForAll:j,canForward:E,canFaveSticker:A,canUnfaveSticker:k,canCopy:N,canCopyLink:T,canSelect:P}}function be(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=D(e)||{},u=n&&L(e,n);if(!u||!t||!r)return{};const d=t.map(t=>u[t]&&le(e,u[t],r)).filter(Boolean);return{canDelete:d.every(e=>e.canDelete),canDeleteForAll:d.every(e=>e.canDeleteForAll)}}function he(e,t){const n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id];return n?n.progress:void 0}function me(e,t,n){if(n===d.MAIN_THREAD_ID){const n=f(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?Object(c.sb)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=Y(e,t,n);if(!r)return;return r.lastReadInboxMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId||1/0):r.topMessageId}}function pe(e,t,n){const r=f(e,t);if(n===d.MAIN_THREAD_ID){if(!r)return}else{const r=Y(e,t,n);if(!r||r.lastMessageId===r.lastReadInboxMessageId)return}const u=U(e,t,n),o=R(e,t,n),c=L(e,t);if(!c||!u&&!o)return;const a=me(e,t,n);if(a||!r||!r.isNotJoined){if(u){const e=a?u.find(e=>e>a&&c[e]&&(!c[e].isOutgoing||c[e].isFromScheduled)):u[0];if(e)return e}if(o){const e=a?o.find(e=>e>a&&c[e]&&(!c[e].isOutgoing||c[e].isFromScheduled)):o[0];if(e)return e}}}function ge(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function ye(e,t){const n=Object.values(e.chats.byId).find(e=>Object(c.ob)(e)&&e.lastMessage&&e.lastMessage.id===t);if(n)return n.id;const{byChatId:r}=e.messages;return Number(Object.keys(r).find(n=>{const u=f(e,Number(n));return u&&Object(c.ob)(u)&&r[u.id].byId[t]}))}function ve(e){const{selectedMessages:t}=e;return Boolean(t)}function we(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function Oe(e,t,n){const r=L(e,t);if(r)return Object.values(r).filter(e=>e.groupedId===n&&e.forwardInfo).map(({forwardInfo:e})=>e.fromMessageId)}function Ie(e,t,n){const r=L(e,t);if(r)return Object.keys(r).map(Number).filter(e=>r[e].groupedId===n)}function je(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const u=Ie(e,t,n);return u&&u.every(e=>r.includes(e))}function Ce(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function Ee(e,t){const n=f(e,t);if(!n)return;if(!h(e,n))return;const r=L(e,t),u=G(e,t,d.MAIN_THREAD_ID);if(!r||!u)return;const o=Object(S.g)(u,e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons)),c=Object(S.g)(u,e=>Boolean(r[e].shouldHideKeyboardButtons));return o&&c&&c>o?void 0:o?r[o]:void 0}function Se(e,t,n,r){const{shouldAutoDownloadMediaFromContacts:u,shouldAutoDownloadMediaInPrivateChats:d,shouldAutoDownloadMediaInGroups:o,shouldAutoDownloadMediaInChannels:a}=e.settings.byKey;return Boolean(d&&Object(c.lb)(n.id)||o&&Object(c.kb)(n)||a&&Object(c.jb)(n)||u&&r&&(r.id===e.currentUserId||function(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}(e,r)))}function Me(e,t){const n=Object(c.P)(t);if(!n)return;const{shouldAutoPlayVideos:r,shouldAutoPlayGifs:u}=e.settings.byKey,d=n.isGif||n.isRound;return r&&!d||u&&d}function Ae(e){return e.settings.byKey.shouldLoopStickers}function ke(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;const r=Object(c.a)(t,n),u=e.localTextSearch.byChatThreadKey[r];return u&&u.isActive?u:void 0}function Ne(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=D(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function Te(e){const t=Ne(e);if(t)return e.localMediaSearch.byChatId[t]}function Pe(e,t){return e.management.byChatId[t]}function De(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;if(Object(c.lb)(t))return"user";const r=f(e,t);return r?Object(c.kb)(r)?"group":"channel":void 0}function Fe(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function Le(e){const{users:t,isChatInfoShown:n}=e,d=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),o=Boolean(!u.g&&ke(e)),c=function(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;const r=e.management.byChatId[t];return r&&r.isActive?r:void 0}(e),a=void 0!==M(e).query,i=void 0!==A(e).query,{chatId:s}=D(e)||{},f=t.selectedId,l=v(e),b=Boolean(f&&l),h=Boolean(s&&l)&&n;return d?r.l.PollResults:o?r.l.Search:c?r.l.Management:a?r.l.StickerSearch:i?r.l.GifSearch:b?r.l.UserInfo:h?r.l.ChatInfo:void 0}function Be(e){return void 0!==Le(e)}function xe(e){return e.globalSearch.query}function Re(e){return e.payment.messageId}function Ue(e){return e.payment.formId}function _e(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function Ge(e){return e.payment.stripeCredentials}},function(e,t,n){"use strict";n.d(t,"o",(function(){return u})),n.d(t,"f",(function(){return d})),n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return c})),n.d(t,"j",(function(){return a})),n.d(t,"l",(function(){return i})),n.d(t,"g",(function(){return s})),n.d(t,"m",(function(){return f})),n.d(t,"d",(function(){return l})),n.d(t,"k",(function(){return b})),n.d(t,"i",(function(){return h})),n.d(t,"h",(function(){return m})),n.d(t,"c",(function(){return p})),n.d(t,"a",(function(){return g})),n.d(t,"n",(function(){return y})),n.d(t,"p",(function(){return w}));var r=n(1);const u=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="Mac OS":-1!==["iPhone","iPad","iPod"].indexOf(t)?n="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?n="Windows":/Android/.test(e)?n="Android":/Linux/.test(t)&&(n="Linux"),n}(),d="Mac OS"===u,o="iOS"===u,c="Android"===u,a=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),i=window.matchMedia("(pointer: coarse)").matches,s=window.innerWidth<=r.db||window.innerWidth<=r.cb&&window.innerHeight<=r.bb,f=navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext),l=(document.documentElement.style,u&&(d||o)),b="serviceWorker"in navigator,h=b,m=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),p=!r.E&&"filter"in(document.createElement("canvas").getContext("2d")||{}),g=window.devicePixelRatio||1,y=!0;let v;function w(){return Boolean(v)}new Promise(e=>{const t=new Image;t.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA";const n=()=>{e(2===t.height)};t.onload=n,t.onerror=n}).then(e=>{v=e})},function(e,t,n){"use strict";t.a=(...e)=>e.filter(Boolean).join(" ")},function(e,t,n){"use strict";function r(e,t,n=!0,r=!0){let u;return(...d)=>{u?(clearTimeout(u),u=void 0):n&&e(...d),u=self.setTimeout(()=>{r&&e(...d),u=void 0},t)}}function u(e,t,n=!0){let r,u,d;return(...o)=>{u=!0,d=o,r||(n&&(u=!1,e(...d)),r=self.setInterval(()=>{if(!u)return self.clearInterval(r),void(r=void 0);u=!1,e(...d)},t))}}function d(e){return c(h,e)}function o(e){return c(m,e)}function c(e,t){let n,r=!1;return(...u)=>{n=u,r||(r=!0,e(()=>{r=!1,t(...n)}))}}function a(e){Promise.resolve().then(e)}function i(e){self.requestIdleCallback?self.requestIdleCallback(e):a(e)}n.d(t,"a",(function(){return r})),n.d(t,"g",(function(){return u})),n.d(t,"i",(function(){return d})),n.d(t,"h",(function(){return o})),n.d(t,"d",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"e",(function(){return s})),n.d(t,"f",(function(){return f})),n.d(t,"b",(function(){return h}));const s=e=>new Promise(t=>{setTimeout(()=>t(),e)});function f(){return new Promise(e=>{h(e)})}let l,b;function h(e,t=!1){l?t?b.push(e):l.push(e):(l=t?[]:[e],b=t?[e]:[],requestAnimationFrame(()=>{const e=l,t=b;l=void 0,b=void 0,t.forEach(e=>e()),e.forEach(e=>e())}))}function m(e){h(e,!0)}},function(e,t,n){"use strict";n.d(t,"c",(function(){return s})),n.d(t,"a",(function(){return f})),n.d(t,"b",(function(){return l}));var r=n(80),u=n.n(r),d=n(1),o=n(28);let c;const a=new Map,i=new Map;function s(e,t){return c||(d.p&&console.log(">>> START LOAD WORKER"),c=new u.a,function(e){c.addEventListener("message",({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=a.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){const e=a.get(t.messageId);e&&e.callback&&e.callback(...t.callbackArgs)}else if("unhandledError"===t.type)throw t.error})}(e)),b({type:"initApi",args:[t]})}function f(e,...t){if(c)return b({type:"callMethod",name:e,args:t});d.p&&console.warn("API is not initialized")}function l(e){e.isCanceled=!0;const{messageId:t}=i.get(e)||{};t&&c.postMessage({type:"cancelProgress",messageId:t})}function b(e){const t=Object(o.a)(a),n={messageId:t,...e},r={messageId:t},u=new Promise((e,t)=>{Object.assign(r,{resolve:e,reject:t})});if("function"==typeof n.args[1]){const e=n.args.pop();r.callback=e,i.set(e,r)}return a.set(t,r),u.catch(()=>{}).finally(()=>{a.delete(t),r.callback&&i.delete(r.callback)}),c.postMessage(n),u}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"d",(function(){return c})),n.d(t,"c",(function(){return a})),n.d(t,"b",(function(){return s}));var r=n(1);let u;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra"}(u||(u={}));const d={},o={};async function c(e,t){if(!d[e]){switch(e){case u.Auth:d[u.Auth]=n.e(5).then(n.bind(null,105));break;case u.Main:r.p&&console.log(">>> START LOAD MAIN BUNDLE"),d[u.Main]=Promise.all([n.e(0),n.e(4)]).then(n.bind(null,104));break;case u.Extra:d[u.Extra]=Promise.all([n.e(0),n.e(3)]).then(n.bind(null,103))}d[e].then(f)}const c=await d[e];return o[e]||(o[e]=c),a(e,t)}function a(e,t){const n=o[e];if(n)return n[t]}const i=[];function s(e){i.includes(e)||i.push(e)}function f(){i.forEach(e=>{e()})}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"c",(function(){return d})),n.d(t,"d",(function(){return o})),n.d(t,"b",(function(){return c}));const r=self.caches;let u;async function d(e,t,n){if(r)try{const d=new Request(t),o=await r.open(e),c=await o.match(d);if(!c)return;switch(n){case u.Text:return await c.text();case u.Blob:{const e=await c.blob();if("sticker"===t.substr(0,7))return new Blob([e],{type:"image/webp"});if(!e.type){const t=c.headers.get("Content-Type");if(t)return new Blob([e],{type:t})}return e}case u.Json:return await c.json();default:return}}catch(e){return void console.warn(e)}}async function o(e,t,n){if(r)try{const u="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),d=new Request(t),o=new Response(u),c=await r.open(e);return await c.put(d,o)}catch(e){return void console.warn(e)}}async function c(e){try{if(!r)return;return await r.delete(e)}catch(e){return void console.warn(e)}}!function(e){e[e.Text=0]="Text",e[e.Blob=1]="Blob",e[e.Json=2]="Json"}(u||(u={}))},function(e,t,n){"use strict";n.d(t,"d",(function(){return d})),n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return c})),n.d(t,"g",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l}));var r=n(9);function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}"undefined"==typeof File&&(self.File=class extends Blob{constructor(e,t,n){if(n){const{type:t,...r}=n;super(e,{type:t}),u(this,"name",void 0),Object.assign(this,r)}else super(e),u(this,"name",void 0);this.name=t}});function d(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let u=r.length;const d=new Uint8Array(u);for(;u--;)d[u]=r.charCodeAt(u);return new Blob([d],{type:n})}function o(e){return new Promise((t,n)=>{const r=new FileReader;r.onload=e=>{const{result:r}=e.target||{};"string"==typeof r&&t(r),n(new Error("Failed to read blob"))},r.onerror=n,r.readAsDataURL(e)})}function c(e,t){return new File([e],t,{lastModified:Date.now(),type:e.type})}function a(e){return new Promise((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=n,r.src=e})}function i(e){return new Promise((t,n)=>{const r=document.createElement("video");r.volume=0,r.onloadedmetadata=()=>t(r),r.onerror=n,r.src=e})}async function s(e){const t=await i(e);return Promise.race([Object(r.e)(2e3),new Promise((e,n)=>{t.onseeked=()=>{const n=document.createElement("canvas");n.width=t.videoWidth,n.height=t.videoHeight;n.getContext("2d").drawImage(t,0,0),e(n.toDataURL("image/jpeg"))},t.onerror=n,t.currentTime=Math.min(t.duration,1)})])}async function f(e){return(await fetch(e)).blob()}function l(e){const t=document.createElement("canvas");t.width=e.width,t.height=e.height;return t.getContext("2d").drawImage(e,0,0),t}},function(e,t,n){"use strict";n.d(t,"a",(function(){return v})),n.d(t,"b",(function(){return j})),n.d(t,"c",(function(){return C}));var r=n(1),u=n(12),d=n(10);var o=n(3),c=n.p+"en-extra.e73049da90714ecdae3233e8ffa74d39.json",a=n.p+"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json",i=n.p+"it-extra.78e5568451a888818c7e2209e05a9602.json",s=n.p+"pl-extra.38fd67a6c26e58f5c912568332c7c074.json",f=n.p+"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json",l=n(49),b=n(2);const h={en:c,es:a,it:i,pl:s,ru:f},m=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],p={en:e=>1!==e?6:2,ar:e=>0===e?1:1===e?2:2===e?3:e%100>=3&&e%100<=10?4:e%100>=11?5:6,ca:e=>1!==e?6:2,de:e=>1!==e?6:2,es:e=>1!==e?6:2,fa:e=>e>1?6:2,fr:e=>e>1?6:2,id:()=>0,it:e=>1!==e?6:2,ko:()=>0,ms:()=>0,nl:e=>1!==e?6:2,pl:e=>1===e?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,pt_BR:e=>e>1?6:2,ru:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,tr:e=>e>1?6:2,uk:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,uz:e=>e>1?6:2},g=new Map;let y;const{addCallback:v,removeCallback:w,runCallbacks:O}=function(){const e=[];function t(t){const n=e.indexOf(t);-1!==n&&e.splice(n,1)}return{runCallbacks:function(...t){e.forEach(e=>{e(...t)})},addCallback:function(n){return e.push(n),()=>{t(n)}},removeCallback:t}}();let I;const j=(e,t,n)=>{if(void 0!==t){const r=g.get(`${e}_${t}_${n}`);if(r)return r}if(!y)return e;const r=y[e];if(!r)return e;const u=r["number"==typeof t?function(e){const t=I&&p[I]?p[I](e):0;return m[t]}(t):"value"];if(!u||!u.trim()){const t=e.split(".");return t[t.length-1]}if(void 0!==t){const r=function(e,t){return e.replace(/%\d?\$?[sdf@]/,String(t))}(u,"i"===n?Object(l.a)(t):t);return g.set(`${e}_${t}_${n}`,r),r}return u};async function C(e,t){if(y&&e===I)return void(t&&t());const n=await async function(e){const t=await u.c(r.F,e,u.a.Json);if(t)return t;const n=await Object(d.a)("fetchLangPack",{sourceLangPacks:r.G,langCode:e});if(n)return await u.d(r.F,e,n.langPack),n.langPack;return}(e);if(!n)return;if(h[e])try{const t=await fetch(h[e]),r=await t.json(),u=Object(o.i)(r,(e,t)=>({key:t,value:e}));Object.assign(n,u)}catch(e){r.p&&console.error(e)}g.clear(),I=e,y=n,document.documentElement.lang=e;const{languages:c}=Object(b.e)().settings.byKey,a=c?c.find(t=>t.langCode===e):void 0;j.isRtl=Boolean(a&&a.rtl),t&&t(),O(y)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d}));const r=/\uFE0F/g,u=String.fromCharCode(8205);function d(e){return e.indexOf(u)<0?e.replace(r,""):e}t.a=/(?:\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]|\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]|\ud83d[\udc6b-\udc6d\udc8f\udc91])|(?:\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]|[\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\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g},function(e,t,n){"use strict";var r=n(0),u=n(21);n(94);t.a=Object(r.h)(({color:e="blue"})=>r.a.createElement("div",{className:"Loading"},r.a.createElement(u.a,{color:e,withBackground:"white"===e})))},function(e,t,n){"use strict";var r=n(0),u=n(11),d=n(26);t.a=(e,t,n=!1,o=!1)=>{const c=Object(u.c)(e,t),a=Object(d.a)();return o&&Object(u.b)(a),Object(r.n)(()=>{n||c||Object(u.d)(e,t).then(a)},[e,a,c,t,n]),c}},function(e,t,n){"use strict";n.d(t,"d",(function(){return o})),n.d(t,"e",(function(){return c})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"a",(function(){return d}));const r={},u=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/;var d="AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234".split("\n").map(e=>({id:e.substr(0,2),flag:e.substr(2,4),code:"+"+e.match(/\d+/)[0],name:e.split(/\d+/)[1],phoneFormat:function(e){if(!e)return u;const t=e[0];let n;if(!r[t]){const e=t.split("").map(Number);n=e.reduce((e,t,n)=>`${e}(\\d{1,${t}})${n>0?"?":""}`,""),r[t]=new RegExp(`${n}${"()?".repeat(5-e.length)}`)}return r[t]}(e.match(/\d+$/))}));function o(e){return d.find(t=>t.id===e)}function c(e){let t=e.replace(/[^\d+]+/g,"");t.startsWith("+")||(t="+"+t);const n=d.filter(e=>t.startsWith(e.code)).sort((e,t)=>e.code.length-t.code.length);return n[n.length-1]}function a(e,t){let n=e.replace(/[^\d]+/g,"");if(t)n=n.substr(t.code.length-1);else if(e.startsWith("+"))return e;return n=n.replace(function(e){return e?e.phoneFormat:u}(t),(e,n,r,u,d,o)=>{const c=t&&"GB"===t.id?" ":"-";let a="";return n&&(a=""+n),r&&(a+=" "+r),u&&(a+=`${c}${u}`),d&&(a+=`${c}${d}`),o&&(a+=`${c}${o}`),a}),n}function i(e){const t=e.startsWith("+")?e:"+"+e,n=c(t);return n?`${n.code} ${a(t,n)}`:t}},function(e,t,n){"use strict";(function(e){n.d(t,"f",(function(){return c})),n.d(t,"b",(function(){return a})),n.d(t,"e",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"a",(function(){return f})),n.d(t,"d",(function(){return l}));var r=n(41),u=n(1),d=n(12);const o=[1,2,3,4,5];function c(e,t){const{mainDcId:n,keys:r,hashes:d}=e;localStorage.setItem(u.nb,JSON.stringify({dcID:n,id:t})),localStorage.setItem("dc",String(n)),Object.keys(r).map(Number).forEach(e=>{localStorage.setItem(`dc${e}_auth_key`,JSON.stringify(r[e]))}),Object.keys(d).map(Number).forEach(e=>{localStorage.setItem(`dc${e}_hash`,JSON.stringify(d[e]))})}function a(){[u.nb,"dc",...o.map(e=>`dc${e}_auth_key`),...o.map(e=>`dc${e}_hash`)].forEach(e=>{localStorage.removeItem(e)})}function i(){const e=localStorage.getItem(u.nb);if(!e)return;let t;const n={},r={};try{const n=JSON.parse(e);t=Number(n.dcID)}catch(e){}return t&&(o.forEach(e=>{try{const t=localStorage.getItem(`dc${e}_auth_key`);t&&(n[e]=JSON.parse(t));const u=localStorage.getItem(`dc${e}_hash`);u&&(r[e]=JSON.parse(u))}catch(e){u.p&&console.warn("Failed to load stored session",e)}}),Object.keys(n).length)?{mainDcId:t,keys:n,hashes:r}:void 0}async function s(){const e=localStorage.getItem(u.H);if(!e)return;const t=await r.b("GramJs:"+e);try{c(JSON.parse(t))}catch(e){u.p&&console.warn("Failed to load legacy session",e)}}async function f(){localStorage.removeItem(u.H);const e=await r.c();await Promise.all([d.b("GramJs"),...e.filter(e=>"string"==typeof e&&e.startsWith("GramJs:GramJs-session-")).map(e=>r.a(e))])}function l(){const t=e.env.TEST_SESSION;try{c(JSON.parse(t))}catch(e){u.p&&console.warn("Failed to load test session",e)}}}).call(this,n(86))},function(e,t,n){"use strict";let r,u,d,o,c,a,i,s,f,l,b,h;n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"m",(function(){return d})),n.d(t,"d",(function(){return o})),n.d(t,"c",(function(){return c})),n.d(t,"l",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"k",(function(){return b})),n.d(t,"i",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"g",(function(){return p})),function(e){e[e.Backwards=0]="Backwards",e[e.Forwards=1]="Forwards",e[e.Around=2]="Around"}(r||(r={})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(u||(u={})),function(e){e[e.Main=0]="Main",e[e.EditProfile=1]="EditProfile",e[e.Notifications=2]="Notifications",e[e.Language=3]="Language",e[e.General=4]="General",e[e.GeneralChatBackground=5]="GeneralChatBackground",e[e.GeneralChatBackgroundColor=6]="GeneralChatBackgroundColor",e[e.Privacy=7]="Privacy",e[e.PrivacyPhoneNumber=8]="PrivacyPhoneNumber",e[e.PrivacyLastSeen=9]="PrivacyLastSeen",e[e.PrivacyProfilePhoto=10]="PrivacyProfilePhoto",e[e.PrivacyForwarding=11]="PrivacyForwarding",e[e.PrivacyGroupChats=12]="PrivacyGroupChats",e[e.PrivacyPhoneNumberAllowedContacts=13]="PrivacyPhoneNumberAllowedContacts",e[e.PrivacyPhoneNumberDeniedContacts=14]="PrivacyPhoneNumberDeniedContacts",e[e.PrivacyLastSeenAllowedContacts=15]="PrivacyLastSeenAllowedContacts",e[e.PrivacyLastSeenDeniedContacts=16]="PrivacyLastSeenDeniedContacts",e[e.PrivacyProfilePhotoAllowedContacts=17]="PrivacyProfilePhotoAllowedContacts",e[e.PrivacyProfilePhotoDeniedContacts=18]="PrivacyProfilePhotoDeniedContacts",e[e.PrivacyForwardingAllowedContacts=19]="PrivacyForwardingAllowedContacts",e[e.PrivacyForwardingDeniedContacts=20]="PrivacyForwardingDeniedContacts",e[e.PrivacyGroupChatsAllowedContacts=21]="PrivacyGroupChatsAllowedContacts",e[e.PrivacyGroupChatsDeniedContacts=22]="PrivacyGroupChatsDeniedContacts",e[e.PrivacyActiveSessions=23]="PrivacyActiveSessions",e[e.PrivacyBlockedUsers=24]="PrivacyBlockedUsers",e[e.Folders=25]="Folders",e[e.FoldersCreateFolder=26]="FoldersCreateFolder",e[e.FoldersEditFolder=27]="FoldersEditFolder",e[e.FoldersIncludedChats=28]="FoldersIncludedChats",e[e.FoldersExcludedChats=29]="FoldersExcludedChats",e[e.TwoFaDisabled=30]="TwoFaDisabled",e[e.TwoFaNewPassword=31]="TwoFaNewPassword",e[e.TwoFaNewPasswordConfirm=32]="TwoFaNewPasswordConfirm",e[e.TwoFaNewPasswordHint=33]="TwoFaNewPasswordHint",e[e.TwoFaNewPasswordEmail=34]="TwoFaNewPasswordEmail",e[e.TwoFaNewPasswordEmailCode=35]="TwoFaNewPasswordEmailCode",e[e.TwoFaEnabled=36]="TwoFaEnabled",e[e.TwoFaChangePasswordCurrent=37]="TwoFaChangePasswordCurrent",e[e.TwoFaChangePasswordNew=38]="TwoFaChangePasswordNew",e[e.TwoFaChangePasswordConfirm=39]="TwoFaChangePasswordConfirm",e[e.TwoFaChangePasswordHint=40]="TwoFaChangePasswordHint",e[e.TwoFaTurnOff=41]="TwoFaTurnOff",e[e.TwoFaRecoveryEmailCurrentPassword=42]="TwoFaRecoveryEmailCurrentPassword",e[e.TwoFaRecoveryEmail=43]="TwoFaRecoveryEmail",e[e.TwoFaRecoveryEmailCode=44]="TwoFaRecoveryEmailCode",e[e.TwoFaCongratulations=45]="TwoFaCongratulations"}(d||(d={})),function(e){e[e.ChatList=0]="ChatList",e[e.GlobalSearch=1]="GlobalSearch",e[e.Settings=2]="Settings",e[e.Contacts=3]="Contacts",e[e.Archived=4]="Archived",e[e.NewChannelStep1=5]="NewChannelStep1",e[e.NewChannelStep2=6]="NewChannelStep2",e[e.NewGroupStep1=7]="NewGroupStep1",e[e.NewGroupStep2=8]="NewGroupStep2"}(o||(o={})),function(e){e[e.ChatList=0]="ChatList",e[e.Media=1]="Media",e[e.Links=2]="Links",e[e.Files=3]="Files",e[e.Music=4]="Music",e[e.Voice=5]="Voice"}(c||(c={})),function(e){e[e.ChatInfo=0]="ChatInfo",e[e.UserInfo=1]="UserInfo",e[e.Search=2]="Search",e[e.Management=3]="Management",e[e.StickerSearch=4]="StickerSearch",e[e.GifSearch=5]="GifSearch",e[e.PollResults=6]="PollResults"}(a||(a={})),function(e){e[e.Inline=0]="Inline",e[e.ScheduledInline=1]="ScheduledInline",e[e.SharedMedia=2]="SharedMedia",e[e.ProfileAvatar=3]="ProfileAvatar",e[e.MiddleHeaderAvatar=4]="MiddleHeaderAvatar",e[e.Album=5]="Album",e[e.ScheduledAlbum=6]="ScheduledAlbum",e[e.SearchResult=7]="SearchResult"}(i||(i={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(s||(s={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(f||(f={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(l||(l={})),function(e){e[e.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(b||(b={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(h||(h={}));const m="UPLOADING_WALLPAPER_SLUG";let p;!function(e){e[e.Initial=0]="Initial",e[e.ChatPrivacyType=1]="ChatPrivacyType",e[e.Discussion=2]="Discussion",e[e.ChannelSubscribers=3]="ChannelSubscribers",e[e.GroupType=4]="GroupType",e[e.GroupPermissions=5]="GroupPermissions",e[e.GroupRemovedUsers=6]="GroupRemovedUsers",e[e.GroupUserPermissionsCreate=7]="GroupUserPermissionsCreate",e[e.GroupUserPermissions=8]="GroupUserPermissions",e[e.ChatAdministrators=9]="ChatAdministrators",e[e.GroupRecentActions=10]="GroupRecentActions",e[e.ChatAdminRights=11]="ChatAdminRights",e[e.GroupMembers=12]="GroupMembers"}(p||(p={}))},function(e,t,n){"use strict";var r=n(0),u=n(8);n(90);t.a=({color:e="blue",withBackground:t})=>r.a.createElement("div",{className:Object(u.a)("Spinner",e,t&&"with-background")},r.a.createElement("div",null))},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(1),u=n(9);window.addEventListener("error",c),window.addEventListener("unhandledrejection",c);const d=Date.now();let o=!1;function c(e){e.preventDefault(),a(e instanceof ErrorEvent?e.error:e.reason)}Object(u.g)(window.alert,1e3);function a(e){if(console.error(e),!o)return Date.now()-d<=5e3&&localStorage.getItem(r.B)?(localStorage.removeItem(r.B),o=!0,void window.location.reload()):void 0}},function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var r=n(0),u=n(15),d=n(1),o=n(7),c=n(65),a=n(8),i=n(76),s=n(57);const f=/^[\d\wа-яё]$/i,l=/(\*\*|__).+?\1/g;function b(e,t=["emoji"],n){return"string"!=typeof e?[e]:t.reduce((e,t)=>{switch(t){case"escape_html":return function(e){const t=document.createElement("div");return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:(t.innerText=n,[...e,t.innerHTML]),[])}(e);case"hq_emoji":return u.a.lastIndex=0,h(e,"big","jsx");case"emoji":return u.a.lastIndex=0,h(e,"small","jsx");case"emoji_html":return u.a.lastIndex=0,h(e,"small","html");case"br":return m(e,"jsx");case"br_html":return m(e,"html");case"highlight":return d=e,o=n.highlight,d.reduce((e,t)=>{if("string"!=typeof t||!o)return[...e,t];const n=t.toLowerCase(),u=n.indexOf(o.toLowerCase()),d=n[u+o.length];if(u<0||d&&d.match(f))return[...e,t];const c=[];return c.push(t.substring(0,u)),c.push(r.a.createElement("span",{className:"matching-text-highlight"},t.substring(u,u+o.length))),c.push(t.substring(u+o.length)),[...e,...c]},[]);case"links":return function(e){return e.reduce((e,t)=>{if("string"!=typeof t)return[...e,t];const n=[...t.match(p)||[],...t.match(g)||[]];if(!n.length)return[...e,t];const u=[];let d=n.shift(),o=0;for(;d;){const e=t.indexOf(d,o);u.push(t.substring(o,e)),d.startsWith("@")?u.push(r.a.createElement(i.a,{username:d},d)):(d.endsWith("?")&&(d=d.slice(0,d.length-1)),u.push(r.a.createElement(s.a,{text:d,url:d}))),o=e+d.length,d=n.shift()}return u.push(t.substring(o)),[...e,...u]},[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var d,o;return e},[e])}function h(e,t,n){return e.reduce((e,d)=>{if("string"!=typeof d)return[...e,d];const i=d.split(u.a),s=d.match(u.a)||[];return e.push(i[0]),s.reduce((e,d,s)=>{const f=Object(c.a)(Object(u.b)(d)),l=Object(a.a)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(o.d?r.a.createElement("span",{className:"font-emoji"},d):r.a.createElement("img",{className:l,src:`./img-apple-${"big"===t?"160":"64"}/${f}.png`,alt:d})),"html"===n&&e.push(o.d?d:`${d}`);const b=2*s+2;return i[b]&&e.push(i[b]),e},e)},[])}function m(e,t){return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:[...e,...n.split(/\r\n|\r|\n/g).reduce((e,n,u,d)=>{const o=n.trimLeft(),c=n.length-o.length;return e.push(String.fromCharCode(160).repeat(c)+o),u!==d.length-1&&e.push("jsx"===t?r.a.createElement("br",null):"
"),e},[])],[])}const p=new RegExp(d.gb,"ig"),g=/@[\w\d_-]+/gi;function y(e,t){return e.reduce((e,n)=>{if("string"!=typeof n)return[...e,n];const u=n.split(l),d=n.match(l)||[];return e.push(u[0]),d.reduce((e,n,d)=>{"jsx"===t?e.push(n.startsWith("**")?r.a.createElement("b",null,n.replace(/\*\*/g,"")):r.a.createElement("i",null,n.replace(/__/g,""))):e.push(n.startsWith("**")?`${n.replace(/\*\*/g,"")}`:`${n.replace(/__/g,"")}`);const o=2*d+2;return u[o]&&e.push(u[o]),e},e)},[])}},function(e,t,n){"use strict";function r(e,t){if(e===t)return!0;const n=Object.keys(e),r=n.length;if(r!==Object.keys(t).length)return!1;if(0===r)return!0;for(let u=0;ue[n]!==t[n])}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u}))},function(e,t,n){"use strict";var r=n(14),u=n(26),d=n(51);t.a=()=>{const e=Object(u.a)();return Object(d.a)(()=>r.a(e),[e]),r.b}},function(e,t,n){"use strict";var r=n(0);t.a=()=>{const[,e]=Object(r.r)(!1);return Object(r.m)(()=>{e(e=>!e)},[])}},function(e,t,n){"use strict";var r=n(0),u=n(8);n(88);t.a=({children:e,className:t,isRtl:n,onClick:d})=>{const o=Object(r.m)(e=>{e.preventDefault(),d(e)},[d]);return r.a.createElement("a",{href:"#",className:Object(u.a)("Link",t),dir:n?"rtl":"auto",onClick:d?o:void 0},e)}},function(e,t,n){"use strict";t.a=e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t}},function(e,t,n){"use strict";n.d(t,"d",(function(){return p})),n.d(t,"c",(function(){return y})),n.d(t,"b",(function(){return v})),n.d(t,"a",(function(){return w}));var r=n(10),u=n(67),d=n(1),o=n(2),c=n(4),a=n(14),i=n(37),s=n(6),f=n(7);function l(e){const t=e.toJSON();return JSON.stringify({endpoint:t.endpoint,keys:t.keys})}function b(){return!!f.k&&("showNotification"in ServiceWorkerRegistration.prototype?"denied"===Notification.permission?(d.p&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(d.p&&console.warn("[PUSH] Push messaging isn't supported."),!1):(d.p&&console.warn("[PUSH] Push notifications aren't supported."),!1))}async function h(){"Notification"in window&&(["granted","denied"].includes(Notification.permission)||await Notification.requestPermission())}async function m(e){const t=Object(o.e)(),n=Object(o.d)();if(e)try{const t=l(e);return await Object(r.a)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){d.p&&console.log("[PUSH] Unable to unsubscribe from push.",e)}t.push&&(await Object(r.a)("unregisterDevice",t.push.deviceToken),n.deleteDeviceToken())}async function p(){if(!b())return;const e=await navigator.serviceWorker.ready,t=await e.pushManager.getSubscription();await m(t)}let g=!1;async function y(){if(!b())return void await h();const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(function(e){const t=Object(o.e)();return!t.push||!e||(l(e)!==t.push.deviceToken||Date.now()-t.push.subscribedAt>432e5)}(t)){await m(t);try{t=await e.pushManager.subscribe({userVisibleOnly:!0});const n=l(t);d.p&&console.log("[PUSH] Received push subscription: ",n),await Object(r.a)("registerDevice",n),Object(o.d)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?d.p&&console.warn("[PUSH] The user has blocked push notifications."):d.p&&(console.log("[PUSH] Unable to subscribe to push.",e),e.code===DOMException.ABORT_ERR&&await h())}}}async function v({chat:e,message:t,isActiveChat:n}){if(!("Notification"in window?"denied"!==Notification.permission||(d.p&&console.warn("[PUSH] The user has blocked push notifications."),0):(d.p&&console.warn("[PUSH] This browser does not support desktop notification"),0)))return;if(!t.id)return;if(await async function(){if(g)return;const[e]=await Promise.all([Object(r.a)("fetchNotificationSettings"),Object(r.a)("fetchNotificationExceptions")]);e&&(Object(o.g)(Object(i.v)(Object(o.e)(),e)),g=!0)}(),!function(e,t){if(!g)return!1;const n=Object(o.e)();return!Object(c.Cb)(e,Object(s.eb)(n),Object(s.db)(n))&&!e.isNotJoined&&!(t&&document.hasFocus())}(e,n))return;const{title:f,body:l}=function(e,t){const n=Object(o.e)(),{senderId:r,replyToMessageId:d}=t,i=r?Object(s.Gb)(n,r):void 0,f=Object(c.t)(t),l=f&&d?Object(s.k)(n,e.id,d):void 0,{targetUserId:b,targetChatId:h}=f||{},m=b?Object(s.Gb)(n,b):void 0,p=Object(c.U)(e),g=p?Object(s.Gb)(n,p):void 0;let y;if(Object(c.db)(t)){const n=e&&(Object(c.jb)(e)||t.senderId===t.chatId)?e:i;y=Object(u.a)(a.b,t,n,m,l,h,{asPlain:!0})}else{const n=Object(c.J)(a.b,e.id,i),r=Object(c.N)(a.b,t);y=n?`${n}: ${r}`:r}return{title:Object(c.l)(a.b,e,g),body:y}}(e,t);if(b())navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({type:"newMessageNotification",payload:{title:f,body:l,chatId:e.id,messageId:t.id}});else{const n=Object(o.d)(),r={body:l,icon:"icon-192x192.png",badge:"icon-192x192.png",tag:t.id.toString()};"vibrate"in navigator&&(r.vibrate=[200,100,200]);const u=new Notification(f,r);u.onclick=()=>{u.close(),n.focusMessage({chatId:e.id,messageId:t.id}),window.focus&&window.focus()}}}function w(){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({type:"clientReady"})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return c})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return i})),n.d(t,"g",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"h",(function(){return b})),n.d(t,"a",(function(){return h}));var r=n(1),u=n(36),d=n(3);const o=[1,8,5,2,7,4,6];function c(e){if(e)switch(e.type){case"userTypeBot":case"userTypeRegular":return e.firstName||e.lastName;case"userTypeDeleted":case"userTypeUnknown":return"Deleted";default:return}}function a(e){if(e){if(f(e))return"Deleted account";switch(e.type){case"userTypeBot":case"userTypeRegular":if(e.firstName&&e.lastName)return`${e.firstName} ${e.lastName}`;if(e.firstName)return e.firstName;if(e.lastName)return e.lastName;break;case"userTypeDeleted":case"userTypeUnknown":return"Deleted account"}}}function i(e,t){if(t.id===r.mb)return e("ServiceNotifications").toLowerCase();if(t.type&&"userTypeBot"===t.type)return e("Bot");if(!t.status)return"";switch(t.status.type){case"userStatusEmpty":return e("ALongTimeAgo");case"userStatusLastMonth":return e("WithinAMonth");case"userStatusLastWeek":return e("WithinAWeek");case"userStatusOffline":{const{wasOnline:n}=t.status;if(!n)return e("LastSeen.Offline");const r=new Date,d=new Date(1e3*n);if(d>=r)return e("LastSeen.JustNow");const o=new Date(r.getTime()-d.getTime());if(o.getTime()/1e3<60)return e("LastSeen.JustNow");if(o.getTime()/1e3<3600){return e("LastSeen.MinutesAgo",Math.floor(o.getTime()/1e3/60))}const c=new Date;if(c.setHours(0,0,0,0),d>c){if(o.getTime()/1e3<21600){return e("LastSeen.HoursAgo",Math.floor(o.getTime()/1e3/60/60))}return e("LastSeen.TodayAt",Object(u.h)(d))}const a=new Date;return a.setDate(r.getDate()-1),c.setHours(0,0,0,0),d>a?e("LastSeen.YesterdayAt",Object(u.h)(d)):e("LastSeen.AtDate",Object(u.b)(e,d))}case"userStatusOnline":return e("Online");case"userStatusRecently":return e("Lately");default:return}}function s(e){const{id:t,status:n,type:u}=e;return!!n&&(t!==r.mb&&("userStatusOnline"===n.type&&"userTypeBot"!==u))}function f(e){return!(!e.status||"userTypeBot"===e.type||e.id===r.mb)&&("userTypeDeleted"===e.type||"userTypeUnknown"===e.type)}function l(e){return"userTypeBot"===e.type}function b(e,t,n){return Object(d.k)(e,e=>{const r=Date.now()/1e3;if(n&&n.includes(e))return r+172800-(n.length-n.indexOf(e));const u=t[e];if(!u||!u.status)return 0;if("userStatusOnline"===u.status.type)return u.status.expires;if("userStatusOffline"===u.status.type&&u.status.wasOnline)return u.status.wasOnline;switch(u.status.type){case"userStatusRecently":return r-86400;case"userStatusLastWeek":return r-604800;case"userStatusLastMonth":return r-18144e3;default:return 0}},"desc")}function h(e){const t=e?Math.abs(e.id)%7:0;return o[t]}},function(e,t,n){"use strict";n.d(t,"w",(function(){return c})),n.d(t,"v",(function(){return a})),n.d(t,"t",(function(){return i})),n.d(t,"y",(function(){return s})),n.d(t,"u",(function(){return f})),n.d(t,"z",(function(){return l})),n.d(t,"j",(function(){return b})),n.d(t,"p",(function(){return h})),n.d(t,"i",(function(){return m})),n.d(t,"e",(function(){return p})),n.d(t,"f",(function(){return g})),n.d(t,"d",(function(){return y})),n.d(t,"x",(function(){return v})),n.d(t,"r",(function(){return w})),n.d(t,"m",(function(){return O})),n.d(t,"A",(function(){return I})),n.d(t,"c",(function(){return j})),n.d(t,"a",(function(){return C})),n.d(t,"o",(function(){return E})),n.d(t,"h",(function(){return S})),n.d(t,"g",(function(){return M})),n.d(t,"s",(function(){return A})),n.d(t,"D",(function(){return k})),n.d(t,"b",(function(){return N})),n.d(t,"C",(function(){return T})),n.d(t,"B",(function(){return P})),n.d(t,"l",(function(){return D})),n.d(t,"k",(function(){return F})),n.d(t,"q",(function(){return L})),n.d(t,"n",(function(){return B})),n.d(t,"E",(function(){return x}));var r=n(5),u=n(1),d=n(3),o=n(30);function c(e){return e>0}function a(e){return i(e)||s(e)}function i(e){return"chatTypeBasicGroup"===e.type}function s(e){return"chatTypeSuperGroup"===e.type}function f(e){return"chatTypeChannel"===e.type}function l(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function b(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function h(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function m(e,t,n,r=!1){return r||n&&t.id===n.id&&n.isSelf?e("SavedMessages"):t.title||e("HiddenName")}function p(e){if(e.fullInfo)return e.fullInfo.about}function g(e){const{username:t}=e,{inviteLink:n}=e.fullInfo||{};return n&&n.length?n:t?"t.me/"+t:""}function y(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function v(e){return!e.lastMessage}function w(e){return Boolean(e.adminRights)}function O(e,t){return!!e.adminRights&&e.adminRights[t]}function I(e,t){return Boolean(e.currentUserBannedRights&&e.currentUserBannedRights[t]||e.defaultBannedRights&&e.defaultBannedRights[t])}function j(e,t){return t!==r.MAIN_THREAD_ID||!(e.isRestricted||e.migratedTo||e.isNotJoined)&&(!!e.isCreator||(!!c(e.id)||(f(e)?O(e,"postMessages"):w(e)||!I(e,"sendMessages"))))}function C(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=w(e);return{canAttachMedia:n||!I(e,"sendMedia"),canAttachPolls:(n||!I(e,"sendPolls"))&&(!c(e.id)||t),canSendStickers:n||!I(e,"sendStickers"),canSendGifs:n||!I(e,"sendGifs"),canAttachEmbedLinks:n||!I(e,"embedLinks")}}function E(e){return e.currentUserBannedRights&&e.currentUserBannedRights.sendMessages?"You are not allowed to send messages in this chat.":e.defaultBannedRights&&e.defaultBannedRights.sendMessages?"Sending messages is not allowed in this chat.":void 0}function S(e){if(e&&e.fullInfo)return e.fullInfo.slowMode}function M(e){return Math.max(e.joinDate||0,e.lastMessage?e.lastMessage.date:0)}function A(e){return e.folderId===u.h}function k(e,t,n){return!(n&&n[e.id]&&!n[e.id].isMuted)&&(e.isMuted||c(e.id)&&!t.hasPrivateChatsNotifications||f(e)&&!t.hasBroadcastNotifications||a(e)&&!t.hasGroupNotifications)}function N(e){return i(e)||(s(e)||f(e))&&e.isCreator}function T(e,t,n,r,u,d){const o=n.excludedChatIds?new Set(n.excludedChatIds):void 0,i=n.excludedChatIds?new Set(n.includedChatIds):void 0,s=n.excludedChatIds?new Set(n.pinnedChatIds):void 0;return[(d||Object.keys(e).map(Number)).filter(d=>function(e,t,n,r,u,d,o,i){if(d&&d.has(e.id))return!1;if(o&&o.has(e.id))return!0;if(i&&i.has(e.id))return!0;if(A(e)&&t.excludeArchived)return!1;if(t.excludeMuted&&!e.unreadMentionsCount&&k(e,r,u))return!1;if(!e.unreadCount&&!e.unreadMentionsCount&&!e.hasUnreadMark&&t.excludeRead)return!1;if(c(e.id)){const r=n[e.id];if(r&&"userTypeBot"===r.type){if(t.bots)return!0}else{if(t.contacts&&r&&r.isContact)return!0;if(t.nonContacts&&r&&!r.isContact)return!0}}else{if(a(e))return!!t.groups;if(f(e))return!!t.channels}return!1}(e[d],n,t,r,u,o,i,s)),n.pinnedChatIds]}function P(e,t,n,r="all"){function u(e){if(!e||!e.lastMessage||e.migratedTo)return!1;switch(r){case"all":if(A(e))return!1;break;case"archived":if(!A(e))return!1}return!e.isRestricted&&!e.isNotJoined}const o=t.map(t=>e[t]).filter(u),c=new Set(t);return{pinnedChats:n?n.map(t=>e[t]).filter(u).filter(e=>c.has(e.id)):[],otherChats:Object(d.k)(n?o.filter(e=>!n.includes(e.id)):o,M,"desc")}}function D(e,t,n,r,u,d){const[o]=T(e,t,n,u,d,r),c=o.map(t=>e[t]).filter(e=>e&&e.lastMessage&&!e.isRestricted&&!e.isNotJoined);return{unreadDialogsCount:c.reduce((e,t)=>t.unreadCount||t.hasUnreadMark?e+1:e,0),hasActiveDialogs:c.some(e=>e.unreadMentionsCount||!k(e,u,d)&&(e.unreadCount||e.hasUnreadMark))}}function F(e,t,n,r,u,d,o){const{id:c,title:a,emoticon:i,description:s,pinnedChatIds:f,excludedChatIds:l,includedChatIds:b,excludeArchived:h,excludeMuted:m,excludeRead:p,...g}=r;if(Object.values(g).filter(Boolean).length>1||l&&l.length||b&&b.length){return e("Chats",function(e,t,n,r,u,d){const[o,c]=T(e,t,n,u,d,r),{pinnedChats:a,otherChats:i}=P(e,o,c,"folder");return a.length+i.length}(t,n,r,u,d,o))}return g.bots?e("FilterBots"):g.groups?e("FilterGroups"):g.channels?e("FilterChannels"):g.contacts?e("FilterContacts"):g.nonContacts?e("FilterNonContacts"):void 0}function L(e){return!!e&&e.id<0}function B(e,t,n){if(n&&!c(t))return n.isSelf?e("FromYou"):Object(o.b)(n)}function x(e,t,n=!1,r){return Object(d.k)(e,e=>{const u=t[e];if(!u)return 0;let d=0;return u.lastMessage&&(d+=u.lastMessage.date),n&&u.isVerified&&(d+=3e9),r&&r.includes(e)&&(d+=Date.now()+(r.length-r.indexOf(e))),d},"desc")}},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(21),o=n(43);n(92);t.a=({ref:e,type:t="button",onClick:n,onContextMenu:c,onMouseDown:a,onMouseEnter:i,onMouseLeave:s,onFocus:f,children:l,size:b="default",color:h="primary",className:m,round:p,pill:g,fluid:y,isText:v,isLoading:w,ariaLabel:O,href:I,download:j,disabled:C,ripple:E,faded:S,tabIndex:M,isRtl:A})=>{let k=Object(r.q)(null);e&&(k=e);const[N,T]=Object(r.r)(!1),P=Object(u.a)("Button",m,b,h,p&&"round",g&&"pill",y&&"fluid",C&&"disabled",v&&"text",w&&"loading",E&&"has-ripple",S&&"faded",N&&"clicked"),D=Object(r.m)(e=>{!C&&n&&n(e),T(!0),setTimeout(()=>{T(!1)},400)},[C,n]),F=Object(r.m)(e=>{e.preventDefault(),!C&&a&&a(e)},[a,C]);return I?r.a.createElement("a",{ref:k,className:P,href:I,title:O,download:j,tabIndex:M,dir:A?"rtl":void 0},l,!C&&E&&r.a.createElement(o.a,null)):r.a.createElement("button",{ref:k,type:t,className:P,onClick:D,onContextMenu:c,onMouseDown:F,onMouseEnter:i&&!C?i:void 0,onMouseLeave:s&&!C?s:void 0,onFocus:f&&!C?f:void 0,"aria-label":O,title:O,tabIndex:M,dir:A?"rtl":void 0},w?r.a.createElement("div",null,r.a.createElement("span",{dir:A?"auto":void 0},"Please wait.."),r.a.createElement(d.a,{color:v?"blue":"white"})):l,!C&&E&&r.a.createElement(o.a,null))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return b}));var r=n(1);const u=new Set(["scroll","mouseenter","mouseleave"]),d={},o=new Map,c={};function a(e,t,n){const r=s(t,e);f(r,e)?function(e,t,n){c[e]||(c[e]=0,document.addEventListener(e,h));(function(e){d[e]||(d[e]=new Map);return d[e]})(e).set(t,n),function(e){const t=o.get(e);if(t)return t;const n=new Set;return o.set(e,n),n}(t).add(e),c[e]++}(r,e,n):e.addEventListener(r,n)}function i(e,t,n){const r=s(t,e);f(r,e)?l(r,e):e.removeEventListener(r,n)}function s(e,t){const n=e.replace(/^on/,"").toLowerCase();return"change"===n&&"SELECT"!==t.tagName?"input":"doubleclick"===n?"dblclick":"focus"===n?"focusin":"blur"===n?"focusout":n}function f(e,t){return!u.has(e)&&"VIDEO"!==t.tagName&&"IFRAME"!==t.tagName}function l(e,t){c[e]--,c[e]||document.removeEventListener(e,h),d[e].delete(t),o.get(t).delete(e)}function b(e){const t=o.get(e);t&&(t.forEach(t=>l(t,e)),o.delete(e))}function h(e){const t=d[e.type];if(t){let n=!1,r=e.target;const u=()=>{n=!0},d=()=>{e.preventDefault()},o=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?u:"preventDefault"===t?d:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(o),n))return;r=r.parentNode}}}r.p&&document.addEventListener("dblclick",()=>{console.log("DELEGATED EVENTS",{delegationRegistry:d,delegatedEventsByElement:o,documentEventCounters:c})})},function(e,t,n){"use strict";var r=n(0);t.a=(e=!1)=>{const[t,n]=Object(r.r)(e);return[t,Object(r.m)(()=>{n(!0)},[]),Object(r.m)(()=>{n(!1)},[])]}},function(e,t,n){"use strict";var r=n(0),u=n(8);t.a=(e=!1,t,n=!1,d="fast",o=!1)=>{const[c,a]=Object(r.r)(!e),i=Object(r.q)(),[s,f]=Object(r.r)(e&&n);e?(a(!1),f(!0),i.current&&(window.clearTimeout(i.current),i.current=void 0)):(f(!1),c||i.current||(i.current=window.setTimeout(()=>{a(!0),t&&t(),i.current=void 0},o?0:350)));const l=Boolean(i.current),b=e||l;return{shouldRender:b,transitionClassNames:Object(u.a)(d&&"opacity-transition",d,s&&"open",b&&"shown",l&&"closing")}}},function(e,t,n){"use strict";n.d(t,"j",(function(){return o})),n.d(t,"k",(function(){return c})),n.d(t,"n",(function(){return a})),n.d(t,"h",(function(){return s})),n.d(t,"g",(function(){return f})),n.d(t,"b",(function(){return l})),n.d(t,"f",(function(){return b})),n.d(t,"c",(function(){return h})),n.d(t,"d",(function(){return p})),n.d(t,"e",(function(){return g})),n.d(t,"i",(function(){return y})),n.d(t,"a",(function(){return v})),n.d(t,"l",(function(){return O})),n.d(t,"m",(function(){return I}));const r=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],u=["January","February","March","April","May","June","July","August","September","October","November","December"],d=u.map(e=>e.toLowerCase());function o(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function c(e){return o(e).getTime()}function a(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${t.getMonth()}`}function i(e){return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`}function s(e){const t="number"==typeof e?new Date(e):e;return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function f(e,t){const n="number"==typeof t?new Date(t):t,u=o(new Date);if(n>=u)return s(n);const d=new Date(u);if(d.setDate(u.getDate()-7),n>=d)return e("Weekday.Short"+r[n.getDay()]);const c=n.getFullYear()!==u.getFullYear(),a=e(c?"formatDateScheduleYear":"formatDateSchedule")||(c?"d MMM yyyy":"d MMM");return m(e,n,a)}function l(e,t){const n="number"==typeof t?new Date(t):t,r=e("formatterYearMax")||"dd.MM.yyyy";return m(e,n,r)}function b(e,t,n=!1){const r=e(n?"formatterMonthYear2":"formatterMonthYear")||"MMM yyyy";return m(e,t,r)}function h(e,t,n=!1,u=!1){const d="number"==typeof t?new Date(t):t,c=o(new Date);if(!u){if(i(d)===i(c))return(n?j:C)(e("Weekday.Today"));const t=new Date(c);if(t.setDate(c.getDate()-1),i(d)===i(t))return(n?j:C)(e("Weekday.Yesterday"));const u=new Date(c),o=new Date(c);if(u.setDate(c.getDate()-7),o.setDate(c.getDate()+7),d>=u&&d<=o){const t=r[d.getDay()];return n?j(e("Weekday.Short"+t)):C(e("Weekday."+t))}}const a=d.getFullYear()!==c.getFullYear(),s=e(n?a?"formatDateScheduleYear":"formatDateSchedule":a?"chatFullDate":"chatDate")||"d MMMM yyyy";return(n?j:C)(m(e,d,s))}function m(e,t,n){const r=t.getDate(),d=t.getMonth();return n.replace("LLLL",e(u[d])).replace("MMMM",e("Month.Gen"+u[d])).replace("MMM",e("Month.Short"+u[d])).replace("MM",String(d+1).padStart(2,"0")).replace("dd",String(r).padStart(2,"0")).replace("d",String(r)).replace("yyyy",String(t.getFullYear()))}function p(e,t){const n="number"==typeof t?new Date(t):t;return`${h(e,n,!0)}, ${s(n)}`}function g(e){const t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=Math.floor(e%3600%60);let u="";return t>0?(u+=String(t).padStart(2,"0")+":",u+=String(n).padStart(2,"0")+":"):u+=String(n)+":",u+=String(r).padStart(2,"0"),u}function y(e){const t=[];let n=e%1e3;e-=n,n=Math.floor(n/10);const r=(e=Math.floor(e/1e3))%60;e-=r;const u=(e=Math.floor(e/60))%60;e-=u;const d=(e=Math.floor(e/60))%60;return d>0&&t.push(String(d).padStart(2,"0")),t.push(String(u).padStart(d>0?2:1,"0")),t.push(String(r).padStart(2,"0")),`${t.join(":")},${String(n).padStart(2,"0")}`}function v(e){return e.toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric"})}function w(e,t,n=2021){if(t>11||e>31)return!1;const r=new Date(n,t,e);return!Number.isNaN(r.getTime())&&r.getDate()===e}function O(e=""){const t=e.match(/\d{1,2}\s[a-zA-Z]{3,}/),n=e.match(/[a-zA-Z]{3,}\s\d{1,2}/),r=e.match(/\d{1,2}[./-]\d{1,2}([./-]\d{2,4})?/);if(!t&&!r&&!n)return;if(r){const[t,n,r]=e.split(/[./-]/).map(Number);return r&&r<2015||!w(t,n-1,r||void 0)?void 0:`${r?r+"-":""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const u=e.split(" "),o=t?u[0]:u[1],c=(t?u[1]:u[0]).toLowerCase(),a=d.findIndex(e=>e.startsWith(c));return-1!==a&&w(Number(o),a)?`${String(a+1).padStart(2,"0")}-${String(o).padStart(2,"0")}`:void 0}function I(e){return e+86400}function j(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function C(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},function(e,t,n){"use strict";n.d(t,"r",(function(){return d})),n.d(t,"I",(function(){return o})),n.d(t,"s",(function(){return c})),n.d(t,"H",(function(){return a})),n.d(t,"M",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"K",(function(){return f})),n.d(t,"J",(function(){return l})),n.d(t,"N",(function(){return m})),n.d(t,"x",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"b",(function(){return w})),n.d(t,"L",(function(){return O})),n.d(t,"eb",(function(){return I})),n.d(t,"j",(function(){return j})),n.d(t,"k",(function(){return C})),n.d(t,"V",(function(){return E})),n.d(t,"db",(function(){return S})),n.d(t,"g",(function(){return A})),n.d(t,"z",(function(){return k})),n.d(t,"kb",(function(){return N})),n.d(t,"lb",(function(){return T})),n.d(t,"u",(function(){return P})),n.d(t,"P",(function(){return D})),n.d(t,"O",(function(){return F})),n.d(t,"m",(function(){return L})),n.d(t,"G",(function(){return B})),n.d(t,"n",(function(){return x})),n.d(t,"ib",(function(){return R})),n.d(t,"hb",(function(){return U})),n.d(t,"Q",(function(){return _})),n.d(t,"q",(function(){return G})),n.d(t,"jb",(function(){return $})),n.d(t,"o",(function(){return W})),n.d(t,"y",(function(){return K})),n.d(t,"nb",(function(){return z})),n.d(t,"ob",(function(){return V})),n.d(t,"f",(function(){return q})),n.d(t,"fb",(function(){return J})),n.d(t,"l",(function(){return Y})),n.d(t,"R",(function(){return Z})),n.d(t,"S",(function(){return X})),n.d(t,"U",(function(){return ee})),n.d(t,"T",(function(){return te})),n.d(t,"Y",(function(){return ue})),n.d(t,"t",(function(){return de})),n.d(t,"Z",(function(){return oe})),n.d(t,"X",(function(){return ae})),n.d(t,"W",(function(){return ie})),n.d(t,"bb",(function(){return fe})),n.d(t,"ab",(function(){return le})),n.d(t,"v",(function(){return be})),n.d(t,"w",(function(){return he})),n.d(t,"e",(function(){return me})),n.d(t,"cb",(function(){return pe})),n.d(t,"a",(function(){return ge})),n.d(t,"p",(function(){return ye})),n.d(t,"mb",(function(){return ve})),n.d(t,"gb",(function(){return we})),n.d(t,"E",(function(){return Oe})),n.d(t,"C",(function(){return Ie})),n.d(t,"A",(function(){return je})),n.d(t,"F",(function(){return Ce})),n.d(t,"B",(function(){return Ee})),n.d(t,"D",(function(){return Se})),n.d(t,"h",(function(){return Me})),n.d(t,"i",(function(){return Ae}));var r=n(1),u=n(3);function d(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function o(e,t,n){const{[t]:r}=e.chats.listIds,u=r&&r.length?n.filter(e=>!r.includes(e)):n;return r&&!u.length?e:d(e,t,[...r||[],...u])}function c(e,t){return{...e,chats:{...e.chats,byId:t}}}function a(e,t,n,r){const{byId:d}=e.chats,o=d[t],a=n.isMin&&o&&!o.isMin,i={...o,...a?Object(u.j)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...o.photos||[]]}};return i.id&&i.type?c(e,{...d,[t]:i}):e}function i(e,t){return Object.keys(t).forEach(n=>{e=a(e,Number(n),t[Number(n)])}),e}function s(e,t){const{byId:n}=e.chats;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=a(e,r,t[r]))}),e}function f(e,t,n){const u=n===r.h?"archived":"active";let d=e.chats.listIds;return Object.keys(d).forEach(e=>{const n=d[e]||[];e!==u||n.includes(t)?e!==u&&n.includes(t)&&(d={...d,[e]:n.filter(e=>e!==t)}):d={...d,[e]:[...n,t]}}),e=a(e={...e,chats:{...e.chats,listIds:d}},t,{folderId:n||void 0})}function l(e,t,n){const r="active"===t?"all":"archived";return{...e,chats:{...e.chats,...n.orderedPinnedIds&&{orderedPinnedIds:{...e.chats.orderedPinnedIds,[t]:n.orderedPinnedIds}},totalCount:{...e.chats.totalCount,[r]:n.totalChatCount},isFullyLoaded:{...e.chats.isFullyLoaded,[t]:!1}}}}var b=n(5),h=n(6);function m(e,t,n=b.MAIN_THREAD_ID,r="thread"){return{...e,messages:{...e.messages,messageLists:t?[{chatId:t,threadId:n,type:r}]:void 0}}}function p(e,t,n){return g(e,t,{byId:n})}function g(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function y(e,t,n,r,u){return function(e,t,n,r){const u=e.messages.byChatId[t];return g(e,t,{threadsById:{...u&&u.threadsById,[n]:{...u&&u.threadsById[n],...r}}})}(e,t,n,{[r]:u})}function v(e,t){const n=t.reduce((e,t)=>(e[t.chatId]||(e[t.chatId]={}),e[t.chatId][t.id]=t,e),{});return Object.keys(n).map(Number).forEach(t=>{e=w(e,t,n[t])}),e}function w(e,t,n){const r=Object(h.m)(e,t);return r&&Object.keys(n).every(e=>Boolean(r[Number(e)]))?e:p(e,t,{...n,...r})}function O(e,t,n,r){const u=Object(h.m)(e,t)||{},d={...u[n],...r};return d.id?p(e,t,{...u,[n]:d}):e}function I(e,t,n,r){const u=Object(h.qb)(e,t)||{},d={...u[n],...r};return d.id?P(e,t,{...u,[n]:d},void 0):e}function j(e,t,n){const r=Object(h.m)(e,t);if(!r)return e;const d=Object(u.j)(r,n),o=Object.values(Object(u.m)(r,n)).filter(({forwardInfo:e})=>e&&e.isLinkedChannelPost);if(Object.keys(e.messages.byChatId[t].threadsById).map(Number).forEach(r=>{let u=Object(h.Y)(e,t,r),d=Object(h.gb)(e,t,r),o=Object(h.Hb)(e,t,r),c=Object(h.jb)(e,t);n.forEach(e=>{u&&u.includes(e)&&(u=u.filter(t=>t!==e)),d&&d.includes(e)&&(d=d.filter(t=>t!==e)),o&&o.includes(e)&&(o=o.filter(t=>t!==e)),c&&c.includes(e)&&(c=c.filter(t=>t!==e))}),e=y(e,t,r,"listedIds",u),e=y(e,t,r,"outlyingIds",d),e=y(e,t,r,"viewportIds",o),e=y(e,t,r,"pinnedIds",c)}),o.length){const n=Object(h.y)(e),r=n&&n.chatId===t&&"thread"===n.type,u=n&&n.threadId;o.forEach(n=>{const{fromChatId:d,fromMessageId:o}=n.forwardInfo,c=Object(h.k)(e,d,o);r&&u===o&&(e=m(e,t)),c&&(e=O(e,d,o,{threadInfo:void 0}))})}return e=p(e,t,d)}function C(e,t,n){const r=Object(h.qb)(e,t);if(!r)return e;const d=Object(u.j)(r,n);let o=Object(h.ob)(e,t);return o&&(n.forEach(e=>{o.includes(e)&&(o=o.filter(t=>t!==e))}),e=y(e,t,b.MAIN_THREAD_ID,"scheduledIds",o)),e=P(e,t,d,void 0)}function E(e,t,n,r){const u=Object(h.Y)(e,t,n),d=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!d.length?e:y(e,t,n,"listedIds",M([...u||[],...d]))}function S(e,t,n,r){const u=Object(h.gb)(e,t,n),d=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!d.length?e:y(e,t,n,"outlyingIds",M([...u||[],...d]))}function M(e){return e.sort((e,t)=>e-t)}function A(e,t,n,u){const d=Object(h.Hb)(e,t,n)||[];if(d.includes(u))return e;return y(e,t,n,"viewportIds",M([...d.length{e=N(e,t.chatId,t.threadId,t)}),e}function P(e,t,n,r){return function(e,t,n){const r=e.scheduledMessages.byChatId[t]||{byId:{},hash:0};return{...e,scheduledMessages:{byChatId:{...e.scheduledMessages.byChatId,[t]:{...r,...n}}}}}(e,t,{byId:n,hash:r})}function D(e,t,n,r=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r}}}function F(e,t){return{...e,focusedMessage:{...e.focusedMessage,direction:t}}}function L(e,t,n){return{...e,selectedMessages:{chatId:t,messageIds:n?Array.prototype.concat([],n):[]}}}function B(e,t,n,r,d,o,c,a=!1){const{selectedMessages:i}=e;o&&(c=Object(h.ab)(e,t,o));const s=c||[d];if(!i)return L(e,t,s);const{messageIds:f}=i;let l;const b=s.filter(e=>!f.includes(e));if(b&&!b.length)l=f.filter(e=>!s.includes(e));else if(a&&f.length){const o=Object(h.x)(e,t,n,r),c=o.indexOf(f[f.length-1]),a=o.indexOf(d),i=Math.min(c,a),s=Math.max(c,a),b=o.slice(i,s+1);l=Object(u.o)([...f,...b])}else l=[...f,...b];return l.length?{...e,selectedMessages:{...i,messageIds:l}}:x(e)}function x(e){return{...e,selectedMessages:void 0}}function R(e,t,n,r,d){const o=r.map(t=>{const n=e.stickers.setsById[t.id];return n?{...n,...t}:t});return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,...Object(u.c)(o,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:d}:{setIds:r.map(({id:e})=>e)}}}}}function U(e,t,n){const r=e.stickers.setsById[t]||{};return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,[t]:{...r,...n}}}}}function _(e,t,n,r){const{results:u}=e.gifs.search;let d;if(t||!u)d=n;else{const e=new Set(u.map(e=>e.id));d=[...u,...n.filter(t=>!e.has(t.id))]}return{...e,gifs:{...e.gifs,search:{...e.gifs.search,offset:r,results:d}}}}function G(e,t){return{...e,animatedEmojis:t}}function $(e,t,n,r){const d=[...Object(h.yb)(e,t),...n||[]],o=Object(u.o)(d.map(({id:e})=>e)),c=Object(u.c)(d,"id"),a=o.map(e=>c[e]);return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:a,hash:r}}}}function W(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?$(e,t,n,r):e}var H=n(50);function K(e,t){return{...e,users:{...e.users,byId:t}}}function z(e,t,n){const{byId:r}=e.users,{hash:d,userIds:o}=e.contactList||{},c=r[t],a=n.isMin&&c&&!c.isMin,i={...c,...a?Object(u.j)(n,["isMin","accessHash"]):n};return i.id&&i.type?(i.isContact&&o&&!o.includes(t)&&(e={...e,contactList:{hash:d||0,userIds:[t,...o]}}),K(e,{...r,[t]:i})):e}function V(e,t){return Object.keys(t).map(Number).forEach(n=>{e=z(e,n,t[n])}),e}function q(e,t){const{byId:n}=e.users;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=z(e,r,t[r]))}),e}function J(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function Y(e,t){const{byId:n}=e.users,{hash:r,userIds:u}=e.contactList||{};return delete n[t],K(e={...e,contactList:{hash:r||0,userIds:u?u.filter(e=>e!==t):H.a}},n)}const Q=e=>`${e.chatId}_${e.id}`;function Z(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function X(e,t){return Z(e,{currentContent:t})}function ee(e,t,n,r,d){const{resultsByType:o}=e.globalSearch||{},c=t.reduce((e,t)=>(e[Q(t)]=t,e),{}),a=o&&o[r]?o[r].foundIds:void 0;if(void 0!==a&&Object.keys(c).every(e=>a.includes(Q(c[e]))))return te(e,{messages:!1});const i=a||[],s=t.map(e=>Q(e)),f=Array.prototype.concat(i,s),l=Object(u.a)(i,f)?i:f;return Z(e=te(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:d,foundIds:l}}})}function te(e,t){return Z(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var ne=n(4);function re(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function ue(e,t,n,r,u){const d=Object(ne.a)(t,n);return re(e,d,{...e.localTextSearch.byChatThreadKey[d],isActive:r,query:u})}function de(e,t,n,r,u,d){const o=Object(ne.a)(t,n);return re(e,o,{...e.localTextSearch.byChatThreadKey[o],results:{foundIds:r,totalCount:u,nextOffsetId:d}})}function oe(e,t,n,r,d,o){const c=Object(ne.a)(t,n),{results:a}=e.localTextSearch.byChatThreadKey[c]||{},i=a&&a.foundIds||[],s=se(Object(u.o)(Array.prototype.concat(i,r)));return de(e,t,n,Object(u.a)(i,s)?i:s,d,o)}function ce(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function ae(e,t,n){return ce(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function ie(e,t,n,r,d,o){const{resultsByType:c}=e.localMediaSearch.byChatId[t]||{},a=c&&c[n]?c[n].foundIds:[],i=se(Object(u.o)(Array.prototype.concat(a,r)));return function(e,t,n,r,u,d){return ce(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:u,nextOffsetId:d}}})}(e,t,n,Object(u.a)(a,i)?a:i,d,o)}function se(e){return e.sort((e,t)=>e-t)}function fe(e,t){return{...e,management:{...e.management,progress:t}}}function le(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function be(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function he(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function me(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function pe(e,t,n,r){switch(t){case"contact":return be(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return be(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return be(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function ge(e,t){return{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function ye(e,t){return{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter(e=>e!==t),totalCount:e.blocked.totalCount-1}}}function ve(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function we(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function Oe(e,t){return{...e,payment:{...e.payment,formId:t}}}function Ie(e,t){return{...e,payment:{...e.payment,step:t}}}function je(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,description:u,photoUrl:d}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,description:u,photoUrl:d}}}}function Ce(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Ee(e,t){return{...e,payment:{...e.payment,...t}}}function Se(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:u,text:d,title:o}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:u,text:d,title:o}}}}function Me(e){return{...e,payment:{}}}function Ae(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},function(e,t,n){"use strict";var r=n(0);t.a=function(e,t){const n=Object(r.q)(),{current:u}=n;return t&&void 0===e||(n.current=e),u}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));function r(e,t=30){return!e||e.length<=t?e:e.substr(0,t)+"..."}},function(e){e.exports=JSON.parse('{"--color-primary":["#50A2E9","#8378DB"],"--color-primary-opacity":["#50A2E980","#8378DB80"],"--color-primary-shade":["#4a95d6","#7b71c6"],"--color-background":["#FFFFFF","#212121"],"--color-background-secondary":["#f4f4f5","#121212"],"--color-background-secondary-accent":["#E4E4E5","#100f10"],"--color-background-own":["#EEFEDF","#8378DB"],"--color-background-selected":["#F4F4F5","#2C2C2C"],"--color-background-own-selected":["#d4fcae","#7b71c6"],"--color-chat-hover":["#F4F4F5","#2C2C2C"],"--color-chat-active":["#4C90E6","#8378DB"],"--color-item-active":["#ededed","#292929"],"--color-text":["#000000","#FFFFFF"],"--color-text-secondary":["#707579","#AAAAAA"],"--color-borders":["#DADCE0","#100F10"],"--color-borders-input":["#DADCE0","#5B5B5A"],"--color-links":["#52A1EF","#868DF6"],"--color-links-hover":["#2d8dec","#6b5fcc"],"--color-gray":["#C4C9CC","#717579"],"--color-pinned":["#C4C9CC","#707579"],"--color-default-shadow":["#72727240","#1010109c"],"--color-light-shadow":["#7272722B","#00000040"],"--color-green":["#4DCD5E","#8378DB"],"--color-text-meta-colored":["#4DCD5E","#8378DB"],"--color-reply-hover":["#F4F4F4","#272727"],"--color-reply-active":["#E8E9E9","#2E2F2F"],"--color-reply-own-hover":["#DBF4CE","#6458bc"],"--color-reply-own-active":["#C8EBBC","#4F4A9F"],"--color-accent-own":["#4FAE4E","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#52A1EF","#FFFFFF"],"--color-code":["#4a729a","#93c4ef"],"--color-code-own":["#3c7940","#FFFFFF"],"--color-code-bg":["#70757914","#ffffff26"],"--color-code-own-bg":["#70757914","#ffffff26"]}')},function(e,t,n){"use strict";function r(e){return new Promise((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)})}let u;function d(){return u||(u=function(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const u=r(n);return(e,n)=>u.then(r=>n(r.transaction(t,e).objectStore(t)))}("keyval-store","keyval")),u}function o(e,t=d()){return t("readonly",t=>r(t.get(e)))}function c(e,t=d()){return t("readwrite",t=>(t.delete(e),r(t.transaction)))}function a(e,t){return e("readonly",e=>(e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},r(e.transaction)))}function i(e=d()){const t=[];return a(e,e=>t.push(e.key)).then(()=>t)}n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return i}))},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(25);n(97);t.a=e=>{const{icon:t,className:n,children:o,onClick:c,href:a,download:i,disabled:s,destructive:f,ariaLabel:l}=e,b=Object(d.a)(),h=Object(r.m)(e=>{if(s||!c)return e.stopPropagation(),void e.preventDefault();c(e)},[s,c]),m=Object(r.m)(e=>{if(13===e.keyCode||32===e.keyCode)return s||!c?(e.stopPropagation(),void e.preventDefault()):void c(e)},[s,c]),p=Object(u.a)("MenuItem",n,s&&"disabled",f&&"destructive"),g=r.a.createElement(r.a.Fragment,null,t&&r.a.createElement("i",{className:"icon-"+t,"data-char":t.startsWith("char-")?t.replace("char-",""):void 0}),o);return a?r.a.createElement("a",{tabIndex:0,className:p,href:a,download:i,"aria-label":l,title:l,target:a.startsWith(window.location.origin)?"_self":"_blank",rel:"noopener noreferrer",dir:b.isRtl?"rtl":void 0,onClick:c},g):r.a.createElement("div",{role:"button",tabIndex:0,className:p,onClick:h,onKeyDown:m,"aria-label":l,title:l,dir:b.isRtl?"rtl":void 0},g)}},function(e,t,n){"use strict";var r=n(0),u=n(9);n(91);t.a=Object(r.h)(()=>{const[e,t]=Object(r.r)([]),n=Object(r.p)(()=>Object(u.a)(()=>{t([])},700,!1),[]),d=Object(r.m)(r=>{if(0!==r.button)return;const u=r.currentTarget,d=u.getBoundingClientRect(),o=u.offsetWidth/2;t([...e,{x:r.clientX-d.x-o/2,y:r.clientY-d.y-o/2,size:o}]),requestAnimationFrame(()=>{n()})},[e,n]);return r.a.createElement("div",{className:"ripple-container",onMouseDown:d},e.map(({x:e,y:t,size:n})=>r.a.createElement("span",{style:`left: ${e}px; top: ${t}px; width: ${n}px; height: ${n}px;`})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return f})),n.d(t,"c",(function(){return l}));var r=n(83),u=n.n(r),d=n(7),o=n(13),c=n(9);let a,i;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function f(e,t){for(b();!i.wasmReady;)await Object(c.e)(2e3);const{result:n,width:r,height:u}=await function(e,t){return new Promise(n=>{i.requests=i.requests||new Map,i.requests.set(e,n),i.postMessage({id:e,blob:t})})}(e,t);if(r&&u)return function({result:e,width:t,height:n}){a||(a=document.createElement("canvas"));return new Promise(r=>{const u=new ImageData(e,t,n);a.width=t,a.height=n;a.getContext("2d").putImageData(u,0,0),a.toBlob(e=>{r(null!=e?e:void 0)},"image/png",1)})}({result:n,width:r,height:u})}async function l(e,t){if(Object(d.p)()||"data:image/webp"!==t.substr(0,15))return t;b();const n=await f(e,Object(o.d)(t));if(!n)throw new Error("Can't convert webp to png. Url: "+t);return Object(o.a)(n)}function b(){i||(i=new u.a,i.wasmReady=!1,i.onmessage=h)}function h(e){const{id:t}=e.data;switch(e.data.type){case"initialized":i.wasmReady=!0;break;case"result":if(i.requests.has(t)){const n=i.requests.get(t);i.requests.delete(t),n(e.data)}}}},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(25);t.a=Object(r.h)(({ref:e,id:t,className:n,value:o,label:c,error:a,success:i,disabled:s,readOnly:f,placeholder:l,autoComplete:b,inputMode:h,maxLength:m,onChange:p,onInput:g,onKeyPress:y,onKeyDown:v,onBlur:w})=>{const O=Object(d.a)(),I=a||i||c,j=Object(u.a)("input-group",o&&"touched",a?"error":i&&"success",s&&"disabled",f&&"disabled",I&&"with-label",n);return r.a.createElement("div",{className:j,dir:O.isRtl?"rtl":void 0},r.a.createElement("input",{ref:e,className:"form-control",type:"text",id:t,dir:"auto",value:o||"",placeholder:l,maxLength:m,autoComplete:b,inputMode:h,disabled:s,readOnly:f,onChange:p,onInput:g,onKeyPress:y,onKeyDown:v,onBlur:w}),I&&r.a.createElement("label",{htmlFor:t},I))})},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(25),o=n(21);n(93);t.a=Object(r.h)(({id:e,name:t,value:n,label:c,subLabel:a,checked:i,disabled:s,round:f,blocking:l,isLoading:b,onChange:h,onCheck:m})=>{const p=Object(d.a)(),g=Object(r.m)(e=>{h&&h(e),m&&m(e.currentTarget.checked)},[h,m]),y=Object(u.a)("Checkbox",s&&"disabled",f&&"round",b&&"loading",l&&"blocking");return r.a.createElement("label",{className:y,dir:p.isRtl?"rtl":void 0},r.a.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:i,disabled:s,onChange:g}),r.a.createElement("div",{className:"Checkbox-main"},r.a.createElement("span",{className:"label",dir:"auto"},c),a&&r.a.createElement("span",{className:"subLabel",dir:"auto"},a)),b&&r.a.createElement(o.a,null))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(55);function u(e){return Object(r.a)({onEsc:e})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var r=n(0);let u,d=!1;const o=e=>{document.dispatchEvent(new Event("tt-event-heavy-animation-start")),d=!0,u&&(clearTimeout(u),u=void 0),u=window.setTimeout(()=>{d=!1,document.dispatchEvent(new Event("tt-event-heavy-animation-end")),u=void 0},e)};t.a=(e,t)=>{Object(r.n)(()=>(d&&e(),document.addEventListener("tt-event-heavy-animation-start",e),document.addEventListener("tt-event-heavy-animation-end",t),()=>{document.removeEventListener("tt-event-heavy-animation-end",t),document.removeEventListener("tt-event-heavy-animation-start",e)}),[t,e])}},function(e,t,n){"use strict";function r(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function u(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function d(e){return e<1e3?e:e<1e6?u(e/1e3)+"K":u(e/1e6)+"M"}function o(e,t=2){return e.replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi,"").trim().split(/\s+/).slice(0,t).map(e=>e.length&&e.match(/./u)[0].toUpperCase()).join("")}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return d})),n.d(t,"c",(function(){return o}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const r=[]},function(e,t,n){"use strict";var r=n(38);t.a=(e,t)=>{const n=Object(r.a)(t);n&&!t.some((e,t)=>e!==n[t])||e(n||[])}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));const r=/[^\wа-яё]+/;function u(e,t){if(!e||!t)return!1;const n=e.toLowerCase().split(r);return t.toLowerCase().split(r).every(e=>n.some(t=>t.startsWith(e)))}},function(e,t,n){"use strict";var r=n(0),u=n(35),d=n(63),o=n(79),c=n(58),a=n(47),i=n(8),s=n(48);n(95);t.a=({ref:e,containerRef:t,isOpen:n,className:f,style:l,children:b,positionX:h="left",positionY:m="top",autoClose:p=!1,footer:g,noCloseOnBackdrop:y=!1,onCloseAnimationEnd:v,onClose:w,onMouseEnter:O,onMouseLeave:I})=>{let j=Object(r.q)(null);e&&(j=e);const C=t||j,{transitionClassNames:E}=Object(u.a)(n,v);Object(r.n)(()=>n&&w?Object(a.a)(w):void 0,[n,w]),Object(c.a)(([e])=>{void 0!==e&&Object(s.b)(200)},[n]);const S=Object(d.a)(j,n,p?w:void 0,void 0,!0);Object(o.a)(n,C,y?void 0:w);const M=Object(i.a)("bubble menu-container custom-scroll",m,h,g&&"with-footer",E);return r.a.createElement("div",{className:Object(i.a)("Menu no-selection",f),onKeyDown:n?S:void 0,onMouseEnter:O,onMouseLeave:n?I:void 0,style:l},n&&r.a.createElement("div",{className:"backdrop"}),r.a.createElement("div",{ref:j,className:M,style:`transform-origin: ${m} ${h}`,onClick:p?w:void 0},b,g&&r.a.createElement("div",{className:"footer"},g)))}},function(e,t,n){"use strict";n.d(t,"b",(function(){return y})),n.d(t,"c",(function(){return v})),n.d(t,"a",(function(){return w}));var r=n(5),u=n(1),d=n(10),o=n(12),c=n(13),a=n(7),i=n(81),s=n.n(i),f=n(82),l=n.n(f);async function b(e){const t=await new Response(e).arrayBuffer();return new Promise(e=>{const n=new Uint8Array(t);let r=new s.a,u=new l.a;r.onmessage=e=>{null===e.data?u.postMessage({command:"done"}):u.postMessage({command:"encode",buffers:e.data},e.data.map(({buffer:e})=>e))},u.onmessage=t=>{"page"===t.data.message&&(e(new Blob([t.data.page],{type:"audio/wav"})),r.terminate(),r=void 0,u.terminate(),u=void 0)},u.postMessage({command:"init",wavBitDepth:16,wavSampleRate:48e3}),r.postMessage({command:"init",decoderSampleRate:48e3,outputBufferSampleRate:48e3}),r.postMessage({command:"decode",pages:n},[n.buffer])})}var h=n(44);const m={[r.ApiMediaFormat.DataUri]:o.a.Text,[r.ApiMediaFormat.BlobUrl]:o.a.Blob,[r.ApiMediaFormat.Lottie]:o.a.Json,[r.ApiMediaFormat.Progressive]:void 0,[r.ApiMediaFormat.Stream]:void 0},p=new Map,g=new Map;function y(e,t,n){if(t===r.ApiMediaFormat.Progressive)return a.i?function(e){const t="./progressive/"+e;return p.set(e,t),Promise.resolve(t)}(e):y(e,r.ApiMediaFormat.BlobUrl,n);if(!g.has(e)){const i=async function(e,t,n){if(!u.M){const n=e.startsWith("avatar")?u.O:u.N,r=await o.c(n,e,m[t]);if(r){let t=r;if("audio/ogg"!==r.type||a.h||(t=await b(t)),"image/webp"===r.type&&!Object(a.p)()&&t){const n=await Object(h.b)(e,t);n&&(t=n)}const n=O(t);return p.set(e,n),n}}if(t===r.ApiMediaFormat.Stream){const r=new MediaSource,u=URL.createObjectURL(r);let o=!1;return r.addEventListener("sourceopen",()=>{if(o)return;o=!0;const u=r.addSourceBuffer("audio/mpeg");Object(d.a)("downloadMedia",{url:e,mediaFormat:t},(e,t)=>{n&&n(e),1===e&&r.endOfStream(),t&&u.appendBuffer(t)})}),p.set(e,u),u}const i=await Object(d.a)("downloadMedia",{url:e,mediaFormat:t},n);if(!i)throw new Error("Failed to fetch media");let{prepared:s,mimeType:f}=i;if("audio/ogg"===f&&!a.h){const e=await Object(c.e)(s);URL.revokeObjectURL(s);const t=await b(e);s=O(t),f=e.type}if("image/webp"===f&&!Object(a.p)()){const t=await Object(c.e)(s);URL.revokeObjectURL(s);const n=await Object(h.b)(e,t);n&&(s=O(n))}return p.set(e,s),s}(e,t,n).catch(e=>{u.p&&console.warn(e)}).finally(()=>{g.delete(e)});g.set(e,i)}return g.get(e)}function v(e){return p.get(e)}function w(e){Object(d.b)(e)}function O(e){return e instanceof Blob?URL.createObjectURL(e):e}a.i&&navigator.serviceWorker.addEventListener("message",async e=>{const{type:t,messageId:n,params:u}=e.data;if("requestPart"!==t)return;const o=await Object(d.a)("downloadMedia",{mediaFormat:r.ApiMediaFormat.Progressive,...u});if(!o)return;const{arrayBuffer:c,mimeType:a,fullSize:i}=o;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:c,mimeType:a,fullSize:i}},[c])})},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));const r={Enter:"onEnter",Backspace:"onBackspace",Delete:"onDelete",Esc:"onEsc",Escape:"onEsc",ArrowUp:"onUp",ArrowDown:"onDown",ArrowLeft:"onLeft",ArrowRight:"onRight",Tab:"onTab"},u={onEnter:[],onDelete:[],onBackspace:[],onEsc:[],onUp:[],onDown:[],onLeft:[],onRight:[],onTab:[]};function d(e){return o()||document.addEventListener("keydown",c,!0),Object.keys(e).forEach(t=>{const n=e[t];if(!n)return;const r=u[t];r&&r.push(n)}),()=>{!function(e){Object.keys(e).forEach(t=>{const n=e[t],r=u[t];if(r){const e=r.findIndex(e=>e===n);-1!==e&&r.splice(e,1)}}),o()||document.removeEventListener("keydown",c,!1)}(e)}}function o(){return Object.values(u).some(e=>Boolean(e.length))}function c(e){const t=r[e.key];if(!t)return;const{length:n}=u[t];if(!n)return;e.stopPropagation();(0,u[t][n-1])(e)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return i}));var r=n(9),u=n(1),d=n(7);const o=d.g&&s();let c=i();const a=Object(r.g)(()=>{c=i(),((c.width<=u.db||c.width<=u.cb&&c.height<=u.bb)!==d.g||d.g&&o!==s())&&window.location.reload()},250,!0);function i(){const e=.01*window.innerHeight;return document.documentElement.style.setProperty("--vh",e+"px"),{width:window.innerWidth,height:window.innerHeight}}function s(){return d.e?window.matchMedia("(orientation: landscape)").matches:window.matchMedia("screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)").matches}window.addEventListener("resize",a),window.addEventListener("orientationchange",a),t.a={get:()=>c}},function(e,t,n){"use strict";var r=n(0),u=n(2);const d=e=>{const t=[];let n=0;const r=e.length;let u;for(;n65535&&(u-=65536,t.push(String.fromCharCode(u>>>10&1023|55296)),u=56320|1023&u),t.push(String.fromCharCode(u))}return t.join("")};function o(e,t,n){let r;for(e=n?Math.floor(e/700):e>>1,e+=Math.floor(e/t),r=0;e>455;r+=36)e=Math.floor(e/35);return Math.floor(r+36*e/(e+38))}function c(e,t){const n=[],r=[],u=e.length;let c,a,i,s,f,l,b,h,m,p,g,y,v;for(c=128,i=0,s=72,f=e.lastIndexOf("-"),f<0&&(f=0),l=0;l=128)throw new RangeError("Illegal input >= 0x80");n.push(e.charCodeAt(l))}for(b=f>0?f+1:0;b=u)throw RangeError("punycode_bad_input(1)");if(g=(w=e.charCodeAt(b++))-48<10?w-22:w-65<26?w-65:w-97<26?w-97:36,g>=36)throw RangeError("punycode_bad_input(2)");if(g>Math.floor((2147483647-i)/m))throw RangeError("punycode_overflow(1)");if(i+=g*m,y=p<=s?1:p>=s+26?26:p-s,gMath.floor(2147483647/(36-y)))throw RangeError("punycode_overflow(2)");m*=36-y}if(a=n.length+1,s=o(i-h,a,0===h),Math.floor(i/a)>2147483647-c)throw RangeError("punycode_overflow(3)");c+=Math.floor(i/a),i%=a,t&&r.splice(i,0,e.charCodeAt(b-1)-65<26),n.splice(i,0,c),i++}var w;if(t)for(i=0,v=n.length;iObject(s.l)(t,["toggleSafeLinkModal","openTelegramLink"]))(({url:e,text:t,className:n,children:u,isRtl:d,toggleSafeLinkModal:o,openTelegramLink:c})=>{const a=u||t,s=e!==a,h=Object(r.m)(t=>t.ctrlKey||t.altKey||t.shiftKey||t.metaKey||!e||!e.match(i.ib)&&!e.match(i.hb)?!s||(o({url:e}),t.preventDefault(),!1):(t.preventDefault(),c({url:e}),!1),[s,c,o,e]);if(!e)return;const m=Object(f.a)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.a.createElement("a",{href:l(e),title:b(e),target:"_blank",rel:"noopener noreferrer",className:m,onClick:h,dir:d?"rtl":"auto"},a)}))},function(e,t,n){"use strict";var r=n(0),u=n(38);t.a=(e,t)=>{const n=Object(u.a)(t);return Object(r.n)(()=>e(n||[]),t)}},function(e,t,n){"use strict";n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"d",(function(){return d})),n.d(t,"a",(function(){return o})),n.d(t,"c",(function(){return c}));function r(e){return e>536870912?(e/1073741824).toFixed(1)+" GB":e>524288?(e/1048576).toFixed(1)+" MB":(e/1024).toFixed(1)+" KB"}function u(e){const{fileName:t,mimeType:n}=e;return d(t,n)}function d(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function o(e){switch(e){case"apk":case"xls":case"xlsx":return"green";case"zip":case"rar":case"7z":case"tar":case"gz":case"ppt":case"pptx":return"orange";case"pdf":case"xps":return"red";default:return"default"}}function c(e){return Boolean(e.previewBlobUrl||e.thumbnail)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return o}));const r={missing_payment_information:{field:"cardNumber",fieldError:"Incorrect card number"},invalid_number:{field:"cardNumber",fieldError:"Incorrect card number"},number:{field:"cardNumber",fieldError:"Incorrect card number"},exp_year:{field:"expiry",fieldError:"Incorrect year"},exp_month:{field:"expiry",fieldError:"Incorrect month"},invalid_expiry_year:{field:"expiry",fieldError:"Incorrect year"},invalid_expiry_month:{field:"expiry",fieldError:"Incorrect month"},cvc:{field:"cvv",fieldError:"Incorrect CVV"},invalid_cvc:{field:"cvv",fieldError:"Incorrect CVV"}};function u(e){const{message:t,code:n,param:u}=e,{field:d,fieldError:o,description:c}=u?r[u]:r[n];return{field:d,fieldError:o,description:c||t}}const d={ADDRESS_STREET_LINE1_INVALID:{field:"streetLine1",fieldError:"Incorrect street address"},ADDRESS_STREET_LINE2_INVALID:{field:"streetLine2",fieldError:"Incorrect street address"},ADDRESS_CITY_INVALID:{field:"city",fieldError:"Incorrect city"},ADDRESS_COUNTRY_INVALID:{field:"countryIso2",fieldError:"Incorrect country"},ADDRESS_POSTCODE_INVALID:{field:"postCode",fieldError:"Incorrect post code"},ADDRESS_STATE_INVALID:{field:"state",fieldError:"Incorrect state"},REQ_INFO_NAME_INVALID:{field:"fullName",fieldError:"Incorrect name"},REQ_INFO_PHONE_INVALID:{field:"phone",fieldError:"Incorrect phone"},REQ_INFO_EMAIL_INVALID:{field:"email",fieldError:"Incorrect email"}};function o(e){return Object.values(e).reduce((e,t)=>{const n=d[t.message];return n&&(e={...e,[n.field]:n.fieldError}),e},{})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"a",(function(){return o}));var r=n(9);let u;function d(e,t){t||(u&&!u.isCancelled&&(u.isCancelled=!0),u=t={isCancelled:!1}),Object(r.b)(()=>{!t.isCancelled&&e()&&d(e,t)})}function o(e){Object(r.b)(()=>{e()&&o(e)})}},function(e,t,n){"use strict";var r=n(0),u=n(53);n(96);t.a=({trigger:e,className:t,children:n,positionX:d="left",positionY:o="top",footer:c})=>{const a=Object(r.q)(null),i=Object(r.q)(null),[s,f]=Object(r.r)(!1);return r.a.createElement("div",{ref:i,className:"DropdownMenu "+(t||""),onKeyDown:e=>{const t=a.current;if(!s||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{f(!s)},isOpen:s}),r.a.createElement(u.a,{ref:a,containerRef:i,isOpen:s,className:t||"",positionX:d,positionY:o,footer:c,autoClose:!0,onClose:()=>{f(!1)}},n))}},function(e,t,n){"use strict";var r=n(0);t.a=(e,t,n,u,d)=>{const[o,c]=Object(r.r)(-1);Object(r.n)(()=>{c(-1);const n=e.current;t&&n&&!d&&(n.tabIndex=-1,n.focus())},[e,t,d]);return Object(r.m)(t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n(o);if(38!==t.keyCode&&40!==t.keyCode)return;const d=document.activeElement,a=Array.from(u?r.querySelectorAll(u):r.children);let i=d&&a.indexOf(d)||o;if(38===t.keyCode&&i>0)i--;else if(40===t.keyCode&&i{if(e.length>24)return!1;if(!Boolean(e.match(u)))return!1;let t=0;for(;r.a.exec(e);)if(t++,t>3)return r.a.lastIndex=0,!1;return t}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return o}));const r=["female_sign","male_sign","medical_symbol"];function u(e){const t=e.split("-").map(e=>parseInt(e,16));return String.fromCodePoint(...t)}function d(e){let t;if(1===e.length)t=e.charCodeAt(0).toString(16).padStart(4,"0");else{const n=[];for(let t=0;t=55296&&e.charCodeAt(t)<=56319?e.charCodeAt(t+1)>=56320&&e.charCodeAt(t+1)<=57343&&n.push(1024*(e.charCodeAt(t)-55296)+(e.charCodeAt(t+1)-56320)+65536):(e.charCodeAt(t)<55296||e.charCodeAt(t)>57343)&&n.push(e.charCodeAt(t));t=n.map(e=>e.toString(16).padStart(4,"0")).join("-")}return t}function o(e){const t={categories:[],emojis:{}};for(let n=0;n{void 0!==e.props[r]&&void 0===t.props[r]&&g(n,r,e.props[r])}),u.forEach(r=>{void 0!==t.props[r]&&e.props[r]!==t.props[r]&&(void 0===e.props[r]?p(n,r,t.props[r]):function(e,t,n,r){"value"===t?e.value=void 0!==r?r:"":(g(e,t,n),p(e,t,r))}(n,r,e.props[r],t.props[r]))})}(t,n,Object(r.b)(t)),n.children=function(e,t,n){if(t.props.teactFastList)return function(e,t,n){const u=new Set(t.children.map(e=>{const t="props"in e&&e.props.key;return d.p&&Object(r.f)(e)&&!t&&console.warn("Missing `key` in `teactFastList`"),t}));let o=0;const c=e.children.reduce((e,r,d)=>{let c="props"in r?r.props.key:void 0;if(c&&!u.has(c))return f(n,r,void 0,t,-1),e;if(!c){const u=t.children[d],o=u&&"props"in u?u.props.key:void 0;if(!u||o)return f(n,r,void 0,t,-1),e;c="__indexKey#"+d}return e[c]={$element:r,index:o++,order:"props"in r?r.props.teactOrderKey:void 0},e},{});let a,i,s=[],l=0;t.children.forEach((e,r)=>{const u="props"in e?e.props.key:"__indexKey#"+r,d=c[u];if(!d)return a||(a=[],i=r),void a.push(e);a&&(s=s.concat(m(a,i,n,t)),i=void 0,a=void 0);const o="props"in e?e.props.teactOrderKey:void 0,b=d.index!==l&&d.order!==o,h=b&&l>d.index;b&&!h||l++,s.push(f(n,d.$element,e,t,r,{forceIndex:!0,...b&&{moveDirection:h?"down":"up"}}))}),a&&(s=s.concat(m(a,i,n,t)));return s}(e,t,n);const u=Math.max(e.children.length,t.children.length),o=[],c=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:c}:void 0);u&&o.push(u)}c&&n.appendChild(c);return o}(t,n,u?e:Object(r.b)(t))}}return n}function l(e,t,n,u){if(!Object(r.d)(e))return e;const{componentInstance:d}=e;if(!d.isMounted){b(e=Object(r.i)(d),t,n,u);const o=e.children[0];Object(r.d)(o)&&(e.children=[l(o,e,0,u)]),d.isMounted=!0}return e}function b(e,t,n,r){const{componentInstance:u}=e;u.onUpdate=()=>{t.children[n]=f(r,t.children[n],u.$element,t,n,{skipComponentUpdate:!0})}}function h(e){if(Object(r.e)(e))return document.createTextNode("");if(Object(r.g)(e))return document.createTextNode(e.value);if(Object(r.d)(e))return h(e.children[0]);const{tag:t,props:n,children:u=[]}=e,d=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=d),Object.keys(n).forEach(e=>{p(d,e,n[e])}),e.children=u.map((t,n)=>f(d,void 0,t,e,n)),d}function m(e,t,n,r){if(1===e.length)return[f(n,void 0,e[0],r,t,{forceIndex:!0})];if(e.length>1){const u=document.createDocumentFragment(),d=e.map(e=>f(n,void 0,e,r,t,{fragment:u}));return n.childNodes[t]?n.insertBefore(u,n.childNodes[t]):n.appendChild(u),d}throw new Error("Unexpected input")}function p(e,t,n){void 0!==n&&("className"===t?e.className=n:"value"===t?e.value=n:"style"===t?e.style.cssText=n:t.startsWith("on")?Object(o.a)(e,t,n):t.startsWith("data-")||a.has(t)?e.setAttribute(t,n):c.has(t)||(e[i[t]||t]=n))}function g(e,t,n){"className"===t?e.className="":"value"===t?e.value="":"style"===t?e.style.cssText="":t.startsWith("on")?Object(o.c)(e,t,n):t.startsWith("data-")||a.has(t)?e.removeAttribute(t):c.has(t)||delete e[i[t]||t]}t.a={render:function(e,t){if(!t)return;let n=t.getAttribute("data-teact-head-id");n||(n=Object(u.a)(s),s[n]={children:[]},t.setAttribute("data-teact-head-id",n));const r=s[n];r.children=[f(t,r.children[0],e,r,0)]}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return h}));var r=n(0),u=n(4),d=n(39),o=n(23),c=n(2),a=n(3),i=n(8),s=n(27);var f=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["openUserInfo"]))(({className:e,sender:t,openUserInfo:n,children:u})=>{const d=Object(r.m)(()=>{t&&n({id:t.id})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("UserLink",e),onClick:d},u):u});var l=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["focusMessage"]))(({className:e,message:t,children:n,focusMessage:u})=>{const d=Object(r.m)(()=>{t&&u({chatId:t.chatId,messageId:t.id})},[u,t]);return t?r.a.createElement(s.a,{className:Object(i.a)("MessageLink",e),onClick:d},n):n});var b=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["openChat"]))(({className:e,chatId:t,openChat:n,children:u})=>{const d=Object(r.m)(()=>{t&&n({id:t})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("ChatLink",e),onClick:d},u):u});function h(e,t,n,c,a,i,s={}){if(!t.content.action)return[];const{text:f}=t.content.action,h=[],g={...s,maxTextLength:16};let y,v=p(f,"%action_origin%",n?!s.isEmbedded&&function(e,t,n){return Object(u.fb)(t)?function(e,t,n){const c=Object(d.a)(Object(u.l)(e,t));if(n)return c;return r.a.createElement(b,{className:"action-link",chatId:t.id},t&&Object(o.a)(c))}(e,t,n):m(t,n)}(e,n,s.asPlain)||" ":"User");return y=v.pop(),h.push(...v),v=p(y,"%target_user%",c?m(c,s.asPlain):"User"),y=v.pop(),h.push(...v),v=p(y,"%message%",a?function(e,t,n={}){const c=Object(u.N)(e,t),{photo:a,video:i,document:s,sticker:f}=Object(u.v)(t),b=c&&!a&&!i&&!s&&!f;let h=Object(d.a)(c,n.maxTextLength);a?h="a photo":i?h=i.isGif?"a GIF":"a video":s?h="a document":f&&(h=`«${c}»`);if(n.asPlain)return b?`«${h}»`:h;if(b)return r.a.createElement("span",null,"«",r.a.createElement(l,{className:"action-link",message:t},Object(o.a)(h)),"»");return r.a.createElement(l,{className:"action-link",message:t},Object(o.a)(h))}(e,a,g):"a message"),y=v.pop(),h.push(...v),v=p(y,"%product%",a?function(e){return e.content&&e.content.invoice?e.content.invoice.title:"a product"}(a):"a product"),y=v.pop(),h.push(...v),v=p(y,"%target_chat%",i?function(e,t){if(t)return"another chat";return r.a.createElement(b,{className:"action-link",chatId:e},"another chat")}(i,s.asPlain):"another chat"),h.push(...v),s.asPlain?h.join("").trim():h}function m(e,t){const n=Object(d.a)(Object(u.Z)(e));return t?n:r.a.createElement(f,{className:"action-link",sender:e},e&&Object(o.a)(n))}function p(e,t,n){const r=e.indexOf(t);if(r<0||!n)return[e];const u=[];return u.push(e.substring(0,r)),u.push(n),u.push(e.substring(r+t.length)),u}},function(e,t){},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"c",(function(){return d})),function(e){e.Bold="MessageEntityBold",e.Blockquote="MessageEntityBlockquote",e.BotCommand="MessageEntityBotCommand",e.Cashtag="MessageEntityCashtag",e.Code="MessageEntityCode",e.Email="MessageEntityEmail",e.Hashtag="MessageEntityHashtag",e.Italic="MessageEntityItalic",e.MentionName="MessageEntityMentionName",e.Mention="MessageEntityMention",e.Phone="MessageEntityPhone",e.Pre="MessageEntityPre",e.Strike="MessageEntityStrike",e.TextUrl="MessageEntityTextUrl",e.Url="MessageEntityUrl",e.Underline="MessageEntityUnderline",e.Unknown="MessageEntityUnknown"}(r||(r={}));const u=-1,d="MESSAGE_DELETED"},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),function(e){e[e.DataUri=0]="DataUri",e[e.BlobUrl=1]="BlobUrl",e[e.Lottie=2]="Lottie",e[e.Progressive=3]="Progressive",e[e.Stream=4]="Stream"}(r||(r={}))},function(e,t){},function(e,t){},function(e,t){},function(e,t,n){"use strict";var r=n(0),u=n(2),d=n(3),o=n(6);t.a=Object(u.h)((e,{userId:t})=>({userOrChat:t?Object(o.Gb)(e,t):void 0}),(e,t)=>Object(d.l)(t,["openChat","openChatByUsername"]))(({username:e,userOrChat:t,children:n,openChat:u,openChatByUsername:d})=>r.a.createElement("a",{onClick:()=>{t?u({id:t.id}):e&&d({username:e.substring(1)})},className:"text-entity-link",dir:"auto"},n))},function(e,t,n){"use strict";var r=n(61),u=n(40);let d=!1;const o=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,c=(e,t,n)=>(1-n)*e+n*t,a=Object.keys(u).map(e=>({property:e,colors:[i(u[e][0]),i(u[e][1])]}));function i(e){const t=o.exec(e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16),a:void 0!==t[4]?parseInt(t[4],16):void 0}}function s(e,t,n=1){a.forEach(({property:r,colors:u})=>{const d=Math.round(c(u[e].r,u[t].r,n)),o=Math.round(c(u[e].g,u[t].g,n)),a=Math.round(c(u[e].b,u[t].b,n)),i=void 0!==u[e].a?Math.round(c(u[e].a,u[t].a,n)):void 0;document.documentElement.style.setProperty(r,void 0!==i?`rgba(${d},${o},${a},${i/255})`:`rgb(${d},${o},${a})`)})}t.a=(e,t)=>{const n="dark"===e,u=d&&t,o=n?0:1,c=n?1:0,a=Date.now(),i=document.querySelector('meta[name="theme-color"]');document.documentElement.classList.remove("theme-"+(n?"light":"dark")),d&&document.documentElement.classList.add("no-animations"),document.documentElement.classList.add("theme-"+e),i&&i.setAttribute("content",n?"#212121":"#fff"),setTimeout(()=>{document.documentElement.classList.remove("no-animations")},500),d=!0,u?Object(r.b)(()=>{const e=Math.min((Date.now()-a)/200,1);return s(o,c,function(e){return 1-(1-e)**3.5}(e)),e<1}):s(o,c)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(1);function u(e){"function"==typeof window.navigator.setAppBadge&&window.navigator.setAppBadge(e).catch(e=>{r.p&&console.error(e)})}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(0);function u(e,t,n){Object(r.n)(()=>{const r=e=>{const r=t.current,u=e.target;r&&u&&(r.contains(e.target)&&!u.classList.contains("backdrop")||(e.preventDefault(),e.stopPropagation(),n&&n()))};return e&&n&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}},[e,t,n])}},function(e,t,n){e.exports=function(){return new Worker(n.p+"aaed5b6465e3e90ac269.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"01705582fc3eca0e007b.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"0dbbe0a906f6c2adf071.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"a66075669d8d0ac2d740.worker.js")}},function(e,t,n){"use strict";var r=n(2),u=n(7),d=n(14),o=n(77);Object(r.b)("init",e=>{const{theme:t,animationLevel:n,messageTextSize:r,language:c}=e.settings.byKey;Object(d.c)(c),document.documentElement.style.setProperty("--message-text-size",r+"px"),document.body.classList.add("initial"),document.body.classList.add("animation-level-"+n),document.body.classList.add(u.l?"is-touch-env":"is-pointer-env"),Object(o.a)(t,n>0),u.j&&document.body.classList.add("is-safari"),u.e?document.body.classList.add("is-ios"):u.b&&document.body.classList.add("is-android")}),Object(r.b)("setIsUiReady",(e,t,n)=>{const{uiReadyState:r}=n;return 2===r&&document.body.classList.remove("initial"),{...e,uiReadyState:r}}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return{...e,authPhoneNumber:r}}),Object(r.b)("setAuthRememberMe",(e,t,n)=>({...e,authRememberMe:Boolean(n)})),Object(r.b)("clearAuthError",e=>({...e,authError:void 0}))},function(e,t,n){"use strict";var r=n(2),u=n(1),d=n(10),o=n(29),c=n(12),a=n(78),i=n(19);Object(r.b)("initApi",(e,t)=>{(async()=>{u.E?Object(i.d)():(await Object(i.c)(),Object(i.a)()),Object(d.c)(t.apiUpdate,Object(i.e)())})()}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return Object(d.a)("provideAuthPhoneNumber",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthCode",(e,t,n)=>{const{code:r}=n;return Object(d.a)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthPassword",(e,t,n)=>{const{password:r}=n;return Object(d.a)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("uploadProfilePhoto",(e,t,n)=>{const{file:r}=n;Object(d.a)("uploadProfilePhoto",r)}),Object(r.b)("signUp",(e,t,n)=>{const{firstName:r,lastName:u}=n;return Object(d.a)("provideAuthRegistration",{firstName:r,lastName:u}),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("returnToAuthPhoneNumber",e=>(Object(d.a)("restartAuth"),{...e,authError:void 0})),Object(r.b)("gotToAuthQrCode",e=>(Object(d.a)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0})),Object(r.b)("saveSession",(e,t,n)=>{const{sessionData:r}=n;r?Object(i.f)(n.sessionData,e.currentUserId):Object(i.b)()}),Object(r.b)("signOut",()=>{(async()=>{await Object(o.d)(),await Object(d.a)("destroy"),Object(r.d)().reset()})()}),Object(r.b)("reset",()=>{Object(i.b)(),c.b(u.N),c.b(u.O),c.b(u.P),c.b(u.m);const e=u.F.replace(/\d+$/,""),t=(u.F.match(/\d+$/)||[0])[0];for(let n=0;n{(async()=>{await Object(d.a)("disconnect")})()}),Object(r.b)("loadNearestCountry",e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await Object(d.a)("fetchNearestCountry");Object(r.g)({...Object(r.e)(),authNearestCountry:e})})()}),Object(r.b)("setDeviceToken",(e,t,n)=>{Object(r.g)({...e,push:{deviceToken:n,subscribedAt:Date.now()}})}),Object(r.b)("deleteDeviceToken",e=>{const t={...e};delete t.push,Object(r.g)(t)})},function(e,t){var n,r,u=e.exports={};function d(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function c(e){if(n===setTimeout)return setTimeout(e,0);if((n===d||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:d}catch(e){n=d}try{r="function"==typeof clearTimeout?clearTimeout:o}catch(e){r=o}}();var a,i=[],s=!1,f=-1;function l(){s&&a&&(s=!1,a.length?i=a.concat(i):f=-1,i.length&&b())}function b(){if(!s){var e=c(l);s=!0;for(var t=i.length;t;){for(a=i,i=[];++f1)for(var n=1;n{switch(u.p&&"updateUserStatus"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){Object(d.c)(),Object(c.c)(e.settings.byKey.language)}(e);break;case"updateAuthorizationState":!function(e){let t=Object(r.e)();const n="authorizationStateReady"===t.authState,u=e.authorizationState;switch(Object(r.g)({...t,authState:u,authIsLoading:!1}),t=Object(r.e)(),u){case"authorizationStateLoggingOut":Object(r.g)({...t,isLoggingOut:!0});break;case"authorizationStateWaitCode":Object(r.g)({...t,authIsCodeViaApp:e.isCodeViaApp});break;case"authorizationStateWaitPassword":Object(r.g)({...t,authHint:e.hint});break;case"authorizationStateWaitQrCode":Object(r.g)({...t,authIsLoadingQrCode:!1,authQrCode:e.qrCode});break;case"authorizationStateReady":if(n)break;Object(r.g)({...t,isLoggingOut:!1,lastSyncTime:Date.now()})}}(n);break;case"updateAuthorizationError":!function(e){Object(r.g)({...Object(r.e)(),authError:e.message})}(n);break;case"updateConnectionState":!function(e){const{connectionState:t}=e,n=Object(r.e)();Object(r.g)({...n,connectionState:t}),"connectionStateReady"===t&&"authorizationStateReady"===n.authState?Object(r.d)().sync():"connectionStateBroken"===t&&Object(r.d)().signOut()}(n);break;case"updateSession":!function(e){if(!Object(r.e)().authRememberMe)return;const{sessionData:t}=e;Object(r.d)().saveSession({sessionData:t})}(n);break;case"updateCurrentUser":!function(e){const{currentUser:t}=e;Object(r.g)({...Object(o.nb)(Object(r.e)(),t.id,t),currentUserId:t.id}),function(e){const t=localStorage.getItem(u.nb);if(!t)return;const n=JSON.parse(t);n.id=e,localStorage.setItem(u.nb,JSON.stringify(n))}(t.id)}(n);break;case"error":"SESSION_REVOKED"===n.error.message&&t.signOut(),t.showError({error:n.error})}})},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t);n(22),function(){function e(){var t=Error.call(this,"ServiceWorker is not supported.");return Object.setPrototypeOf(t,e.prototype),t}e.prototype=Object.create(Error.prototype)}();var r=n.p+"serviceWorker.js";var u=n(1),d=n(2),o=n(7),c=n(29);function a(e){const t=e.data;if(!t.type)return;const n=Object(d.d)();switch(t.type){case"focusMessage":n.focusMessage(t.payload)}}function i(){navigator.serviceWorker.removeEventListener("message",a),navigator.serviceWorker.addEventListener("message",a),Object(c.a)()}o.k&&(window.addEventListener("load",async()=>{try{await navigator.serviceWorker.register(r),u.p&&console.log("[SW] ServiceWorker registered"),await navigator.serviceWorker.ready,navigator.serviceWorker.controller?(u.p&&console.log("[SW] ServiceWorker ready"),i()):(u.p&&console.error("[SW] ServiceWorker not available"),Object(d.d)().showError({error:{message:"SERVICE_WORKER_DISABLED"}}))}catch(e){u.p&&console.error("[SW] ServiceWorker registration failed: ",e)}}),window.addEventListener("focus",async()=>{await navigator.serviceWorker.ready,i()}));var s=n(66);const f={isLeftColumnShown:!0,isChatInfoShown:!1,uiReadyState:0,authRememberMe:!0,blocked:{ids:[],totalCount:0},users:{byId:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{}},scheduledMessages:{byChatId:{}},chatFolders:{byId:{},activeChatFolder:0},fileUploads:{byMessageLocalId:{}},recentEmojis:["grinning","kissing_heart","christmas_tree","brain","trophy"],stickers:{setsById:{},added:{},recent:{stickers:[]},favorite:{stickers:[]},featured:{setIds:[]},search:{},forEmoji:{}},emojiKeywords:{},gifs:{saved:{},search:{}},globalSearch:{},localTextSearch:{byChatThreadKey:{}},localMediaSearch:{byChatId:{}},management:{byChatId:{}},topPeers:{},mediaViewer:{},audioPlayer:{},forwardMessages:{},pollResults:{},payment:{},notifications:[],errors:[],activeSessions:[],settings:{byKey:{messageTextSize:u.s,animationLevel:u.d,messageSendKeyCombo:"enter",theme:"light",shouldAutoDownloadMediaFromContacts:!0,shouldAutoDownloadMediaInPrivateChats:!0,shouldAutoDownloadMediaInGroups:!0,shouldAutoDownloadMediaInChannels:!0,shouldAutoPlayGifs:!0,shouldAutoPlayVideos:!0,shouldSuggestStickers:!0,shouldLoopStickers:!0,language:"en"},themes:{light:{isBlurred:!0,patternColor:u.t},dark:{isBlurred:!0,patternColor:u.o}},privacy:{},notifyExceptions:{}},twoFaSettings:{}};var l=n(5),b=n(9),h=n(3),m=n(6);const p=Object(b.g)((function(){Object(b.c)(()=>{if(!g)return;const e=Object(d.e)();if(e.isLoggingOut)return;const t={...f,...Object(h.l)(e,["authState","authPhoneNumber","authRememberMe","authNearestCountry","currentUserId","contactList","topPeers","recentEmojis","emojiKeywords","push"]),isChatInfoShown:v(e),users:w(e),chats:O(e),messages:I(e),globalSearch:{recentlyFoundChatIds:e.globalSearch.recentlyFoundChatIds},settings:j(e),chatFolders:C(e)},n=JSON.stringify(t);localStorage.setItem(u.B,n)})}),1e3,!1);let g=!1;function y(e){if(!u.A){if(localStorage.getItem(u.nb)||localStorage.getItem(u.H))return g=!0,Object(d.a)(p),function(e){u.p&&console.time("global-state-cache-read");const t=localStorage.getItem(u.B),n=t?JSON.parse(t):void 0;u.p&&console.timeEnd("global-state-cache-read");n&&(n.settings.byKey={...e.settings.byKey,...n.settings.byKey},n.settings.themes={...e.settings.themes,...n.settings.themes},n.chatFolders={...e.chatFolders,...n.chatFolders});return{...e,...n}}(e);g=!1}}function v(e){return window.innerWidth>u.ab&&e.isChatInfoShown}function w(e){const{users:{byId:t,selectedId:n}}=e,r=[...(e.chats.listIds.active||[]).slice(0,u.z).filter(e=>e>0),...Object.keys(t)].slice(0,u.C);return{byId:Object(h.l)(t,r),selectedId:window.innerWidth>u.ab?n:void 0}}function O(e){const t=[...(e.chats.listIds.active||[]).slice(0,u.z)],{chatId:n}=Object(m.y)(e)||{};return{...e.chats,byId:Object(h.l)(e.chats.byId,n?[...t,n]:t),listIds:{active:t},isFullyLoaded:{},orderedPinnedIds:{active:e.chats.orderedPinnedIds.active}}}function I(e){const t={},{chatId:n}=Object(m.y)(e)||{};[...(e.chats.listIds.active||[]).slice(0,u.z),...n?[n]:[]].forEach(n=>{const r=e.messages.byChatId[n];if(!r)return;const u=r.threadsById[l.MAIN_THREAD_ID];u&&u.viewportIds&&(t[n]={byId:Object(h.l)(r.byId,u.viewportIds),threadsById:{[l.MAIN_THREAD_ID]:u}})});const r=Object(m.y)(e);return{byChatId:t,messageLists:!r||o.g?void 0:[{...r,threadId:l.MAIN_THREAD_ID,type:"thread"}]}}function j(e){const{byKey:t,themes:n}=e.settings;return{byKey:t,themes:n,privacy:{},notifyExceptions:{}}}function C(e){return{...e.chatFolders,activeChatFolder:0}}u.A||(Object(d.b)("saveSession",()=>{g=!0,Object(d.a)(p)}),Object(d.b)("reset",()=>{g=!1,Object(d.f)(p),localStorage.removeItem(u.B)})),Object(d.b)("init",()=>{const e=Object(h.d)(f),t=y(e)||e,n=Object(m.y)(t)||{};return window.history.replaceState(n,""),t});var E=n(0),S=n(56);const M=String(Date.now()+Math.random());let A;localStorage.setItem("tt-active-tab",M);const k=window.setInterval(()=>{A&&localStorage.getItem("tt-active-tab")!==M&&(A(),clearInterval(k))},2e3);var N=n(34),T=(n(84),n(85),n(87),n(31)),P=n(35),D=n(13);const F=["400 1em Roboto","500 1em Roboto"];function L(){if("fonts"in document)return Promise.all(F.map(e=>document.fonts.load(e)))}var B=n(54),x=n(11),R=n(8),U=(n(89),n.p+"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg"),_=n.p+"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg";function G(){const{listIds:e,byId:t}=Object(d.e)().chats;if(e.active)return Promise.all(e.active.slice(0,10).map(e=>{const n=t[e];if(!n)return;const r=Object(T.d)(n);return r?B.b(r,l.ApiMediaFormat.DataUri):void 0}))}const $={main:()=>Promise.all([Object(x.d)(x.a.Main,"Main").then(L),G()]),authPhoneNumber:()=>Promise.all([L(),Object(D.g)(U)]),authCode:()=>Object(D.g)(_),authPassword:()=>Object(D.g)(_),authQrCode:L};var W=Object(d.h)(e=>{const{theme:t}=e.settings.byKey,{background:n,backgroundColor:r}=e.settings.themes[t]||{};return{uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(n),hasCustomBackgroundColor:Boolean(r),isRightColumnShown:Object(m.W)(e)}},(e,t)=>Object(h.l)(t,["setIsUiReady"]))(({page:e,children:t,hasCustomBackground:n,hasCustomBackgroundColor:r,isRightColumnShown:u,setIsUiReady:d})=>{const[o,c]=Object(N.a)(),{shouldRender:a,transitionClassNames:i}=Object(P.a)(!o,void 0,!0);return Object(E.n)(()=>{let t;return Promise.race([Object(b.e)(700),(async()=>{try{await $[e]()}catch(e){}})()]).then(()=>{c(),d({uiReadyState:1}),t=window.setTimeout(()=>{d({uiReadyState:2})},1e3)}),()=>{t&&(clearTimeout(t),t=void 0),d({uiReadyState:0})}},[]),E.a.createElement("div",{id:"UiLoader"},t,a&&E.a.createElement("div",{className:Object(R.a)("mask",i)},"main"===e?E.a.createElement(E.a.Fragment,null,E.a.createElement("div",{className:"left"}),E.a.createElement("div",{className:Object(R.a)("middle",n&&"custom-bg-image",r&&"custom-bg-color",u&&"with-right-column")}),u&&E.a.createElement("div",{className:"right"})):E.a.createElement("div",{className:"blank"})))}),H=n(18),K=n(32),z=n(46),V=n(45),q=n(16),J=n(52),Y=n(23),Q=n(62),Z=n(42),X=n(21);n(98);const ee=200+u.c;var te=Object(E.h)(({id:e,value:t,isLoading:n,onChange:r})=>{const u=Object(E.q)(null),[d,o]=Object(E.r)(),[c,a]=Object(E.r)(H.a);function i(e){o(e),a(function(e=""){return e.length?H.a.filter(t=>Object(J.a)(t.name,e)):H.a}(e))}const s=Object(E.m)(e=>{const{countryId:t}=e.currentTarget.firstElementChild.dataset,n=H.a.find(e=>e.id===t);n&&r(n),setTimeout(()=>i(void 0),ee)},[r]),f=Object(E.m)(e=>{i(e.currentTarget.value)},[]),l=Object(E.m)(e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===d&&(n.value=""),i(n.value)},[d,t]);return E.a.createElement(Q.a,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:o})=>{const c=()=>{if(o)return;setTimeout(()=>{u.current.select()},50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},a=void 0!==d?d:t&&t.name||"";return E.a.createElement("div",{className:Object(R.a)("input-group",t&&"touched")},E.a.createElement("input",{ref:u,className:Object(R.a)("form-control",o&&"focus"),type:"text",id:e,value:a,autoComplete:"off",onClick:c,onFocus:c,onInput:f,onKeyDown:l}),E.a.createElement("label",null,"Country"),n?E.a.createElement(X.a,{color:"black"}):E.a.createElement("i",{onClick:c,className:Object(R.a)("css-icon-down",o&&"open")}))}},c.map(e=>E.a.createElement(Z.a,{key:e.id,className:t&&e.id===t.id?"selected":"",onClick:s},E.a.createElement("span",{"data-country-id":e.id}),E.a.createElement("span",{className:"country-flag"},Object(Y.a)(e.flag,["hq_emoji"])),E.a.createElement("span",{className:"country-name"},e.name),E.a.createElement("span",{className:"country-code"},e.code))),!c.length&&E.a.createElement(Z.a,{key:"no-results",className:"no-results",disabled:!0},E.a.createElement("span",null,"No countries matched your filter.")))});let ne=!1;var re=Object(E.h)(Object(d.h)(e=>Object(h.l)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),(e,t)=>Object(h.l)(t,["setAuthPhoneNumber","setAuthRememberMe","clearAuthError","loadNearestCountry","gotToAuthQrCode"]))(({connectionState:e,authState:t,authPhoneNumber:n,authIsLoading:r,authIsLoadingQrCode:u,authError:d,authRememberMe:c,authNearestCountry:a,setAuthPhoneNumber:i,setAuthRememberMe:s,loadNearestCountry:f,clearAuthError:l,gotToAuthQrCode:b})=>{const h=Object(E.q)(null),[m,p]=Object(E.r)(),[g,y]=Object(E.r)(),[v,w]=Object(E.r)(!1),[O,I]=Object(E.r)(),j=m?`${m.code} ${g||""}`:g,C=j&&j.replace(/[^\d]+/g,"").length>=7;Object(E.n)(()=>{o.l||h.current.focus()},[m]),Object(E.n)(()=>{"connectionStateReady"!==e||a||f()},[e,a,f]),Object(E.n)(()=>{!a||m||v||p(Object(H.d)(a))},[m,a,v]);const S=Object(E.m)(e=>{const t=Object(H.e)(e),n=!m||t&&t.id!==m.id?t:m;e.length?(!m||n&&n.code!==m.code)&&p(n):p(void 0),y(Object(H.b)(e,n))},[m]);Object(E.n)(()=>{void 0===g&&n&&S(n)},[n,g,S]),Object(E.o)(()=>{h.current&&O&&h.current.setSelectionRange(...O)},[O]);const M=Object(E.m)(e=>{d&&l(),ne||(ne=!0,L(),Object(D.g)(_));const{value:t,selectionStart:n,selectionEnd:r}=e.target;I(n&&r&&r{s(e.target.checked)},[s]);const k="authorizationStateWaitPhoneNumber"===t;return E.a.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},E.a.createElement("div",{className:"auth-form"},E.a.createElement("div",{id:"logo"}),E.a.createElement("h2",null,"Sign in to Telegram"),E.a.createElement("p",{className:"note"},"Please confirm your country and",E.a.createElement("br",null),"enter your phone number."),E.a.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),r||C&&i({phoneNumber:j})}},E.a.createElement(te,{id:"sign-in-phone-code",value:m,isLoading:!a&&!m,onChange:p}),E.a.createElement(V.a,{ref:h,id:"sign-in-phone-number",label:"Phone Number",value:j,error:d,inputMode:"tel",onChange:M}),E.a.createElement(z.a,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(c),onChange:A}),C&&(k?E.a.createElement(K.a,{type:"submit",ripple:!0,isLoading:r},"Next"):E.a.createElement(q.a,null)),k&&E.a.createElement(K.a,{isText:!0,ripple:!0,isLoading:u,onClick:b},"Log in by QR code"))))})),ue=n(17);var de=Object(E.h)(()=>{const e=Object(ue.a)(x.a.Auth,"AuthCode");return e?E.a.createElement(e,null):E.a.createElement(q.a,null)});var oe=Object(E.h)(()=>{const e=Object(ue.a)(x.a.Auth,"AuthPassword");return e?E.a.createElement(e,null):E.a.createElement(q.a,null)});var ce=Object(E.h)(()=>{const e=Object(ue.a)(x.a.Auth,"AuthRegister");return e?E.a.createElement(e,null):E.a.createElement(q.a,null)});var ae=Object(E.h)(()=>{const e=Object(ue.a)(x.a.Auth,"AuthQrCode");return e?E.a.createElement(e,null):E.a.createElement(q.a,null)});n(99);var ie=Object(E.h)(Object(d.h)(e=>Object(h.l)(e,["authState"]),(e,t)=>Object(h.l)(t,["reset","initApi"]))(({authState:e,reset:t,initApi:n})=>{switch(Object(E.n)(()=>{t(),n()},[t,n]),Object(E.n)(()=>{},[]),e){case"authorizationStateWaitCode":return E.a.createElement(W,{page:"authCode",key:"authCode"},E.a.createElement(de,null));case"authorizationStateWaitPassword":return E.a.createElement(W,{page:"authPassword",key:"authPassword"},E.a.createElement(oe,null));case"authorizationStateWaitRegistration":return E.a.createElement(ce,null);case"authorizationStateWaitQrCode":return E.a.createElement(W,{page:"authQrCode",key:"authQrCode"},E.a.createElement(ae,null));case"authorizationStateWaitPhoneNumber":default:return E.a.createElement(W,{page:"authPhoneNumber",key:"authPhoneNumber"},E.a.createElement(re,null))}}));var se=Object(E.h)(()=>{const e=Object(ue.a)(x.a.Main,"Main");return e?E.a.createElement(e,null):void 0}),fe=n.p+"app-inactive.bc7953c2dfebcabce2c43ca7dc778a89.png";n(100);var le=()=>E.a.createElement("div",{id:"AppInactive"},E.a.createElement("div",{className:"content"},E.a.createElement("img",{src:fe,alt:""}),E.a.createElement("h3",{className:"title"},"Such error, many tabs"),E.a.createElement("div",{className:"description"},"Telegram supports only one active tab with the app.",E.a.createElement("br",null),"Please reload this page to continue using this tab or close it."),E.a.createElement("div",{className:"actions"},E.a.createElement(K.a,{isText:!0,ripple:!0,onClick:()=>{window.location.reload()}},"Reload app"))));function be(){return d.c.createElement(W,{page:"main",key:"main"},d.c.createElement(se,null))}var he=Object(d.h)(e=>Object(h.l)(e,["authState"]),(e,t)=>Object(h.l)(t,["disconnect"]))(({authState:e,disconnect:t})=>{const[n,r]=Object(N.a)(!1);if(Object(E.n)(()=>{Object(S.b)(),A=()=>{t(),document.title=`${u.eb}${u.D}`,r()}},[t,r]),n)return d.c.createElement(le,null);if(e)switch(e){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return d.c.createElement(ie,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return be()}return localStorage.getItem(u.nb)||localStorage.getItem(u.H)?be():d.c.createElement(ie,null)});n(101);u.p&&console.log(">>> INIT"),Object(d.d)().init(),u.p&&console.log(">>> START INITIAL RENDER"),s.a.render(d.c.createElement(he,null),document.getElementById("root")),u.p&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",()=>{console.log("GLOBAL STATE",Object(d.e)())})}]); -//# sourceMappingURL=main.06f68f8f23df64b5d8e1.js.map \ No newline at end of file diff --git a/dist/main.06f68f8f23df64b5d8e1.js.map b/dist/main.06f68f8f23df64b5d8e1.js.map deleted file mode 100644 index 2f0cd6539..000000000 --- a/dist/main.06f68f8f23df64b5d8e1.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/config.ts","webpack:///./src/lib/teact/teactn.tsx","webpack:///./src/util/iteratees.ts","webpack:///./src/modules/helpers/messages.ts","webpack:///./src/modules/helpers/messageMedia.ts","webpack:///./src/modules/helpers/localSearch.ts","webpack:///./src/api/types/index.ts","webpack:///./src/modules/selectors/users.ts","webpack:///./src/modules/selectors/settings.ts","webpack:///./src/modules/selectors/chats.ts","webpack:///./src/modules/selectors/symbols.ts","webpack:///./src/modules/selectors/messages.ts","webpack:///./src/modules/selectors/localSearch.ts","webpack:///./src/modules/selectors/management.ts","webpack:///./src/modules/selectors/ui.ts","webpack:///./src/modules/selectors/globalSearch.ts","webpack:///./src/modules/selectors/payments.ts","webpack:///./src/util/environment.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/util/files.ts","webpack:///./src/assets/lang/en-extra.json","webpack:///./src/assets/lang/es-extra.json","webpack:///./src/assets/lang/it-extra.json","webpack:///./src/assets/lang/pl-extra.json","webpack:///./src/assets/lang/ru-extra.json","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/modules/actions/api/sessions.ts","webpack:///./src/types/index.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/util/arePropsShallowEqual.ts","webpack:///./src/hooks/useLang.ts","webpack:///./src/hooks/useForceUpdate.ts","webpack:///./src/components/ui/Link.tsx","webpack:///./src/util/generateIdFor.ts","webpack:///./src/util/notifications.ts","webpack:///./src/modules/helpers/users.ts","webpack:///./src/modules/helpers/chats.ts","webpack:///./src/components/ui/Button.tsx","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useFlag.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/dateFormat.ts","webpack:///./src/modules/reducers/chats.ts","webpack:///./src/modules/reducers/messages.ts","webpack:///./src/modules/reducers/symbols.ts","webpack:///./src/modules/reducers/users.ts","webpack:///./src/modules/reducers/globalSearch.ts","webpack:///./src/modules/reducers/localSearch.ts","webpack:///./src/modules/reducers/management.ts","webpack:///./src/modules/reducers/settings.ts","webpack:///./src/modules/reducers/twoFaSettings.ts","webpack:///./src/modules/reducers/payments.ts","webpack:///./src/hooks/usePrevious.ts","webpack:///./src/util/trimText.ts","webpack:///./node_modules/idb-keyval/dist/esm/index.js","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/webpToPng.ts","webpack:///./src/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/memo.ts","webpack:///./src/hooks/useOnChange.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/hooks/useEffectWithPrevDeps.ts","webpack:///./src/components/common/helpers/documentInfo.ts","webpack:///./src/modules/helpers/payments.ts","webpack:///./src/util/animation.ts","webpack:///./src/components/ui/DropdownMenu.tsx","webpack:///./src/hooks/useKeyboardListNavigation.ts","webpack:///./src/components/common/helpers/parseEmojiOnlyString.ts","webpack:///./src/util/emoji.ts","webpack:///./src/lib/teact/teact-dom.ts","webpack:///./src/components/common/UserLink.tsx","webpack:///./src/components/common/MessageLink.tsx","webpack:///./src/components/common/ChatLink.tsx","webpack:///./src/components/common/helpers/renderActionMessageText.tsx","webpack:///./src/api/types/messages.ts","webpack:///./src/api/types/media.ts","webpack:///./src/components/middle/message/MentionLink.tsx","webpack:///./src/util/switchTheme.ts","webpack:///./src/util/appBadge.ts","webpack:///./src/hooks/useVirtualBackdrop.ts","webpack:///./src/api/gramjs/worker/worker.ts","webpack:///./node_modules/opus-recorder/dist/decoderWorker.min.js","webpack:///./node_modules/opus-recorder/dist/waveWorker.min.js","webpack:///./src/lib/webp/webp_wasm.worker.js","webpack:///./src/modules/actions/ui/initial.ts","webpack:///./src/modules/actions/api/initial.ts","webpack:///./node_modules/process/browser.js","webpack:///./src/modules/actions/apiUpdaters/initial.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/util/setupServiceWorker.ts","webpack:///./src/global/initial.ts","webpack:///./src/global/cache.ts","webpack:///./src/global/index.ts","webpack:///./src/util/activeTabMonitor.ts","webpack:///./src/util/fonts.ts","webpack:///./src/assets/telegram-logo.svg","webpack:///./src/assets/monkey.svg","webpack:///./src/components/common/UiLoader.tsx","webpack:///./src/components/auth/CountryCodeInput.tsx","webpack:///./src/components/auth/AuthPhoneNumber.tsx","webpack:///./src/components/auth/AuthCode.async.tsx","webpack:///./src/components/auth/AuthPassword.async.tsx","webpack:///./src/components/auth/AuthRegister.async.tsx","webpack:///./src/components/auth/AuthQrCode.async.tsx","webpack:///./src/components/auth/Auth.tsx","webpack:///./src/components/main/Main.async.tsx","webpack:///./src/assets/app-inactive.png","webpack:///./src/components/main/AppInactive.tsx","webpack:///./src/App.tsx","webpack:///./src/index.tsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","2","__webpack_require__","exports","module","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","s","VirtualElementTypesEnum","Fragment","renderingInstance","isEmptyElement","$element","Empty","isTextElement","Text","isTagElement","Tag","isComponentElement","Component","isRealElement","source","props","children","flatten","parsedChildren","componentInstance","isMounted","hooks","state","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","map","buildChildElement","buildTagElement","isEmptyPlaceholder","child","String","DEBUG_components","renderComponent","newRenderedValue","DEBUG_startAt","DEBUG","componentName","renderCount","renderTimes","DEBUG_MORE","log","performance","now","renderTime","warn","Math","round","handleError","renderedValue","newChild","hasElementChanged","$old","$new","unmountTree","forEach","hook","current","cleanup","effect","dependencies","nextValue","setter","forceUpdate","onUpdate","helpGc","unmountComponent","removeAllDelegatedListeners","mountComponent","forceUpdateComponent","currentElement","getTarget","setTarget","useState","initial","newValue","prepareForFrame","throttleWithPrimaryRaf","prepareComponentForFrame","throttleWithRaf","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","exec","some","dependency","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","withDebug","propsRef","renderedRef","getUnequalProps","join","addEventListener","orderBy","values","PAGE_TITLE","INACTIVE_MARKER","APP_NAME","APP_VERSION","process","IS_TEST","DEBUG_ALERT_MSG","SESSION_USER_KEY","LEGACY_SESSION_KEY","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","isBigScreen","Set","innerHeight","MIN_PASSWORD_LENGTH","MESSAGE_LIST_SENSITIVE_AREA","MESSAGE_LIST_SLICE","MESSAGE_LIST_VIEWPORT_LIMIT","CHAT_HEIGHT_PX","CHAT_LIST_SLICE","CHAT_LIST_LOAD_SLICE","SHARED_MEDIA_SLICE","MESSAGE_SEARCH_SLICE","GLOBAL_SEARCH_SLICE","MEMBERS_SLICE","MEMBERS_LOAD_SLICE","PROFILE_SENSITIVE_AREA","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","EDITABLE_INPUT_ID","EDITABLE_INPUT_MODAL_ID","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_ID_BASE","ANIMATION_END_DELAY","STICKER_SIZE_INLINE_DESKTOP_FACTOR","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_AUTH","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_PICKER","STICKER_SIZE_GENERAL_SETTINGS","STICKER_SIZE_PICKER_HEADER","STICKER_SIZE_SEARCH","STICKER_SIZE_MODAL","STICKER_SIZE_TWO_FA","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","MEMOJI_STICKER_ID","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_TEMPLATE","RE_TME_LINK","RE_TME_INVITE_LINK","SERVICE_NOTIFICATIONS_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","LANG_PACKS","TIPS_USERNAME","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","React","currentGlobal","reducers","callbacks","container","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","setGlobal","actions","Number","isNaN","DEBUG_componentName","keys","areMappedPropsChanged","DEBUG_updates","updateTime","Map","runCallbacksThrottled","cb","newGlobal","getGlobal","getDispatch","addReducer","reducer","payload","onDispatch","addCallback","removeCallback","index","indexOf","splice","withGlobal","TeactNContainer","id","generateIdFor","useForceUpdate","delete","set","buildCollectionByKey","collection","reduce","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","filter","has","orderKey","sort","a","b","Array","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","from","compact","Boolean","areSortedArraysEqual","array1","array2","every","item","areSortedArraysIntersecting","findIntersectionWithSet","split","chunkSize","cloneDeep","acc","findLast","predicate","RE_LINK","RegExp","getMessageKey","chatId","parseMessageKey","match","messageId","getMessageOriginalId","previousLocalId","getMessageSummaryText","lang","noEmoji","text","photo","video","audio","voice","sticker","contact","poll","invoice","content","groupedId","isGif","emoji","title","performer","fileName","summary","question","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","entities","link","find","entity","ApiMessageEntityTypes","TextUrl","url","Url","offset","substring","domain","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","action","isServiceNotificationMessage","isMessageLocal","isAnonymousOwnMessage","senderId","getSenderTitle","sender","getUserFullName","getChatTitle","getSendingState","sendingState","isHistoryClearMessage","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","base","hasMessageLocalBlobUrl","canMessagePlayVideoInline","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageMediaFilename","date","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","reverseOrder","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","selectUser","global","userId","users","byId","selectNotifySettings","settings","selectNotifyExceptions","notifyExceptions","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","user","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","fullInfo","members","onlineCount","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","includes","list","selectChatListType","folderId","selectChatFolder","chatFolders","selectIsChatPinned","archived","orderedPinnedIds","chatFoldersById","pinnedChatIds","selectChatByUsername","username","usernameLowered","toLowerCase","selectCountNotMutedUnread","activeChatIds","unreadCount","selectIsChatMuted","selectCurrentStickerSearch","stickers","search","selectCurrentGifSearch","gifs","selectStickerSet","setsById","selectStickersForEmoji","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","animatedEmojis","cleanedEmoji","replace","selectEmojiKeywords","language","emojiKeywords","selectCurrentMessageList","messageLists","selectCurrentChat","selectChatMessages","selectScheduledMessages","scheduledMessages","selectThreadParam","thread","selectListedIds","selectOutlyingIds","selectCurrentMessageIds","messageListType","selectViewportIds","selectPinnedIds","selectScheduledIds","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectThreadInfo","selectFirstMessageId","selectThreadOriginChat","threadInfo","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","currentMessageList","selectIsViewportNewest","viewportIds","lastMessageId","selectChatMessage","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","focusedMessage","selectIsMessageFocused","focusedId","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","selectSender","selectForwardedSender","isChannelPost","fromChatId","senderUserId","selectAllowedMessageActions","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","getHasAdminRight","canPin","canUnpin","pinnedMessageIds","canDelete","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","selectUploadProgress","fileTransfer","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","min","Infinity","selectFirstUnreadId","outlyingIds","lastReadId","isNotJoined","found","isFromScheduled","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","isCommonBoxChat","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","fromMessageId","selectMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectShouldAutoLoadMedia","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","isChatGroup","userOrChat","contactList","userIds","selectIsUserOrChatContact","selectShouldAutoPlayMedia","shouldAutoPlayVideos","shouldAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectCurrentTextSearch","chatThreadKey","currentSearch","localTextSearch","byChatThreadKey","isActive","selectCurrentMediaSearchPeerId","localMediaSearch","currentProfileUserId","selectedId","selectCurrentMediaSearch","peerId","selectManagement","management","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_MOBILE_SCREEN","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","StickerSearch","GifSearch","UserInfo","ChatInfo","selectIsRightColumnShown","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_TOUCH_ENV","matchMedia","matches","innerWidth","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","getContext","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","parts","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","args","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","waiting","onIdle","requestIdleCallback","pause","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","isPrimary","requestAnimationFrame","currentCallbacks","currentPrimaryCallbacks","worker","requestStates","requestStatesByCallback","initApi","sessionData","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","Bundles","LOAD_PROMISES","MEMORY_CACHE","async","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","cacheApi","caches","Type","fetch","cacheName","Request","cache","open","Blob","blob","substr","headers","Json","json","save","cacheData","JSON","stringify","Response","put","clear","File","constructor","fileBits","options","rest","super","this","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","charCodeAt","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","race","onseeked","canvas","videoWidth","videoHeight","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","EXTRA_PACK_PATHS","en","enExtraJson","es","esExtraJson","it","itExtraJson","pl","plExtraJson","ru","ruExtraJson","PLURAL_OPTIONS","PLURAL_RULES","ar","ca","de","fa","fr","ko","nl","pt_BR","tr","uk","uz","langPack","runCallbacks","createCallbackManager","currentLangCode","getTranslation","format","cached","langString","template","amount","optionIndex","getPluralOption","trim","processTemplate","formatInteger","setLanguage","langCode","newLangPack","remote","sourceLangPacks","fetchFromCacheOrRemote","pairs","extraLangPack","languages","langInfo","isRtl","rtl","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","noLoad","autoUpdate","formatsCache","defaultPhoneNumberFormat","parsed","str","flag","phoneFormat","formatValue","phoneNumberFormat","phoneNumberGroups","count","repeat","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","startsWith","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","DC_IDS","storeSession","mainDcId","hashes","localStorage","setItem","dcID","dcId","clearStoredSession","removeItem","loadStoredSession","userAuthJson","getItem","userAuth","parse","hash","importLegacySession","sessionId","sessionJson","idb","clearLegacySessions","idbKeys","k","importTestSession","env","TEST_SESSION","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","Spinner","buildClassName","handleErrorEvent","startedAt","isReloading","preventDefault","ErrorEvent","reason","alert","location","reload","APP_ENV","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","renderText","part","filters","params","textParts","divEl","innerText","innerHTML","escapeHtml","EMOJI_REGEX","lastIndex","replaceEmojis","addLineBreaks","highlight","lowerCaseText","queryPosition","nextSymbol","newParts","links","RE_MENTION","nextLink","endsWith","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","entityResult","currentProps","newProps","currentKeys","currentKeysLength","prop","useOnChange","langProvider","setTrigger","trigger","Link","onClick","handleClick","dir","store","random","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","requestPermission","unsubscribeFromPush","dispatch","deviceToken","unsubscribe","deleteDeviceToken","serviceWorkerRegistration","serviceWorker","ready","pushManager","getSubscription","areSettingsLoaded","subscribe","subscribedAt","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","showNewMessageNotification","isActiveChat","replaceSettings","loadNotificationSettings","hasFocus","checkIfShouldNotify","body","messageSender","messageAction","actionTargetMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","actionTargetUser","privateChatUserId","privateChatUser","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","getNotificationContent","controller","icon","badge","toString","vibrate","notification","onclick","close","focusMessage","focus","notifyClientReady","USER_COLOR_KEYS","getUserFirstOrLastName","firstName","lastName","isDeletedUser","getUserStatus","status","wasOnline","wasOnlineDate","diff","getTime","floor","today","setHours","formatTime","yesterday","setDate","getDate","formatFullDate","sortUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","getChatTypeString","isSelf","getChatDescription","about","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","isChatAdmin","adminRights","currentUserBannedRights","defaultBannedRights","migratedTo","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","getChatSlowModeOptions","slowMode","getChatOrder","max","joinDate","isChatArchived","notifySettings","isMuted","hasPrivateChatsNotifications","hasBroadcastNotifications","hasGroupNotifications","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","bots","contacts","isContact","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","description","pinnedIds","getFolderChatsCount","isChat","chatOrUser","sortChatIds","chatIds","shouldPrioritizeVerified","priority","isVerified","Button","ref","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","handleMouseDown","aria-label","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeEventListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","setValue","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","isClosed","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","isClosing","shouldRender","transitionClassNames","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getHours","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","photos","updateChats","updatedById","addChats","addedById","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalCount","totalChatCount","isFullyLoaded","updateCurrentMessageList","replaceChatMessages","updateMessageStore","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","isLinkedChannelPost","canDeleteCurrentThread","currentThreadId","originalPost","deleteChatScheduledMessages","scheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","updateScheduledMessages","updateFocusedMessage","noHighlight","updateFocusDirection","direction","enterMessageSelectMode","toggleMessageSelection","childMessageIds","withShift","oldSelectedMessages","newMessageIds","newSelectedMessageIds","prevIndex","currentIndex","to","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","updateUser","userUpdate","contactUserIds","updatedUser","updateUsers","addUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","getComplexKey","updateGlobalSearch","searchStatePartial","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","newState","fetchingStatus","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","newSettings","replaceThemeSettings","theme","themes","addNotifyException","notifyException","updateNotifySettings","peerType","isSilent","shouldShowPreviews","hasPrivateChatsMessagePreview","hasGroupMessagePreview","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","usePrevious","next","shouldSkipUndefined","trimText","promisifyRequest","oncomplete","onsuccess","onabort","defaultGetStoreFunc","defaultGetStore","dbName","storeName","indexedDB","onupgradeneeded","createObjectStore","dbp","txMode","db","transaction","objectStore","createStore","customStore","del","eachCursor","openCursor","continue","items","MenuItem","destructive","useLang","handleKeyDown","keyCode","data-char","origin","role","onKeyDown","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","EMPTY_IMAGE_DATA_URI","webpToPng","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","WebpWorker","onmessage","handleLibWebpMessage","label","success","readOnly","placeholder","autoComplete","inputMode","maxLength","onChange","onInput","onKeyPress","onBlur","labelText","htmlFor","subLabel","checked","blocking","onCheck","handleChange","captureEscKeyListener","captureKeyboardListener","onEsc","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","prevDeps","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","DecoderWorker","wavWorker","WavWorker","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","DataUri","Stream","memoryCache","fetchPromises","mediaFormat","onProgress","progressiveUrl","getProgressive","mediaPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","URL","createObjectURL","sourceBuffer","addSourceBuffer","endOfStream","appendBuffer","revokeObjectURL","getFromMemory","cancelProgress","mediaData","fullSize","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","IS_LANDSCAPE","isLandscape","windowSize","updateSizes","handleResize","vh","setProperty","utf16","len","RangeError","adapt","delta","numpoints","firsttime","decode","preserveCase","case_flags","input_length","out","bias","basic","j","ic","oldi","w","digit","lastIndexOf","cp","toUnicode","domain_array","ensureProtocol","getDomain","decodedHref","decodeURI","convertPunycode","toggleSafeLinkModal","openTelegramLink","isNotSafe","ctrlKey","altKey","shiftKey","metaKey","classNames","getFileSizeString","bytes","ONE_GIGABYTE","ONE_MEGABYTE","getDocumentExtension","getFileExtension","getColorFromExtension","extension","STRIPE_ERRORS","missing_payment_information","field","fieldError","invalid_number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","SHIPPING_ERRORS","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","getShippingError","errors","cur","currentInstance","animateSingle","tick","instance","isCancelled","animate","DropdownMenu","dropdownRef","setIsOpen","menu","focusedElement","activeElement","elementChildren","onTrigger","onSelectWithEnter","itemSelector","noCaptureFocus","focusedIndex","setFocusedIndex","querySelectorAll","newIndex","RE_EMOJI_ONLY","twemojiRegex","DETECT_UP_TO","emojiCount","EXCLUDE_EMOJIS","unifiedToNative","unified","codePoints","parseInt","fromCodePoint","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","updateComponent","setupComponentUpdateListener","initComponent","node","createNode","childNodes","insertBefore","replaceChild","areComponents","nextSibling","newKeys","removeAttribute","addAttribute","oldValue","updateAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","$currentChild","newChildKey","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","createDocumentFragment","renderChildren","$firstChild","createTextNode","$child","$fragmentChild","cssText","render","headId","$head","openUserInfo","handleMessageClick","openChat","targetUser","targetMessage","textOptions","maxTextLength","unprocessed","processed","processPlaceholder","isEmbedded","renderChatContent","renderUserContent","renderOriginContent","showQuotes","messageText","renderMessageContent","renderProductContent","renderMigratedContent","replaceValue","placeholderPosition","MESSAGE_DELETED","openChatByUsername","isInitialized","HEX_COLOR_REGEX","lerp","start","end","interpolationRatio","colors","themeColors","hexToRgb","hex","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","transition","updateAppBadge","setAppBadge","contains","animationLevel","messageTextSize","switchTheme","uiReadyState","authPhoneNumber","authRememberMe","authError","apiUpdate","authIsLoading","password","file","authIsLoadingQrCode","reset","langCachePrefix","langCacheVersion","init","connectionState","authNearestCountry","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","run","marker","runClearTimeout","Item","noop","nextTick","arguments","apply","browser","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","binding","cwd","chdir","umask","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","saveSession","onUpdateSession","currentUser","sessionUserAuth","updateSessionUserId","onUpdateCurrentUser","showError","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","handleWorkerMessage","register","INITIAL_STATE","isLeftColumnShown","activeChatFolder","recentEmojis","added","recent","featured","saved","topPeers","audioPlayer","notifications","activeSessions","messageSendKeyCombo","shouldSuggestStickers","light","isBlurred","patternColor","dark","privacy","updateCacheThrottled","isAllowed","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","loadCache","initialState","time","timeEnd","readCache","idsToSave","cid","chatIdsToSave","mainThread","history","replaceState","tabKey","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","mediaLoader","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","background","backgroundColor","hasCustomBackground","hasCustomBackgroundColor","isRightColumnShown","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","safePreload","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","getFilteredList","countryId","firstElementChild","dataset","handleInput","handleInputKeyDown","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","data-country-id","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","clearAuthError","gotToAuthQrCode","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","setSelectionRange","handlePhoneNumberChange","selectionStart","selectionEnd","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","AuthQrCode","AppInactive","appInactivePath","renderMain","disconnect","isInactive","markInactive","TeactDOM"],"mappings":"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","file":"main.06f68f8f23df64b5d8e1.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t2: 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".\" + {\"0\":\"c66dcd2dcbc1482a0d6f\",\"1\":\"fb539fa72ec126e2a2cc\",\"3\":\"ac6afd4be1c32f54938b\",\"4\":\"7d611cd5e39f10293bca\",\"5\":\"c1959eb66d878675dbb0\",\"6\":\"63a48d34eed627347217\",\"7\":\"8ebf93748e52726d9361\",\"8\":\"75df16efec295d79dd82\",\"9\":\"600e8c07ee8b577efa8f\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"0\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"c66dcd2dcbc1482a0d6f\",\"1\":\"fb539fa72ec126e2a2cc\",\"3\":\"ac6afd4be1c32f54938b\",\"4\":\"7d611cd5e39f10293bca\",\"5\":\"c1959eb66d878675dbb0\",\"6\":\"63a48d34eed627347217\",\"7\":\"8ebf93748e52726d9361\",\"8\":\"75df16efec295d79dd82\",\"9\":\"600e8c07ee8b577efa8f\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 102);\n","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, onTickEnd, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\nimport { removeAllDelegatedListeners } from './dom-events';\n\nexport type Props = AnyLiteral;\nexport type FC

= (props: P) => any;\nexport type FC_withDebug = FC & {\n DEBUG_contentComponentName?: string;\n};\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n}\n\ninterface VirtualElementEmpty {\n type: VirtualElementTypesEnum.Empty;\n target?: Node;\n}\n\ninterface VirtualElementText {\n type: VirtualElementTypesEnum.Text;\n target?: Node;\n value: string;\n}\n\nexport interface VirtualElementTag {\n type: VirtualElementTypesEnum.Tag;\n target?: Node;\n tag: string;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport interface VirtualElementComponent {\n type: VirtualElementTypesEnum.Component;\n componentInstance: ComponentInstance;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter = (newValue: ((current: T) => T) | T) => void;\n\ninterface ComponentInstance {\n $element: VirtualElementComponent;\n Component: FC;\n name: string;\n props: Props;\n renderedValue?: any;\n isMounted: boolean;\n hooks: {\n state: {\n cursor: number;\n byCursor: {\n value: any;\n nextValue: any;\n setter: StateHookSetter;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n current: any;\n dependencies: any[];\n }[];\n };\n };\n prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement = VirtualElementEmpty | VirtualElementText | VirtualElementTag | VirtualElementComponent;\nexport type VirtualRealElement = VirtualElementTag | VirtualElementComponent;\nexport type VirtualElementChildren = VirtualElement[];\n\nconst Fragment = Symbol('Fragment');\n\nlet renderingInstance: ComponentInstance;\n\nexport function isEmptyElement($element: VirtualElement): $element is VirtualElementEmpty {\n return $element.type === VirtualElementTypesEnum.Empty;\n}\n\nexport function isTextElement($element: VirtualElement): $element is VirtualElementText {\n return $element.type === VirtualElementTypesEnum.Text;\n}\n\nexport function isTagElement($element: VirtualElement): $element is VirtualElementTag {\n return $element.type === VirtualElementTypesEnum.Tag;\n}\n\nexport function isComponentElement($element: VirtualElement): $element is VirtualElementComponent {\n return $element.type === VirtualElementTypesEnum.Component;\n}\n\nexport function isRealElement($element: VirtualElement): $element is VirtualRealElement {\n return isTagElement($element) || isComponentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualRealElement | VirtualElementChildren {\n if (!props) {\n props = {};\n }\n\n children = flatten(children);\n\n if (source === Fragment) {\n return children;\n } else if (typeof source === 'function') {\n return createComponentInstance(source, props, children);\n } else {\n return buildTagElement(source, props, children);\n }\n}\n\nfunction createComponentInstance(Component: FC, props: Props, children: any[]): VirtualElementComponent {\n let parsedChildren: any | any[] | undefined;\n if (children.length === 0) {\n parsedChildren = undefined;\n } else if (children.length === 1) {\n [parsedChildren] = children;\n } else {\n parsedChildren = children;\n }\n\n const componentInstance: ComponentInstance = {\n $element: {} as VirtualElementComponent,\n Component,\n name: Component.name,\n props: {\n ...props,\n ...(parsedChildren && { children: parsedChildren }),\n },\n isMounted: false,\n hooks: {\n state: {\n cursor: 0,\n byCursor: [],\n },\n effects: {\n cursor: 0,\n byCursor: [],\n },\n memos: {\n cursor: 0,\n byCursor: [],\n },\n },\n };\n\n componentInstance.$element = buildComponentElement(componentInstance);\n\n return componentInstance.$element;\n}\n\nfunction buildComponentElement(\n componentInstance: ComponentInstance,\n children: VirtualElementChildren = [],\n): VirtualElementComponent {\n const { props } = componentInstance;\n\n return {\n componentInstance,\n type: VirtualElementTypesEnum.Component,\n props,\n children,\n };\n}\n\nfunction buildTagElement(tag: string, props: Props, children: any[]): VirtualElementTag {\n return {\n type: VirtualElementTypesEnum.Tag,\n tag,\n props,\n children: dropEmptyTail(children).map(buildChildElement),\n };\n}\n\n// We only need placeholders in the middle of collection (to ensure other elements order).\nfunction dropEmptyTail(children: any[]) {\n let i = children.length - 1;\n\n for (; i >= 0; i--) {\n if (!isEmptyPlaceholder(children[i])) {\n break;\n }\n }\n\n return i + 1 < children.length ? children.slice(0, i + 1) : children;\n}\n\nfunction isEmptyPlaceholder(child: any) {\n // eslint-disable-next-line no-null/no-null\n return child === false || child === null || child === undefined;\n}\n\nfunction buildChildElement(child: any): VirtualElement {\n if (isEmptyPlaceholder(child)) {\n return buildEmptyElement();\n } else if (isRealElement(child)) {\n return child;\n } else {\n return buildTextElement(child);\n }\n}\n\nfunction buildTextElement(value: any): VirtualElementText {\n return {\n type: VirtualElementTypesEnum.Text,\n value: String(value),\n };\n}\n\nfunction buildEmptyElement(): VirtualElementEmpty {\n return { type: VirtualElementTypesEnum.Empty };\n}\n\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('COMPONENTS', orderBy(Object.values(DEBUG_components), 'renderCount', 'desc'));\n});\n\nexport function renderComponent(componentInstance: ComponentInstance) {\n renderingInstance = componentInstance;\n componentInstance.hooks.state.cursor = 0;\n componentInstance.hooks.effects.cursor = 0;\n componentInstance.hooks.memos.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n const componentName = componentInstance.name;\n if (!DEBUG_components[componentName]) {\n DEBUG_components[componentName] = {\n componentName,\n renderCount: 0,\n renderTimes: [],\n };\n }\n\n if (DEBUG_MORE) {\n if (componentName !== 'TeactMemoWrapper' && componentName !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Render ${componentName}`);\n }\n }\n\n DEBUG_startAt = performance.now();\n }\n\n newRenderedValue = Component(props);\n\n if (DEBUG) {\n const renderTime = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (renderTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(renderTime)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(renderTime);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err) {\n handleError(err);\n\n newRenderedValue = componentInstance.renderedValue;\n }\n\n if (componentInstance.isMounted && newRenderedValue === componentInstance.renderedValue) {\n return componentInstance.$element;\n }\n\n componentInstance.renderedValue = newRenderedValue;\n\n const newChild = buildChildElement(newRenderedValue);\n componentInstance.$element = buildComponentElement(componentInstance, [newChild]);\n\n return componentInstance.$element;\n}\n\nexport function hasElementChanged($old: VirtualElement, $new: VirtualElement) {\n if (typeof $old !== typeof $new) {\n return true;\n } else if ($old.type !== $new.type) {\n return true;\n } else if (isTextElement($old) && isTextElement($new)) {\n return $old.value !== $new.value;\n } else if (isTagElement($old) && isTagElement($new)) {\n return ($old.tag !== $new.tag) || ($old.props.key !== $new.props.key);\n } else if (isComponentElement($old) && isComponentElement($new)) {\n return (\n $old.componentInstance.Component !== $new.componentInstance.Component\n ) || (\n $old.props.key !== $new.props.key\n );\n }\n\n return false;\n}\n\nexport function unmountTree($element: VirtualElement) {\n if (!isRealElement($element)) {\n return;\n }\n\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n // Trying to help GC\n // eslint-disable-next-line no-null/no-null\n $element.target = null as any;\n }\n\n $element.children.forEach(unmountTree);\n}\n\nexport function mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nfunction unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n // eslint-disable-next-line no-null/no-null\n hook.current = null;\n });\n\n componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We force cleaning as many objects as possible. Not sure this is needed at all.\nfunction helpGc(componentInstance: ComponentInstance) {\n /* eslint-disable no-null/no-null */\n\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = null as any;\n hook.effect = null as any;\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = null as any;\n hook.nextValue = null as any;\n hook.setter = null as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks = null as any;\n componentInstance.$element = null as any;\n componentInstance.Component = null as any;\n componentInstance.props = null as any;\n componentInstance.forceUpdate = null as any;\n componentInstance.onUpdate = null as any;\n\n /* eslint-enable no-null/no-null */\n}\n\nfunction prepareComponentForFrame(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = hook.nextValue;\n });\n\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(() => prepareComponentForFrame(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n\n renderComponent(componentInstance);\n\n if (componentInstance.$element !== currentElement) {\n componentInstance.onUpdate();\n }\n}\n\nexport function getTarget($element: VirtualElement): Node | undefined {\n if (isComponentElement($element)) {\n return getTarget($element.children[0]);\n } else {\n return $element.target;\n }\n}\n\nexport function setTarget($element: VirtualElement, target: Node) {\n if (isComponentElement($element)) {\n setTarget($element.children[0], target);\n } else {\n $element.target = target;\n }\n}\n\nexport function useState(initial?: T): [T, StateHookSetter] {\n const { cursor, byCursor } = renderingInstance.hooks.state;\n\n if (byCursor[cursor] === undefined) {\n byCursor[cursor] = {\n value: initial,\n nextValue: initial,\n setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => {\n if (byCursor[cursor].nextValue !== newValue) {\n byCursor[cursor].nextValue = typeof newValue === 'function'\n ? (newValue as (current: T) => T)(byCursor[cursor].value)\n : newValue;\n\n if (!componentInstance.prepareForFrame || !componentInstance.forceUpdate) {\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(\n () => prepareComponentForFrame(componentInstance),\n );\n componentInstance.forceUpdate = throttleWithRaf(\n () => forceUpdateComponent(componentInstance),\n );\n }\n\n componentInstance.prepareForFrame();\n componentInstance.forceUpdate();\n\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[Teact.useState]',\n componentInstance.name,\n // `componentInstance.Component` may be set to `null` by GC helper\n componentInstance.Component && (componentInstance.Component as FC_withDebug).DEBUG_contentComponentName\n ? `> ${(componentInstance.Component as FC_withDebug).DEBUG_contentComponentName}`\n : '',\n `Forced update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\n }\n }\n })(renderingInstance),\n };\n }\n\n renderingInstance.hooks.state.cursor++;\n\n return [\n byCursor[cursor].value,\n byCursor[cursor].setter,\n ];\n}\n\nfunction useLayoutEffectBase(\n schedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: any[],\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n const exec = () => {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n\n byCursor[cursor].cleanup = effect() as Function;\n };\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n schedulerFn(exec);\n }\n } else {\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor] ? byCursor[cursor].cleanup : undefined,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(fastRaf, effect, dependencies);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(onTickEnd, effect, dependencies);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[]): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { current } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n current = resolver();\n }\n\n byCursor[cursor] = {\n current,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return current;\n}\n\nexport function useCallback(newCallback: F, dependencies: any[]): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies);\n}\n\nexport function useRef(initial: T): { current: T };\nexport function useRef(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef(initial?: T | null) {\n return useMemo(() => ({\n current: initial,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), []);\n}\n\nexport function memo(Component: T, areEqual = arePropsShallowEqual, withDebug = false) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const propsRef = useRef(props);\n const renderedRef = useRef();\n\n if (!renderedRef.current || (propsRef.current && !areEqual(propsRef.current, props))) {\n if (DEBUG && withDebug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name}: Update is caused by:`,\n getUnequalProps(propsRef.current!, props).join(', '),\n );\n }\n\n propsRef.current = props;\n renderedRef.current = createElement(Component, props) as VirtualElementComponent;\n }\n\n return renderedRef.current;\n } as T;\n}\n\n// We need to keep it here for JSX.\nexport default {\n createElement,\n Fragment,\n};\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v4';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 500;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'];\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","import React, {\n FC, FC_withDebug, Props, useEffect, useState,\n} from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { throttleWithRaf } from '../../util/schedulers';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport { GlobalState, GlobalActions, ActionTypes } from '../../global/types';\nimport { handleError } from '../../util/handleError';\n\nexport default React;\n\ntype ActionPayload = AnyLiteral;\n\ntype Reducer = (\n global: GlobalState,\n actions: GlobalActions,\n payload: any,\n) => GlobalState | void;\n\ntype MapStateToProps = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral | null);\ntype MapActionsToProps = ((setGlobal: Function, actions: GlobalActions) => Partial | null);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map;\n mapReducersToProps: MapActionsToProps;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nfunction runCallbacks() {\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nconst runCallbacksThrottled = throttleWithRaf(runCallbacks);\n\nexport function setGlobal(newGlobal?: GlobalState) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n runCallbacksThrottled();\n }\n}\n\nexport function getGlobal() {\n return currentGlobal;\n}\n\nexport function getDispatch() {\n return actions;\n}\n\nfunction onDispatch(name: string, payload?: ActionPayload) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal);\n }\n });\n }\n}\n\nfunction updateContainers() {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const container of containers.values()) {\n const {\n mapStateToProps, mapReducersToProps, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = {\n ...mapStateToProps(currentGlobal, ownProps),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n\n return;\n }\n\n if (DEBUG) {\n if (Object.values(newMappedProps).some(Number.isNaN)) {\n // eslint-disable-next-line no-console\n console.warn(\n // eslint-disable-next-line max-len\n `[TeactN] Some of \\`${container.DEBUG_componentName}\\` mappers contain NaN values. This may cause redundant updates because of incorrect equality check.`,\n );\n }\n }\n\n if (Object.keys(newMappedProps).length && !arePropsShallowEqual(mappedProps!, newMappedProps)) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[TeactN] Will update',\n container.DEBUG_componentName,\n 'caused by',\n getUnequalProps(mappedProps!, newMappedProps).join(', '),\n );\n }\n\n container.mappedProps = newMappedProps;\n container.areMappedPropsChanged = true;\n container.DEBUG_updates++;\n\n forceUpdate();\n }\n }\n\n if (DEBUG) {\n const updateTime = performance.now() - DEBUG_startAt!;\n if (updateTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[TeactN] Slow containers update: ${Math.round(updateTime)} ms`);\n }\n }\n}\n\nexport function addReducer(name: ActionTypes, reducer: Reducer) {\n if (!reducers[name]) {\n reducers[name] = [];\n\n actions[name] = (payload?: ActionPayload) => {\n onDispatch(name, payload);\n };\n }\n\n reducers[name].push(reducer);\n}\n\nexport function addCallback(cb: Function) {\n callbacks.push(cb);\n}\n\nexport function removeCallback(cb: Function) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n}\n\nexport function withGlobal(\n mapStateToProps: MapStateToProps = () => ({}),\n mapReducersToProps: MapActionsToProps = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\n (TeactNContainer as FC_withDebug).DEBUG_contentComponentName = Component.name;\n\n const [id] = useState(generateIdFor(containers));\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n return () => {\n containers.delete(id);\n };\n }, [id]);\n\n let container = containers.get(id);\n if (!container) {\n container = {\n mapStateToProps,\n mapReducersToProps,\n ownProps: props,\n areMappedPropsChanged: false,\n forceUpdate,\n DEBUG_updates: 0,\n DEBUG_componentName: Component.name,\n };\n\n containers.set(id, container);\n }\n\n if (container.areMappedPropsChanged) {\n container.areMappedPropsChanged = false;\n }\n\n if (!container.mappedProps || !arePropsShallowEqual(container.ownProps, props)) {\n container.ownProps = props;\n\n try {\n container.mappedProps = {\n ...mapStateToProps(currentGlobal, props),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ;\n };\n };\n}\n\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL CONTAINERS', orderBy(Object.values(containers), 'DEBUG_updates', 'desc'));\n });\n}\n","type CollectionByKey = Record;\n\ntype OrderDirection = 'asc' | 'desc';\n\ninterface OrderCallback {\n (member: T): any;\n}\n\nexport function buildCollectionByKey(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues(\n byKey: CollectionByKey,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R,\n): CollectionByKey {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick);\n}\n\nexport function pickTruthy(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick);\n}\n\nexport function omit(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy(\n collection: T[],\n orderKey: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n return collection.sort((a, b) => {\n if (Array.isArray(orderKey)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderKey1, orderKey2] = orderKey;\n\n let aValue1;\n let bValue1;\n\n if (typeof orderKey1 === 'function') {\n aValue1 = orderKey1(a) || 0;\n bValue1 = orderKey1(b) || 0;\n } else if (typeof orderKey1 === 'string') {\n aValue1 = a[orderKey1] || 0;\n bValue1 = b[orderKey1] || 0;\n }\n\n if (aValue1 !== bValue1) {\n return mode1 === 'asc' ? aValue1 - bValue1 : bValue1 - aValue1;\n } else {\n let aValue2;\n let bValue2;\n\n if (typeof orderKey2 === 'function') {\n aValue2 = orderKey2(a) || 0;\n bValue2 = orderKey2(b) || 0;\n } else if (typeof orderKey2 === 'string') {\n aValue2 = a[orderKey2] || 0;\n bValue2 = b[orderKey2] || 0;\n }\n\n return mode2 === 'asc' ? aValue2 - bValue2 : bValue2 - aValue2;\n }\n }\n\n let aValue;\n let bValue;\n\n if (typeof orderKey === 'function') {\n aValue = orderKey(a) || 0;\n bValue = orderKey(b) || 0;\n } else if (typeof orderKey === 'string') {\n aValue = a[orderKey] || 0;\n bValue = b[orderKey] || 0;\n }\n\n return mode === 'asc' ? aValue - bValue : bValue - aValue;\n });\n}\n\nexport function flatten(array: any[]) {\n return array.reduce((result, member) => {\n if (Array.isArray(member)) {\n return result.concat(member);\n } else {\n result.push(member);\n return result;\n }\n }, []);\n}\n\nexport function unique(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact(array: any[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet(array: T[], set: Set): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split(array: any[], chunkSize: number) {\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\n/**\n * Returns the index of the last element in the array where predicate is true, and -1 otherwise.\n *\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLast(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\nimport { getUserFullName } from './users';\nimport { getChatTitle } from './chats';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nexport function getMessageKey(message: ApiMessage) {\n const { chatId, id } = message;\n\n return `msg${chatId}-${id}`;\n}\n\nexport function parseMessageKey(key: string) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: Number(match[1]), messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageSummaryText(lang: LangFn, message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n if (message.groupedId) {\n return `${noEmoji ? '' : '🖼 '}${text ? text.text : lang('lng_in_dlg_album')}`;\n }\n\n if (photo) {\n return `${noEmoji ? '' : '🖼 '}${text ? text.text : lang('AttachPhoto')}`;\n }\n\n if (video) {\n return `${noEmoji ? '' : '📹 '}${text ? text.text : lang(video.isGif ? 'AttachGif' : 'AttachVideo')}`;\n }\n\n if (sticker) {\n return `${sticker.emoji} ${lang('AttachSticker')} `;\n }\n\n if (audio) {\n const caption = [audio.title, audio.performer].filter(Boolean).join(' — ') || (text && text.text);\n return `${noEmoji ? '' : '🎧 '}${caption || lang('AttachMusic')}`;\n }\n\n if (voice) {\n return `${noEmoji ? '' : '🎤 '}${text ? text.text : lang('AttachAudio')}`;\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${text ? text.text : document.fileName}`;\n }\n\n if (contact) {\n return lang('AttachContact');\n }\n\n if (poll) {\n return `${noEmoji ? '' : '📊 '}${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return text.text;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document || contact || poll || webPage || invoice) {\n return undefined;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageCustomShape(message: ApiMessage): boolean | number {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact,\n } = message.content;\n\n if (sticker || (video && video.isRound)) {\n return true;\n }\n\n if (!text || photo || video || audio || voice || document || poll || webPage || contact) {\n return false;\n }\n\n // This is a \"dual-intent\" method used to limit calls of `parseEmojiOnlyString`.\n return parseEmojiOnlyString(text.text) || false;\n}\n\nexport function getMessageSingleEmoji(message: ApiMessage) {\n const { text } = message.content;\n if (!(text && text.text.length <= 6)) {\n return undefined;\n }\n\n if (getMessageCustomShape(message) !== 1) {\n return undefined;\n }\n\n return text.text;\n}\n\nexport function getFirstLinkInMessage(message: ApiMessage) {\n const { text } = message.content;\n\n let match: RegExpMatchArray | null | undefined;\n if (text && text.entities) {\n let link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.TextUrl);\n if (link) {\n match = link.url!.match(RE_LINK);\n }\n\n if (!match) {\n link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url);\n if (link) {\n const { offset, length } = link;\n match = text.text.substring(offset, offset + length).match(RE_LINK);\n }\n }\n }\n\n if (!match && text) {\n match = text.text.match(RE_LINK);\n }\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function matchLinkInMessageText(message: ApiMessage) {\n const { text } = message.content;\n const match = text && text.text.match(RE_LINK);\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function isOwnMessage(message: ApiMessage) {\n return message.isOutgoing;\n}\n\nexport function isReplyMessage(message: ApiMessage) {\n return Boolean(message.replyToMessageId);\n}\n\nexport function isForwardedMessage(message: ApiMessage) {\n return Boolean(message.forwardInfo);\n}\n\nexport function isActionMessage(message: ApiMessage) {\n return !!message.content.action;\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && isMessageLocal(message);\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && message.senderId! < 0 && isOwnMessage(message);\n}\n\nexport function getSenderTitle(lang: LangFn, sender: ApiUser | ApiChat) {\n return sender.id > 0 ? getUserFullName(sender as ApiUser) : getChatTitle(lang, sender as ApiChat);\n}\n\nexport function getSendingState(message: ApiMessage) {\n if (!message.sendingState) {\n return 'succeeded';\n }\n\n return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending';\n}\n\nexport function isMessageLocal(message: ApiMessage) {\n return message.id >= LOCAL_MESSAGE_ID_BASE;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo,\n} from '../../api/types';\n\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, IS_SAFARI } from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\nexport type IDimensions = {\n width: number;\n height: number;\n};\n\ntype Target = 'micro' | 'pictogram' | 'inline' | 'viewerPreview' | 'viewerFull' | 'download';\n\nconst MAX_INLINE_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\n\nexport function getMessageContent(message: ApiMessage) {\n return message.content;\n}\n\nexport function hasMessageMedia(message: ApiMessage) {\n return Boolean((\n getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageContact(message)\n || getMessagePoll(message)\n || getMessageAction(message)\n || getMessageAudio(message)\n || getMessageVoice(message)\n ));\n}\n\nexport function getMessagePhoto(message: ApiMessage) {\n return message.content.photo;\n}\n\nexport function getMessageVideo(message: ApiMessage) {\n return message.content.video;\n}\n\nexport function getMessageRoundVideo(message: ApiMessage) {\n const { video } = message.content;\n\n return video && video.isRound ? video : undefined;\n}\n\nexport function getMessageAction(message: ApiMessage) {\n return message.content.action;\n}\n\nexport function getMessageAudio(message: ApiMessage) {\n return message.content.audio;\n}\n\nexport function getMessageVoice(message: ApiMessage) {\n return message.content.voice;\n}\n\nexport function getMessageSticker(message: ApiMessage) {\n return message.content.sticker;\n}\n\nexport function getMessageDocument(message: ApiMessage) {\n return message.content.document;\n}\n\nexport function getMessageContact(message: ApiMessage) {\n return message.content.contact;\n}\n\nexport function getMessagePoll(message: ApiMessage) {\n return message.content.poll;\n}\n\nexport function getMessageInvoice(message: ApiMessage) {\n return message.content.invoice;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.photo : undefined;\n}\n\nexport function getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n const thumbnail = getMessageMediaThumbnail(message);\n\n return thumbnail ? thumbnail.dataUri : undefined;\n}\n\nexport function getMessageMediaHash(\n message: ApiMessage,\n target: Target,\n) {\n const {\n photo, video, sticker, audio, voice, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n\n if (!(photo || video || sticker || webPagePhoto || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (photo || webPagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=x`;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (video) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n if (canMessagePlayVideoInline(video)) {\n return getVideoOrAudioBaseHash(video, base);\n }\n\n return `${base}?size=z`;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(video, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (sticker) {\n switch (target) {\n case 'micro':\n return undefined;\n case 'pictogram':\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return getVideoOrAudioBaseHash(audio, base);\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return base;\n }\n }\n\n return undefined;\n}\n\nfunction getVideoOrAudioBaseHash(media: ApiAudio | ApiVideo, base: string) {\n if (IS_PROGRESSIVE_SUPPORTED && IS_SAFARI) {\n return `${base}?fileSize=${media.size}&mimeType=${media.mimeType}`;\n }\n\n return base;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): Exclude;\nexport function getMessageMediaFormat(message: ApiMessage, target: Target, canBeLottie: true): ApiMediaFormat;\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n sticker, video, audio, voice,\n } = message.content;\n\n if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (video && IS_PROGRESSIVE_SUPPORTED && (\n (target === 'viewerFull') || (target === 'inline' && canMessagePlayVideoInline(video))\n )) {\n return ApiMediaFormat.Progressive;\n } else if (audio || voice) {\n // Safari\n if (voice && !IS_OPUS_SUPPORTED) {\n return ApiMediaFormat.BlobUrl;\n }\n\n return ApiMediaFormat.Progressive;\n }\n\n return ApiMediaFormat.BlobUrl;\n}\n\nexport function getMessageMediaFilename(message: ApiMessage) {\n const { photo, video, webPage } = message.content;\n\n if (photo || (webPage && webPage.photo)) {\n return `photo${message.date}.jpeg`;\n }\n\n if (video) {\n return video.fileName;\n }\n\n return undefined;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo && photo.blobUrl) || (video && video.blobUrl) || (document && document.previewBlobUrl);\n}\n\nexport function canMessagePlayVideoInline(video: ApiVideo): boolean {\n return video.isGif || video.isRound || video.size <= MAX_INLINE_VIDEO_SIZE;\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], reverseOrder = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, 'media');\n\n return reverseOrder ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): IDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'z')\n || photo.sizes.find((size) => size.type === 'y')\n || getPhotoInlineDimensions(photo)\n );\n}\n\nexport function getPhotoInlineDimensions(photo: ApiPhoto): IDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'x')\n || photo.sizes.find((size) => size.type === 'm')\n || photo.sizes.find((size) => size.type === 's')\n || photo.thumbnail\n );\n}\n\nexport function getVideoDimensions(video: ApiVideo): IDimensions | undefined {\n if (video.width && video.height) {\n return video as IDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isDownloadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isDownloadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record, messageIds: number[], contentType: ApiMessageSearchType,\n) {\n let validator: Function;\n\n switch (contentType) {\n case 'media':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessagePhoto(message) || (video && !video.isRound && !video.isGif);\n };\n break;\n\n case 'documents':\n validator = getMessageDocument;\n break;\n\n case 'links':\n validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message);\n break;\n\n case 'audio':\n validator = getMessageAudio;\n break;\n\n default:\n return [] as Array;\n }\n\n return messageIds.reduce((result, messageId) => {\n if (messages[messageId] && validator(messages[messageId])) {\n result.push(messageId);\n }\n\n return result;\n }, [] as Array);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video;\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: number, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","export * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\nexport * from './misc';\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: number): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectUserByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.users.byId).find(\n (user) => user.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectNotifySettings(global: GlobalState) {\n return global.settings.byKey;\n}\n\nexport function selectNotifyExceptions(global: GlobalState) {\n return global.settings.notifyExceptions;\n}\n","import { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isChatPrivate, isHistoryClearMessage, isUserBot, isUserOnline, selectIsChatMuted,\n} from '../helpers';\nimport { selectUser } from './users';\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE } from '../../config';\nimport { selectNotifyExceptions, selectNotifySettings } from './settings';\n\nexport function selectChat(global: GlobalState, chatId: number): ApiChat | undefined {\n return global.chats.byId[chatId];\n}\n\nexport function selectChatUser(global: GlobalState, chat: ApiChat) {\n const userId = getPrivateChatUserId(chat);\n if (!userId) {\n return false;\n }\n\n return selectUser(global, userId);\n}\n\nexport function selectIsChatWithSelf(global: GlobalState, chatId: number) {\n return chatId === global.currentUserId;\n}\n\nexport function selectIsChatWithBot(global: GlobalState, chat: ApiChat) {\n const user = selectChatUser(global, chat);\n return user && isUserBot(user);\n}\n\nexport function selectSupportChat(global: GlobalState) {\n return Object.values(global.chats.byId).find(({ isSupport }: ApiChat) => isSupport);\n}\n\nexport function selectChatOnlineCount(global: GlobalState, chat: ApiChat) {\n if (isChatPrivate(chat.id) || isChatChannel(chat) || !chat.fullInfo) {\n return undefined;\n }\n\n if (!chat.fullInfo.members || chat.fullInfo.members.length === MEMBERS_LOAD_SLICE) {\n return chat.fullInfo.onlineCount;\n }\n\n return chat.fullInfo.members.reduce((onlineCount, { userId }) => {\n if (global.users.byId[userId] && isUserOnline(global.users.byId[userId]) && userId !== global.currentUserId) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const userId = chat && getPrivateChatUserId(chat);\n const user = userId && selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const bot = selectChatBot(global, chatId);\n if (!chat || !bot) {\n return false;\n }\n\n if (chat.lastMessage && isHistoryClearMessage(chat.lastMessage)) {\n return true;\n }\n\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return false;\n }\n\n const { listedIds } = messageInfo.threadsById[MAIN_THREAD_ID] || {};\n return listedIds && !listedIds.length;\n}\n\nexport function selectAreActiveChatsLoaded(global: GlobalState): boolean {\n return Boolean(global.chats.listIds.active);\n}\n\nexport function selectIsChatListed(global: GlobalState, chatId: number, type?: 'active' | 'archived'): boolean {\n const { listIds } = global.chats;\n if (type) {\n const targetList = listIds[type];\n return Boolean(targetList && targetList.includes(chatId));\n }\n\n return Object.values(listIds).some((list) => list && list.includes(chatId));\n}\n\nexport function selectChatListType(global: GlobalState, chatId: number): 'active' | 'archived' | undefined {\n const chat = selectChat(global, chatId);\n if (!chat || !selectIsChatListed(global, chatId)) {\n return undefined;\n }\n\n return chat.folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n}\n\nexport function selectChatFolder(global: GlobalState, folderId: number) {\n return global.chatFolders.byId[folderId];\n}\n\nexport function selectTotalChatCount(global: GlobalState, listType: 'active' | 'archived'): number {\n const { totalCount } = global.chats;\n const allChatsCount = totalCount.all;\n const archivedChatsCount = totalCount.archived || 0;\n\n if (listType === 'archived') {\n return archivedChatsCount;\n }\n\n return allChatsCount ? allChatsCount - archivedChatsCount : 0;\n}\n\nexport function selectIsChatPinned(global: GlobalState, chatId: number, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return !!active && active.includes(chatId);\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return !!archived && archived.includes(chatId);\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return !!pinnedChatIds && pinnedChatIds.includes(chatId);\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectChatByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.chats.byId).find(\n (chat) => chat.username && chat.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectCountNotMutedUnread(global: GlobalState) {\n const activeChatIds = global.chats.listIds.active;\n if (!activeChatIds) {\n return 0;\n }\n\n const chats = global.chats.byId;\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (\n chat\n && chat.unreadCount\n && !selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n ) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker } from '../../api/types';\nimport { LangCode, EmojiKeywords } from '../../types';\n\nexport function selectIsStickerFavorite(global: GlobalState, sticker: ApiSticker) {\n const { stickers } = global.stickers.favorite;\n return stickers && stickers.some(({ id }) => id === sticker.id);\n}\n\nexport function selectCurrentStickerSearch(global: GlobalState) {\n return global.stickers.search;\n}\n\nexport function selectCurrentGifSearch(global: GlobalState) {\n return global.gifs.search;\n}\n\nexport function selectStickerSet(global: GlobalState, id: string) {\n return global.stickers.setsById[id];\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const stickerSets = Object.values(global.stickers.setsById);\n let stickersForEmoji: ApiSticker[] = [];\n stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n const stickers = packs[emoji];\n if (stickers) {\n stickersForEmoji = stickersForEmoji.concat(stickers);\n }\n });\n return stickersForEmoji;\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n const cleanedEmoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectEmojiKeywords(global: GlobalState, language: LangCode): EmojiKeywords | undefined {\n return global.emojiKeywords[language] && global.emojiKeywords[language] !== undefined\n ? global.emojiKeywords[language] as EmojiKeywords\n : undefined;\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport {\n ApiChat,\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isChatPrivate,\n isForwardedMessage,\n getCanPostInChat,\n isUserRightBanned,\n getHasAdminRight,\n isChatBasicGroup,\n isCommonBoxChat,\n isServiceNotificationMessage,\n isOwnMessage,\n isActionMessage,\n isChatGroup,\n isChatSuperGroup,\n getMessageVideo,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\n\nconst MESSAGE_EDIT_ALLOWED_TIME_MS = 172800000; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (messageLists && messageLists.length) {\n return messageLists[messageLists.length - 1];\n }\n\n return undefined;\n}\n\nexport function selectCurrentChat(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n return chatId ? selectChat(global, chatId) : undefined;\n}\n\nexport function selectChatMessages(global: GlobalState, chatId: number) {\n const messages = global.messages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: number) {\n const messages = global.scheduledMessages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectThreadParam(\n global: GlobalState,\n chatId: number,\n threadId: number,\n key: K,\n) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const thread = messageInfo.threadsById[threadId];\n if (!thread) {\n return undefined;\n }\n\n return thread[key];\n}\n\nexport function selectListedIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n switch (messageListType) {\n case 'thread':\n return selectViewportIds(global, chatId, threadId);\n case 'pinned':\n return selectPinnedIds(global, chatId);\n case 'scheduled':\n return selectScheduledIds(global, chatId);\n }\n\n return undefined;\n}\n\nexport function selectViewportIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return selectChat(global, chatId);\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return selectChat(global, threadInfo.originChannelId || chatId);\n}\n\nexport function selectThreadTopMessageId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return undefined;\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return threadInfo.topMessageId;\n}\n\nexport function selectThreadByMessage(global: GlobalState, chatId: number, message: ApiMessage) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const { replyToMessageId, replyToTopMessageId } = message;\n if (!replyToMessageId && !replyToTopMessageId) {\n return undefined;\n }\n\n return Object.values(messageInfo.threadsById).find((thread) => {\n return thread.threadInfo && (\n (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId)\n || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId)\n );\n });\n}\n\nexport function isMessageInCurrentMessageList(global: GlobalState, chatId: number, message: ApiMessage) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return false;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n return (\n chatId === currentMessageList.chatId\n && (\n (currentMessageList.threadId === MAIN_THREAD_ID)\n || (threadInfo && currentMessageList.threadId === threadInfo.threadId)\n )\n );\n}\n\nexport function selectIsViewportNewest(global: GlobalState, chatId: number, threadId: number) {\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!viewportIds || !viewportIds.length) {\n return true;\n }\n\n let lastMessageId: number;\n\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return true;\n }\n\n lastMessageId = chat.lastMessage.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || !threadInfo.lastMessageId) {\n return undefined;\n }\n\n lastMessageId = threadInfo.lastMessageId;\n }\n\n // Edge case: outgoing `lastMessage` is updated with a delay to optimize animation\n if (lastMessageId >= LOCAL_MESSAGE_ID_BASE && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n if (messageListType === 'scheduled') {\n const messageId = selectEditingScheduledId(global, chatId);\n return messageId ? selectScheduledMessage(global, chatId, messageId) : undefined;\n } else {\n const messageId = selectEditingId(global, chatId, threadId);\n return messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n }\n}\n\nexport function selectChatMessageByPollId(global: GlobalState, pollId: string) {\n let messageWithPoll: ApiMessage | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const chatMessages of Object.values(global.messages.byChatId)) {\n const { byId } = chatMessages;\n messageWithPoll = Object.values(byId).find((message) => {\n return message.content.poll && message.content.poll.id === pollId;\n });\n if (messageWithPoll) {\n break;\n }\n }\n\n return messageWithPoll;\n}\n\nexport function selectFocusedMessageId(global: GlobalState, chatId: number) {\n const { chatId: focusedChatId, messageId } = global.focusedMessage || {};\n\n return focusedChatId === chatId ? messageId : undefined;\n}\n\nexport function selectIsMessageFocused(global: GlobalState, message: ApiMessage) {\n const focusedId = selectFocusedMessageId(global, message.chatId);\n\n return focusedId ? focusedId === message.id || focusedId === message.previousLocalId : false;\n}\n\nexport function selectIsMessageUnread(global: GlobalState, message: ApiMessage) {\n const { lastReadOutboxMessageId } = selectChat(global, message.chatId) || {};\n return isMessageLocal(message) || !lastReadOutboxMessageId || lastReadOutboxMessageId < message.id;\n}\n\nexport function selectOutgoingStatus(\n global: GlobalState, message: ApiMessage, isScheduledList = false,\n): ApiMessageOutgoingStatus {\n if (!selectIsMessageUnread(global, message) && !isScheduledList) {\n return 'read';\n }\n\n return getSendingState(message);\n}\n\nexport function selectSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return senderId > 0 ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectForwardedSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { forwardInfo } = message;\n if (!forwardInfo) {\n return undefined;\n }\n\n if (forwardInfo.isChannelPost && forwardInfo.fromChatId) {\n return selectChat(global, forwardInfo.fromChatId);\n } else if (forwardInfo.senderUserId) {\n return selectUser(global, forwardInfo.senderUserId);\n }\n\n return undefined;\n}\n\nexport function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) {\n const chat = selectChat(global, message.chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n const isPrivate = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, message.chatId);\n const isBasicGroup = isChatBasicGroup(chat);\n const isSuperGroup = isChatSuperGroup(chat);\n const isChannel = isChatChannel(chat);\n const isServiceNotification = isServiceNotificationMessage(message);\n\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n const isMessageEditable = (\n (isChatWithSelf || Date.now() - message.date * 1000 < MESSAGE_EDIT_ALLOWED_TIME_MS)\n && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video && content.video.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = getCanPostInChat(chat, threadId) && !isServiceNotification;\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isAction && hasPinPermission;\n let canUnpin = false;\n\n const pinnedMessageIds = selectPinnedIds(global, chat.id);\n\n if (canPin) {\n canUnpin = Boolean(pinnedMessageIds && pinnedMessageIds.includes(message.id));\n canPin = !canUnpin;\n }\n\n const canDelete = isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages');\n\n const canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages')\n ))\n );\n\n const canEdit = !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isAction && !isServiceNotification;\n\n const hasSticker = Boolean(message.content.sticker);\n const hasFavoriteSticker = hasSticker && selectIsStickerFavorite(global, message.content.sticker!);\n const canFaveSticker = !isAction && hasSticker && !hasFavoriteSticker;\n const canUnfaveSticker = !isAction && hasFavoriteSticker;\n const canCopy = !isAction;\n const canCopyLink = !isAction && (isChannel || isSuperGroup);\n const canSelect = !isAction;\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\nexport function selectCanDeleteSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return {};\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return {\n canDelete: messageActions.every((actions) => actions.canDelete),\n canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll),\n };\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n const fileTransfer = global.fileUploads.byMessageLocalId[message.previousLocalId || message.id];\n\n return fileTransfer ? fileTransfer.progress : undefined;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n // `lastReadInboxMessageId` is empty for new chats\n if (!chat.lastReadInboxMessageId) {\n return undefined;\n }\n\n if (!chat.lastMessage) {\n return chat.lastReadInboxMessageId;\n }\n\n if (isMessageLocal(chat.lastMessage)) {\n return chat.lastMessage.id;\n }\n\n // Some previously read messages may be deleted\n return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId);\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n if (!threadInfo.lastReadInboxMessageId) {\n return threadInfo.topMessageId;\n }\n\n // Some previously read messages may be deleted\n return Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId || Infinity);\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: number, threadId: number) {\n const chat = selectChat(global, chatId);\n\n if (threadId === MAIN_THREAD_ID) {\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId) {\n return undefined;\n }\n }\n\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const byId = selectChatMessages(global, chatId);\n if (!byId || !(outlyingIds || listedIds)) {\n return undefined;\n }\n\n const lastReadId = selectRealLastReadId(global, chatId, threadId);\n if (!lastReadId && chat && chat.isNotJoined) {\n return undefined;\n }\n\n if (outlyingIds) {\n const found = !lastReadId ? outlyingIds[0] : outlyingIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = !lastReadId ? listedIds[0] : listedIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nexport function selectIsPollResultsOpen(global: GlobalState) {\n const { pollResults } = global;\n return Boolean(pollResults.messageId);\n}\n\nexport function selectIsForwardModalOpen(global: GlobalState) {\n const { forwardMessages } = global;\n return Boolean(forwardMessages.isModalShown);\n}\n\nexport function selectCommonBoxChatId(global: GlobalState, messageId: number) {\n const fromLastMessage = Object.values(global.chats.byId).find((chat) => (\n isCommonBoxChat(chat) && chat.lastMessage && chat.lastMessage.id === messageId\n ));\n if (fromLastMessage) {\n return fromLastMessage.id;\n }\n\n const { byChatId } = global.messages;\n return Number(Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, Number(chatId));\n return chat && isCommonBoxChat(chat) && byChatId[chat.id].byId[messageId];\n }));\n}\n\nexport function selectIsInSelectMode(global: GlobalState) {\n const { selectedMessages } = global;\n\n return Boolean(selectedMessages);\n}\n\nexport function selectIsMessageSelected(global: GlobalState, messageId: number) {\n const { messageIds } = global.selectedMessages || {};\n if (!messageIds) {\n return false;\n }\n\n return messageIds.includes(messageId);\n}\n\nexport function selectForwardedMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.values(chatMessages)\n .filter((message) => message.groupedId === groupedId && message.forwardInfo)\n .map(({ forwardInfo }) => forwardInfo!.fromMessageId);\n}\n\nexport function selectMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.keys(chatMessages)\n .map(Number)\n .filter((id) => chatMessages[id].groupedId === groupedId);\n}\n\nexport function selectIsDocumentGroupSelected(global: GlobalState, chatId: number, groupedId: string) {\n const { messageIds: selectedIds } = global.selectedMessages || {};\n if (!selectedIds) {\n return false;\n }\n\n const groupIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n return groupIds && groupIds.every((id) => selectedIds.includes(id));\n}\n\nexport function selectSelectedMessagesCount(global: GlobalState) {\n const { messageIds } = global.selectedMessages || {};\n\n return messageIds ? messageIds.length : 0;\n}\n\nexport function selectNewestMessageWithBotKeyboardButtons(\n global: GlobalState, chatId: number,\n): ApiMessage | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (!selectIsChatWithBot(global, chat)) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, MAIN_THREAD_ID);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const messageId = findLast(viewportIds, (id) => {\n return !chatMessages[id].isOutgoing && Boolean(chatMessages[id].keyboardButtons);\n });\n\n const replyHideMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id].shouldHideKeyboardButtons);\n });\n\n if (messageId && replyHideMessageId && replyHideMessageId > messageId) {\n return undefined;\n }\n\n return messageId ? chatMessages[messageId] : undefined;\n}\n\nexport function selectShouldAutoLoadMedia(\n global: GlobalState, message: ApiMessage, chat: ApiChat, sender?: ApiChat | ApiUser,\n) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n } = global.settings.byKey;\n\n return Boolean(\n (shouldAutoDownloadMediaInPrivateChats && isChatPrivate(chat.id))\n || (shouldAutoDownloadMediaInGroups && isChatGroup(chat))\n || (shouldAutoDownloadMediaInChannels && isChatChannel(chat))\n || (shouldAutoDownloadMediaFromContacts && sender && (\n sender.id === global.currentUserId\n || selectIsUserOrChatContact(global, sender)\n )),\n );\n}\n\nexport function selectShouldAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (shouldAutoPlayVideos && !asGif) || (shouldAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n","import { GlobalState } from '../../global/types';\nimport { selectCurrentMessageList } from './messages';\nimport { buildChatThreadKey } from '../helpers';\n\nexport function selectCurrentTextSearch(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const currentSearch = global.localTextSearch.byChatThreadKey[chatThreadKey];\n if (!currentSearch || !currentSearch.isActive) {\n return undefined;\n }\n\n return currentSearch;\n}\n\nexport function selectCurrentMediaSearchPeerId(global: GlobalState) {\n const { byChatId } = global.localMediaSearch;\n const { chatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = global.users.selectedId;\n\n return currentProfileUserId && byChatId[currentProfileUserId] ? currentProfileUserId : chatId;\n}\n\nexport function selectCurrentMediaSearch(global: GlobalState) {\n const peerId = selectCurrentMediaSearchPeerId(global);\n if (!peerId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[peerId];\n}\n","import { GlobalState } from '../../global/types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isChatPrivate } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: number) {\n return global.management.byChatId[chatId];\n}\n\nexport function selectCurrentManagement(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const currentManagement = global.management.byChatId[chatId];\n if (!currentManagement || !currentManagement.isActive) {\n return undefined;\n }\n\n return currentManagement;\n}\n\nexport function selectCurrentManagementType(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n if (isChatPrivate(chatId)) {\n return 'user';\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (isChatGroup(chat)) {\n return 'group';\n }\n\n return 'channel';\n}\n","import { GlobalState } from '../../global/types';\nimport { RightColumnContent } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectAreActiveChatsLoaded } from './chats';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.messageId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n const {\n users,\n isChatInfoShown,\n } = global;\n\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_MOBILE_SCREEN && selectCurrentTextSearch(global));\n const isManagement = selectCurrentManagement(global);\n const stickerSearch = selectCurrentStickerSearch(global);\n const isStickerSearch = stickerSearch.query !== undefined;\n const gifSearch = selectCurrentGifSearch(global);\n const isGifSearch = gifSearch.query !== undefined;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = users.selectedId;\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n const isUserInfo = Boolean(currentProfileUserId && areActiveChatsLoaded);\n const isChatShown = Boolean(currentChatId && areActiveChatsLoaded);\n const isChatInfo = isChatShown && isChatInfoShown;\n\n return isPollResults ? (\n RightColumnContent.PollResults\n ) : isSearch ? (\n RightColumnContent.Search\n ) : isManagement ? (\n RightColumnContent.Management\n ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isUserInfo ? (\n RightColumnContent.UserInfo\n ) : isChatInfo ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","\nimport { GlobalState } from '../../global/types';\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams ? global.payment.nativeParams.publishableKey : undefined;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n","import {\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n IS_TEST,\n} from '../config';\n\nexport function getPlatform() {\n const { userAgent, platform } = window.navigator;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os: 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'Mac OS';\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS';\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows';\n } else if (/Android/.test(userAgent)) {\n os = 'Android';\n } else if (/Linux/.test(platform)) {\n os = 'Linux';\n }\n\n return os;\n}\n\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'Mac OS';\nexport const IS_IOS = PLATFORM_ENV === 'iOS';\nexport const IS_ANDROID = PLATFORM_ENV === 'Android';\nexport const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_MOBILE_SCREEN = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = (navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n));\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS);\nexport const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator;\n// TODO Consider failed service worker\nexport const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED;\nexport const IS_STREAMING_SUPPORTED = 'MediaSource' in window;\nexport const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus'));\nexport const IS_CANVAS_FILTER_SUPPORTED = (\n !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {})\n);\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\n\nlet isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise {\n return new Promise((resolve) => {\n const webp = new Image();\n // eslint-disable-next-line max-len\n webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n const handleLoadOrError = () => {\n resolve(webp.height === 2);\n };\n webp.onload = handleLoadOrError;\n webp.onerror = handleLoadOrError;\n });\n}\n\ntestWebp().then((hasWebp) => {\n isWebpSupportedCache = hasWebp;\n});\n","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\n};\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n","import Worker from 'worker-loader!./worker';\n\nimport { ApiOnProgress, ApiSessionData, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, ThenArg, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nlet worker: Worker;\nconst requestStates = new Map();\nconst requestStatesByCallback = new Map();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, sessionData?: ApiSessionData) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD WORKER');\n }\n\n worker = new Worker();\n subscribeToWorker(onUpdate);\n }\n\n return makeRequest({\n type: 'initApi',\n args: [sessionData],\n });\n}\n\nexport function callApi(fnName: T, ...args: MethodArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('API is not initialized');\n }\n\n return undefined;\n }\n\n return makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n }) as MethodResponse;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n\n const { messageId } = requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n}\n\nfunction subscribeToWorker(onUpdate: OnApiUpdate) {\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'update') {\n onUpdate(data.update);\n } else if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n const requestState = requestStates.get(data.messageId);\n if (requestState && requestState.callback) {\n requestState.callback(...data.callbackArgs);\n }\n } else if (data.type === 'unhandledError') {\n throw data.error;\n }\n });\n}\n\nfunction makeRequest(message: OriginRequest) {\n const messageId = generateIdFor(requestStates);\n const payload: OriginRequest = {\n messageId,\n ...message,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (typeof payload.args[1] === 'function') {\n const callback = payload.args.pop() as AnyToVoidFunction;\n requestState.callback = callback;\n requestStatesByCallback.set(callback, requestState);\n }\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n\n if (requestState.callback) {\n requestStatesByCallback.delete(requestState.callback);\n }\n });\n\n worker.postMessage(payload);\n\n return promise;\n}\n","import { DEBUG } from '../config';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra\n}\n\ninterface ImportedBundles {\n [Bundles.Auth]: typeof import('../bundles/auth');\n [Bundles.Main]: typeof import('../bundles/main');\n [Bundles.Extra]: typeof import('../bundles/extra');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise\n};\n\nexport type BundleModules = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial = {};\nconst MEMORY_CACHE: Partial = {};\n\nexport async function loadModule>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import('../bundles/auth');\n break;\n case Bundles.Main:\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD MAIN BUNDLE');\n }\n\n LOAD_PROMISES[Bundles.Main] = import('../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import('../bundles/extra');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise).then(handleBundleLoad);\n }\n\n const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B];\n\n if (!MEMORY_CACHE[bundleName]) {\n MEMORY_CACHE[bundleName] = bundle;\n }\n\n return getModuleFromMemory(bundleName, moduleName);\n}\n\nexport function getModuleFromMemory>(bundleName: B, moduleName: M) {\n const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B];\n\n if (!bundle) {\n return undefined;\n }\n\n return bundle[moduleName];\n}\n\nconst listeners: NoneToVoidFunction[] = [];\n\nexport function addLoadListener(listener: NoneToVoidFunction) {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n}\n\nfunction handleBundleLoad() {\n listeners.forEach((listener) => {\n listener();\n });\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n}\n\nexport async function fetch(cacheName: string, key: string, type: Type) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const request = new Request(key);\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.substr(0, 7) === 'sticker') {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n // iOS Safari fails to preserve `type` in cache\n if (!blob.type) {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n return new Blob([blob], { type: contentType });\n }\n }\n\n return blob;\n }\n case Type.Json:\n return await response.json();\n default:\n return undefined;\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n const request = new Request(key);\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function clear(cacheName: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n return await cacheApi.delete(cacheName);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n new Promise((resolve, reject) => {\n video.onseeked = () => {\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","export default __webpack_public_path__ + \"en-extra.e73049da90714ecdae3233e8ffa74d39.json\";","export default __webpack_public_path__ + \"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json\";","export default __webpack_public_path__ + \"it-extra.78e5568451a888818c7e2209e05a9602.json\";","export default __webpack_public_path__ + \"pl-extra.38fd67a6c26e58f5c912568332c7c074.json\";","export default __webpack_public_path__ + \"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json\";","import { ApiLangPack } from '../api/types';\n\nimport { DEBUG, LANG_CACHE_NAME, LANG_PACKS } from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { mapValues } from './iteratees';\n\nimport enExtraJson from '../assets/lang/en-extra.json';\nimport esExtraJson from '../assets/lang/es-extra.json';\nimport itExtraJson from '../assets/lang/it-extra.json';\nimport plExtraJson from '../assets/lang/pl-extra.json';\nimport ruExtraJson from '../assets/lang/ru-extra.json';\nimport { formatInteger } from './textFormat';\nimport { getGlobal } from '../lib/teact/teactn';\n\ninterface LangFn {\n (key: string, value?: any, format?: 'i'): any;\n\n isRtl?: boolean;\n}\n\nconst EXTRA_PACK_PATHS: Record = {\n en: enExtraJson as unknown as string,\n es: esExtraJson as unknown as string,\n it: itExtraJson as unknown as string,\n pl: plExtraJson as unknown as string,\n ru: ruExtraJson as unknown as string,\n};\n\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\nconst PLURAL_RULES = {\n /* eslint-disable max-len */\n en: (n: number) => (n !== 1 ? 6 : 2),\n ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6),\n ca: (n: number) => (n !== 1 ? 6 : 2),\n de: (n: number) => (n !== 1 ? 6 : 2),\n es: (n: number) => (n !== 1 ? 6 : 2),\n fa: (n: number) => (n > 1 ? 6 : 2),\n fr: (n: number) => (n > 1 ? 6 : 2),\n id: () => 0,\n it: (n: number) => (n !== 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nl: (n: number) => (n !== 1 ? 6 : 2),\n pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n pt_BR: (n: number) => (n > 1 ? 6 : 2),\n ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n tr: (n: number) => (n > 1 ? 6 : 2),\n uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n uz: (n: number) => (n > 1 ? 6 : 2),\n /* eslint-enable max-len */\n};\n\nconst cache = new Map();\n\nlet langPack: ApiLangPack;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\n\nexport const getTranslation: LangFn = (key: string, value?: any, format?: 'i') => {\n if (value !== undefined) {\n const cached = cache.get(`${key}_${value}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack) {\n return key;\n }\n\n const langString = langPack[key];\n if (!langString) {\n return key;\n }\n\n const template = langString[typeof value === 'number' ? getPluralOption(value) : 'value'];\n if (!template || !template.trim()) {\n const parts = key.split('.');\n\n return parts[parts.length - 1];\n }\n\n if (value !== undefined) {\n const formattedValue = format === 'i' ? formatInteger(value) : value;\n const result = processTemplate(template, formattedValue);\n cache.set(`${key}_${value}_${format}`, result);\n return result;\n }\n\n return template;\n};\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n const newLangPack = await fetchFromCacheOrRemote(langCode);\n if (!newLangPack) {\n return;\n }\n\n if (EXTRA_PACK_PATHS[langCode]) {\n try {\n const response = await fetch(EXTRA_PACK_PATHS[langCode]);\n const pairs = await response.json();\n const extraLangPack = mapValues(pairs, (value, key) => ({ key, value }));\n\n Object.assign(newLangPack, extraLangPack);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n const { languages } = getGlobal().settings.byKey;\n const langInfo = languages ? languages.find((l) => l.langCode === langCode) : undefined;\n getTranslation.isRtl = Boolean(langInfo && langInfo.rtl);\n\n if (callback) {\n callback();\n }\n\n runCallbacks(langPack);\n}\n\nasync function fetchFromCacheOrRemote(langCode: string): Promise {\n const cached = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (cached) {\n return cached;\n }\n\n const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode });\n if (remote) {\n await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack);\n return remote.langPack;\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const optionIndex = currentLangCode && PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n return template.replace(/%\\d?\\$?[sdf@]/, String(value));\n}\n","export function createCallbackManager() {\n const callbacks: AnyToVoidFunction[] = [];\n\n function addCallback(cb: AnyToVoidFunction) {\n callbacks.push(cb);\n\n return () => {\n removeCallback(cb);\n };\n }\n\n function removeCallback(cb: AnyToVoidFunction) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n\n function runCallbacks(...args: any[]) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n };\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 2c193ce 28.05.2021\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n// eslint-disable-next-line max-len\nexport default /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\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]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91])|(?:\\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]|[\\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\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black';\n};\n\nconst Loading: FC = ({ color = 'blue' }) => {\n return (\n

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

Sign in to Telegram

\n

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

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

Such error, many tabs

\n
\n Telegram supports only one active tab with the app.\n
\n Please reload this page to continue using this tab or close it.\n
\n
\n \n
\n
\n
\n );\n};\n\nexport default AppInactive;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from './global/types';\n\nimport {\n LEGACY_SESSION_KEY, INACTIVE_MARKER, SESSION_USER_KEY, PAGE_TITLE,\n} from './config';\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport useFlag from './hooks/useFlag';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\nimport AppInactive from './components/main/AppInactive';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst App: FC = ({ authState, disconnect }) => {\n const [isInactive, markInactive] = useFlag(false);\n\n useEffect(() => {\n updateSizes();\n addActiveTabChangeListener(() => {\n disconnect();\n document.title = `${PAGE_TITLE}${INACTIVE_MARKER}`;\n\n markInactive();\n });\n }, [disconnect, markInactive]);\n\n // return ;\n\n if (isInactive) {\n return ;\n }\n\n if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n case 'authorizationStateWaitCode':\n case 'authorizationStateWaitPassword':\n case 'authorizationStateWaitRegistration':\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n return renderMain();\n }\n }\n\n const hasSession = localStorage.getItem(SESSION_USER_KEY) || localStorage.getItem(LEGACY_SESSION_KEY);\n\n return hasSession ? renderMain() : ;\n};\n\nfunction renderMain() {\n return (\n \n
\n \n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (setGlobal, actions): DispatchProps => pick(actions, ['disconnect']),\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React, { getDispatch, getGlobal } from './lib/teact/teactn';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport './global';\n\nimport { DEBUG } from './config';\n\nimport App from './App';\n\nimport './styles/index.scss';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> INIT');\n}\n\ngetDispatch().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nTeactDOM.render(\n ,\n document.getElementById('root'),\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL STATE', getGlobal());\n});\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/main.30f39d7692fbe2ac267b.js b/dist/main.30f39d7692fbe2ac267b.js new file mode 100644 index 000000000..2e3003b01 --- /dev/null +++ b/dist/main.30f39d7692fbe2ac267b.js @@ -0,0 +1,2 @@ +!function(e){function t(t){for(var n,r,d=t[0],o=t[1],c=0,a=[];c=0&&w(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),I[n].renderTimes.push(t),I[n].renderCount++}}catch(t){Object(c.a)(t),u=e.renderedValue}if(e.isMounted&&u===e.renderedValue)return e.$element;e.renderedValue=u;const d=O(u);return e.$element=y(e,[d]),e.$element}function E(e,t){return typeof e!=typeof t||(e.type!==t.type||(b(e)&&b(t)?e.value!==t.value:h(e)&&h(t)?e.tag!==t.tag||e.props.key!==t.props.key:!(!m(e)||!m(t))&&(e.componentInstance.Component!==t.componentInstance.Component||e.props.key!==t.props.key)))}function C(e){p(e)&&(m(e)?function(e){if(!e.isMounted)return;e.hooks.memos.byCursor.forEach(e=>{e.current=null}),e.hooks.effects.byCursor.forEach(({cleanup:e})=>{if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}}),e.isMounted=!1,function(e){e.hooks.effects.byCursor.forEach(e=>{e.cleanup=null,e.effect=null,e.dependencies=null}),e.hooks.state.byCursor.forEach(e=>{e.value=null,e.nextValue=null,e.setter=null}),e.hooks.memos.byCursor.forEach(e=>{e.dependencies=null}),e.hooks=null,e.$element=null,e.Component=null,e.props=null,e.forceUpdate=null,e.onUpdate=null}(e)}(e.componentInstance):e.target&&(Object(a.b)(e.target),e.target=null),e.children.forEach(C))}function S(e){return j(e),e.isMounted=!0,e.$element}function M(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;j(e),e.$element!==t&&e.onUpdate()}function A(e){return m(e)?A(e.children[0]):e.target}function k(e,t){m(e)?k(e.children[0],t):e.target=t}function T(e){const{cursor:t,byCursor:n}=f.hooks.state;var d;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(d=f,e=>{n[t].nextValue!==e&&(n[t].nextValue="function"==typeof e?e(n[t].value):e,d.prepareForFrame&&d.forceUpdate||(d.prepareForFrame=Object(u.h)(()=>function e(t){t.isMounted&&(t.hooks.state.byCursor.forEach(e=>{e.value=e.nextValue}),t.prepareForFrame=Object(u.h)(()=>e(t)),t.forceUpdate=Object(u.i)(()=>M(t)))}(d)),d.forceUpdate=Object(u.i)(()=>M(d))),d.prepareForFrame(),d.forceUpdate(),r.r&&console.log("[Teact.useState]",d.name,d.Component&&d.Component.DEBUG_contentComponentName?"> "+d.Component.DEBUG_contentComponentName:"",`Forced update at cursor #${t}, next value: `,n[t].nextValue))})}),f.hooks.state.cursor++,[n[t].value,n[t].setter]}function N(e,t,n){const{cursor:r,byCursor:u}=f.hooks.effects,d=f,o=()=>{if(!d.isMounted)return;const{cleanup:e}=u[r];if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}u[r].cleanup=t()};void 0!==u[r]&&n&&u[r].dependencies?n.some((e,t)=>e!==u[r].dependencies[t])&&e(o):e(o),u[r]={effect:t,dependencies:n,cleanup:u[r]?u[r].cleanup:void 0},f.hooks.effects.cursor++}function P(e,t){return N(u.b,e,t)}function D(e,t){return N(u.d,e,t)}function F(e,t){const{cursor:n,byCursor:r}=f.hooks.memos;let{current:u}=r[n]||{};return(void 0===r[n]||t.some((e,t)=>e!==r[n].dependencies[t]))&&(u=e()),r[n]={current:u,dependencies:t},f.hooks.memos.cursor++,u}function L(e,t){return F(()=>e,t)}function x(e){return F(()=>({current:e}),[])}function B(e,t=o.a,n=!1){return function(u){const d=x(u),c=x();return(!c.current||d.current&&!t(d.current,u))&&(r.p&&n&&console.log(`[Teact.memo] ${e.name}: Update is caused by:`,Object(o.b)(d.current,u).join(", ")),d.current=u,c.current=g(e,u)),c.current}}document.addEventListener("dblclick",()=>{console.log("COMPONENTS",Object(d.k)(Object.values(I),"renderCount","desc"))}),t.a={createElement:g,Fragment:s}},function(e,t,n){"use strict";n.d(t,"eb",(function(){return r})),n.d(t,"D",(function(){return u})),n.d(t,"f",(function(){return d})),n.d(t,"g",(function(){return o})),n.d(t,"p",(function(){return c})),n.d(t,"r",(function(){return a})),n.d(t,"E",(function(){return i})),n.d(t,"q",(function(){return s})),n.d(t,"nb",(function(){return f})),n.d(t,"H",(function(){return l})),n.d(t,"A",(function(){return b})),n.d(t,"B",(function(){return h})),n.d(t,"z",(function(){return m})),n.d(t,"C",(function(){return p})),n.d(t,"M",(function(){return g})),n.d(t,"N",(function(){return y})),n.d(t,"O",(function(){return v})),n.d(t,"P",(function(){return w})),n.d(t,"m",(function(){return O})),n.d(t,"F",(function(){return I})),n.d(t,"Y",(function(){return E})),n.d(t,"U",(function(){return C})),n.d(t,"V",(function(){return S})),n.d(t,"W",(function(){return M})),n.d(t,"i",(function(){return A})),n.d(t,"k",(function(){return k})),n.d(t,"j",(function(){return T})),n.d(t,"ob",(function(){return N})),n.d(t,"X",(function(){return P})),n.d(t,"y",(function(){return D})),n.d(t,"R",(function(){return F})),n.d(t,"Q",(function(){return L})),n.d(t,"fb",(function(){return x})),n.d(t,"Db",(function(){return B})),n.d(t,"a",(function(){return R})),n.d(t,"e",(function(){return U})),n.d(t,"d",(function(){return _})),n.d(t,"s",(function(){return G})),n.d(t,"u",(function(){return $})),n.d(t,"v",(function(){return W})),n.d(t,"w",(function(){return H})),n.d(t,"kb",(function(){return K})),n.d(t,"jb",(function(){return z})),n.d(t,"ab",(function(){return V})),n.d(t,"Z",(function(){return q})),n.d(t,"db",(function(){return J})),n.d(t,"cb",(function(){return Y})),n.d(t,"bb",(function(){return Q})),n.d(t,"J",(function(){return Z})),n.d(t,"c",(function(){return X})),n.d(t,"vb",(function(){return ee})),n.d(t,"wb",(function(){return te})),n.d(t,"qb",(function(){return ne})),n.d(t,"rb",(function(){return re})),n.d(t,"yb",(function(){return ue})),n.d(t,"ub",(function(){return de})),n.d(t,"zb",(function(){return oe})),n.d(t,"Ab",(function(){return ce})),n.d(t,"xb",(function(){return ae})),n.d(t,"Bb",(function(){return ie})),n.d(t,"sb",(function(){return se})),n.d(t,"tb",(function(){return fe})),n.d(t,"S",(function(){return le})),n.d(t,"T",(function(){return be})),n.d(t,"pb",(function(){return he})),n.d(t,"l",(function(){return me})),n.d(t,"gb",(function(){return pe})),n.d(t,"ib",(function(){return ge})),n.d(t,"hb",(function(){return ye})),n.d(t,"mb",(function(){return ve})),n.d(t,"b",(function(){return we})),n.d(t,"h",(function(){return Oe})),n.d(t,"L",(function(){return Ie})),n.d(t,"K",(function(){return je})),n.d(t,"lb",(function(){return Ee})),n.d(t,"G",(function(){return Ce})),n.d(t,"Cb",(function(){return Se})),n.d(t,"x",(function(){return Me})),n.d(t,"I",(function(){return Ae})),n.d(t,"n",(function(){return ke})),n.d(t,"o",(function(){return Te})),n.d(t,"t",(function(){return Ne}));const r="Telegram",u=" [Inactive]",d="Telegram WebZ",o="1.0.16",c=!1,a=!1,i=!1,s="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",f="user_auth",l="GramJs:sessionId",b=!1,h="tt-global-state",m=30,p=5e3,g=!1,y="tt-media",v="tt-media-avatars",w="tt-media-progressive",O="tt-custom-bg",I="tt-lang-packs-v4",j=(new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),"undefined"!=typeof window&&window.innerHeight>=900),E=1,C=500,S=j?60:40,M=2*S,A=72,k=j?30:25,T=100,N=42,P=42,D=20,F=30,L=200,x=500,B=20,R=!1,U=2,_=U,G=16,$=1e4,W="editable-message-text",H="editable-message-text-modal",K=1440,z=1150,V=1275,q=925,J=600,Y=950,Q=450,Z=1e9,X=100,ee=13,te=11,ne=160,re=120,ue=64,de=48,oe=32,ce=64,ae=64,ie=160,se=140,fe=80,le="MEMOJI_STICKER",be=200,he=450,me="image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime",pe="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",ge=/^(?:https?:\/\/)?(?:t\.me\/)([\d\w_]+)(?:\/([\d]+))?$/gm,ye=/^(?:https?:\/\/)?(?:t\.me\/joinchat\/)([\d\w_]+)?$/gm,ve=777e3,we=0,Oe=1,Ie=10,je=5,Ee=2147483646,Ce=["android","ios","tdesktop","macos"],Se="TelegramTips",Me="https://bugs.telegram.org/?tag_ids=41&sort=time",Ae="#A2AF8E",ke="#0F0F0F",Te="#0a0a0a8c",Ne="rgba(90, 110, 70, 0.6)"},function(e,t,n){"use strict";n.d(t,"g",(function(){return y})),n.d(t,"e",(function(){return v})),n.d(t,"d",(function(){return w})),n.d(t,"b",(function(){return O})),n.d(t,"a",(function(){return I})),n.d(t,"f",(function(){return j})),n.d(t,"h",(function(){return E}));var r=n(0),u=n(1),d=n(26),o=n(28),c=n(9),a=n(24),i=n(3),s=n(22);function f(){return(f=Object.assign||function(e){for(var t=1;t7&&console.warn(`[TeactN] Slow containers update: ${Math.round(t)} ms`)}}],m={},p=new Map;const g=Object(c.i)((function(){h.forEach(e=>e(l))}));function y(e){"object"==typeof e&&e!==l&&(l=e,g())}function v(){return l}function w(){return m}function O(e,t){b[e]||(b[e]=[],m[e]=t=>{!function(e,t){b[e]&&b[e].forEach(e=>{const n=e(l,m,t);n&&y(n)})}(e,t)}),b[e].push(t)}function I(e){h.push(e)}function j(e){const t=h.indexOf(e);-1!==t&&h.splice(t,1)}function E(e=(()=>({})),t=(()=>({}))){return n=>function u(c){u.DEBUG_contentComponentName=n.name;const[i]=Object(r.r)(Object(o.a)(p)),b=Object(d.a)();Object(r.n)(()=>()=>{p.delete(i)},[i]);let h=p.get(i);if(h||(h={mapStateToProps:e,mapReducersToProps:t,ownProps:c,areMappedPropsChanged:!1,forceUpdate:b,DEBUG_updates:0,DEBUG_componentName:n.name},p.set(i,h)),h.areMappedPropsChanged&&(h.areMappedPropsChanged=!1),!h.mappedProps||!Object(a.a)(h.ownProps,c)){h.ownProps=c;try{h.mappedProps={...e(l,c),...t(y,m)}}catch(e){Object(s.a)(e)}}return r.a.createElement(n,f({},h.mappedProps,c))}}u.p&&(window.getGlobal=v,document.addEventListener("dblclick",()=>{console.log("GLOBAL CONTAINERS",Object(i.k)(Object.values(p),"DEBUG_updates","desc"))}))},function(e,t,n){"use strict";function r(e,t){return e.reduce((e,n)=>(e[n[t]]=n,e),{})}function u(e,t){return Object.keys(e).reduce((n,r,u)=>(n[r]=t(e[r],r,u,e),n),{})}function d(e,t){return t.reduce((t,n)=>(t[n]=e[n],t),{})}function o(e,t){return t.reduce((t,n)=>(e[n]&&(t[n]=e[n]),t),{})}function c(e,t){const n=new Set(t.map(String));return d(e,Object.keys(e).filter(e=>!n.has(e)))}function a(e,t,n="asc"){return e.sort((e,r)=>{if(Array.isArray(t)){const[u,d]=Array.isArray(n)?n:[n,n],[o,c]=t;let a,i;if("function"==typeof o?(a=o(e)||0,i=o(r)||0):"string"==typeof o&&(a=e[o]||0,i=r[o]||0),a!==i)return"asc"===u?a-i:i-a;{let t,n;return"function"==typeof c?(t=c(e)||0,n=c(r)||0):"string"==typeof c&&(t=e[c]||0,n=r[c]||0),"asc"===d?t-n:n-t}}let u,d;return"function"==typeof t?(u=t(e)||0,d=t(r)||0):"string"==typeof t&&(u=e[t]||0,d=r[t]||0),"asc"===n?u-d:d-u})}function i(e){return e.reduce((e,t)=>Array.isArray(t)?e.concat(t):(e.push(t),e),[])}function s(e){return Array.from(new Set(e))}function f(e){return e.filter(Boolean)}function l(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function b(e,t){return e[0]<=t[t.length-1]&&e[e.length-1]>=t[0]}function h(e,t){return e.filter(e=>t.has(e))}function m(e,t){const n=[];for(let r=0;r(t[n]=p(e[n]),t),{})}function g(e,t){let n=e.length;for(;n--;)if(t(e[n],n,e))return e[n]}n.d(t,"c",(function(){return r})),n.d(t,"i",(function(){return u})),n.d(t,"l",(function(){return d})),n.d(t,"m",(function(){return o})),n.d(t,"j",(function(){return c})),n.d(t,"k",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"o",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return b})),n.d(t,"f",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"d",(function(){return p})),n.d(t,"g",(function(){return g}))},function(e,t,n){"use strict";n.d(t,"Z",(function(){return r.b})),n.d(t,"ab",(function(){return r.c})),n.d(t,"bb",(function(){return r.d})),n.d(t,"yb",(function(){return r.g})),n.d(t,"qb",(function(){return r.e})),n.d(t,"xb",(function(){return r.f})),n.d(t,"Fb",(function(){return r.h})),n.d(t,"Y",(function(){return r.a})),n.d(t,"mb",(function(){return u.w})),n.d(t,"lb",(function(){return u.v})),n.d(t,"jb",(function(){return u.t})),n.d(t,"ob",(function(){return u.y})),n.d(t,"kb",(function(){return u.u})),n.d(t,"pb",(function(){return u.z})),n.d(t,"m",(function(){return u.j})),n.d(t,"V",(function(){return u.p})),n.d(t,"l",(function(){return u.i})),n.d(t,"g",(function(){return u.e})),n.d(t,"h",(function(){return u.f})),n.d(t,"f",(function(){return u.d})),n.d(t,"nb",(function(){return u.x})),n.d(t,"hb",(function(){return u.r})),n.d(t,"q",(function(){return u.m})),n.d(t,"zb",(function(){return u.A})),n.d(t,"e",(function(){return u.c})),n.d(t,"c",(function(){return u.a})),n.d(t,"L",(function(){return u.o})),n.d(t,"k",(function(){return u.h})),n.d(t,"j",(function(){return u.g})),n.d(t,"ib",(function(){return u.s})),n.d(t,"Db",(function(){return u.D})),n.d(t,"d",(function(){return u.b})),n.d(t,"Cb",(function(){return u.C})),n.d(t,"Bb",(function(){return u.B})),n.d(t,"p",(function(){return u.l})),n.d(t,"o",(function(){return u.k})),n.d(t,"gb",(function(){return u.q})),n.d(t,"K",(function(){return u.n})),n.d(t,"Eb",(function(){return u.E})),n.d(t,"B",(function(){return i})),n.d(t,"Ab",(function(){return s})),n.d(t,"G",(function(){return f})),n.d(t,"O",(function(){return l})),n.d(t,"P",(function(){return b})),n.d(t,"y",(function(){return h})),n.d(t,"M",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"ub",(function(){return g})),n.d(t,"vb",(function(){return y})),n.d(t,"rb",(function(){return v})),n.d(t,"eb",(function(){return w})),n.d(t,"wb",(function(){return O})),n.d(t,"fb",(function(){return I})),n.d(t,"W",(function(){return j})),n.d(t,"X",(function(){return E})),n.d(t,"tb",(function(){return C})),n.d(t,"sb",(function(){return S})),n.d(t,"v",(function(){return M})),n.d(t,"w",(function(){return T})),n.d(t,"db",(function(){return N})),n.d(t,"H",(function(){return P})),n.d(t,"Q",(function(){return D})),n.d(t,"J",(function(){return F})),n.d(t,"t",(function(){return L})),n.d(t,"u",(function(){return x})),n.d(t,"N",(function(){return B})),n.d(t,"z",(function(){return R})),n.d(t,"I",(function(){return U})),n.d(t,"A",(function(){return _})),n.d(t,"R",(function(){return G})),n.d(t,"S",(function(){return $})),n.d(t,"F",(function(){return W})),n.d(t,"E",(function(){return H})),n.d(t,"D",(function(){return z})),n.d(t,"C",(function(){return V})),n.d(t,"b",(function(){return J})),n.d(t,"i",(function(){return Y})),n.d(t,"T",(function(){return Q})),n.d(t,"U",(function(){return Z})),n.d(t,"cb",(function(){return X})),n.d(t,"s",(function(){return ee})),n.d(t,"x",(function(){return te})),n.d(t,"r",(function(){return ne})),n.d(t,"a",(function(){return re}));var r=n(30),u=n(31),d=n(5),o=n(1),c=n(64);const a=new RegExp(o.gb,"i");function i(e){const{chatId:t,id:n}=e;return`msg${t}-${n}`}function s(e){const t=e.match(/^msg(-?\d+)-(\d+)/);return{chatId:Number(t[1]),messageId:Number(t[2])}}function f(e){return e.previousLocalId||e.id}function l(e,t,n=!1){const{text:r,photo:u,video:d,audio:o,voice:c,document:a,sticker:i,contact:s,poll:f,invoice:l}=t.content;return t.groupedId?`${n?"":"🖼 "}${r?r.text:e("lng_in_dlg_album")}`:u?`${n?"":"🖼 "}${r?r.text:e("AttachPhoto")}`:d?`${n?"":"📹 "}${r?r.text:e(d.isGif?"AttachGif":"AttachVideo")}`:i?`${i.emoji} ${e("AttachSticker")} `:o?`${n?"":"🎧 "}${M(t)||e("AttachMusic")}`:c?`${n?"":"🎤 "}${r?r.text:e("AttachAudio")}`:a?`${n?"":"📎 "}${r?r.text:a.fileName}`:s?e("AttachContact"):f?`${n?"":"📊 "}${f.summary.question}`:l?"Invoice":r?r.text:"The message is not supported on this version of Telegram"}function b(e){const{text:t,sticker:n,photo:r,video:u,audio:d,voice:o,document:c,poll:a,webPage:i,contact:s,invoice:f}=e.content;return t?t.text:n||r||u||d||o||c||s||a||i||f?void 0:"The message is not supported on this version of Telegram"}function h(e){const{text:t,sticker:n,photo:r,video:u,audio:d,voice:o,document:a,poll:i,webPage:s,contact:f}=e.content;return!!(n||u&&u.isRound)||!(!t||r||u||d||o||a||i||s||f)&&(Object(c.a)(t.text)||!1)}function m(e){const{text:t}=e.content;if(t&&t.text.length<=6&&1===h(e))return t.text}function p(e){const{text:t}=e.content;let n;if(t&&t.entities){let e=t.entities.find(e=>e.type===d.ApiMessageEntityTypes.TextUrl);if(e&&(n=e.url.match(a)),!n&&(e=t.entities.find(e=>e.type===d.ApiMessageEntityTypes.Url),e)){const{offset:r,length:u}=e;n=t.text.substring(r,r+u).match(a)}}if(!n&&t&&(n=t.text.match(a)),n)return{url:n[0],domain:n[3]}}function g(e){return e.isOutgoing}function y(e){return Boolean(e.replyToMessageId)}function v(e){return Boolean(e.forwardInfo)}function w(e){return!!e.content.action}function O(e){return e.chatId===o.mb&&C(e)}function I(e){return Boolean(e.senderId)&&e.senderId<0&&g(e)}function j(e,t){return t.id>0?Object(r.c)(t):Object(u.i)(e,t)}function E(e){return e.sendingState?"messageSendingStateFailed"===e.sendingState?"failed":"pending":"succeeded"}function C(e){return e.id>=o.J}function S(e){return e.content.action&&"historyClear"===e.content.action.type}function M(e){const{audio:t,text:n}=e.content;return t&&[t.title,t.performer].filter(Boolean).join(" — ")||n&&n.text}var A=n(7),k=n(59);function T(e){return e.content}function N(e){return Boolean(P(e)||D(e)||R(e)||B(e)||function(e){return e.content.contact}(e)||U(e)||L(e)||x(e)||function(e){return e.content.voice}(e))}function P(e){return e.content.photo}function D(e){return e.content.video}function F(e){const{video:t}=e.content;return t&&t.isRound?t:void 0}function L(e){return e.content.action}function x(e){return e.content.audio}function B(e){return e.content.sticker}function R(e){return e.content.document}function U(e){return e.content.poll}function _(e){return e.content.invoice}function G(e){return e.content.webPage}function $(e){const t=G(e);return t?t.photo:void 0}function W(e){const t=function(e){const t=P(e)||D(e)||R(e)||B(e)||$(e);if(t)return t.thumbnail}(e);return t?t.dataUri:void 0}function H(e,t){const{photo:n,video:r,sticker:u,audio:d,voice:o,document:c}=e.content,a=$(e);if(!(n||r||u||a||d||o||c))return;const s=i(e);if(n||a)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(q(e))return;return s+"?size=x";case"viewerPreview":return s+"?size=x";case"viewerFull":return s+"?size=z"}if(r)switch(t){case"micro":case"pictogram":return s+"?size=m";case"inline":if(q(e))return;return J(r)?K(r,s):s+"?size=z";case"viewerPreview":return s+"?size=m";case"viewerFull":return K(r,s);case"download":return s+"?download"}if(c)switch(t){case"micro":case"pictogram":case"inline":if(!Object(k.c)(c)||q(e))return;return s+"?size=m";default:return s}if(u)switch(t){case"micro":return;case"pictogram":return s+"?size=m";default:return s}if(d)switch(t){case"micro":case"pictogram":return;case"download":return s+"?download";default:return K(d,s)}if(o)switch(t){case"micro":case"pictogram":return;default:return s}}function K(e,t){return A.i&&A.j?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function z(e,t){const{sticker:n,video:r,audio:u,voice:o}=e.content;return n&&"inline"===t&&n.isAnimated?d.ApiMediaFormat.Lottie:r&&A.i&&("viewerFull"===t||"inline"===t&&J(r))?d.ApiMediaFormat.Progressive:u||o?o&&!A.h?d.ApiMediaFormat.BlobUrl:d.ApiMediaFormat.Progressive:d.ApiMediaFormat.BlobUrl}function V(e){const{photo:t,video:n,webPage:r}=e.content;return t||r&&r.photo?`photo${e.date}.jpeg`:n?n.fileName:void 0}function q(e){const{photo:t,video:n,document:r}=e.content;return t&&t.blobUrl||n&&n.blobUrl||r&&r.previewBlobUrl}function J(e){return e.isGif||e.isRound||e.size<=10485760}function Y(e,t,n=!1){const r=te(e,t,"media");return n?r.reverse():r}function Q(e){return e.sizes.find(e=>"z"===e.type)||e.sizes.find(e=>"y"===e.type)||Z(e)}function Z(e){return e.sizes.find(e=>"x"===e.type)||e.sizes.find(e=>"m"===e.type)||e.sizes.find(e=>"s"===e.type)||e.thumbnail}function X(e){if(e.width&&e.height)return e}function ee(e,t,n=!1){const r=C(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function te(e,t,n){let r;switch(n){case"media":r=e=>{const t=D(e);return P(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=R;break;case"links":r=e=>G(e)||function(e){const{text:t}=e.content,n=t&&t.text.match(a);if(n)return{url:n[0],domain:n[3]}}(e);break;case"audio":r=x;break;default:return[]}return t.reduce((t,n)=>(e[n]&&r(e[n])&&t.push(n),t),[])}function ne(e){const{audio:t,voice:n,video:r}=T(e),u=t||n||r;if(u)return u.duration}function re(e,t){return`${e}_${t}`}n(60)},function(e,t,n){"use strict";var r=n(68);n.o(r,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return r.ApiMediaFormat})),n.o(r,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return r.ApiMessageEntityTypes})),n.o(r,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return r.MAIN_THREAD_ID})),n.o(r,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return r.MESSAGE_DELETED}));var u=n(69);n.o(u,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return u.ApiMediaFormat})),n.o(u,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return u.ApiMessageEntityTypes})),n.o(u,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return u.MAIN_THREAD_ID})),n.o(u,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return u.MESSAGE_DELETED}));var d=n(70);n.d(t,"ApiMessageEntityTypes",(function(){return d.a})),n.d(t,"MAIN_THREAD_ID",(function(){return d.b})),n.d(t,"MESSAGE_DELETED",(function(){return d.c}));var o=n(71);n.o(o,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return o.ApiMediaFormat}));var c=n(72);n.d(t,"ApiMediaFormat",(function(){return c.a}));n(73),n(74),n(75)},function(e,t,n){"use strict";n.d(t,"T",(function(){return Fe})),n.d(t,"nb",(function(){return Le})),n.d(t,"W",(function(){return xe})),n.d(t,"Gb",(function(){return a})),n.d(t,"f",(function(){return f})),n.d(t,"o",(function(){return l})),n.d(t,"P",(function(){return b})),n.d(t,"O",(function(){return h})),n.d(t,"Ab",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"g",(function(){return g})),n.d(t,"L",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"M",(function(){return w})),n.d(t,"j",(function(){return O})),n.d(t,"i",(function(){return I})),n.d(t,"N",(function(){return j})),n.d(t,"h",(function(){return E})),n.d(t,"q",(function(){return C})),n.d(t,"y",(function(){return D})),n.d(t,"r",(function(){return F})),n.d(t,"m",(function(){return L})),n.d(t,"qb",(function(){return x})),n.d(t,"Y",(function(){return R})),n.d(t,"gb",(function(){return U})),n.d(t,"x",(function(){return _})),n.d(t,"Hb",(function(){return G})),n.d(t,"jb",(function(){return $})),n.d(t,"ob",(function(){return W})),n.d(t,"rb",(function(){return H})),n.d(t,"mb",(function(){return K})),n.d(t,"C",(function(){return z})),n.d(t,"E",(function(){return V})),n.d(t,"B",(function(){return q})),n.d(t,"cb",(function(){return J})),n.d(t,"Cb",(function(){return Y})),n.d(t,"G",(function(){return Q})),n.d(t,"Db",(function(){return Z})),n.d(t,"Eb",(function(){return X})),n.d(t,"Bb",(function(){return ee})),n.d(t,"a",(function(){return te})),n.d(t,"X",(function(){return ne})),n.d(t,"k",(function(){return re})),n.d(t,"pb",(function(){return ue})),n.d(t,"D",(function(){return de})),n.d(t,"l",(function(){return oe})),n.d(t,"I",(function(){return ce})),n.d(t,"U",(function(){return ae})),n.d(t,"fb",(function(){return ie})),n.d(t,"tb",(function(){return se})),n.d(t,"K",(function(){return fe})),n.d(t,"b",(function(){return le})),n.d(t,"e",(function(){return be})),n.d(t,"Fb",(function(){return he})),n.d(t,"lb",(function(){return me})),n.d(t,"H",(function(){return pe})),n.d(t,"R",(function(){return ge})),n.d(t,"p",(function(){return ye})),n.d(t,"S",(function(){return ve})),n.d(t,"V",(function(){return we})),n.d(t,"J",(function(){return Oe})),n.d(t,"ab",(function(){return Ie})),n.d(t,"Q",(function(){return je})),n.d(t,"sb",(function(){return Ee})),n.d(t,"bb",(function(){return Ce})),n.d(t,"ub",(function(){return Se})),n.d(t,"vb",(function(){return Me})),n.d(t,"wb",(function(){return Ae})),n.d(t,"t",(function(){return Be})),n.d(t,"A",(function(){return ke})),n.d(t,"w",(function(){return Te})),n.d(t,"v",(function(){return Ne})),n.d(t,"Z",(function(){return Pe})),n.d(t,"u",(function(){return De})),n.d(t,"z",(function(){return M})),n.d(t,"s",(function(){return A})),n.d(t,"xb",(function(){return k})),n.d(t,"yb",(function(){return T})),n.d(t,"c",(function(){return N})),n.d(t,"F",(function(){return P})),n.d(t,"hb",(function(){return Re})),n.d(t,"ib",(function(){return Ue})),n.d(t,"kb",(function(){return _e})),n.d(t,"zb",(function(){return Ge})),n.d(t,"eb",(function(){return i})),n.d(t,"db",(function(){return s}));var r=n(20),u=n(7),d=n(5),o=n(1),c=n(4);function a(e,t){return e.users.byId[t]}function i(e){return e.settings.byKey}function s(e){return e.settings.notifyExceptions}function f(e,t){return e.chats.byId[t]}function l(e,t){const n=Object(c.V)(t);return!!n&&a(e,n)}function b(e,t){return t===e.currentUserId}function h(e,t){const n=l(e,t);return n&&Object(c.xb)(n)}function m(e){return Object.values(e.chats.byId).find(({isSupport:e})=>e)}function p(e,t){if(!Object(c.mb)(t.id)&&!Object(c.kb)(t)&&t.fullInfo)return t.fullInfo.members&&t.fullInfo.members.length!==o.Q?t.fullInfo.members.reduce((t,{userId:n})=>e.users.byId[n]&&Object(c.yb)(e.users.byId[n])&&n!==e.currentUserId?t+1:t,0):t.fullInfo.onlineCount}function g(e,t){const n=f(e,t),r=n&&Object(c.V)(n),u=r&&a(e,r);if(u&&Object(c.xb)(u))return u}function y(e,t){const n=f(e,t),r=g(e,t);if(!n||!r)return!1;if(n.lastMessage&&Object(c.sb)(n.lastMessage))return!0;const u=e.messages.byChatId[t];if(!u)return!1;const{listedIds:o}=u.threadsById[d.MAIN_THREAD_ID]||{};return o&&!o.length}function v(e){return Boolean(e.chats.listIds.active)}function w(e,t,n){const{listIds:r}=e.chats;if(n){const e=r[n];return Boolean(e&&e.includes(t))}return Object.values(r).some(e=>e&&e.includes(t))}function O(e,t){const n=f(e,t);if(n&&w(e,t))return n.folderId===o.h?"archived":"active"}function I(e,t){return e.chatFolders.byId[t]}function j(e,t,n=o.b){const{active:r,archived:u}=e.chats.orderedPinnedIds;if(n===o.b)return!!r&&r.includes(t);if(n===o.h)return!!u&&u.includes(t);const{byId:d}=e.chatFolders,{pinnedChatIds:c}=d[n]||{};return!!c&&c.includes(t)}function E(e,t){const n=t.toLowerCase();return Object.values(e.chats.byId).find(e=>e.username&&e.username.toLowerCase()===n)}function C(e){const t=e.chats.listIds.active;if(!t)return 0;const n=e.chats.byId;return t.reduce((t,r)=>{const u=n[r];return u&&u.unreadCount&&!Object(c.Db)(u,i(e),s(e))?t+u.unreadCount:t},0)}var S=n(3);function M(e){return e.stickers.search}function A(e){return e.gifs.search}function k(e,t){return e.stickers.setsById[t]}function T(e,t){const n=Object.values(e.stickers.setsById);let r=[];return n.forEach(({packs:e})=>{if(!e)return;const n=e[t];n&&(r=r.concat(n))}),r}function N(e,t){const{animatedEmojis:n}=e;if(!n||!n.stickers)return;const r=t.replace("️","");return n.stickers.find(e=>e.emoji===t||e.emoji===r)}function P(e,t){return e.emojiKeywords[t]&&void 0!==e.emojiKeywords[t]?e.emojiKeywords[t]:void 0}function D(e){const{messageLists:t}=e.messages;if(t&&t.length)return t[t.length-1]}function F(e){const{chatId:t}=D(e)||{};return t?f(e,t):void 0}function L(e,t){const n=e.messages.byChatId[t];return n?n.byId:void 0}function x(e,t){const n=e.scheduledMessages.byChatId[t];return n?n.byId:void 0}function B(e,t,n,r){const u=e.messages.byChatId[t];if(!u)return;const d=u.threadsById[n];return d?d[r]:void 0}function R(e,t,n){return B(e,t,n,"listedIds")}function U(e,t,n){return B(e,t,n,"outlyingIds")}function _(e,t,n,r){switch(r){case"thread":return G(e,t,n);case"pinned":return $(e,t);case"scheduled":return W(e,t)}}function G(e,t,n){return B(e,t,n,"viewportIds")}function $(e,t){return B(e,t,d.MAIN_THREAD_ID,"pinnedIds")}function W(e,t){return B(e,t,d.MAIN_THREAD_ID,"scheduledIds")}function H(e,t,n){return B(e,t,n,"scrollOffset")}function K(e,t,n){return B(e,t,n,"replyingToId")}function z(e,t,n){return B(e,t,n,"editingId")}function V(e,t){return B(e,t,d.MAIN_THREAD_ID,"editingScheduledId")}function q(e,t,n){return B(e,t,n,"draft")}function J(e,t,n){return B(e,t,n,"noWebPage")}function Y(e,t,n){return B(e,t,n,"threadInfo")}function Q(e,t,n){return B(e,t,n,"firstMessageId")}function Z(e,t,n){if(n===d.MAIN_THREAD_ID)return f(e,t);const r=Y(e,t,n);return r?f(e,r.originChannelId||t):void 0}function X(e,t,n){if(n===d.MAIN_THREAD_ID)return;const r=Y(e,t,n);return r?r.topMessageId:void 0}function ee(e,t,n){const r=e.messages.byChatId[t];if(!r)return;const{replyToMessageId:u,replyToTopMessageId:d}=n;return u||d?Object.values(r.threadsById).find(e=>e.threadInfo&&(u&&u===e.threadInfo.topMessageId||d&&d===e.threadInfo.topMessageId)):void 0}function te(e,t,n){const r=D(e);if(!r)return!1;const{threadInfo:u}=ee(e,t,n)||{};return t===r.chatId&&(r.threadId===d.MAIN_THREAD_ID||u&&r.threadId===u.threadId)}function ne(e,t,n){const r=G(e,t,n);if(!r||!r.length)return!0;let u;if(n===d.MAIN_THREAD_ID){const n=f(e,t);if(!n||!n.lastMessage)return!0;u=n.lastMessage.id}else{const r=Y(e,t,n);if(!r||!r.lastMessageId)return;u=r.lastMessageId}return u>=o.J&&!re(e,t,u)||r[r.length-1]>=u}function re(e,t,n){const r=L(e,t);return r?r[n]:void 0}function ue(e,t,n){const r=x(e,t);return r?r[n]:void 0}function de(e,t,n,r){if("scheduled"===r){const n=V(e,t);return n?ue(e,t,n):void 0}{const r=z(e,t,n);return r?re(e,t,r):void 0}}function oe(e,t){let n;for(const r of Object.values(e.messages.byChatId)){const{byId:e}=r;if(n=Object.values(e).find(e=>e.content.poll&&e.content.poll.id===t),n)break}return n}function ce(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function ae(e,t){const n=ce(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function ie(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=f(e,t.chatId)||{};return Object(c.tb)(t)||!n||n0?a(e,n):f(e,n)}function fe(e,t){const{forwardInfo:n}=t;if(n)return n.isChannelPost&&n.fromChatId?f(e,n.fromChatId):n.senderUserId?a(e,n.senderUserId):void 0}function le(e,t,n){const r=f(e,t.chatId);if(!r||r.isRestricted)return{};const u=Object(c.mb)(r.id),d=b(e,t.chatId),o=Object(c.jb)(r),a=Object(c.ob)(r),i=Object(c.kb)(r),s=Object(c.wb)(t),l=Object(c.ub)(t),h=Object(c.eb)(t),{content:m}=t,p=(d||Date.now()-1e3*t.date<1728e5)&&!(m.sticker||m.contact||m.poll||m.action||m.audio||m.video&&m.video.isRound)&&!Object(c.rb)(t)&&!t.viaBotId,g=Object(c.e)(r,n)&&!s,y=u||r.isCreator||!i&&!Object(c.zb)(r,"pinMessages")||Object(c.q)(r,"pinMessages");let v=!h&&y,w=!1;const O=$(e,r.id);v&&(w=Boolean(O&&O.includes(t.id)),v=!w);const I=u||l||o||r.isCreator||Object(c.q)(r,"deleteMessages"),j=I&&!s&&(u&&!d||o&&(l||Object(c.q)(r,"deleteMessages"))),E=!h&&p&&(l||i&&(r.isCreator||Object(c.q)(r,"editMessages"))),C=!h&&!s,S=Boolean(t.content.sticker),M=S&&function(e,t){const{stickers:n}=e.stickers.favorite;return n&&n.some(({id:e})=>e===t.id)}(e,t.content.sticker),A=!h&&S&&!M,k=!h&&M,T=!h,N=!h&&(i||a),P=!h;return{noOptions:[g,E,v,w,I,j,C,A,k,T,N,P].every(e=>!e),canReply:g,canEdit:E,canPin:v,canUnpin:w,canDelete:I,canDeleteForAll:j,canForward:C,canFaveSticker:A,canUnfaveSticker:k,canCopy:T,canCopyLink:N,canSelect:P}}function be(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=D(e)||{},u=n&&L(e,n);if(!u||!t||!r)return{};const d=t.map(t=>u[t]&&le(e,u[t],r)).filter(Boolean);return{canDelete:d.every(e=>e.canDelete),canDeleteForAll:d.every(e=>e.canDeleteForAll)}}function he(e,t){const n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id];return n?n.progress:void 0}function me(e,t,n){if(n===d.MAIN_THREAD_ID){const n=f(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?Object(c.tb)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=Y(e,t,n);if(!r)return;return r.lastReadInboxMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId||1/0):r.topMessageId}}function pe(e,t,n){const r=f(e,t);if(n===d.MAIN_THREAD_ID){if(!r)return}else{const r=Y(e,t,n);if(!r||r.lastMessageId===r.lastReadInboxMessageId)return}const u=U(e,t,n),o=R(e,t,n),c=L(e,t);if(!c||!u&&!o)return;const a=me(e,t,n);if(a||!r||!r.isNotJoined){if(u){const e=a?u.find(e=>e>a&&c[e]&&(!c[e].isOutgoing||c[e].isFromScheduled)):u[0];if(e)return e}if(o){const e=a?o.find(e=>e>a&&c[e]&&(!c[e].isOutgoing||c[e].isFromScheduled)):o[0];if(e)return e}}}function ge(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function ye(e,t){const n=Object.values(e.chats.byId).find(e=>Object(c.pb)(e)&&e.lastMessage&&e.lastMessage.id===t);if(n)return n.id;const{byChatId:r}=e.messages;return Number(Object.keys(r).find(n=>{const u=f(e,Number(n));return u&&Object(c.pb)(u)&&r[u.id].byId[t]}))}function ve(e){const{selectedMessages:t}=e;return Boolean(t)}function we(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function Oe(e,t,n){const r=L(e,t);if(r)return Object.values(r).filter(e=>e.groupedId===n&&e.forwardInfo).map(({forwardInfo:e})=>e.fromMessageId)}function Ie(e,t,n){const r=L(e,t);if(r)return Object.keys(r).map(Number).filter(e=>r[e].groupedId===n)}function je(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const u=Ie(e,t,n);return u&&u.every(e=>r.includes(e))}function Ee(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function Ce(e,t){const n=f(e,t);if(!n)return;if(!h(e,n))return;const r=L(e,t),u=G(e,t,d.MAIN_THREAD_ID);if(!r||!u)return;const o=Object(S.g)(u,e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons)),c=Object(S.g)(u,e=>Boolean(r[e].shouldHideKeyboardButtons));return o&&c&&c>o?void 0:o?r[o]:void 0}function Se(e,t,n,r){const{shouldAutoDownloadMediaFromContacts:u,shouldAutoDownloadMediaInPrivateChats:d,shouldAutoDownloadMediaInGroups:o,shouldAutoDownloadMediaInChannels:a}=e.settings.byKey;return Boolean(d&&Object(c.mb)(n.id)||o&&Object(c.lb)(n)||a&&Object(c.kb)(n)||u&&r&&(r.id===e.currentUserId||function(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}(e,r)))}function Me(e,t){const n=Object(c.Q)(t);if(!n)return;const{shouldAutoPlayVideos:r,shouldAutoPlayGifs:u}=e.settings.byKey,d=n.isGif||n.isRound;return r&&!d||u&&d}function Ae(e){return e.settings.byKey.shouldLoopStickers}function ke(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;const r=Object(c.a)(t,n),u=e.localTextSearch.byChatThreadKey[r];return u&&u.isActive?u:void 0}function Te(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=D(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function Ne(e){const t=Te(e);if(t)return e.localMediaSearch.byChatId[t]}function Pe(e,t){return e.management.byChatId[t]}function De(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;if(Object(c.mb)(t))return"user";const r=f(e,t);return r?Object(c.lb)(r)?"group":"channel":void 0}function Fe(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function Le(e){const{users:t,isChatInfoShown:n}=e,d=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),o=Boolean(!u.g&&ke(e)),c=function(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;const r=e.management.byChatId[t];return r&&r.isActive?r:void 0}(e),a=void 0!==M(e).query,i=void 0!==A(e).query,{chatId:s}=D(e)||{},f=t.selectedId,l=v(e),b=Boolean(f&&l),h=Boolean(s&&l)&&n;return d?r.l.PollResults:o?r.l.Search:c?r.l.Management:a?r.l.StickerSearch:i?r.l.GifSearch:b?r.l.UserInfo:h?r.l.ChatInfo:void 0}function xe(e){return void 0!==Le(e)}function Be(e){return e.globalSearch.query}function Re(e){return e.payment.messageId}function Ue(e){return e.payment.formId}function _e(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function Ge(e){return e.payment.stripeCredentials}},function(e,t,n){"use strict";n.d(t,"o",(function(){return u})),n.d(t,"f",(function(){return d})),n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return c})),n.d(t,"j",(function(){return a})),n.d(t,"l",(function(){return i})),n.d(t,"g",(function(){return s})),n.d(t,"m",(function(){return f})),n.d(t,"d",(function(){return l})),n.d(t,"k",(function(){return b})),n.d(t,"i",(function(){return h})),n.d(t,"h",(function(){return m})),n.d(t,"c",(function(){return p})),n.d(t,"a",(function(){return g})),n.d(t,"n",(function(){return y})),n.d(t,"p",(function(){return w}));var r=n(1);const u=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="Mac OS":-1!==["iPhone","iPad","iPod"].indexOf(t)?n="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?n="Windows":/Android/.test(e)?n="Android":/Linux/.test(t)&&(n="Linux"),n}(),d="Mac OS"===u,o="iOS"===u,c="Android"===u,a=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),i=window.matchMedia("(pointer: coarse)").matches,s=window.innerWidth<=r.db||window.innerWidth<=r.cb&&window.innerHeight<=r.bb,f=navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext),l=(document.documentElement.style,u&&(d||o)),b="serviceWorker"in navigator,h=b,m=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),p=!r.E&&"filter"in(document.createElement("canvas").getContext("2d")||{}),g=window.devicePixelRatio||1,y=!0;let v;function w(){return Boolean(v)}new Promise(e=>{const t=new Image;t.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA";const n=()=>{e(2===t.height)};t.onload=n,t.onerror=n}).then(e=>{v=e})},function(e,t,n){"use strict";t.a=(...e)=>e.filter(Boolean).join(" ")},function(e,t,n){"use strict";function r(e,t,n=!0,r=!0){let u;return(...d)=>{u?(clearTimeout(u),u=void 0):n&&e(...d),u=self.setTimeout(()=>{r&&e(...d),u=void 0},t)}}function u(e,t,n=!0){let r,u,d;return(...o)=>{u=!0,d=o,r||(n&&(u=!1,e(...d)),r=self.setInterval(()=>{if(!u)return self.clearInterval(r),void(r=void 0);u=!1,e(...d)},t))}}function d(e){return c(h,e)}function o(e){return c(m,e)}function c(e,t){let n,r=!1;return(...u)=>{n=u,r||(r=!0,e(()=>{r=!1,t(...n)}))}}function a(e){Promise.resolve().then(e)}function i(e){self.requestIdleCallback?self.requestIdleCallback(e):a(e)}n.d(t,"a",(function(){return r})),n.d(t,"g",(function(){return u})),n.d(t,"i",(function(){return d})),n.d(t,"h",(function(){return o})),n.d(t,"d",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"e",(function(){return s})),n.d(t,"f",(function(){return f})),n.d(t,"b",(function(){return h}));const s=e=>new Promise(t=>{setTimeout(()=>t(),e)});function f(){return new Promise(e=>{h(e)})}let l,b;function h(e,t=!1){l?t?b.push(e):l.push(e):(l=t?[]:[e],b=t?[e]:[],requestAnimationFrame(()=>{const e=l,t=b;l=void 0,b=void 0,t.forEach(e=>e()),e.forEach(e=>e())}))}function m(e){h(e,!0)}},function(e,t,n){"use strict";n.d(t,"c",(function(){return s})),n.d(t,"a",(function(){return f})),n.d(t,"b",(function(){return l}));var r=n(80),u=n.n(r),d=n(1),o=n(28);let c;const a=new Map,i=new Map;function s(e,t){return c||(d.p&&console.log(">>> START LOAD WORKER"),c=new u.a,function(e){c.addEventListener("message",({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=a.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){const e=a.get(t.messageId);e&&e.callback&&e.callback(...t.callbackArgs)}else if("unhandledError"===t.type)throw t.error})}(e)),b({type:"initApi",args:[t]})}function f(e,...t){if(c)return b({type:"callMethod",name:e,args:t});d.p&&console.warn("API is not initialized")}function l(e){e.isCanceled=!0;const{messageId:t}=i.get(e)||{};t&&c.postMessage({type:"cancelProgress",messageId:t})}function b(e){const t=Object(o.a)(a),n={messageId:t,...e},r={messageId:t},u=new Promise((e,t)=>{Object.assign(r,{resolve:e,reject:t})});if("function"==typeof n.args[1]){const e=n.args.pop();r.callback=e,i.set(e,r)}return a.set(t,r),u.catch(()=>{}).finally(()=>{a.delete(t),r.callback&&i.delete(r.callback)}),c.postMessage(n),u}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"d",(function(){return c})),n.d(t,"c",(function(){return a})),n.d(t,"b",(function(){return s}));var r=n(1);let u;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra"}(u||(u={}));const d={},o={};async function c(e,t){if(!d[e]){switch(e){case u.Auth:d[u.Auth]=n.e(5).then(n.bind(null,105));break;case u.Main:r.p&&console.log(">>> START LOAD MAIN BUNDLE"),d[u.Main]=Promise.all([n.e(0),n.e(4)]).then(n.bind(null,104));break;case u.Extra:d[u.Extra]=Promise.all([n.e(0),n.e(3)]).then(n.bind(null,103))}d[e].then(f)}const c=await d[e];return o[e]||(o[e]=c),a(e,t)}function a(e,t){const n=o[e];if(n)return n[t]}const i=[];function s(e){i.includes(e)||i.push(e)}function f(){i.forEach(e=>{e()})}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"c",(function(){return d})),n.d(t,"d",(function(){return o})),n.d(t,"b",(function(){return c}));const r=self.caches;let u;async function d(e,t,n){if(r)try{const d=new Request(t),o=await r.open(e),c=await o.match(d);if(!c)return;switch(n){case u.Text:return await c.text();case u.Blob:{const e=await c.blob();if("sticker"===t.substr(0,7))return new Blob([e],{type:"image/webp"});if(!e.type){const t=c.headers.get("Content-Type");if(t)return new Blob([e],{type:t})}return e}case u.Json:return await c.json();default:return}}catch(e){return void console.warn(e)}}async function o(e,t,n){if(r)try{const u="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),d=new Request(t),o=new Response(u),c=await r.open(e);return await c.put(d,o)}catch(e){return void console.warn(e)}}async function c(e){try{if(!r)return;return await r.delete(e)}catch(e){return void console.warn(e)}}!function(e){e[e.Text=0]="Text",e[e.Blob=1]="Blob",e[e.Json=2]="Json"}(u||(u={}))},function(e,t,n){"use strict";n.d(t,"d",(function(){return d})),n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return c})),n.d(t,"g",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l}));var r=n(9);function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}"undefined"==typeof File&&(self.File=class extends Blob{constructor(e,t,n){if(n){const{type:t,...r}=n;super(e,{type:t}),u(this,"name",void 0),Object.assign(this,r)}else super(e),u(this,"name",void 0);this.name=t}});function d(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let u=r.length;const d=new Uint8Array(u);for(;u--;)d[u]=r.charCodeAt(u);return new Blob([d],{type:n})}function o(e){return new Promise((t,n)=>{const r=new FileReader;r.onload=e=>{const{result:r}=e.target||{};"string"==typeof r&&t(r),n(new Error("Failed to read blob"))},r.onerror=n,r.readAsDataURL(e)})}function c(e,t){return new File([e],t,{lastModified:Date.now(),type:e.type})}function a(e){return new Promise((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=n,r.src=e})}function i(e){return new Promise((t,n)=>{const r=document.createElement("video");r.volume=0,r.onloadedmetadata=()=>t(r),r.onerror=n,r.src=e})}async function s(e){const t=await i(e);return Promise.race([Object(r.e)(2e3),new Promise((e,n)=>{t.onseeked=()=>{const n=document.createElement("canvas");n.width=t.videoWidth,n.height=t.videoHeight;n.getContext("2d").drawImage(t,0,0),e(n.toDataURL("image/jpeg"))},t.onerror=n,t.currentTime=Math.min(t.duration,1)})])}async function f(e){return(await fetch(e)).blob()}function l(e){const t=document.createElement("canvas");t.width=e.width,t.height=e.height;return t.getContext("2d").drawImage(e,0,0),t}},function(e,t,n){"use strict";n.d(t,"a",(function(){return v})),n.d(t,"b",(function(){return j})),n.d(t,"c",(function(){return E}));var r=n(1),u=n(12),d=n(10);var o=n(3),c=n.p+"en-extra.e73049da90714ecdae3233e8ffa74d39.json",a=n.p+"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json",i=n.p+"it-extra.78e5568451a888818c7e2209e05a9602.json",s=n.p+"pl-extra.38fd67a6c26e58f5c912568332c7c074.json",f=n.p+"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json",l=n(49),b=n(2);const h={en:c,es:a,it:i,pl:s,ru:f},m=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],p={en:e=>1!==e?6:2,ar:e=>0===e?1:1===e?2:2===e?3:e%100>=3&&e%100<=10?4:e%100>=11?5:6,ca:e=>1!==e?6:2,de:e=>1!==e?6:2,es:e=>1!==e?6:2,fa:e=>e>1?6:2,fr:e=>e>1?6:2,id:()=>0,it:e=>1!==e?6:2,ko:()=>0,ms:()=>0,nl:e=>1!==e?6:2,pl:e=>1===e?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,pt_BR:e=>e>1?6:2,ru:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,tr:e=>e>1?6:2,uk:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,uz:e=>e>1?6:2},g=new Map;let y;const{addCallback:v,removeCallback:w,runCallbacks:O}=function(){const e=[];function t(t){const n=e.indexOf(t);-1!==n&&e.splice(n,1)}return{runCallbacks:function(...t){e.forEach(e=>{e(...t)})},addCallback:function(n){return e.push(n),()=>{t(n)}},removeCallback:t}}();let I;const j=(e,t,n)=>{if(void 0!==t){const r=g.get(`${e}_${t}_${n}`);if(r)return r}if(!y)return e;const r=y[e];if(!r)return e;const u=r["number"==typeof t?function(e){const t=I&&p[I]?p[I](e):0;return m[t]}(t):"value"];if(!u||!u.trim()){const t=e.split(".");return t[t.length-1]}if(void 0!==t){const r=function(e,t){return e.replace(/%\d?\$?[sdf@]/,String(t))}(u,"i"===n?Object(l.a)(t):t);return g.set(`${e}_${t}_${n}`,r),r}return u};async function E(e,t){if(y&&e===I)return void(t&&t());const n=await async function(e){const t=await u.c(r.F,e,u.a.Json);if(t)return t;const n=await Object(d.a)("fetchLangPack",{sourceLangPacks:r.G,langCode:e});if(n)return await u.d(r.F,e,n.langPack),n.langPack;return}(e);if(!n)return;if(h[e])try{const t=await fetch(h[e]),r=await t.json(),u=Object(o.i)(r,(e,t)=>({key:t,value:e}));Object.assign(n,u)}catch(e){r.p&&console.error(e)}g.clear(),I=e,y=n,document.documentElement.lang=e;const{languages:c}=Object(b.e)().settings.byKey,a=c?c.find(t=>t.langCode===e):void 0;j.isRtl=Boolean(a&&a.rtl),t&&t(),O(y)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d}));const r=/\uFE0F/g,u=String.fromCharCode(8205);function d(e){return e.indexOf(u)<0?e.replace(r,""):e}t.a=/(?:\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]|\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]|\ud83d[\udc6b-\udc6d\udc8f\udc91])|(?:\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]|[\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\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g},function(e,t,n){"use strict";var r=n(0),u=n(21);n(94);t.a=Object(r.h)(({color:e="blue"})=>r.a.createElement("div",{className:"Loading"},r.a.createElement(u.a,{color:e,withBackground:"white"===e})))},function(e,t,n){"use strict";var r=n(0),u=n(11),d=n(26);t.a=(e,t,n=!1,o=!1)=>{const c=Object(u.c)(e,t),a=Object(d.a)();return o&&Object(u.b)(a),Object(r.n)(()=>{n||c||Object(u.d)(e,t).then(a)},[e,a,c,t,n]),c}},function(e,t,n){"use strict";n.d(t,"d",(function(){return o})),n.d(t,"e",(function(){return c})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"a",(function(){return d}));const r={},u=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/;var d="AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234".split("\n").map(e=>({id:e.substr(0,2),flag:e.substr(2,4),code:"+"+e.match(/\d+/)[0],name:e.split(/\d+/)[1],phoneFormat:function(e){if(!e)return u;const t=e[0];let n;if(!r[t]){const e=t.split("").map(Number);n=e.reduce((e,t,n)=>`${e}(\\d{1,${t}})${n>0?"?":""}`,""),r[t]=new RegExp(`${n}${"()?".repeat(5-e.length)}`)}return r[t]}(e.match(/\d+$/))}));function o(e){return d.find(t=>t.id===e)}function c(e){let t=e.replace(/[^\d+]+/g,"");t.startsWith("+")||(t="+"+t);const n=d.filter(e=>t.startsWith(e.code)).sort((e,t)=>e.code.length-t.code.length);return n[n.length-1]}function a(e,t){let n=e.replace(/[^\d]+/g,"");if(t)n=n.substr(t.code.length-1);else if(e.startsWith("+"))return e;return n=n.replace(function(e){return e?e.phoneFormat:u}(t),(e,n,r,u,d,o)=>{const c=t&&"GB"===t.id?" ":"-";let a="";return n&&(a=""+n),r&&(a+=" "+r),u&&(a+=`${c}${u}`),d&&(a+=`${c}${d}`),o&&(a+=`${c}${o}`),a}),n}function i(e){const t=e.startsWith("+")?e:"+"+e,n=c(t);return n?`${n.code} ${a(t,n)}`:t}},function(e,t,n){"use strict";(function(e){n.d(t,"f",(function(){return c})),n.d(t,"b",(function(){return a})),n.d(t,"e",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"a",(function(){return f})),n.d(t,"d",(function(){return l}));var r=n(41),u=n(1),d=n(12);const o=[1,2,3,4,5];function c(e,t){const{mainDcId:n,keys:r,hashes:d}=e;localStorage.setItem(u.nb,JSON.stringify({dcID:n,id:t})),localStorage.setItem("dc",String(n)),Object.keys(r).map(Number).forEach(e=>{localStorage.setItem(`dc${e}_auth_key`,JSON.stringify(r[e]))}),Object.keys(d).map(Number).forEach(e=>{localStorage.setItem(`dc${e}_hash`,JSON.stringify(d[e]))})}function a(){[u.nb,"dc",...o.map(e=>`dc${e}_auth_key`),...o.map(e=>`dc${e}_hash`)].forEach(e=>{localStorage.removeItem(e)})}function i(){const e=localStorage.getItem(u.nb);if(!e)return;let t;const n={},r={};try{const n=JSON.parse(e);t=Number(n.dcID)}catch(e){}return t&&(o.forEach(e=>{try{const t=localStorage.getItem(`dc${e}_auth_key`);t&&(n[e]=JSON.parse(t));const u=localStorage.getItem(`dc${e}_hash`);u&&(r[e]=JSON.parse(u))}catch(e){u.p&&console.warn("Failed to load stored session",e)}}),Object.keys(n).length)?{mainDcId:t,keys:n,hashes:r}:void 0}async function s(){const e=localStorage.getItem(u.H);if(!e)return;const t=await r.b("GramJs:"+e);try{c(JSON.parse(t))}catch(e){u.p&&console.warn("Failed to load legacy session",e)}}async function f(){localStorage.removeItem(u.H);const e=await r.c();await Promise.all([d.b("GramJs"),...e.filter(e=>"string"==typeof e&&e.startsWith("GramJs:GramJs-session-")).map(e=>r.a(e))])}function l(){const t=e.env.TEST_SESSION;try{c(JSON.parse(t))}catch(e){u.p&&console.warn("Failed to load test session",e)}}}).call(this,n(86))},function(e,t,n){"use strict";let r,u,d,o,c,a,i,s,f,l,b,h;n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"m",(function(){return d})),n.d(t,"d",(function(){return o})),n.d(t,"c",(function(){return c})),n.d(t,"l",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"j",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"k",(function(){return b})),n.d(t,"i",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"g",(function(){return p})),function(e){e[e.Backwards=0]="Backwards",e[e.Forwards=1]="Forwards",e[e.Around=2]="Around"}(r||(r={})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(u||(u={})),function(e){e[e.Main=0]="Main",e[e.EditProfile=1]="EditProfile",e[e.Notifications=2]="Notifications",e[e.Language=3]="Language",e[e.General=4]="General",e[e.GeneralChatBackground=5]="GeneralChatBackground",e[e.GeneralChatBackgroundColor=6]="GeneralChatBackgroundColor",e[e.Privacy=7]="Privacy",e[e.PrivacyPhoneNumber=8]="PrivacyPhoneNumber",e[e.PrivacyLastSeen=9]="PrivacyLastSeen",e[e.PrivacyProfilePhoto=10]="PrivacyProfilePhoto",e[e.PrivacyForwarding=11]="PrivacyForwarding",e[e.PrivacyGroupChats=12]="PrivacyGroupChats",e[e.PrivacyPhoneNumberAllowedContacts=13]="PrivacyPhoneNumberAllowedContacts",e[e.PrivacyPhoneNumberDeniedContacts=14]="PrivacyPhoneNumberDeniedContacts",e[e.PrivacyLastSeenAllowedContacts=15]="PrivacyLastSeenAllowedContacts",e[e.PrivacyLastSeenDeniedContacts=16]="PrivacyLastSeenDeniedContacts",e[e.PrivacyProfilePhotoAllowedContacts=17]="PrivacyProfilePhotoAllowedContacts",e[e.PrivacyProfilePhotoDeniedContacts=18]="PrivacyProfilePhotoDeniedContacts",e[e.PrivacyForwardingAllowedContacts=19]="PrivacyForwardingAllowedContacts",e[e.PrivacyForwardingDeniedContacts=20]="PrivacyForwardingDeniedContacts",e[e.PrivacyGroupChatsAllowedContacts=21]="PrivacyGroupChatsAllowedContacts",e[e.PrivacyGroupChatsDeniedContacts=22]="PrivacyGroupChatsDeniedContacts",e[e.PrivacyActiveSessions=23]="PrivacyActiveSessions",e[e.PrivacyBlockedUsers=24]="PrivacyBlockedUsers",e[e.Folders=25]="Folders",e[e.FoldersCreateFolder=26]="FoldersCreateFolder",e[e.FoldersEditFolder=27]="FoldersEditFolder",e[e.FoldersIncludedChats=28]="FoldersIncludedChats",e[e.FoldersExcludedChats=29]="FoldersExcludedChats",e[e.TwoFaDisabled=30]="TwoFaDisabled",e[e.TwoFaNewPassword=31]="TwoFaNewPassword",e[e.TwoFaNewPasswordConfirm=32]="TwoFaNewPasswordConfirm",e[e.TwoFaNewPasswordHint=33]="TwoFaNewPasswordHint",e[e.TwoFaNewPasswordEmail=34]="TwoFaNewPasswordEmail",e[e.TwoFaNewPasswordEmailCode=35]="TwoFaNewPasswordEmailCode",e[e.TwoFaEnabled=36]="TwoFaEnabled",e[e.TwoFaChangePasswordCurrent=37]="TwoFaChangePasswordCurrent",e[e.TwoFaChangePasswordNew=38]="TwoFaChangePasswordNew",e[e.TwoFaChangePasswordConfirm=39]="TwoFaChangePasswordConfirm",e[e.TwoFaChangePasswordHint=40]="TwoFaChangePasswordHint",e[e.TwoFaTurnOff=41]="TwoFaTurnOff",e[e.TwoFaRecoveryEmailCurrentPassword=42]="TwoFaRecoveryEmailCurrentPassword",e[e.TwoFaRecoveryEmail=43]="TwoFaRecoveryEmail",e[e.TwoFaRecoveryEmailCode=44]="TwoFaRecoveryEmailCode",e[e.TwoFaCongratulations=45]="TwoFaCongratulations"}(d||(d={})),function(e){e[e.ChatList=0]="ChatList",e[e.GlobalSearch=1]="GlobalSearch",e[e.Settings=2]="Settings",e[e.Contacts=3]="Contacts",e[e.Archived=4]="Archived",e[e.NewChannelStep1=5]="NewChannelStep1",e[e.NewChannelStep2=6]="NewChannelStep2",e[e.NewGroupStep1=7]="NewGroupStep1",e[e.NewGroupStep2=8]="NewGroupStep2"}(o||(o={})),function(e){e[e.ChatList=0]="ChatList",e[e.Media=1]="Media",e[e.Links=2]="Links",e[e.Files=3]="Files",e[e.Music=4]="Music",e[e.Voice=5]="Voice"}(c||(c={})),function(e){e[e.ChatInfo=0]="ChatInfo",e[e.UserInfo=1]="UserInfo",e[e.Search=2]="Search",e[e.Management=3]="Management",e[e.StickerSearch=4]="StickerSearch",e[e.GifSearch=5]="GifSearch",e[e.PollResults=6]="PollResults"}(a||(a={})),function(e){e[e.Inline=0]="Inline",e[e.ScheduledInline=1]="ScheduledInline",e[e.SharedMedia=2]="SharedMedia",e[e.ProfileAvatar=3]="ProfileAvatar",e[e.MiddleHeaderAvatar=4]="MiddleHeaderAvatar",e[e.Album=5]="Album",e[e.ScheduledAlbum=6]="ScheduledAlbum",e[e.SearchResult=7]="SearchResult"}(i||(i={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(s||(s={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(f||(f={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(l||(l={})),function(e){e[e.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(b||(b={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(h||(h={}));const m="UPLOADING_WALLPAPER_SLUG";let p;!function(e){e[e.Initial=0]="Initial",e[e.ChatPrivacyType=1]="ChatPrivacyType",e[e.Discussion=2]="Discussion",e[e.ChannelSubscribers=3]="ChannelSubscribers",e[e.GroupType=4]="GroupType",e[e.GroupPermissions=5]="GroupPermissions",e[e.GroupRemovedUsers=6]="GroupRemovedUsers",e[e.GroupUserPermissionsCreate=7]="GroupUserPermissionsCreate",e[e.GroupUserPermissions=8]="GroupUserPermissions",e[e.ChatAdministrators=9]="ChatAdministrators",e[e.GroupRecentActions=10]="GroupRecentActions",e[e.ChatAdminRights=11]="ChatAdminRights",e[e.GroupMembers=12]="GroupMembers"}(p||(p={}))},function(e,t,n){"use strict";var r=n(0),u=n(8);n(90);t.a=({color:e="blue",withBackground:t})=>r.a.createElement("div",{className:Object(u.a)("Spinner",e,t&&"with-background")},r.a.createElement("div",null))},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(1),u=n(9);window.addEventListener("error",c),window.addEventListener("unhandledrejection",c);const d=Date.now();let o=!1;function c(e){e.preventDefault(),a(e instanceof ErrorEvent?e.error:e.reason)}Object(u.g)(window.alert,1e3);function a(e){if(console.error(e),!o)return Date.now()-d<=5e3&&localStorage.getItem(r.B)?(localStorage.removeItem(r.B),o=!0,void window.location.reload()):void 0}},function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var r=n(0),u=n(15),d=n(1),o=n(7),c=n(65),a=n(8),i=n(76),s=n(57);const f=/^[\d\wа-яё]$/i,l=/(\*\*|__).+?\1/g;function b(e,t=["emoji"],n){return"string"!=typeof e?[e]:t.reduce((e,t)=>{switch(t){case"escape_html":return function(e){const t=document.createElement("div");return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:(t.innerText=n,[...e,t.innerHTML]),[])}(e);case"hq_emoji":return u.a.lastIndex=0,h(e,"big","jsx");case"emoji":return u.a.lastIndex=0,h(e,"small","jsx");case"emoji_html":return u.a.lastIndex=0,h(e,"small","html");case"br":return m(e,"jsx");case"br_html":return m(e,"html");case"highlight":return d=e,o=n.highlight,d.reduce((e,t)=>{if("string"!=typeof t||!o)return[...e,t];const n=t.toLowerCase(),u=n.indexOf(o.toLowerCase()),d=n[u+o.length];if(u<0||d&&d.match(f))return[...e,t];const c=[];return c.push(t.substring(0,u)),c.push(r.a.createElement("span",{className:"matching-text-highlight"},t.substring(u,u+o.length))),c.push(t.substring(u+o.length)),[...e,...c]},[]);case"links":return function(e){return e.reduce((e,t)=>{if("string"!=typeof t)return[...e,t];const n=[...t.match(p)||[],...t.match(g)||[]];if(!n.length)return[...e,t];const u=[];let d=n.shift(),o=0;for(;d;){const e=t.indexOf(d,o);u.push(t.substring(o,e)),d.startsWith("@")?u.push(r.a.createElement(i.a,{username:d},d)):(d.endsWith("?")&&(d=d.slice(0,d.length-1)),u.push(r.a.createElement(s.a,{text:d,url:d}))),o=e+d.length,d=n.shift()}return u.push(t.substring(o)),[...e,...u]},[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var d,o;return e},[e])}function h(e,t,n){return e.reduce((e,d)=>{if("string"!=typeof d)return[...e,d];const i=d.split(u.a),s=d.match(u.a)||[];return e.push(i[0]),s.reduce((e,d,s)=>{const f=Object(c.a)(Object(u.b)(d)),l=Object(a.a)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(o.d?r.a.createElement("span",{className:"font-emoji"},d):r.a.createElement("img",{className:l,src:`./img-apple-${"big"===t?"160":"64"}/${f}.png`,alt:d})),"html"===n&&e.push(o.d?d:`${d}`);const b=2*s+2;return i[b]&&e.push(i[b]),e},e)},[])}function m(e,t){return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:[...e,...n.split(/\r\n|\r|\n/g).reduce((e,n,u,d)=>{const o=n.trimLeft(),c=n.length-o.length;return e.push(String.fromCharCode(160).repeat(c)+o),u!==d.length-1&&e.push("jsx"===t?r.a.createElement("br",null):"
"),e},[])],[])}const p=new RegExp(d.gb,"ig"),g=/@[\w\d_-]+/gi;function y(e,t){return e.reduce((e,n)=>{if("string"!=typeof n)return[...e,n];const u=n.split(l),d=n.match(l)||[];return e.push(u[0]),d.reduce((e,n,d)=>{"jsx"===t?e.push(n.startsWith("**")?r.a.createElement("b",null,n.replace(/\*\*/g,"")):r.a.createElement("i",null,n.replace(/__/g,""))):e.push(n.startsWith("**")?`${n.replace(/\*\*/g,"")}`:`${n.replace(/__/g,"")}`);const o=2*d+2;return u[o]&&e.push(u[o]),e},e)},[])}},function(e,t,n){"use strict";function r(e,t){if(e===t)return!0;const n=Object.keys(e),r=n.length;if(r!==Object.keys(t).length)return!1;if(0===r)return!0;for(let u=0;ue[n]!==t[n])}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u}))},function(e,t,n){"use strict";var r=n(14),u=n(26),d=n(51);t.a=()=>{const e=Object(u.a)();return Object(d.a)(()=>r.a(e),[e]),r.b}},function(e,t,n){"use strict";var r=n(0);t.a=()=>{const[,e]=Object(r.r)(!1);return Object(r.m)(()=>{e(e=>!e)},[])}},function(e,t,n){"use strict";var r=n(0),u=n(8);n(88);t.a=({children:e,className:t,isRtl:n,onClick:d})=>{const o=Object(r.m)(e=>{e.preventDefault(),d(e)},[d]);return r.a.createElement("a",{href:"#",className:Object(u.a)("Link",t),dir:n?"rtl":"auto",onClick:d?o:void 0},e)}},function(e,t,n){"use strict";t.a=e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t}},function(e,t,n){"use strict";n.d(t,"d",(function(){return p})),n.d(t,"c",(function(){return y})),n.d(t,"b",(function(){return v})),n.d(t,"a",(function(){return w}));var r=n(10),u=n(67),d=n(1),o=n(2),c=n(4),a=n(14),i=n(37),s=n(6),f=n(7);function l(e){const t=e.toJSON();return JSON.stringify({endpoint:t.endpoint,keys:t.keys})}function b(){return!!f.k&&("showNotification"in ServiceWorkerRegistration.prototype?"denied"===Notification.permission?(d.p&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(d.p&&console.warn("[PUSH] Push messaging isn't supported."),!1):(d.p&&console.warn("[PUSH] Push notifications aren't supported."),!1))}async function h(){"Notification"in window&&(["granted","denied"].includes(Notification.permission)||await Notification.requestPermission())}async function m(e){const t=Object(o.e)(),n=Object(o.d)();if(e)try{const t=l(e);return await Object(r.a)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){d.p&&console.log("[PUSH] Unable to unsubscribe from push.",e)}t.push&&(await Object(r.a)("unregisterDevice",t.push.deviceToken),n.deleteDeviceToken())}async function p(){if(!b())return;const e=await navigator.serviceWorker.ready,t=await e.pushManager.getSubscription();await m(t)}let g=!1;async function y(){if(!b())return void await h();const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(function(e){const t=Object(o.e)();return!t.push||!e||(l(e)!==t.push.deviceToken||Date.now()-t.push.subscribedAt>432e5)}(t)){await m(t);try{t=await e.pushManager.subscribe({userVisibleOnly:!0});const n=l(t);d.p&&console.log("[PUSH] Received push subscription: ",n),await Object(r.a)("registerDevice",n),Object(o.d)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?d.p&&console.warn("[PUSH] The user has blocked push notifications."):d.p&&(console.log("[PUSH] Unable to subscribe to push.",e),e.code===DOMException.ABORT_ERR&&await h())}}}async function v({chat:e,message:t,isActiveChat:n}){if(!("Notification"in window?"denied"!==Notification.permission||(d.p&&console.warn("[PUSH] The user has blocked push notifications."),0):(d.p&&console.warn("[PUSH] This browser does not support desktop notification"),0)))return;if(!t.id)return;if(await async function(){if(g)return;const[e]=await Promise.all([Object(r.a)("fetchNotificationSettings"),Object(r.a)("fetchNotificationExceptions")]);e&&(Object(o.g)(Object(i.v)(Object(o.e)(),e)),g=!0)}(),!function(e,t){if(!g)return!1;const n=Object(o.e)();return!Object(c.Db)(e,Object(s.eb)(n),Object(s.db)(n))&&!e.isNotJoined&&!(t&&document.hasFocus())}(e,n))return;const{title:f,body:l}=function(e,t){const n=Object(o.e)(),{senderId:r,replyToMessageId:d}=t,i=r?Object(s.Gb)(n,r):void 0,f=Object(c.t)(t),l=f&&d?Object(s.k)(n,e.id,d):void 0,{targetUserId:b,targetChatId:h}=f||{},m=b?Object(s.Gb)(n,b):void 0,p=Object(c.V)(e),g=p?Object(s.Gb)(n,p):void 0;let y;if(Object(c.eb)(t)){const n=e&&(Object(c.kb)(e)||t.senderId===t.chatId)?e:i;y=Object(u.a)(a.b,t,n,m,l,h,{asPlain:!0})}else{const n=Object(c.K)(a.b,e.id,i),r=Object(c.O)(a.b,t);y=n?`${n}: ${r}`:r}return{title:Object(c.l)(a.b,e,g),body:y}}(e,t);if(b())navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({type:"newMessageNotification",payload:{title:f,body:l,chatId:e.id,messageId:t.id}});else{const n=Object(o.d)(),r={body:l,icon:"icon-192x192.png",badge:"icon-192x192.png",tag:t.id.toString()};"vibrate"in navigator&&(r.vibrate=[200,100,200]);const u=new Notification(f,r);u.onclick=()=>{u.close(),n.focusMessage({chatId:e.id,messageId:t.id}),window.focus&&window.focus()}}}function w(){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({type:"clientReady"})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return c})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return i})),n.d(t,"g",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"h",(function(){return b})),n.d(t,"a",(function(){return h}));var r=n(1),u=n(36),d=n(3);const o=[1,8,5,2,7,4,6];function c(e){if(e)switch(e.type){case"userTypeBot":case"userTypeRegular":return e.firstName||e.lastName;case"userTypeDeleted":case"userTypeUnknown":return"Deleted";default:return}}function a(e){if(e){if(f(e))return"Deleted account";switch(e.type){case"userTypeBot":case"userTypeRegular":if(e.firstName&&e.lastName)return`${e.firstName} ${e.lastName}`;if(e.firstName)return e.firstName;if(e.lastName)return e.lastName;break;case"userTypeDeleted":case"userTypeUnknown":return"Deleted account"}}}function i(e,t){if(t.id===r.mb)return e("ServiceNotifications").toLowerCase();if(t.type&&"userTypeBot"===t.type)return e("Bot");if(!t.status)return"";switch(t.status.type){case"userStatusEmpty":return e("ALongTimeAgo");case"userStatusLastMonth":return e("WithinAMonth");case"userStatusLastWeek":return e("WithinAWeek");case"userStatusOffline":{const{wasOnline:n}=t.status;if(!n)return e("LastSeen.Offline");const r=new Date,d=new Date(1e3*n);if(d>=r)return e("LastSeen.JustNow");const o=new Date(r.getTime()-d.getTime());if(o.getTime()/1e3<60)return e("LastSeen.JustNow");if(o.getTime()/1e3<3600){return e("LastSeen.MinutesAgo",Math.floor(o.getTime()/1e3/60))}const c=new Date;if(c.setHours(0,0,0,0),d>c){if(o.getTime()/1e3<21600){return e("LastSeen.HoursAgo",Math.floor(o.getTime()/1e3/60/60))}return e("LastSeen.TodayAt",Object(u.h)(d))}const a=new Date;return a.setDate(r.getDate()-1),c.setHours(0,0,0,0),d>a?e("LastSeen.YesterdayAt",Object(u.h)(d)):e("LastSeen.AtDate",Object(u.b)(e,d))}case"userStatusOnline":return e("Online");case"userStatusRecently":return e("Lately");default:return}}function s(e){const{id:t,status:n,type:u}=e;return!!n&&(t!==r.mb&&("userStatusOnline"===n.type&&"userTypeBot"!==u))}function f(e){return!(!e.status||"userTypeBot"===e.type||e.id===r.mb)&&("userTypeDeleted"===e.type||"userTypeUnknown"===e.type)}function l(e){return"userTypeBot"===e.type}function b(e,t,n){return Object(d.k)(e,e=>{const r=Date.now()/1e3;if(n&&n.includes(e))return r+172800-(n.length-n.indexOf(e));const u=t[e];if(!u||!u.status)return 0;if("userStatusOnline"===u.status.type)return u.status.expires;if("userStatusOffline"===u.status.type&&u.status.wasOnline)return u.status.wasOnline;switch(u.status.type){case"userStatusRecently":return r-86400;case"userStatusLastWeek":return r-604800;case"userStatusLastMonth":return r-18144e3;default:return 0}},"desc")}function h(e){const t=e?Math.abs(e.id)%7:0;return o[t]}},function(e,t,n){"use strict";n.d(t,"w",(function(){return c})),n.d(t,"v",(function(){return a})),n.d(t,"t",(function(){return i})),n.d(t,"y",(function(){return s})),n.d(t,"u",(function(){return f})),n.d(t,"z",(function(){return l})),n.d(t,"j",(function(){return b})),n.d(t,"p",(function(){return h})),n.d(t,"i",(function(){return m})),n.d(t,"e",(function(){return p})),n.d(t,"f",(function(){return g})),n.d(t,"d",(function(){return y})),n.d(t,"x",(function(){return v})),n.d(t,"r",(function(){return w})),n.d(t,"m",(function(){return O})),n.d(t,"A",(function(){return I})),n.d(t,"c",(function(){return j})),n.d(t,"a",(function(){return E})),n.d(t,"o",(function(){return C})),n.d(t,"h",(function(){return S})),n.d(t,"g",(function(){return M})),n.d(t,"s",(function(){return A})),n.d(t,"D",(function(){return k})),n.d(t,"b",(function(){return T})),n.d(t,"C",(function(){return N})),n.d(t,"B",(function(){return P})),n.d(t,"l",(function(){return D})),n.d(t,"k",(function(){return F})),n.d(t,"q",(function(){return L})),n.d(t,"n",(function(){return x})),n.d(t,"E",(function(){return B}));var r=n(5),u=n(1),d=n(3),o=n(30);function c(e){return e>0}function a(e){return i(e)||s(e)}function i(e){return"chatTypeBasicGroup"===e.type}function s(e){return"chatTypeSuperGroup"===e.type}function f(e){return"chatTypeChannel"===e.type}function l(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function b(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function h(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function m(e,t,n,r=!1){return r||n&&t.id===n.id&&n.isSelf?e("SavedMessages"):t.title||e("HiddenName")}function p(e){if(e.fullInfo)return e.fullInfo.about}function g(e){const{username:t}=e,{inviteLink:n}=e.fullInfo||{};return n&&n.length?n:t?"t.me/"+t:""}function y(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function v(e){return!e.lastMessage}function w(e){return Boolean(e.adminRights)}function O(e,t){return!!e.adminRights&&e.adminRights[t]}function I(e,t){return Boolean(e.currentUserBannedRights&&e.currentUserBannedRights[t]||e.defaultBannedRights&&e.defaultBannedRights[t])}function j(e,t){return t!==r.MAIN_THREAD_ID||!(e.isRestricted||e.migratedTo||e.isNotJoined)&&(!!e.isCreator||(!!c(e.id)||(f(e)?O(e,"postMessages"):w(e)||!I(e,"sendMessages"))))}function E(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=w(e);return{canAttachMedia:n||!I(e,"sendMedia"),canAttachPolls:(n||!I(e,"sendPolls"))&&(!c(e.id)||t),canSendStickers:n||!I(e,"sendStickers"),canSendGifs:n||!I(e,"sendGifs"),canAttachEmbedLinks:n||!I(e,"embedLinks")}}function C(e){return e.currentUserBannedRights&&e.currentUserBannedRights.sendMessages?"You are not allowed to send messages in this chat.":e.defaultBannedRights&&e.defaultBannedRights.sendMessages?"Sending messages is not allowed in this chat.":void 0}function S(e){if(e&&e.fullInfo)return e.fullInfo.slowMode}function M(e){return Math.max(e.joinDate||0,e.lastMessage?e.lastMessage.date:0)}function A(e){return e.folderId===u.h}function k(e,t,n){return!(n&&n[e.id]&&!n[e.id].isMuted)&&(e.isMuted||c(e.id)&&!t.hasPrivateChatsNotifications||f(e)&&!t.hasBroadcastNotifications||a(e)&&!t.hasGroupNotifications)}function T(e){return i(e)||(s(e)||f(e))&&e.isCreator}function N(e,t,n,r,u,d){const o=n.excludedChatIds?new Set(n.excludedChatIds):void 0,i=n.excludedChatIds?new Set(n.includedChatIds):void 0,s=n.excludedChatIds?new Set(n.pinnedChatIds):void 0;return[(d||Object.keys(e).map(Number)).filter(d=>function(e,t,n,r,u,d,o,i){if(d&&d.has(e.id))return!1;if(o&&o.has(e.id))return!0;if(i&&i.has(e.id))return!0;if(A(e)&&t.excludeArchived)return!1;if(t.excludeMuted&&!e.unreadMentionsCount&&k(e,r,u))return!1;if(!e.unreadCount&&!e.unreadMentionsCount&&!e.hasUnreadMark&&t.excludeRead)return!1;if(c(e.id)){const r=n[e.id];if(r&&"userTypeBot"===r.type){if(t.bots)return!0}else{if(t.contacts&&r&&r.isContact)return!0;if(t.nonContacts&&r&&!r.isContact)return!0}}else{if(a(e))return!!t.groups;if(f(e))return!!t.channels}return!1}(e[d],n,t,r,u,o,i,s)),n.pinnedChatIds]}function P(e,t,n,r="all"){function u(e){if(!e||!e.lastMessage||e.migratedTo)return!1;switch(r){case"all":if(A(e))return!1;break;case"archived":if(!A(e))return!1}return!e.isRestricted&&!e.isNotJoined}const o=t.map(t=>e[t]).filter(u),c=new Set(t);return{pinnedChats:n?n.map(t=>e[t]).filter(u).filter(e=>c.has(e.id)):[],otherChats:Object(d.k)(n?o.filter(e=>!n.includes(e.id)):o,M,"desc")}}function D(e,t,n,r,u,d){const[o]=N(e,t,n,u,d,r),c=o.map(t=>e[t]).filter(e=>e&&e.lastMessage&&!e.isRestricted&&!e.isNotJoined);return{unreadDialogsCount:c.reduce((e,t)=>t.unreadCount||t.hasUnreadMark?e+1:e,0),hasActiveDialogs:c.some(e=>e.unreadMentionsCount||!k(e,u,d)&&(e.unreadCount||e.hasUnreadMark))}}function F(e,t,n,r,u,d,o){const{id:c,title:a,emoticon:i,description:s,pinnedChatIds:f,excludedChatIds:l,includedChatIds:b,excludeArchived:h,excludeMuted:m,excludeRead:p,...g}=r;if(Object.values(g).filter(Boolean).length>1||l&&l.length||b&&b.length){return e("Chats",function(e,t,n,r,u,d){const[o,c]=N(e,t,n,u,d,r),{pinnedChats:a,otherChats:i}=P(e,o,c,"folder");return a.length+i.length}(t,n,r,u,d,o))}return g.bots?e("FilterBots"):g.groups?e("FilterGroups"):g.channels?e("FilterChannels"):g.contacts?e("FilterContacts"):g.nonContacts?e("FilterNonContacts"):void 0}function L(e){return!!e&&e.id<0}function x(e,t,n){if(n&&!c(t))return n.isSelf?e("FromYou"):Object(o.b)(n)}function B(e,t,n=!1,r){return Object(d.k)(e,e=>{const u=t[e];if(!u)return 0;let d=0;return u.lastMessage&&(d+=u.lastMessage.date),n&&u.isVerified&&(d+=3e9),r&&r.includes(e)&&(d+=Date.now()+(r.length-r.indexOf(e))),d},"desc")}},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(21),o=n(43);n(92);t.a=({ref:e,type:t="button",onClick:n,onContextMenu:c,onMouseDown:a,onMouseEnter:i,onMouseLeave:s,onFocus:f,children:l,size:b="default",color:h="primary",className:m,round:p,pill:g,fluid:y,isText:v,isLoading:w,ariaLabel:O,href:I,download:j,disabled:E,ripple:C,faded:S,tabIndex:M,isRtl:A})=>{let k=Object(r.q)(null);e&&(k=e);const[T,N]=Object(r.r)(!1),P=Object(u.a)("Button",m,b,h,p&&"round",g&&"pill",y&&"fluid",E&&"disabled",v&&"text",w&&"loading",C&&"has-ripple",S&&"faded",T&&"clicked"),D=Object(r.m)(e=>{!E&&n&&n(e),N(!0),setTimeout(()=>{N(!1)},400)},[E,n]),F=Object(r.m)(e=>{e.preventDefault(),!E&&a&&a(e)},[a,E]);return I?r.a.createElement("a",{ref:k,className:P,href:I,title:O,download:j,tabIndex:M,dir:A?"rtl":void 0},l,!E&&C&&r.a.createElement(o.a,null)):r.a.createElement("button",{ref:k,type:t,className:P,onClick:D,onContextMenu:c,onMouseDown:F,onMouseEnter:i&&!E?i:void 0,onMouseLeave:s&&!E?s:void 0,onFocus:f&&!E?f:void 0,"aria-label":O,title:O,tabIndex:M,dir:A?"rtl":void 0},w?r.a.createElement("div",null,r.a.createElement("span",{dir:A?"auto":void 0},"Please wait.."),r.a.createElement(d.a,{color:v?"blue":"white"})):l,!E&&C&&r.a.createElement(o.a,null))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return b}));var r=n(1);const u=new Set(["scroll","mouseenter","mouseleave"]),d={},o=new Map,c={};function a(e,t,n){const r=s(t,e);f(r,e)?function(e,t,n){c[e]||(c[e]=0,document.addEventListener(e,h));(function(e){d[e]||(d[e]=new Map);return d[e]})(e).set(t,n),function(e){const t=o.get(e);if(t)return t;const n=new Set;return o.set(e,n),n}(t).add(e),c[e]++}(r,e,n):e.addEventListener(r,n)}function i(e,t,n){const r=s(t,e);f(r,e)?l(r,e):e.removeEventListener(r,n)}function s(e,t){const n=e.replace(/^on/,"").toLowerCase();return"change"===n&&"SELECT"!==t.tagName?"input":"doubleclick"===n?"dblclick":"focus"===n?"focusin":"blur"===n?"focusout":n}function f(e,t){return!u.has(e)&&"VIDEO"!==t.tagName&&"IFRAME"!==t.tagName}function l(e,t){c[e]--,c[e]||document.removeEventListener(e,h),d[e].delete(t),o.get(t).delete(e)}function b(e){const t=o.get(e);t&&(t.forEach(t=>l(t,e)),o.delete(e))}function h(e){const t=d[e.type];if(t){let n=!1,r=e.target;const u=()=>{n=!0},d=()=>{e.preventDefault()},o=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?u:"preventDefault"===t?d:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(o),n))return;r=r.parentNode}}}r.p&&document.addEventListener("dblclick",()=>{console.log("DELEGATED EVENTS",{delegationRegistry:d,delegatedEventsByElement:o,documentEventCounters:c})})},function(e,t,n){"use strict";var r=n(0);t.a=(e=!1)=>{const[t,n]=Object(r.r)(e);return[t,Object(r.m)(()=>{n(!0)},[]),Object(r.m)(()=>{n(!1)},[])]}},function(e,t,n){"use strict";var r=n(0),u=n(8);t.a=(e=!1,t,n=!1,d="fast",o=!1)=>{const[c,a]=Object(r.r)(!e),i=Object(r.q)(),[s,f]=Object(r.r)(e&&n);e?(a(!1),f(!0),i.current&&(window.clearTimeout(i.current),i.current=void 0)):(f(!1),c||i.current||(i.current=window.setTimeout(()=>{a(!0),t&&t(),i.current=void 0},o?0:350)));const l=Boolean(i.current),b=e||l;return{shouldRender:b,transitionClassNames:Object(u.a)(d&&"opacity-transition",d,s&&"open",b&&"shown",l&&"closing")}}},function(e,t,n){"use strict";n.d(t,"j",(function(){return o})),n.d(t,"k",(function(){return c})),n.d(t,"n",(function(){return a})),n.d(t,"h",(function(){return s})),n.d(t,"g",(function(){return f})),n.d(t,"b",(function(){return l})),n.d(t,"f",(function(){return b})),n.d(t,"c",(function(){return h})),n.d(t,"d",(function(){return p})),n.d(t,"e",(function(){return g})),n.d(t,"i",(function(){return y})),n.d(t,"a",(function(){return v})),n.d(t,"l",(function(){return O})),n.d(t,"m",(function(){return I}));const r=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],u=["January","February","March","April","May","June","July","August","September","October","November","December"],d=u.map(e=>e.toLowerCase());function o(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function c(e){return o(e).getTime()}function a(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${t.getMonth()}`}function i(e){return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`}function s(e){const t="number"==typeof e?new Date(e):e;return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function f(e,t){const n="number"==typeof t?new Date(t):t,u=o(new Date);if(n>=u)return s(n);const d=new Date(u);if(d.setDate(u.getDate()-7),n>=d)return e("Weekday.Short"+r[n.getDay()]);const c=n.getFullYear()!==u.getFullYear(),a=e(c?"formatDateScheduleYear":"formatDateSchedule")||(c?"d MMM yyyy":"d MMM");return m(e,n,a)}function l(e,t){const n="number"==typeof t?new Date(t):t,r=e("formatterYearMax")||"dd.MM.yyyy";return m(e,n,r)}function b(e,t,n=!1){const r=e(n?"formatterMonthYear2":"formatterMonthYear")||"MMM yyyy";return m(e,t,r)}function h(e,t,n=!1,u=!1){const d="number"==typeof t?new Date(t):t,c=o(new Date);if(!u){if(i(d)===i(c))return(n?j:E)(e("Weekday.Today"));const t=new Date(c);if(t.setDate(c.getDate()-1),i(d)===i(t))return(n?j:E)(e("Weekday.Yesterday"));const u=new Date(c),o=new Date(c);if(u.setDate(c.getDate()-7),o.setDate(c.getDate()+7),d>=u&&d<=o){const t=r[d.getDay()];return n?j(e("Weekday.Short"+t)):E(e("Weekday."+t))}}const a=d.getFullYear()!==c.getFullYear(),s=e(n?a?"formatDateScheduleYear":"formatDateSchedule":a?"chatFullDate":"chatDate")||"d MMMM yyyy";return(n?j:E)(m(e,d,s))}function m(e,t,n){const r=t.getDate(),d=t.getMonth();return n.replace("LLLL",e(u[d])).replace("MMMM",e("Month.Gen"+u[d])).replace("MMM",e("Month.Short"+u[d])).replace("MM",String(d+1).padStart(2,"0")).replace("dd",String(r).padStart(2,"0")).replace("d",String(r)).replace("yyyy",String(t.getFullYear()))}function p(e,t){const n="number"==typeof t?new Date(t):t;return`${h(e,n,!0)}, ${s(n)}`}function g(e){const t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=Math.floor(e%3600%60);let u="";return t>0?(u+=String(t).padStart(2,"0")+":",u+=String(n).padStart(2,"0")+":"):u+=String(n)+":",u+=String(r).padStart(2,"0"),u}function y(e){const t=[];let n=e%1e3;e-=n,n=Math.floor(n/10);const r=(e=Math.floor(e/1e3))%60;e-=r;const u=(e=Math.floor(e/60))%60;e-=u;const d=(e=Math.floor(e/60))%60;return d>0&&t.push(String(d).padStart(2,"0")),t.push(String(u).padStart(d>0?2:1,"0")),t.push(String(r).padStart(2,"0")),`${t.join(":")},${String(n).padStart(2,"0")}`}function v(e){return e.toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric"})}function w(e,t,n=2021){if(t>11||e>31)return!1;const r=new Date(n,t,e);return!Number.isNaN(r.getTime())&&r.getDate()===e}function O(e=""){const t=e.match(/\d{1,2}\s[a-zA-Z]{3,}/),n=e.match(/[a-zA-Z]{3,}\s\d{1,2}/),r=e.match(/\d{1,2}[./-]\d{1,2}([./-]\d{2,4})?/);if(!t&&!r&&!n)return;if(r){const[t,n,r]=e.split(/[./-]/).map(Number);return r&&r<2015||!w(t,n-1,r||void 0)?void 0:`${r?r+"-":""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const u=e.split(" "),o=t?u[0]:u[1],c=(t?u[1]:u[0]).toLowerCase(),a=d.findIndex(e=>e.startsWith(c));return-1!==a&&w(Number(o),a)?`${String(a+1).padStart(2,"0")}-${String(o).padStart(2,"0")}`:void 0}function I(e){return e+86400}function j(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function E(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},function(e,t,n){"use strict";n.d(t,"r",(function(){return d})),n.d(t,"I",(function(){return o})),n.d(t,"s",(function(){return c})),n.d(t,"H",(function(){return a})),n.d(t,"M",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"K",(function(){return f})),n.d(t,"J",(function(){return l})),n.d(t,"N",(function(){return m})),n.d(t,"x",(function(){return y})),n.d(t,"d",(function(){return v})),n.d(t,"b",(function(){return w})),n.d(t,"L",(function(){return O})),n.d(t,"eb",(function(){return I})),n.d(t,"j",(function(){return j})),n.d(t,"k",(function(){return E})),n.d(t,"V",(function(){return C})),n.d(t,"db",(function(){return S})),n.d(t,"g",(function(){return A})),n.d(t,"z",(function(){return k})),n.d(t,"kb",(function(){return T})),n.d(t,"lb",(function(){return N})),n.d(t,"u",(function(){return P})),n.d(t,"P",(function(){return D})),n.d(t,"O",(function(){return F})),n.d(t,"m",(function(){return L})),n.d(t,"G",(function(){return x})),n.d(t,"n",(function(){return B})),n.d(t,"ib",(function(){return R})),n.d(t,"hb",(function(){return U})),n.d(t,"Q",(function(){return _})),n.d(t,"q",(function(){return G})),n.d(t,"jb",(function(){return $})),n.d(t,"o",(function(){return W})),n.d(t,"y",(function(){return K})),n.d(t,"nb",(function(){return z})),n.d(t,"ob",(function(){return V})),n.d(t,"f",(function(){return q})),n.d(t,"fb",(function(){return J})),n.d(t,"l",(function(){return Y})),n.d(t,"R",(function(){return Z})),n.d(t,"S",(function(){return X})),n.d(t,"U",(function(){return ee})),n.d(t,"T",(function(){return te})),n.d(t,"Y",(function(){return ue})),n.d(t,"t",(function(){return de})),n.d(t,"Z",(function(){return oe})),n.d(t,"X",(function(){return ae})),n.d(t,"W",(function(){return ie})),n.d(t,"bb",(function(){return fe})),n.d(t,"ab",(function(){return le})),n.d(t,"v",(function(){return be})),n.d(t,"w",(function(){return he})),n.d(t,"e",(function(){return me})),n.d(t,"cb",(function(){return pe})),n.d(t,"a",(function(){return ge})),n.d(t,"p",(function(){return ye})),n.d(t,"mb",(function(){return ve})),n.d(t,"gb",(function(){return we})),n.d(t,"E",(function(){return Oe})),n.d(t,"C",(function(){return Ie})),n.d(t,"A",(function(){return je})),n.d(t,"F",(function(){return Ee})),n.d(t,"B",(function(){return Ce})),n.d(t,"D",(function(){return Se})),n.d(t,"h",(function(){return Me})),n.d(t,"i",(function(){return Ae}));var r=n(1),u=n(3);function d(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function o(e,t,n){const{[t]:r}=e.chats.listIds,u=r&&r.length?n.filter(e=>!r.includes(e)):n;return r&&!u.length?e:d(e,t,[...r||[],...u])}function c(e,t){return{...e,chats:{...e.chats,byId:t}}}function a(e,t,n,r){const{byId:d}=e.chats,o=d[t],a=n.isMin&&o&&!o.isMin,i={...o,...a?Object(u.j)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...o.photos||[]]}};return i.id&&i.type?c(e,{...d,[t]:i}):e}function i(e,t){return Object.keys(t).forEach(n=>{e=a(e,Number(n),t[Number(n)])}),e}function s(e,t){const{byId:n}=e.chats;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=a(e,r,t[r]))}),e}function f(e,t,n){const u=n===r.h?"archived":"active";let d=e.chats.listIds;return Object.keys(d).forEach(e=>{const n=d[e]||[];e!==u||n.includes(t)?e!==u&&n.includes(t)&&(d={...d,[e]:n.filter(e=>e!==t)}):d={...d,[e]:[...n,t]}}),e=a(e={...e,chats:{...e.chats,listIds:d}},t,{folderId:n||void 0})}function l(e,t,n){const r="active"===t?"all":"archived";return{...e,chats:{...e.chats,...n.orderedPinnedIds&&{orderedPinnedIds:{...e.chats.orderedPinnedIds,[t]:n.orderedPinnedIds}},totalCount:{...e.chats.totalCount,[r]:n.totalChatCount},isFullyLoaded:{...e.chats.isFullyLoaded,[t]:!1}}}}var b=n(5),h=n(6);function m(e,t,n=b.MAIN_THREAD_ID,r="thread"){return{...e,messages:{...e.messages,messageLists:t?[{chatId:t,threadId:n,type:r}]:void 0}}}function p(e,t,n){return g(e,t,{byId:n})}function g(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function y(e,t,n,r,u){return function(e,t,n,r){const u=e.messages.byChatId[t];return g(e,t,{threadsById:{...u&&u.threadsById,[n]:{...u&&u.threadsById[n],...r}}})}(e,t,n,{[r]:u})}function v(e,t){const n=t.reduce((e,t)=>(e[t.chatId]||(e[t.chatId]={}),e[t.chatId][t.id]=t,e),{});return Object.keys(n).map(Number).forEach(t=>{e=w(e,t,n[t])}),e}function w(e,t,n){const r=Object(h.m)(e,t);return r&&Object.keys(n).every(e=>Boolean(r[Number(e)]))?e:p(e,t,{...n,...r})}function O(e,t,n,r){const u=Object(h.m)(e,t)||{},d={...u[n],...r};return d.id?p(e,t,{...u,[n]:d}):e}function I(e,t,n,r){const u=Object(h.qb)(e,t)||{},d={...u[n],...r};return d.id?P(e,t,{...u,[n]:d},void 0):e}function j(e,t,n){const r=Object(h.m)(e,t);if(!r)return e;const d=Object(u.j)(r,n),o=Object.values(Object(u.m)(r,n)).filter(({forwardInfo:e})=>e&&e.isLinkedChannelPost);if(Object.keys(e.messages.byChatId[t].threadsById).map(Number).forEach(r=>{let u=Object(h.Y)(e,t,r),d=Object(h.gb)(e,t,r),o=Object(h.Hb)(e,t,r),c=Object(h.jb)(e,t);n.forEach(e=>{u&&u.includes(e)&&(u=u.filter(t=>t!==e)),d&&d.includes(e)&&(d=d.filter(t=>t!==e)),o&&o.includes(e)&&(o=o.filter(t=>t!==e)),c&&c.includes(e)&&(c=c.filter(t=>t!==e))}),e=y(e,t,r,"listedIds",u),e=y(e,t,r,"outlyingIds",d),e=y(e,t,r,"viewportIds",o),e=y(e,t,r,"pinnedIds",c)}),o.length){const n=Object(h.y)(e),r=n&&n.chatId===t&&"thread"===n.type,u=n&&n.threadId;o.forEach(n=>{const{fromChatId:d,fromMessageId:o}=n.forwardInfo,c=Object(h.k)(e,d,o);r&&u===o&&(e=m(e,t)),c&&(e=O(e,d,o,{threadInfo:void 0}))})}return e=p(e,t,d)}function E(e,t,n){const r=Object(h.qb)(e,t);if(!r)return e;const d=Object(u.j)(r,n);let o=Object(h.ob)(e,t);return o&&(n.forEach(e=>{o.includes(e)&&(o=o.filter(t=>t!==e))}),e=y(e,t,b.MAIN_THREAD_ID,"scheduledIds",o)),e=P(e,t,d,void 0)}function C(e,t,n,r){const u=Object(h.Y)(e,t,n),d=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!d.length?e:y(e,t,n,"listedIds",M([...u||[],...d]))}function S(e,t,n,r){const u=Object(h.gb)(e,t,n),d=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!d.length?e:y(e,t,n,"outlyingIds",M([...u||[],...d]))}function M(e){return e.sort((e,t)=>e-t)}function A(e,t,n,u){const d=Object(h.Hb)(e,t,n)||[];if(d.includes(u))return e;return y(e,t,n,"viewportIds",M([...d.length{e=T(e,t.chatId,t.threadId,t)}),e}function P(e,t,n,r){return function(e,t,n){const r=e.scheduledMessages.byChatId[t]||{byId:{},hash:0};return{...e,scheduledMessages:{byChatId:{...e.scheduledMessages.byChatId,[t]:{...r,...n}}}}}(e,t,{byId:n,hash:r})}function D(e,t,n,r=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r}}}function F(e,t){return{...e,focusedMessage:{...e.focusedMessage,direction:t}}}function L(e,t,n){return{...e,selectedMessages:{chatId:t,messageIds:n?Array.prototype.concat([],n):[]}}}function x(e,t,n,r,d,o,c,a=!1){const{selectedMessages:i}=e;o&&(c=Object(h.ab)(e,t,o));const s=c||[d];if(!i)return L(e,t,s);const{messageIds:f}=i;let l;const b=s.filter(e=>!f.includes(e));if(b&&!b.length)l=f.filter(e=>!s.includes(e));else if(a&&f.length){const o=Object(h.x)(e,t,n,r),c=o.indexOf(f[f.length-1]),a=o.indexOf(d),i=Math.min(c,a),s=Math.max(c,a),b=o.slice(i,s+1);l=Object(u.o)([...f,...b])}else l=[...f,...b];return l.length?{...e,selectedMessages:{...i,messageIds:l}}:B(e)}function B(e){return{...e,selectedMessages:void 0}}function R(e,t,n,r,d){const o=r.map(t=>{const n=e.stickers.setsById[t.id];return n?{...n,...t}:t});return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,...Object(u.c)(o,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:d}:{setIds:r.map(({id:e})=>e)}}}}}function U(e,t,n){const r=e.stickers.setsById[t]||{};return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,[t]:{...r,...n}}}}}function _(e,t,n,r){const{results:u}=e.gifs.search;let d;if(t||!u)d=n;else{const e=new Set(u.map(e=>e.id));d=[...u,...n.filter(t=>!e.has(t.id))]}return{...e,gifs:{...e.gifs,search:{...e.gifs.search,offset:r,results:d}}}}function G(e,t){return{...e,animatedEmojis:t}}function $(e,t,n,r){const d=[...Object(h.yb)(e,t),...n||[]],o=Object(u.o)(d.map(({id:e})=>e)),c=Object(u.c)(d,"id"),a=o.map(e=>c[e]);return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:a,hash:r}}}}function W(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?$(e,t,n,r):e}var H=n(50);function K(e,t){return{...e,users:{...e.users,byId:t}}}function z(e,t,n){const{byId:r}=e.users,{hash:d,userIds:o}=e.contactList||{},c=r[t],a=n.isMin&&c&&!c.isMin,i={...c,...a?Object(u.j)(n,["isMin","accessHash"]):n};return i.id&&i.type?(i.isContact&&o&&!o.includes(t)&&(e={...e,contactList:{hash:d||0,userIds:[t,...o]}}),K(e,{...r,[t]:i})):e}function V(e,t){return Object.keys(t).map(Number).forEach(n=>{e=z(e,n,t[n])}),e}function q(e,t){const{byId:n}=e.users;return Object.keys(t).map(Number).forEach(r=>{(!n[r]||n[r].isMin&&!t[r].isMin)&&(e=z(e,r,t[r]))}),e}function J(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function Y(e,t){const{byId:n}=e.users,{hash:r,userIds:u}=e.contactList||{};return delete n[t],K(e={...e,contactList:{hash:r||0,userIds:u?u.filter(e=>e!==t):H.a}},n)}const Q=e=>`${e.chatId}_${e.id}`;function Z(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function X(e,t){return Z(e,{currentContent:t})}function ee(e,t,n,r,d){const{resultsByType:o}=e.globalSearch||{},c=t.reduce((e,t)=>(e[Q(t)]=t,e),{}),a=o&&o[r]?o[r].foundIds:void 0;if(void 0!==a&&Object.keys(c).every(e=>a.includes(Q(c[e]))))return te(e,{messages:!1});const i=a||[],s=t.map(e=>Q(e)),f=Array.prototype.concat(i,s),l=Object(u.a)(i,f)?i:f;return Z(e=te(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:d,foundIds:l}}})}function te(e,t){return Z(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var ne=n(4);function re(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function ue(e,t,n,r,u){const d=Object(ne.a)(t,n);return re(e,d,{...e.localTextSearch.byChatThreadKey[d],isActive:r,query:u})}function de(e,t,n,r,u,d){const o=Object(ne.a)(t,n);return re(e,o,{...e.localTextSearch.byChatThreadKey[o],results:{foundIds:r,totalCount:u,nextOffsetId:d}})}function oe(e,t,n,r,d,o){const c=Object(ne.a)(t,n),{results:a}=e.localTextSearch.byChatThreadKey[c]||{},i=a&&a.foundIds||[],s=se(Object(u.o)(Array.prototype.concat(i,r)));return de(e,t,n,Object(u.a)(i,s)?i:s,d,o)}function ce(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function ae(e,t,n){return ce(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function ie(e,t,n,r,d,o){const{resultsByType:c}=e.localMediaSearch.byChatId[t]||{},a=c&&c[n]?c[n].foundIds:[],i=se(Object(u.o)(Array.prototype.concat(a,r)));return function(e,t,n,r,u,d){return ce(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:u,nextOffsetId:d}}})}(e,t,n,Object(u.a)(a,i)?a:i,d,o)}function se(e){return e.sort((e,t)=>e-t)}function fe(e,t){return{...e,management:{...e.management,progress:t}}}function le(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function be(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function he(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function me(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function pe(e,t,n,r){switch(t){case"contact":return be(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return be(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return be(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function ge(e,t){return{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function ye(e,t){return{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter(e=>e!==t),totalCount:e.blocked.totalCount-1}}}function ve(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function we(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function Oe(e,t){return{...e,payment:{...e.payment,formId:t}}}function Ie(e,t){return{...e,payment:{...e.payment,step:t}}}function je(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,description:u,photoUrl:d}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,description:u,photoUrl:d}}}}function Ee(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Ce(e,t){return{...e,payment:{...e.payment,...t}}}function Se(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:u,text:d,title:o}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:u,text:d,title:o}}}}function Me(e){return{...e,payment:{}}}function Ae(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},function(e,t,n){"use strict";var r=n(0);t.a=function(e,t){const n=Object(r.q)(),{current:u}=n;return t&&void 0===e||(n.current=e),u}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));function r(e,t=30){return!e||e.length<=t?e:e.substr(0,t)+"..."}},function(e){e.exports=JSON.parse('{"--color-primary":["#50A2E9","#8378DB"],"--color-primary-opacity":["#50A2E980","#8378DB80"],"--color-primary-shade":["#4a95d6","#7b71c6"],"--color-background":["#FFFFFF","#212121"],"--color-background-secondary":["#f4f4f5","#121212"],"--color-background-secondary-accent":["#E4E4E5","#100f10"],"--color-background-own":["#EEFEDF","#8378DB"],"--color-background-selected":["#F4F4F5","#2C2C2C"],"--color-background-own-selected":["#d4fcae","#7b71c6"],"--color-chat-hover":["#F4F4F5","#2C2C2C"],"--color-chat-active":["#4C90E6","#8378DB"],"--color-item-active":["#ededed","#292929"],"--color-text":["#000000","#FFFFFF"],"--color-text-secondary":["#707579","#AAAAAA"],"--color-borders":["#DADCE0","#100F10"],"--color-borders-input":["#DADCE0","#5B5B5A"],"--color-links":["#52A1EF","#868DF6"],"--color-links-hover":["#2d8dec","#6b5fcc"],"--color-gray":["#C4C9CC","#717579"],"--color-pinned":["#C4C9CC","#707579"],"--color-default-shadow":["#72727240","#1010109c"],"--color-light-shadow":["#7272722B","#00000040"],"--color-green":["#4DCD5E","#8378DB"],"--color-text-meta-colored":["#4DCD5E","#8378DB"],"--color-reply-hover":["#F4F4F4","#272727"],"--color-reply-active":["#E8E9E9","#2E2F2F"],"--color-reply-own-hover":["#DBF4CE","#6458bc"],"--color-reply-own-active":["#C8EBBC","#4F4A9F"],"--color-accent-own":["#4FAE4E","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#52A1EF","#FFFFFF"],"--color-code":["#4a729a","#93c4ef"],"--color-code-own":["#3c7940","#FFFFFF"],"--color-code-bg":["#70757914","#ffffff26"],"--color-code-own-bg":["#70757914","#ffffff26"]}')},function(e,t,n){"use strict";function r(e){return new Promise((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)})}let u;function d(){return u||(u=function(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const u=r(n);return(e,n)=>u.then(r=>n(r.transaction(t,e).objectStore(t)))}("keyval-store","keyval")),u}function o(e,t=d()){return t("readonly",t=>r(t.get(e)))}function c(e,t=d()){return t("readwrite",t=>(t.delete(e),r(t.transaction)))}function a(e,t){return e("readonly",e=>(e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},r(e.transaction)))}function i(e=d()){const t=[];return a(e,e=>t.push(e.key)).then(()=>t)}n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return i}))},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(25);n(97);t.a=e=>{const{icon:t,className:n,children:o,onClick:c,href:a,download:i,disabled:s,destructive:f,ariaLabel:l}=e,b=Object(d.a)(),h=Object(r.m)(e=>{if(s||!c)return e.stopPropagation(),void e.preventDefault();c(e)},[s,c]),m=Object(r.m)(e=>{if(13===e.keyCode||32===e.keyCode)return s||!c?(e.stopPropagation(),void e.preventDefault()):void c(e)},[s,c]),p=Object(u.a)("MenuItem",n,s&&"disabled",f&&"destructive"),g=r.a.createElement(r.a.Fragment,null,t&&r.a.createElement("i",{className:"icon-"+t,"data-char":t.startsWith("char-")?t.replace("char-",""):void 0}),o);return a?r.a.createElement("a",{tabIndex:0,className:p,href:a,download:i,"aria-label":l,title:l,target:a.startsWith(window.location.origin)?"_self":"_blank",rel:"noopener noreferrer",dir:b.isRtl?"rtl":void 0,onClick:c},g):r.a.createElement("div",{role:"button",tabIndex:0,className:p,onClick:h,onKeyDown:m,"aria-label":l,title:l,dir:b.isRtl?"rtl":void 0},g)}},function(e,t,n){"use strict";var r=n(0),u=n(9);n(91);t.a=Object(r.h)(()=>{const[e,t]=Object(r.r)([]),n=Object(r.p)(()=>Object(u.a)(()=>{t([])},700,!1),[]),d=Object(r.m)(r=>{if(0!==r.button)return;const u=r.currentTarget,d=u.getBoundingClientRect(),o=u.offsetWidth/2;t([...e,{x:r.clientX-d.x-o/2,y:r.clientY-d.y-o/2,size:o}]),requestAnimationFrame(()=>{n()})},[e,n]);return r.a.createElement("div",{className:"ripple-container",onMouseDown:d},e.map(({x:e,y:t,size:n})=>r.a.createElement("span",{style:`left: ${e}px; top: ${t}px; width: ${n}px; height: ${n}px;`})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return f})),n.d(t,"c",(function(){return l}));var r=n(83),u=n.n(r),d=n(7),o=n(13),c=n(9);let a,i;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function f(e,t){for(b();!i.wasmReady;)await Object(c.e)(2e3);const{result:n,width:r,height:u}=await function(e,t){return new Promise(n=>{i.requests=i.requests||new Map,i.requests.set(e,n),i.postMessage({id:e,blob:t})})}(e,t);if(r&&u)return function({result:e,width:t,height:n}){a||(a=document.createElement("canvas"));return new Promise(r=>{const u=new ImageData(e,t,n);a.width=t,a.height=n;a.getContext("2d").putImageData(u,0,0),a.toBlob(e=>{r(null!=e?e:void 0)},"image/png",1)})}({result:n,width:r,height:u})}async function l(e,t){if(Object(d.p)()||"data:image/webp"!==t.substr(0,15))return t;b();const n=await f(e,Object(o.d)(t));if(!n)throw new Error("Can't convert webp to png. Url: "+t);return Object(o.a)(n)}function b(){i||(i=new u.a,i.wasmReady=!1,i.onmessage=h)}function h(e){const{id:t}=e.data;switch(e.data.type){case"initialized":i.wasmReady=!0;break;case"result":if(i.requests.has(t)){const n=i.requests.get(t);i.requests.delete(t),n(e.data)}}}},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(25);t.a=Object(r.h)(({ref:e,id:t,className:n,value:o,label:c,error:a,success:i,disabled:s,readOnly:f,placeholder:l,autoComplete:b,inputMode:h,maxLength:m,onChange:p,onInput:g,onKeyPress:y,onKeyDown:v,onBlur:w})=>{const O=Object(d.a)(),I=a||i||c,j=Object(u.a)("input-group",o&&"touched",a?"error":i&&"success",s&&"disabled",f&&"disabled",I&&"with-label",n);return r.a.createElement("div",{className:j,dir:O.isRtl?"rtl":void 0},r.a.createElement("input",{ref:e,className:"form-control",type:"text",id:t,dir:"auto",value:o||"",placeholder:l,maxLength:m,autoComplete:b,inputMode:h,disabled:s,readOnly:f,onChange:p,onInput:g,onKeyPress:y,onKeyDown:v,onBlur:w}),I&&r.a.createElement("label",{htmlFor:t},I))})},function(e,t,n){"use strict";var r=n(0),u=n(8),d=n(25),o=n(21);n(93);t.a=Object(r.h)(({id:e,name:t,value:n,label:c,subLabel:a,checked:i,disabled:s,round:f,blocking:l,isLoading:b,onChange:h,onCheck:m})=>{const p=Object(d.a)(),g=Object(r.m)(e=>{h&&h(e),m&&m(e.currentTarget.checked)},[h,m]),y=Object(u.a)("Checkbox",s&&"disabled",f&&"round",b&&"loading",l&&"blocking");return r.a.createElement("label",{className:y,dir:p.isRtl?"rtl":void 0},r.a.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:i,disabled:s,onChange:g}),r.a.createElement("div",{className:"Checkbox-main"},r.a.createElement("span",{className:"label",dir:"auto"},c),a&&r.a.createElement("span",{className:"subLabel",dir:"auto"},a)),b&&r.a.createElement(o.a,null))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(55);function u(e){return Object(r.a)({onEsc:e})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var r=n(0);let u,d=!1;const o=e=>{document.dispatchEvent(new Event("tt-event-heavy-animation-start")),d=!0,u&&(clearTimeout(u),u=void 0),u=window.setTimeout(()=>{d=!1,document.dispatchEvent(new Event("tt-event-heavy-animation-end")),u=void 0},e)};t.a=(e,t)=>{Object(r.n)(()=>(d&&e(),document.addEventListener("tt-event-heavy-animation-start",e),document.addEventListener("tt-event-heavy-animation-end",t),()=>{document.removeEventListener("tt-event-heavy-animation-end",t),document.removeEventListener("tt-event-heavy-animation-start",e)}),[t,e])}},function(e,t,n){"use strict";function r(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function u(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function d(e){return e<1e3?e:e<1e6?u(e/1e3)+"K":u(e/1e6)+"M"}function o(e,t=2){return e.replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi,"").trim().split(/\s+/).slice(0,t).map(e=>e.length&&e.match(/./u)[0].toUpperCase()).join("")}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return d})),n.d(t,"c",(function(){return o}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const r=[]},function(e,t,n){"use strict";var r=n(38);t.a=(e,t)=>{const n=Object(r.a)(t);n&&!t.some((e,t)=>e!==n[t])||e(n||[])}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));const r=/[^\wа-яё]+/;function u(e,t){if(!e||!t)return!1;const n=e.toLowerCase().split(r);return t.toLowerCase().split(r).every(e=>n.some(t=>t.startsWith(e)))}},function(e,t,n){"use strict";var r=n(0),u=n(35),d=n(63),o=n(79),c=n(58),a=n(47),i=n(8),s=n(48);n(95);t.a=({ref:e,containerRef:t,isOpen:n,className:f,style:l,children:b,positionX:h="left",positionY:m="top",autoClose:p=!1,footer:g,noCloseOnBackdrop:y=!1,onCloseAnimationEnd:v,onClose:w,onMouseEnter:O,onMouseLeave:I})=>{let j=Object(r.q)(null);e&&(j=e);const E=t||j,{transitionClassNames:C}=Object(u.a)(n,v);Object(r.n)(()=>n&&w?Object(a.a)(w):void 0,[n,w]),Object(c.a)(([e])=>{void 0!==e&&Object(s.b)(200)},[n]);const S=Object(d.a)(j,n,p?w:void 0,void 0,!0);Object(o.a)(n,E,y?void 0:w);const M=Object(i.a)("bubble menu-container custom-scroll",m,h,g&&"with-footer",C);return r.a.createElement("div",{className:Object(i.a)("Menu no-selection",f),onKeyDown:n?S:void 0,onMouseEnter:O,onMouseLeave:n?I:void 0,style:l},n&&r.a.createElement("div",{className:"backdrop"}),r.a.createElement("div",{ref:j,className:M,style:`transform-origin: ${m} ${h}`,onClick:p?w:void 0},b,g&&r.a.createElement("div",{className:"footer"},g)))}},function(e,t,n){"use strict";n.d(t,"b",(function(){return y})),n.d(t,"c",(function(){return v})),n.d(t,"a",(function(){return w}));var r=n(5),u=n(1),d=n(10),o=n(12),c=n(13),a=n(7),i=n(81),s=n.n(i),f=n(82),l=n.n(f);async function b(e){const t=await new Response(e).arrayBuffer();return new Promise(e=>{const n=new Uint8Array(t);let r=new s.a,u=new l.a;r.onmessage=e=>{null===e.data?u.postMessage({command:"done"}):u.postMessage({command:"encode",buffers:e.data},e.data.map(({buffer:e})=>e))},u.onmessage=t=>{"page"===t.data.message&&(e(new Blob([t.data.page],{type:"audio/wav"})),r.terminate(),r=void 0,u.terminate(),u=void 0)},u.postMessage({command:"init",wavBitDepth:16,wavSampleRate:48e3}),r.postMessage({command:"init",decoderSampleRate:48e3,outputBufferSampleRate:48e3}),r.postMessage({command:"decode",pages:n},[n.buffer])})}var h=n(44);const m={[r.ApiMediaFormat.DataUri]:o.a.Text,[r.ApiMediaFormat.BlobUrl]:o.a.Blob,[r.ApiMediaFormat.Lottie]:o.a.Json,[r.ApiMediaFormat.Progressive]:void 0,[r.ApiMediaFormat.Stream]:void 0},p=new Map,g=new Map;function y(e,t,n){if(t===r.ApiMediaFormat.Progressive)return a.i?function(e){const t="./progressive/"+e;return p.set(e,t),Promise.resolve(t)}(e):y(e,r.ApiMediaFormat.BlobUrl,n);if(!g.has(e)){const i=async function(e,t,n){if(!u.M){const n=e.startsWith("avatar")?u.O:u.N,r=await o.c(n,e,m[t]);if(r){let t=r;if("audio/ogg"!==r.type||a.h||(t=await b(t)),"image/webp"===r.type&&!Object(a.p)()&&t){const n=await Object(h.b)(e,t);n&&(t=n)}const n=O(t);return p.set(e,n),n}}if(t===r.ApiMediaFormat.Stream){const r=new MediaSource,u=URL.createObjectURL(r);let o=!1;return r.addEventListener("sourceopen",()=>{if(o)return;o=!0;const u=r.addSourceBuffer("audio/mpeg");Object(d.a)("downloadMedia",{url:e,mediaFormat:t},(e,t)=>{n&&n(e),1===e&&r.endOfStream(),t&&u.appendBuffer(t)})}),p.set(e,u),u}const i=await Object(d.a)("downloadMedia",{url:e,mediaFormat:t},n);if(!i)throw new Error("Failed to fetch media");let{prepared:s,mimeType:f}=i;if("audio/ogg"===f&&!a.h){const e=await Object(c.e)(s);URL.revokeObjectURL(s);const t=await b(e);s=O(t),f=e.type}if("image/webp"===f&&!Object(a.p)()){const t=await Object(c.e)(s);URL.revokeObjectURL(s);const n=await Object(h.b)(e,t);n&&(s=O(n))}return p.set(e,s),s}(e,t,n).catch(e=>{u.p&&console.warn(e)}).finally(()=>{g.delete(e)});g.set(e,i)}return g.get(e)}function v(e){return p.get(e)}function w(e){Object(d.b)(e)}function O(e){return e instanceof Blob?URL.createObjectURL(e):e}a.i&&navigator.serviceWorker.addEventListener("message",async e=>{const{type:t,messageId:n,params:u}=e.data;if("requestPart"!==t)return;const o=await Object(d.a)("downloadMedia",{mediaFormat:r.ApiMediaFormat.Progressive,...u});if(!o)return;const{arrayBuffer:c,mimeType:a,fullSize:i}=o;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:c,mimeType:a,fullSize:i}},[c])})},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));const r={Enter:"onEnter",Backspace:"onBackspace",Delete:"onDelete",Esc:"onEsc",Escape:"onEsc",ArrowUp:"onUp",ArrowDown:"onDown",ArrowLeft:"onLeft",ArrowRight:"onRight",Tab:"onTab"},u={onEnter:[],onDelete:[],onBackspace:[],onEsc:[],onUp:[],onDown:[],onLeft:[],onRight:[],onTab:[]};function d(e){return o()||document.addEventListener("keydown",c,!0),Object.keys(e).forEach(t=>{const n=e[t];if(!n)return;const r=u[t];r&&r.push(n)}),()=>{!function(e){Object.keys(e).forEach(t=>{const n=e[t],r=u[t];if(r){const e=r.findIndex(e=>e===n);-1!==e&&r.splice(e,1)}}),o()||document.removeEventListener("keydown",c,!1)}(e)}}function o(){return Object.values(u).some(e=>Boolean(e.length))}function c(e){const t=r[e.key];if(!t)return;const{length:n}=u[t];if(!n)return;e.stopPropagation();(0,u[t][n-1])(e)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return i}));var r=n(9),u=n(1),d=n(7);const o=d.g&&s();let c=i();const a=Object(r.g)(()=>{c=i(),((c.width<=u.db||c.width<=u.cb&&c.height<=u.bb)!==d.g||d.g&&o!==s())&&window.location.reload()},250,!0);function i(){const e=.01*window.innerHeight;return document.documentElement.style.setProperty("--vh",e+"px"),{width:window.innerWidth,height:window.innerHeight}}function s(){return d.e?window.matchMedia("(orientation: landscape)").matches:window.matchMedia("screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)").matches}window.addEventListener("resize",a),window.addEventListener("orientationchange",a),t.a={get:()=>c}},function(e,t,n){"use strict";var r=n(0),u=n(2);const d=e=>{const t=[];let n=0;const r=e.length;let u;for(;n65535&&(u-=65536,t.push(String.fromCharCode(u>>>10&1023|55296)),u=56320|1023&u),t.push(String.fromCharCode(u))}return t.join("")};function o(e,t,n){let r;for(e=n?Math.floor(e/700):e>>1,e+=Math.floor(e/t),r=0;e>455;r+=36)e=Math.floor(e/35);return Math.floor(r+36*e/(e+38))}function c(e,t){const n=[],r=[],u=e.length;let c,a,i,s,f,l,b,h,m,p,g,y,v;for(c=128,i=0,s=72,f=e.lastIndexOf("-"),f<0&&(f=0),l=0;l=128)throw new RangeError("Illegal input >= 0x80");n.push(e.charCodeAt(l))}for(b=f>0?f+1:0;b=u)throw RangeError("punycode_bad_input(1)");if(g=(w=e.charCodeAt(b++))-48<10?w-22:w-65<26?w-65:w-97<26?w-97:36,g>=36)throw RangeError("punycode_bad_input(2)");if(g>Math.floor((2147483647-i)/m))throw RangeError("punycode_overflow(1)");if(i+=g*m,y=p<=s?1:p>=s+26?26:p-s,gMath.floor(2147483647/(36-y)))throw RangeError("punycode_overflow(2)");m*=36-y}if(a=n.length+1,s=o(i-h,a,0===h),Math.floor(i/a)>2147483647-c)throw RangeError("punycode_overflow(3)");c+=Math.floor(i/a),i%=a,t&&r.splice(i,0,e.charCodeAt(b-1)-65<26),n.splice(i,0,c),i++}var w;if(t)for(i=0,v=n.length;iObject(s.l)(t,["toggleSafeLinkModal","openTelegramLink"]))(({url:e,text:t,className:n,children:u,isRtl:d,toggleSafeLinkModal:o,openTelegramLink:c})=>{const a=u||t,s=e!==a,h=Object(r.m)(t=>t.ctrlKey||t.altKey||t.shiftKey||t.metaKey||!e||!e.match(i.ib)&&!e.match(i.hb)?!s||(o({url:e}),t.preventDefault(),!1):(t.preventDefault(),c({url:e}),!1),[s,c,o,e]);if(!e)return;const m=Object(f.a)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.a.createElement("a",{href:l(e),title:b(e),target:"_blank",rel:"noopener noreferrer",className:m,onClick:h,dir:d?"rtl":"auto"},a)}))},function(e,t,n){"use strict";var r=n(0),u=n(38);t.a=(e,t)=>{const n=Object(u.a)(t);return Object(r.n)(()=>e(n||[]),t)}},function(e,t,n){"use strict";n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"d",(function(){return d})),n.d(t,"a",(function(){return o})),n.d(t,"c",(function(){return c}));function r(e){return e>536870912?(e/1073741824).toFixed(1)+" GB":e>524288?(e/1048576).toFixed(1)+" MB":(e/1024).toFixed(1)+" KB"}function u(e){const{fileName:t,mimeType:n}=e;return d(t,n)}function d(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function o(e){switch(e){case"apk":case"xls":case"xlsx":return"green";case"zip":case"rar":case"7z":case"tar":case"gz":case"ppt":case"pptx":return"orange";case"pdf":case"xps":return"red";default:return"default"}}function c(e){return Boolean(e.previewBlobUrl||e.thumbnail)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return o}));const r={missing_payment_information:{field:"cardNumber",fieldError:"Incorrect card number"},invalid_number:{field:"cardNumber",fieldError:"Incorrect card number"},number:{field:"cardNumber",fieldError:"Incorrect card number"},exp_year:{field:"expiry",fieldError:"Incorrect year"},exp_month:{field:"expiry",fieldError:"Incorrect month"},invalid_expiry_year:{field:"expiry",fieldError:"Incorrect year"},invalid_expiry_month:{field:"expiry",fieldError:"Incorrect month"},cvc:{field:"cvv",fieldError:"Incorrect CVV"},invalid_cvc:{field:"cvv",fieldError:"Incorrect CVV"}};function u(e){const{message:t,code:n,param:u}=e,{field:d,fieldError:o,description:c}=u?r[u]:r[n];return{field:d,fieldError:o,description:c||t}}const d={ADDRESS_STREET_LINE1_INVALID:{field:"streetLine1",fieldError:"Incorrect street address"},ADDRESS_STREET_LINE2_INVALID:{field:"streetLine2",fieldError:"Incorrect street address"},ADDRESS_CITY_INVALID:{field:"city",fieldError:"Incorrect city"},ADDRESS_COUNTRY_INVALID:{field:"countryIso2",fieldError:"Incorrect country"},ADDRESS_POSTCODE_INVALID:{field:"postCode",fieldError:"Incorrect post code"},ADDRESS_STATE_INVALID:{field:"state",fieldError:"Incorrect state"},REQ_INFO_NAME_INVALID:{field:"fullName",fieldError:"Incorrect name"},REQ_INFO_PHONE_INVALID:{field:"phone",fieldError:"Incorrect phone"},REQ_INFO_EMAIL_INVALID:{field:"email",fieldError:"Incorrect email"}};function o(e){return Object.values(e).reduce((e,t)=>{const n=d[t.message];return n&&(e={...e,[n.field]:n.fieldError}),e},{})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"a",(function(){return o}));var r=n(9);let u;function d(e,t){t||(u&&!u.isCancelled&&(u.isCancelled=!0),u=t={isCancelled:!1}),Object(r.b)(()=>{!t.isCancelled&&e()&&d(e,t)})}function o(e){Object(r.b)(()=>{e()&&o(e)})}},function(e,t,n){"use strict";var r=n(0),u=n(53);n(96);t.a=({trigger:e,className:t,children:n,positionX:d="left",positionY:o="top",footer:c})=>{const a=Object(r.q)(null),i=Object(r.q)(null),[s,f]=Object(r.r)(!1);return r.a.createElement("div",{ref:i,className:"DropdownMenu "+(t||""),onKeyDown:e=>{const t=a.current;if(!s||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{f(!s)},isOpen:s}),r.a.createElement(u.a,{ref:a,containerRef:i,isOpen:s,className:t||"",positionX:d,positionY:o,footer:c,autoClose:!0,onClose:()=>{f(!1)}},n))}},function(e,t,n){"use strict";var r=n(0);t.a=(e,t,n,u,d)=>{const[o,c]=Object(r.r)(-1);Object(r.n)(()=>{c(-1);const n=e.current;t&&n&&!d&&(n.tabIndex=-1,n.focus())},[e,t,d]);return Object(r.m)(t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n(o);if(38!==t.keyCode&&40!==t.keyCode)return;const d=document.activeElement,a=Array.from(u?r.querySelectorAll(u):r.children);let i=d&&a.indexOf(d)||o;if(38===t.keyCode&&i>0)i--;else if(40===t.keyCode&&i{if(e.length>24)return!1;if(!Boolean(e.match(u)))return!1;let t=0;for(;r.a.exec(e);)if(t++,t>3)return r.a.lastIndex=0,!1;return t}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return o}));const r=["female_sign","male_sign","medical_symbol"];function u(e){const t=e.split("-").map(e=>parseInt(e,16));return String.fromCodePoint(...t)}function d(e){let t;if(1===e.length)t=e.charCodeAt(0).toString(16).padStart(4,"0");else{const n=[];for(let t=0;t=55296&&e.charCodeAt(t)<=56319?e.charCodeAt(t+1)>=56320&&e.charCodeAt(t+1)<=57343&&n.push(1024*(e.charCodeAt(t)-55296)+(e.charCodeAt(t+1)-56320)+65536):(e.charCodeAt(t)<55296||e.charCodeAt(t)>57343)&&n.push(e.charCodeAt(t));t=n.map(e=>e.toString(16).padStart(4,"0")).join("-")}return t}function o(e){const t={categories:[],emojis:{}};for(let n=0;n{void 0!==e.props[r]&&void 0===t.props[r]&&g(n,r,e.props[r])}),u.forEach(r=>{void 0!==t.props[r]&&e.props[r]!==t.props[r]&&(void 0===e.props[r]?p(n,r,t.props[r]):function(e,t,n,r){"value"===t?e.value=void 0!==r?r:"":(g(e,t,n),p(e,t,r))}(n,r,e.props[r],t.props[r]))})}(t,n,Object(r.b)(t)),n.children=function(e,t,n){if(t.props.teactFastList)return function(e,t,n){const u=new Set(t.children.map(e=>{const t="props"in e&&e.props.key;return d.p&&Object(r.f)(e)&&!t&&console.warn("Missing `key` in `teactFastList`"),t}));let o=0;const c=e.children.reduce((e,r,d)=>{let c="props"in r?r.props.key:void 0;if(c&&!u.has(c))return f(n,r,void 0,t,-1),e;if(!c){const u=t.children[d],o=u&&"props"in u?u.props.key:void 0;if(!u||o)return f(n,r,void 0,t,-1),e;c="__indexKey#"+d}return e[c]={$element:r,index:o++,order:"props"in r?r.props.teactOrderKey:void 0},e},{});let a,i,s=[],l=0;t.children.forEach((e,r)=>{const u="props"in e?e.props.key:"__indexKey#"+r,d=c[u];if(!d)return a||(a=[],i=r),void a.push(e);a&&(s=s.concat(m(a,i,n,t)),i=void 0,a=void 0);const o="props"in e?e.props.teactOrderKey:void 0,b=d.index!==l&&d.order!==o,h=b&&l>d.index;b&&!h||l++,s.push(f(n,d.$element,e,t,r,{forceIndex:!0,...b&&{moveDirection:h?"down":"up"}}))}),a&&(s=s.concat(m(a,i,n,t)));return s}(e,t,n);const u=Math.max(e.children.length,t.children.length),o=[],c=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:c}:void 0);u&&o.push(u)}c&&n.appendChild(c);return o}(t,n,u?e:Object(r.b)(t))}}return n}function l(e,t,n,u){if(!Object(r.d)(e))return e;const{componentInstance:d}=e;if(!d.isMounted){b(e=Object(r.i)(d),t,n,u);const o=e.children[0];Object(r.d)(o)&&(e.children=[l(o,e,0,u)]),d.isMounted=!0}return e}function b(e,t,n,r){const{componentInstance:u}=e;u.onUpdate=()=>{t.children[n]=f(r,t.children[n],u.$element,t,n,{skipComponentUpdate:!0})}}function h(e){if(Object(r.e)(e))return document.createTextNode("");if(Object(r.g)(e))return document.createTextNode(e.value);if(Object(r.d)(e))return h(e.children[0]);const{tag:t,props:n,children:u=[]}=e,d=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=d),Object.keys(n).forEach(e=>{p(d,e,n[e])}),e.children=u.map((t,n)=>f(d,void 0,t,e,n)),d}function m(e,t,n,r){if(1===e.length)return[f(n,void 0,e[0],r,t,{forceIndex:!0})];if(e.length>1){const u=document.createDocumentFragment(),d=e.map(e=>f(n,void 0,e,r,t,{fragment:u}));return n.childNodes[t]?n.insertBefore(u,n.childNodes[t]):n.appendChild(u),d}throw new Error("Unexpected input")}function p(e,t,n){void 0!==n&&("className"===t?e.className=n:"value"===t?e.value=n:"style"===t?e.style.cssText=n:t.startsWith("on")?Object(o.a)(e,t,n):t.startsWith("data-")||a.has(t)?e.setAttribute(t,n):c.has(t)||(e[i[t]||t]=n))}function g(e,t,n){"className"===t?e.className="":"value"===t?e.value="":"style"===t?e.style.cssText="":t.startsWith("on")?Object(o.c)(e,t,n):t.startsWith("data-")||a.has(t)?e.removeAttribute(t):c.has(t)||delete e[i[t]||t]}t.a={render:function(e,t){if(!t)return;let n=t.getAttribute("data-teact-head-id");n||(n=Object(u.a)(s),s[n]={children:[]},t.setAttribute("data-teact-head-id",n));const r=s[n];r.children=[f(t,r.children[0],e,r,0)]}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return h}));var r=n(0),u=n(4),d=n(39),o=n(23),c=n(2),a=n(3),i=n(8),s=n(27);var f=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["openUserInfo"]))(({className:e,sender:t,openUserInfo:n,children:u})=>{const d=Object(r.m)(()=>{t&&n({id:t.id})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("UserLink",e),onClick:d},u):u});var l=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["focusMessage"]))(({className:e,message:t,children:n,focusMessage:u})=>{const d=Object(r.m)(()=>{t&&u({chatId:t.chatId,messageId:t.id})},[u,t]);return t?r.a.createElement(s.a,{className:Object(i.a)("MessageLink",e),onClick:d},n):n});var b=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["openChat"]))(({className:e,chatId:t,openChat:n,children:u})=>{const d=Object(r.m)(()=>{t&&n({id:t})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("ChatLink",e),onClick:d},u):u});function h(e,t,n,c,a,i,s={}){if(!t.content.action)return[];const{text:f}=t.content.action,h=[],g={...s,maxTextLength:16};let y,v=p(f,"%action_origin%",n?!s.isEmbedded&&function(e,t,n){return Object(u.gb)(t)?function(e,t,n){const c=Object(d.a)(Object(u.l)(e,t));if(n)return c;return r.a.createElement(b,{className:"action-link",chatId:t.id},t&&Object(o.a)(c))}(e,t,n):m(t,n)}(e,n,s.asPlain)||" ":"User");return y=v.pop(),h.push(...v),v=p(y,"%target_user%",c?m(c,s.asPlain):"User"),y=v.pop(),h.push(...v),v=p(y,"%message%",a?function(e,t,n={}){const c=Object(u.O)(e,t),{photo:a,video:i,document:s,sticker:f}=Object(u.w)(t),b=c&&!a&&!i&&!s&&!f;let h=Object(d.a)(c,n.maxTextLength);a?h="a photo":i?h=i.isGif?"a GIF":"a video":s?h="a document":f&&(h=`«${c}»`);if(n.asPlain)return b?`«${h}»`:h;if(b)return r.a.createElement("span",null,"«",r.a.createElement(l,{className:"action-link",message:t},Object(o.a)(h)),"»");return r.a.createElement(l,{className:"action-link",message:t},Object(o.a)(h))}(e,a,g):"a message"),y=v.pop(),h.push(...v),v=p(y,"%product%",a?function(e){return e.content&&e.content.invoice?e.content.invoice.title:"a product"}(a):"a product"),y=v.pop(),h.push(...v),v=p(y,"%target_chat%",i?function(e,t){if(t)return"another chat";return r.a.createElement(b,{className:"action-link",chatId:e},"another chat")}(i,s.asPlain):"another chat"),h.push(...v),s.asPlain?h.join("").trim():h}function m(e,t){const n=Object(d.a)(Object(u.ab)(e));return t?n:r.a.createElement(f,{className:"action-link",sender:e},e&&Object(o.a)(n))}function p(e,t,n){const r=e.indexOf(t);if(r<0||!n)return[e];const u=[];return u.push(e.substring(0,r)),u.push(n),u.push(e.substring(r+t.length)),u}},function(e,t){},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"c",(function(){return d})),function(e){e.Bold="MessageEntityBold",e.Blockquote="MessageEntityBlockquote",e.BotCommand="MessageEntityBotCommand",e.Cashtag="MessageEntityCashtag",e.Code="MessageEntityCode",e.Email="MessageEntityEmail",e.Hashtag="MessageEntityHashtag",e.Italic="MessageEntityItalic",e.MentionName="MessageEntityMentionName",e.Mention="MessageEntityMention",e.Phone="MessageEntityPhone",e.Pre="MessageEntityPre",e.Strike="MessageEntityStrike",e.TextUrl="MessageEntityTextUrl",e.Url="MessageEntityUrl",e.Underline="MessageEntityUnderline",e.Unknown="MessageEntityUnknown"}(r||(r={}));const u=-1,d="MESSAGE_DELETED"},function(e,t){},function(e,t,n){"use strict";let r;n.d(t,"a",(function(){return r})),function(e){e[e.DataUri=0]="DataUri",e[e.BlobUrl=1]="BlobUrl",e[e.Lottie=2]="Lottie",e[e.Progressive=3]="Progressive",e[e.Stream=4]="Stream"}(r||(r={}))},function(e,t){},function(e,t){},function(e,t){},function(e,t,n){"use strict";var r=n(0),u=n(2),d=n(3),o=n(6);t.a=Object(u.h)((e,{userId:t})=>({userOrChat:t?Object(o.Gb)(e,t):void 0}),(e,t)=>Object(d.l)(t,["openChat","openChatByUsername"]))(({username:e,userOrChat:t,children:n,openChat:u,openChatByUsername:d})=>r.a.createElement("a",{onClick:()=>{t?u({id:t.id}):e&&d({username:e.substring(1)})},className:"text-entity-link",dir:"auto"},n))},function(e,t,n){"use strict";var r=n(61),u=n(40);let d=!1;const o=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,c=(e,t,n)=>(1-n)*e+n*t,a=Object.keys(u).map(e=>({property:e,colors:[i(u[e][0]),i(u[e][1])]}));function i(e){const t=o.exec(e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16),a:void 0!==t[4]?parseInt(t[4],16):void 0}}function s(e,t,n=1){a.forEach(({property:r,colors:u})=>{const d=Math.round(c(u[e].r,u[t].r,n)),o=Math.round(c(u[e].g,u[t].g,n)),a=Math.round(c(u[e].b,u[t].b,n)),i=void 0!==u[e].a?Math.round(c(u[e].a,u[t].a,n)):void 0;document.documentElement.style.setProperty(r,void 0!==i?`rgba(${d},${o},${a},${i/255})`:`rgb(${d},${o},${a})`)})}t.a=(e,t)=>{const n="dark"===e,u=d&&t,o=n?0:1,c=n?1:0,a=Date.now(),i=document.querySelector('meta[name="theme-color"]');document.documentElement.classList.remove("theme-"+(n?"light":"dark")),d&&document.documentElement.classList.add("no-animations"),document.documentElement.classList.add("theme-"+e),i&&i.setAttribute("content",n?"#212121":"#fff"),setTimeout(()=>{document.documentElement.classList.remove("no-animations")},500),d=!0,u?Object(r.b)(()=>{const e=Math.min((Date.now()-a)/200,1);return s(o,c,function(e){return 1-(1-e)**3.5}(e)),e<1}):s(o,c)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(1);function u(e){"function"==typeof window.navigator.setAppBadge&&window.navigator.setAppBadge(e).catch(e=>{r.p&&console.error(e)})}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(0);function u(e,t,n){Object(r.n)(()=>{const r=e=>{const r=t.current,u=e.target;r&&u&&(r.contains(e.target)&&!u.classList.contains("backdrop")||(e.preventDefault(),e.stopPropagation(),n&&n()))};return e&&n&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}},[e,t,n])}},function(e,t,n){e.exports=function(){return new Worker(n.p+"9edcd954b6ae38f77d64.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"01705582fc3eca0e007b.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"0dbbe0a906f6c2adf071.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"a66075669d8d0ac2d740.worker.js")}},function(e,t,n){"use strict";var r=n(2),u=n(7),d=n(14),o=n(77);Object(r.b)("init",e=>{const{theme:t,animationLevel:n,messageTextSize:r,language:c}=e.settings.byKey;Object(d.c)(c),document.documentElement.style.setProperty("--message-text-size",r+"px"),document.body.classList.add("initial"),document.body.classList.add("animation-level-"+n),document.body.classList.add(u.l?"is-touch-env":"is-pointer-env"),Object(o.a)(t,n>0),u.j&&document.body.classList.add("is-safari"),u.e?document.body.classList.add("is-ios"):u.b&&document.body.classList.add("is-android")}),Object(r.b)("setIsUiReady",(e,t,n)=>{const{uiReadyState:r}=n;return 2===r&&document.body.classList.remove("initial"),{...e,uiReadyState:r}}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return{...e,authPhoneNumber:r}}),Object(r.b)("setAuthRememberMe",(e,t,n)=>({...e,authRememberMe:Boolean(n)})),Object(r.b)("clearAuthError",e=>({...e,authError:void 0}))},function(e,t,n){"use strict";var r=n(2),u=n(1),d=n(10),o=n(29),c=n(12),a=n(78),i=n(19);Object(r.b)("initApi",(e,t)=>{(async()=>{u.E?Object(i.d)():(await Object(i.c)(),Object(i.a)()),Object(d.c)(t.apiUpdate,Object(i.e)())})()}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return Object(d.a)("provideAuthPhoneNumber",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthCode",(e,t,n)=>{const{code:r}=n;return Object(d.a)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthPassword",(e,t,n)=>{const{password:r}=n;return Object(d.a)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("uploadProfilePhoto",(e,t,n)=>{const{file:r}=n;Object(d.a)("uploadProfilePhoto",r)}),Object(r.b)("signUp",(e,t,n)=>{const{firstName:r,lastName:u}=n;return Object(d.a)("provideAuthRegistration",{firstName:r,lastName:u}),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("returnToAuthPhoneNumber",e=>(Object(d.a)("restartAuth"),{...e,authError:void 0})),Object(r.b)("gotToAuthQrCode",e=>(Object(d.a)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0})),Object(r.b)("saveSession",(e,t,n)=>{const{sessionData:r}=n;r?Object(i.f)(n.sessionData,e.currentUserId):Object(i.b)()}),Object(r.b)("signOut",()=>{(async()=>{await Object(o.d)(),await Object(d.a)("destroy"),Object(r.d)().reset()})()}),Object(r.b)("reset",()=>{Object(i.b)(),c.b(u.N),c.b(u.O),c.b(u.P),c.b(u.m);const e=u.F.replace(/\d+$/,""),t=(u.F.match(/\d+$/)||[0])[0];for(let n=0;n{(async()=>{await Object(d.a)("disconnect")})()}),Object(r.b)("loadNearestCountry",e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await Object(d.a)("fetchNearestCountry");Object(r.g)({...Object(r.e)(),authNearestCountry:e})})()}),Object(r.b)("setDeviceToken",(e,t,n)=>{Object(r.g)({...e,push:{deviceToken:n,subscribedAt:Date.now()}})}),Object(r.b)("deleteDeviceToken",e=>{const t={...e};delete t.push,Object(r.g)(t)})},function(e,t){var n,r,u=e.exports={};function d(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function c(e){if(n===setTimeout)return setTimeout(e,0);if((n===d||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:d}catch(e){n=d}try{r="function"==typeof clearTimeout?clearTimeout:o}catch(e){r=o}}();var a,i=[],s=!1,f=-1;function l(){s&&a&&(s=!1,a.length?i=a.concat(i):f=-1,i.length&&b())}function b(){if(!s){var e=c(l);s=!0;for(var t=i.length;t;){for(a=i,i=[];++f1)for(var n=1;n{switch(u.p&&"updateUserStatus"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){Object(d.c)(),Object(c.c)(e.settings.byKey.language)}(e);break;case"updateAuthorizationState":!function(e){let t=Object(r.e)();const n="authorizationStateReady"===t.authState,u=e.authorizationState;switch(Object(r.g)({...t,authState:u,authIsLoading:!1}),t=Object(r.e)(),u){case"authorizationStateLoggingOut":Object(r.g)({...t,isLoggingOut:!0});break;case"authorizationStateWaitCode":Object(r.g)({...t,authIsCodeViaApp:e.isCodeViaApp});break;case"authorizationStateWaitPassword":Object(r.g)({...t,authHint:e.hint});break;case"authorizationStateWaitQrCode":Object(r.g)({...t,authIsLoadingQrCode:!1,authQrCode:e.qrCode});break;case"authorizationStateReady":if(n)break;Object(r.g)({...t,isLoggingOut:!1,lastSyncTime:Date.now()})}}(n);break;case"updateAuthorizationError":!function(e){Object(r.g)({...Object(r.e)(),authError:e.message})}(n);break;case"updateConnectionState":!function(e){const{connectionState:t}=e,n=Object(r.e)();Object(r.g)({...n,connectionState:t}),"connectionStateReady"===t&&"authorizationStateReady"===n.authState?Object(r.d)().sync():"connectionStateBroken"===t&&Object(r.d)().signOut()}(n);break;case"updateSession":!function(e){if(!Object(r.e)().authRememberMe)return;const{sessionData:t}=e;Object(r.d)().saveSession({sessionData:t})}(n);break;case"updateCurrentUser":!function(e){const{currentUser:t}=e;Object(r.g)({...Object(o.nb)(Object(r.e)(),t.id,t),currentUserId:t.id}),function(e){const t=localStorage.getItem(u.nb);if(!t)return;const n=JSON.parse(t);n.id=e,localStorage.setItem(u.nb,JSON.stringify(n))}(t.id)}(n);break;case"error":"SESSION_REVOKED"===n.error.message&&t.signOut(),t.showError({error:n.error})}})},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t);n(22),function(){function e(){var t=Error.call(this,"ServiceWorker is not supported.");return Object.setPrototypeOf(t,e.prototype),t}e.prototype=Object.create(Error.prototype)}();var r=n.p+"serviceWorker.js";var u=n(1),d=n(2),o=n(7),c=n(29);function a(e){const t=e.data;if(!t.type)return;const n=Object(d.d)();switch(t.type){case"focusMessage":n.focusMessage(t.payload)}}function i(){navigator.serviceWorker.removeEventListener("message",a),navigator.serviceWorker.addEventListener("message",a),Object(c.a)()}o.k&&(window.addEventListener("load",async()=>{try{await navigator.serviceWorker.register(r),u.p&&console.log("[SW] ServiceWorker registered"),await navigator.serviceWorker.ready,navigator.serviceWorker.controller?(u.p&&console.log("[SW] ServiceWorker ready"),i()):(u.p&&console.error("[SW] ServiceWorker not available"),Object(d.d)().showError({error:{message:"SERVICE_WORKER_DISABLED"}}))}catch(e){u.p&&console.error("[SW] ServiceWorker registration failed: ",e)}}),window.addEventListener("focus",async()=>{await navigator.serviceWorker.ready,i()}));var s=n(66);const f={isLeftColumnShown:!0,isChatInfoShown:!1,uiReadyState:0,authRememberMe:!0,blocked:{ids:[],totalCount:0},users:{byId:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{}},scheduledMessages:{byChatId:{}},chatFolders:{byId:{},activeChatFolder:0},fileUploads:{byMessageLocalId:{}},recentEmojis:["grinning","kissing_heart","christmas_tree","brain","trophy"],stickers:{setsById:{},added:{},recent:{stickers:[]},favorite:{stickers:[]},featured:{setIds:[]},search:{},forEmoji:{}},emojiKeywords:{},gifs:{saved:{},search:{}},globalSearch:{},localTextSearch:{byChatThreadKey:{}},localMediaSearch:{byChatId:{}},management:{byChatId:{}},topPeers:{},mediaViewer:{},audioPlayer:{},forwardMessages:{},pollResults:{},payment:{},notifications:[],errors:[],activeSessions:[],settings:{byKey:{messageTextSize:u.s,animationLevel:u.d,messageSendKeyCombo:"enter",theme:"light",shouldAutoDownloadMediaFromContacts:!0,shouldAutoDownloadMediaInPrivateChats:!0,shouldAutoDownloadMediaInGroups:!0,shouldAutoDownloadMediaInChannels:!0,shouldAutoPlayGifs:!0,shouldAutoPlayVideos:!0,shouldSuggestStickers:!0,shouldLoopStickers:!0,language:"en"},themes:{light:{isBlurred:!0,patternColor:u.t},dark:{isBlurred:!0,patternColor:u.o}},privacy:{},notifyExceptions:{}},twoFaSettings:{}};var l=n(5),b=n(9),h=n(3),m=n(6);const p=Object(b.g)((function(){Object(b.c)(()=>{if(!g)return;const e=Object(d.e)();if(e.isLoggingOut)return;const t={...f,...Object(h.l)(e,["authState","authPhoneNumber","authRememberMe","authNearestCountry","currentUserId","contactList","topPeers","recentEmojis","emojiKeywords","push"]),isChatInfoShown:v(e),users:w(e),chats:O(e),messages:I(e),globalSearch:{recentlyFoundChatIds:e.globalSearch.recentlyFoundChatIds},settings:j(e),chatFolders:E(e)},n=JSON.stringify(t);localStorage.setItem(u.B,n)})}),1e3,!1);let g=!1;function y(e){if(!u.A){if(localStorage.getItem(u.nb)||localStorage.getItem(u.H))return g=!0,Object(d.a)(p),function(e){u.p&&console.time("global-state-cache-read");const t=localStorage.getItem(u.B),n=t?JSON.parse(t):void 0;u.p&&console.timeEnd("global-state-cache-read");n&&(n.settings.byKey={...e.settings.byKey,...n.settings.byKey},n.settings.themes={...e.settings.themes,...n.settings.themes},n.chatFolders={...e.chatFolders,...n.chatFolders});return{...e,...n}}(e);g=!1}}function v(e){return window.innerWidth>u.ab&&e.isChatInfoShown}function w(e){const{users:{byId:t,selectedId:n}}=e,r=[...(e.chats.listIds.active||[]).slice(0,u.z).filter(e=>e>0),...Object.keys(t)].slice(0,u.C);return{byId:Object(h.l)(t,r),selectedId:window.innerWidth>u.ab?n:void 0}}function O(e){const t=[...(e.chats.listIds.active||[]).slice(0,u.z)],{chatId:n}=Object(m.y)(e)||{};return{...e.chats,byId:Object(h.l)(e.chats.byId,n?[...t,n]:t),listIds:{active:t},isFullyLoaded:{},orderedPinnedIds:{active:e.chats.orderedPinnedIds.active}}}function I(e){const t={},{chatId:n}=Object(m.y)(e)||{};[...(e.chats.listIds.active||[]).slice(0,u.z),...n?[n]:[]].forEach(n=>{const r=e.messages.byChatId[n];if(!r)return;const u=r.threadsById[l.MAIN_THREAD_ID];u&&u.viewportIds&&(t[n]={byId:Object(h.l)(r.byId,u.viewportIds),threadsById:{[l.MAIN_THREAD_ID]:u}})});const r=Object(m.y)(e);return{byChatId:t,messageLists:!r||o.g?void 0:[{...r,threadId:l.MAIN_THREAD_ID,type:"thread"}]}}function j(e){const{byKey:t,themes:n}=e.settings;return{byKey:t,themes:n,privacy:{},notifyExceptions:{}}}function E(e){return{...e.chatFolders,activeChatFolder:0}}u.A||(Object(d.b)("saveSession",()=>{g=!0,Object(d.a)(p)}),Object(d.b)("reset",()=>{g=!1,Object(d.f)(p),localStorage.removeItem(u.B)})),Object(d.b)("init",()=>{const e=Object(h.d)(f),t=y(e)||e,n=Object(m.y)(t)||{};return window.history.replaceState(n,""),t});var C=n(0),S=n(56);const M=String(Date.now()+Math.random());let A;localStorage.setItem("tt-active-tab",M);const k=window.setInterval(()=>{A&&localStorage.getItem("tt-active-tab")!==M&&(A(),clearInterval(k))},2e3);var T=n(34),N=(n(84),n(85),n(87),n(31)),P=n(35),D=n(13);const F=["400 1em Roboto","500 1em Roboto"];function L(){if("fonts"in document)return Promise.all(F.map(e=>document.fonts.load(e)))}var x=n(54),B=n(11),R=n(8),U=(n(89),n.p+"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg"),_=n.p+"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg";function G(){const{listIds:e,byId:t}=Object(d.e)().chats;if(e.active)return Promise.all(e.active.slice(0,10).map(e=>{const n=t[e];if(!n)return;const r=Object(N.d)(n);return r?x.b(r,l.ApiMediaFormat.DataUri):void 0}))}const $={main:()=>Promise.all([Object(B.d)(B.a.Main,"Main").then(L),G()]),authPhoneNumber:()=>Promise.all([L(),Object(D.g)(U)]),authCode:()=>Object(D.g)(_),authPassword:()=>Object(D.g)(_),authQrCode:L};var W=Object(d.h)(e=>{const{theme:t}=e.settings.byKey,{background:n,backgroundColor:r}=e.settings.themes[t]||{};return{uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(n),hasCustomBackgroundColor:Boolean(r),isRightColumnShown:Object(m.W)(e)}},(e,t)=>Object(h.l)(t,["setIsUiReady"]))(({page:e,children:t,hasCustomBackground:n,hasCustomBackgroundColor:r,isRightColumnShown:u,setIsUiReady:d})=>{const[o,c]=Object(T.a)(),{shouldRender:a,transitionClassNames:i}=Object(P.a)(!o,void 0,!0);return Object(C.n)(()=>{let t;return Promise.race([Object(b.e)(700),(async()=>{try{await $[e]()}catch(e){}})()]).then(()=>{c(),d({uiReadyState:1}),t=window.setTimeout(()=>{d({uiReadyState:2})},1e3)}),()=>{t&&(clearTimeout(t),t=void 0),d({uiReadyState:0})}},[]),C.a.createElement("div",{id:"UiLoader"},t,a&&C.a.createElement("div",{className:Object(R.a)("mask",i)},"main"===e?C.a.createElement(C.a.Fragment,null,C.a.createElement("div",{className:"left"}),C.a.createElement("div",{className:Object(R.a)("middle",n&&"custom-bg-image",r&&"custom-bg-color",u&&"with-right-column")}),u&&C.a.createElement("div",{className:"right"})):C.a.createElement("div",{className:"blank"})))}),H=n(18),K=n(32),z=n(46),V=n(45),q=n(16),J=n(52),Y=n(23),Q=n(62),Z=n(42),X=n(21);n(98);const ee=200+u.c;var te=Object(C.h)(({id:e,value:t,isLoading:n,onChange:r})=>{const u=Object(C.q)(null),[d,o]=Object(C.r)(),[c,a]=Object(C.r)(H.a);function i(e){o(e),a(function(e=""){return e.length?H.a.filter(t=>Object(J.a)(t.name,e)):H.a}(e))}const s=Object(C.m)(e=>{const{countryId:t}=e.currentTarget.firstElementChild.dataset,n=H.a.find(e=>e.id===t);n&&r(n),setTimeout(()=>i(void 0),ee)},[r]),f=Object(C.m)(e=>{i(e.currentTarget.value)},[]),l=Object(C.m)(e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===d&&(n.value=""),i(n.value)},[d,t]);return C.a.createElement(Q.a,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:o})=>{const c=()=>{if(o)return;setTimeout(()=>{u.current.select()},50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},a=void 0!==d?d:t&&t.name||"";return C.a.createElement("div",{className:Object(R.a)("input-group",t&&"touched")},C.a.createElement("input",{ref:u,className:Object(R.a)("form-control",o&&"focus"),type:"text",id:e,value:a,autoComplete:"off",onClick:c,onFocus:c,onInput:f,onKeyDown:l}),C.a.createElement("label",null,"Country"),n?C.a.createElement(X.a,{color:"black"}):C.a.createElement("i",{onClick:c,className:Object(R.a)("css-icon-down",o&&"open")}))}},c.map(e=>C.a.createElement(Z.a,{key:e.id,className:t&&e.id===t.id?"selected":"",onClick:s},C.a.createElement("span",{"data-country-id":e.id}),C.a.createElement("span",{className:"country-flag"},Object(Y.a)(e.flag,["hq_emoji"])),C.a.createElement("span",{className:"country-name"},e.name),C.a.createElement("span",{className:"country-code"},e.code))),!c.length&&C.a.createElement(Z.a,{key:"no-results",className:"no-results",disabled:!0},C.a.createElement("span",null,"No countries matched your filter.")))});let ne=!1;var re=Object(C.h)(Object(d.h)(e=>Object(h.l)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),(e,t)=>Object(h.l)(t,["setAuthPhoneNumber","setAuthRememberMe","clearAuthError","loadNearestCountry","gotToAuthQrCode"]))(({connectionState:e,authState:t,authPhoneNumber:n,authIsLoading:r,authIsLoadingQrCode:u,authError:d,authRememberMe:c,authNearestCountry:a,setAuthPhoneNumber:i,setAuthRememberMe:s,loadNearestCountry:f,clearAuthError:l,gotToAuthQrCode:b})=>{const h=Object(C.q)(null),[m,p]=Object(C.r)(),[g,y]=Object(C.r)(),[v,w]=Object(C.r)(!1),[O,I]=Object(C.r)(),j=m?`${m.code} ${g||""}`:g,E=j&&j.replace(/[^\d]+/g,"").length>=7;Object(C.n)(()=>{o.l||h.current.focus()},[m]),Object(C.n)(()=>{"connectionStateReady"!==e||a||f()},[e,a,f]),Object(C.n)(()=>{!a||m||v||p(Object(H.d)(a))},[m,a,v]);const S=Object(C.m)(e=>{const t=Object(H.e)(e),n=!m||t&&t.id!==m.id?t:m;e.length?(!m||n&&n.code!==m.code)&&p(n):p(void 0),y(Object(H.b)(e,n))},[m]);Object(C.n)(()=>{void 0===g&&n&&S(n)},[n,g,S]),Object(C.o)(()=>{h.current&&O&&h.current.setSelectionRange(...O)},[O]);const M=Object(C.m)(e=>{d&&l(),ne||(ne=!0,L(),Object(D.g)(_));const{value:t,selectionStart:n,selectionEnd:r}=e.target;I(n&&r&&r{s(e.target.checked)},[s]);const k="authorizationStateWaitPhoneNumber"===t;return C.a.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},C.a.createElement("div",{className:"auth-form"},C.a.createElement("div",{id:"logo"}),C.a.createElement("h2",null,"Sign in to Telegram"),C.a.createElement("p",{className:"note"},"Please confirm your country and",C.a.createElement("br",null),"enter your phone number."),C.a.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),r||E&&i({phoneNumber:j})}},C.a.createElement(te,{id:"sign-in-phone-code",value:m,isLoading:!a&&!m,onChange:p}),C.a.createElement(V.a,{ref:h,id:"sign-in-phone-number",label:"Phone Number",value:j,error:d,inputMode:"tel",onChange:M}),C.a.createElement(z.a,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(c),onChange:A}),E&&(k?C.a.createElement(K.a,{type:"submit",ripple:!0,isLoading:r},"Next"):C.a.createElement(q.a,null)),k&&C.a.createElement(K.a,{isText:!0,ripple:!0,isLoading:u,onClick:b},"Log in by QR code"))))})),ue=n(17);var de=Object(C.h)(()=>{const e=Object(ue.a)(B.a.Auth,"AuthCode");return e?C.a.createElement(e,null):C.a.createElement(q.a,null)});var oe=Object(C.h)(()=>{const e=Object(ue.a)(B.a.Auth,"AuthPassword");return e?C.a.createElement(e,null):C.a.createElement(q.a,null)});var ce=Object(C.h)(()=>{const e=Object(ue.a)(B.a.Auth,"AuthRegister");return e?C.a.createElement(e,null):C.a.createElement(q.a,null)});var ae=Object(C.h)(()=>{const e=Object(ue.a)(B.a.Auth,"AuthQrCode");return e?C.a.createElement(e,null):C.a.createElement(q.a,null)});n(99);var ie=Object(C.h)(Object(d.h)(e=>Object(h.l)(e,["authState"]),(e,t)=>Object(h.l)(t,["reset","initApi"]))(({authState:e,reset:t,initApi:n})=>{switch(Object(C.n)(()=>{t(),n()},[t,n]),Object(C.n)(()=>{},[]),e){case"authorizationStateWaitCode":return C.a.createElement(W,{page:"authCode",key:"authCode"},C.a.createElement(de,null));case"authorizationStateWaitPassword":return C.a.createElement(W,{page:"authPassword",key:"authPassword"},C.a.createElement(oe,null));case"authorizationStateWaitRegistration":return C.a.createElement(ce,null);case"authorizationStateWaitQrCode":return C.a.createElement(W,{page:"authQrCode",key:"authQrCode"},C.a.createElement(ae,null));case"authorizationStateWaitPhoneNumber":default:return C.a.createElement(W,{page:"authPhoneNumber",key:"authPhoneNumber"},C.a.createElement(re,null))}}));var se=Object(C.h)(()=>{const e=Object(ue.a)(B.a.Main,"Main");return e?C.a.createElement(e,null):void 0}),fe=n.p+"app-inactive.bc7953c2dfebcabce2c43ca7dc778a89.png";n(100);var le=()=>C.a.createElement("div",{id:"AppInactive"},C.a.createElement("div",{className:"content"},C.a.createElement("img",{src:fe,alt:""}),C.a.createElement("h3",{className:"title"},"Such error, many tabs"),C.a.createElement("div",{className:"description"},"Telegram supports only one active tab with the app.",C.a.createElement("br",null),"Please reload this page to continue using this tab or close it."),C.a.createElement("div",{className:"actions"},C.a.createElement(K.a,{isText:!0,ripple:!0,onClick:()=>{window.location.reload()}},"Reload app"))));function be(){return d.c.createElement(W,{page:"main",key:"main"},d.c.createElement(se,null))}var he=Object(d.h)(e=>Object(h.l)(e,["authState"]),(e,t)=>Object(h.l)(t,["disconnect"]))(({authState:e,disconnect:t})=>{const[n,r]=Object(T.a)(!1);if(Object(C.n)(()=>{Object(S.b)(),A=()=>{t(),document.title=`${u.eb}${u.D}`,r()}},[t,r]),n)return d.c.createElement(le,null);if(e)switch(e){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return d.c.createElement(ie,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return be()}return localStorage.getItem(u.nb)||localStorage.getItem(u.H)?be():d.c.createElement(ie,null)});n(101);u.p&&console.log(">>> INIT"),Object(d.d)().init(),u.p&&console.log(">>> START INITIAL RENDER"),s.a.render(d.c.createElement(he,null),document.getElementById("root")),u.p&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",()=>{console.log("GLOBAL STATE",Object(d.e)())})}]); +//# sourceMappingURL=main.30f39d7692fbe2ac267b.js.map \ No newline at end of file diff --git a/dist/main.30f39d7692fbe2ac267b.js.map b/dist/main.30f39d7692fbe2ac267b.js.map new file mode 100644 index 000000000..968281159 --- /dev/null +++ b/dist/main.30f39d7692fbe2ac267b.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/config.ts","webpack:///./src/lib/teact/teactn.tsx","webpack:///./src/util/iteratees.ts","webpack:///./src/modules/helpers/messages.ts","webpack:///./src/modules/helpers/messageMedia.ts","webpack:///./src/modules/helpers/localSearch.ts","webpack:///./src/api/types/index.ts","webpack:///./src/modules/selectors/users.ts","webpack:///./src/modules/selectors/settings.ts","webpack:///./src/modules/selectors/chats.ts","webpack:///./src/modules/selectors/symbols.ts","webpack:///./src/modules/selectors/messages.ts","webpack:///./src/modules/selectors/localSearch.ts","webpack:///./src/modules/selectors/management.ts","webpack:///./src/modules/selectors/ui.ts","webpack:///./src/modules/selectors/globalSearch.ts","webpack:///./src/modules/selectors/payments.ts","webpack:///./src/util/environment.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/util/files.ts","webpack:///./src/assets/lang/en-extra.json","webpack:///./src/assets/lang/es-extra.json","webpack:///./src/assets/lang/it-extra.json","webpack:///./src/assets/lang/pl-extra.json","webpack:///./src/assets/lang/ru-extra.json","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/modules/actions/api/sessions.ts","webpack:///./src/types/index.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/util/arePropsShallowEqual.ts","webpack:///./src/hooks/useLang.ts","webpack:///./src/hooks/useForceUpdate.ts","webpack:///./src/components/ui/Link.tsx","webpack:///./src/util/generateIdFor.ts","webpack:///./src/util/notifications.ts","webpack:///./src/modules/helpers/users.ts","webpack:///./src/modules/helpers/chats.ts","webpack:///./src/components/ui/Button.tsx","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useFlag.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/dateFormat.ts","webpack:///./src/modules/reducers/chats.ts","webpack:///./src/modules/reducers/messages.ts","webpack:///./src/modules/reducers/symbols.ts","webpack:///./src/modules/reducers/users.ts","webpack:///./src/modules/reducers/globalSearch.ts","webpack:///./src/modules/reducers/localSearch.ts","webpack:///./src/modules/reducers/management.ts","webpack:///./src/modules/reducers/settings.ts","webpack:///./src/modules/reducers/twoFaSettings.ts","webpack:///./src/modules/reducers/payments.ts","webpack:///./src/hooks/usePrevious.ts","webpack:///./src/util/trimText.ts","webpack:///./node_modules/idb-keyval/dist/esm/index.js","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/webpToPng.ts","webpack:///./src/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/memo.ts","webpack:///./src/hooks/useOnChange.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/hooks/useEffectWithPrevDeps.ts","webpack:///./src/components/common/helpers/documentInfo.ts","webpack:///./src/modules/helpers/payments.ts","webpack:///./src/util/animation.ts","webpack:///./src/components/ui/DropdownMenu.tsx","webpack:///./src/hooks/useKeyboardListNavigation.ts","webpack:///./src/components/common/helpers/parseEmojiOnlyString.ts","webpack:///./src/util/emoji.ts","webpack:///./src/lib/teact/teact-dom.ts","webpack:///./src/components/common/UserLink.tsx","webpack:///./src/components/common/MessageLink.tsx","webpack:///./src/components/common/ChatLink.tsx","webpack:///./src/components/common/helpers/renderActionMessageText.tsx","webpack:///./src/api/types/messages.ts","webpack:///./src/api/types/media.ts","webpack:///./src/components/middle/message/MentionLink.tsx","webpack:///./src/util/switchTheme.ts","webpack:///./src/util/appBadge.ts","webpack:///./src/hooks/useVirtualBackdrop.ts","webpack:///./src/api/gramjs/worker/worker.ts","webpack:///./node_modules/opus-recorder/dist/decoderWorker.min.js","webpack:///./node_modules/opus-recorder/dist/waveWorker.min.js","webpack:///./src/lib/webp/webp_wasm.worker.js","webpack:///./src/modules/actions/ui/initial.ts","webpack:///./src/modules/actions/api/initial.ts","webpack:///./node_modules/process/browser.js","webpack:///./src/modules/actions/apiUpdaters/initial.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/util/setupServiceWorker.ts","webpack:///./src/global/initial.ts","webpack:///./src/global/cache.ts","webpack:///./src/global/index.ts","webpack:///./src/util/activeTabMonitor.ts","webpack:///./src/util/fonts.ts","webpack:///./src/assets/telegram-logo.svg","webpack:///./src/assets/monkey.svg","webpack:///./src/components/common/UiLoader.tsx","webpack:///./src/components/auth/CountryCodeInput.tsx","webpack:///./src/components/auth/AuthPhoneNumber.tsx","webpack:///./src/components/auth/AuthCode.async.tsx","webpack:///./src/components/auth/AuthPassword.async.tsx","webpack:///./src/components/auth/AuthRegister.async.tsx","webpack:///./src/components/auth/AuthQrCode.async.tsx","webpack:///./src/components/auth/Auth.tsx","webpack:///./src/components/main/Main.async.tsx","webpack:///./src/assets/app-inactive.png","webpack:///./src/components/main/AppInactive.tsx","webpack:///./src/App.tsx","webpack:///./src/index.tsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","2","__webpack_require__","exports","module","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","s","VirtualElementTypesEnum","Fragment","renderingInstance","isEmptyElement","$element","Empty","isTextElement","Text","isTagElement","Tag","isComponentElement","Component","isRealElement","source","props","children","flatten","parsedChildren","componentInstance","isMounted","hooks","state","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","map","buildChildElement","buildTagElement","isEmptyPlaceholder","child","String","DEBUG_components","renderComponent","newRenderedValue","DEBUG_startAt","DEBUG","componentName","renderCount","renderTimes","DEBUG_MORE","log","performance","now","renderTime","warn","Math","round","handleError","renderedValue","newChild","hasElementChanged","$old","$new","unmountTree","forEach","hook","current","cleanup","effect","dependencies","nextValue","setter","forceUpdate","onUpdate","helpGc","unmountComponent","removeAllDelegatedListeners","mountComponent","forceUpdateComponent","currentElement","getTarget","setTarget","useState","initial","newValue","prepareForFrame","throttleWithPrimaryRaf","prepareComponentForFrame","throttleWithRaf","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","exec","some","dependency","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","withDebug","propsRef","renderedRef","getUnequalProps","join","addEventListener","orderBy","values","PAGE_TITLE","INACTIVE_MARKER","APP_NAME","APP_VERSION","process","IS_TEST","DEBUG_ALERT_MSG","SESSION_USER_KEY","LEGACY_SESSION_KEY","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","isBigScreen","Set","innerHeight","MIN_PASSWORD_LENGTH","MESSAGE_LIST_SENSITIVE_AREA","MESSAGE_LIST_SLICE","MESSAGE_LIST_VIEWPORT_LIMIT","CHAT_HEIGHT_PX","CHAT_LIST_SLICE","CHAT_LIST_LOAD_SLICE","SHARED_MEDIA_SLICE","MESSAGE_SEARCH_SLICE","GLOBAL_SEARCH_SLICE","MEMBERS_SLICE","MEMBERS_LOAD_SLICE","PROFILE_SENSITIVE_AREA","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","EDITABLE_INPUT_ID","EDITABLE_INPUT_MODAL_ID","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_ID_BASE","ANIMATION_END_DELAY","STICKER_SIZE_INLINE_DESKTOP_FACTOR","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_AUTH","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_PICKER","STICKER_SIZE_GENERAL_SETTINGS","STICKER_SIZE_PICKER_HEADER","STICKER_SIZE_SEARCH","STICKER_SIZE_MODAL","STICKER_SIZE_TWO_FA","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","MEMOJI_STICKER_ID","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_TEMPLATE","RE_TME_LINK","RE_TME_INVITE_LINK","SERVICE_NOTIFICATIONS_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","LANG_PACKS","TIPS_USERNAME","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","React","currentGlobal","reducers","callbacks","container","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","setGlobal","actions","Number","isNaN","DEBUG_componentName","keys","areMappedPropsChanged","DEBUG_updates","updateTime","Map","runCallbacksThrottled","cb","newGlobal","getGlobal","getDispatch","addReducer","reducer","payload","onDispatch","addCallback","removeCallback","index","indexOf","splice","withGlobal","TeactNContainer","id","generateIdFor","useForceUpdate","delete","set","buildCollectionByKey","collection","reduce","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","filter","has","orderKey","sort","a","b","Array","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","from","compact","Boolean","areSortedArraysEqual","array1","array2","every","item","areSortedArraysIntersecting","findIntersectionWithSet","split","chunkSize","cloneDeep","acc","findLast","predicate","RE_LINK","RegExp","getMessageKey","chatId","parseMessageKey","match","messageId","getMessageOriginalId","previousLocalId","getMessageSummaryText","lang","noEmoji","text","photo","video","audio","voice","sticker","contact","poll","invoice","content","groupedId","isGif","emoji","getMessageAudioCaption","fileName","summary","question","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","entities","link","find","entity","ApiMessageEntityTypes","TextUrl","url","Url","offset","substring","domain","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","action","isServiceNotificationMessage","isMessageLocal","isAnonymousOwnMessage","senderId","getSenderTitle","sender","getUserFullName","getChatTitle","getSendingState","sendingState","isHistoryClearMessage","title","performer","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","base","hasMessageLocalBlobUrl","canMessagePlayVideoInline","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageMediaFilename","date","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","reverseOrder","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","selectUser","global","userId","users","byId","selectNotifySettings","settings","selectNotifyExceptions","notifyExceptions","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","user","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","fullInfo","members","onlineCount","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","includes","list","selectChatListType","folderId","selectChatFolder","chatFolders","selectIsChatPinned","archived","orderedPinnedIds","chatFoldersById","pinnedChatIds","selectChatByUsername","username","usernameLowered","toLowerCase","selectCountNotMutedUnread","activeChatIds","unreadCount","selectIsChatMuted","selectCurrentStickerSearch","stickers","search","selectCurrentGifSearch","gifs","selectStickerSet","setsById","selectStickersForEmoji","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","animatedEmojis","cleanedEmoji","replace","selectEmojiKeywords","language","emojiKeywords","selectCurrentMessageList","messageLists","selectCurrentChat","selectChatMessages","selectScheduledMessages","scheduledMessages","selectThreadParam","thread","selectListedIds","selectOutlyingIds","selectCurrentMessageIds","messageListType","selectViewportIds","selectPinnedIds","selectScheduledIds","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectThreadInfo","selectFirstMessageId","selectThreadOriginChat","threadInfo","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","currentMessageList","selectIsViewportNewest","viewportIds","lastMessageId","selectChatMessage","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","focusedMessage","selectIsMessageFocused","focusedId","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","selectSender","selectForwardedSender","isChannelPost","fromChatId","senderUserId","selectAllowedMessageActions","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","getHasAdminRight","canPin","canUnpin","pinnedMessageIds","canDelete","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","selectUploadProgress","fileTransfer","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","min","Infinity","selectFirstUnreadId","outlyingIds","lastReadId","isNotJoined","found","isFromScheduled","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","isCommonBoxChat","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","fromMessageId","selectMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectShouldAutoLoadMedia","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","isChatGroup","userOrChat","contactList","userIds","selectIsUserOrChatContact","selectShouldAutoPlayMedia","shouldAutoPlayVideos","shouldAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectCurrentTextSearch","chatThreadKey","currentSearch","localTextSearch","byChatThreadKey","isActive","selectCurrentMediaSearchPeerId","localMediaSearch","currentProfileUserId","selectedId","selectCurrentMediaSearch","peerId","selectManagement","management","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_MOBILE_SCREEN","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","StickerSearch","GifSearch","UserInfo","ChatInfo","selectIsRightColumnShown","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_TOUCH_ENV","matchMedia","matches","innerWidth","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","getContext","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","parts","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","args","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","waiting","onIdle","requestIdleCallback","pause","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","isPrimary","requestAnimationFrame","currentCallbacks","currentPrimaryCallbacks","worker","requestStates","requestStatesByCallback","initApi","sessionData","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","Bundles","LOAD_PROMISES","MEMORY_CACHE","async","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","cacheApi","caches","Type","fetch","cacheName","Request","cache","open","Blob","blob","substr","headers","Json","json","save","cacheData","JSON","stringify","Response","put","clear","File","constructor","fileBits","options","rest","super","this","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","charCodeAt","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","race","onseeked","canvas","videoWidth","videoHeight","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","EXTRA_PACK_PATHS","en","enExtraJson","es","esExtraJson","it","itExtraJson","pl","plExtraJson","ru","ruExtraJson","PLURAL_OPTIONS","PLURAL_RULES","ar","ca","de","fa","fr","ko","nl","pt_BR","tr","uk","uz","langPack","runCallbacks","createCallbackManager","currentLangCode","getTranslation","format","cached","langString","template","amount","optionIndex","getPluralOption","trim","processTemplate","formatInteger","setLanguage","langCode","newLangPack","remote","sourceLangPacks","fetchFromCacheOrRemote","pairs","extraLangPack","languages","langInfo","isRtl","rtl","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","noLoad","autoUpdate","formatsCache","defaultPhoneNumberFormat","parsed","str","flag","phoneFormat","formatValue","phoneNumberFormat","phoneNumberGroups","count","repeat","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","startsWith","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","DC_IDS","storeSession","mainDcId","hashes","localStorage","setItem","dcID","dcId","clearStoredSession","removeItem","loadStoredSession","userAuthJson","getItem","userAuth","parse","hash","importLegacySession","sessionId","sessionJson","idb","clearLegacySessions","idbKeys","k","importTestSession","env","TEST_SESSION","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","Spinner","buildClassName","handleErrorEvent","startedAt","isReloading","preventDefault","ErrorEvent","reason","alert","location","reload","APP_ENV","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","renderText","part","filters","params","textParts","divEl","innerText","innerHTML","escapeHtml","EMOJI_REGEX","lastIndex","replaceEmojis","addLineBreaks","highlight","lowerCaseText","queryPosition","nextSymbol","newParts","links","RE_MENTION","nextLink","endsWith","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","entityResult","currentProps","newProps","currentKeys","currentKeysLength","prop","useOnChange","langProvider","setTrigger","trigger","Link","onClick","handleClick","dir","store","random","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","requestPermission","unsubscribeFromPush","dispatch","deviceToken","unsubscribe","deleteDeviceToken","serviceWorkerRegistration","serviceWorker","ready","pushManager","getSubscription","areSettingsLoaded","subscribe","subscribedAt","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","showNewMessageNotification","isActiveChat","replaceSettings","loadNotificationSettings","hasFocus","checkIfShouldNotify","body","messageSender","messageAction","actionTargetMessage","targetUserId","actionTargetUserId","targetChatId","actionTargetChatId","actionTargetUser","privateChatUserId","privateChatUser","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","getNotificationContent","controller","icon","badge","toString","vibrate","notification","onclick","close","focusMessage","focus","notifyClientReady","USER_COLOR_KEYS","getUserFirstOrLastName","firstName","lastName","isDeletedUser","getUserStatus","status","wasOnline","wasOnlineDate","diff","getTime","floor","today","setHours","formatTime","yesterday","setDate","getDate","formatFullDate","sortUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","getChatTypeString","isSelf","getChatDescription","about","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","isChatAdmin","adminRights","currentUserBannedRights","defaultBannedRights","migratedTo","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","getChatSlowModeOptions","slowMode","getChatOrder","max","joinDate","isChatArchived","notifySettings","isMuted","hasPrivateChatsNotifications","hasBroadcastNotifications","hasGroupNotifications","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","bots","contacts","isContact","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","description","pinnedIds","getFolderChatsCount","isChat","chatOrUser","sortChatIds","chatIds","shouldPrioritizeVerified","priority","isVerified","Button","ref","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","handleMouseDown","aria-label","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeEventListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","setValue","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","isClosed","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","isClosing","shouldRender","transitionClassNames","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getHours","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","photos","updateChats","updatedById","addChats","addedById","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalCount","totalChatCount","isFullyLoaded","updateCurrentMessageList","replaceChatMessages","updateMessageStore","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","isLinkedChannelPost","canDeleteCurrentThread","currentThreadId","originalPost","deleteChatScheduledMessages","scheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","updateScheduledMessages","updateFocusedMessage","noHighlight","updateFocusDirection","direction","enterMessageSelectMode","toggleMessageSelection","childMessageIds","withShift","oldSelectedMessages","newMessageIds","newSelectedMessageIds","prevIndex","currentIndex","to","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","updateUser","userUpdate","contactUserIds","updatedUser","updateUsers","addUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","getComplexKey","updateGlobalSearch","searchStatePartial","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","newState","fetchingStatus","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","newSettings","replaceThemeSettings","theme","themes","addNotifyException","notifyException","updateNotifySettings","peerType","isSilent","shouldShowPreviews","hasPrivateChatsMessagePreview","hasGroupMessagePreview","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","usePrevious","next","shouldSkipUndefined","trimText","promisifyRequest","oncomplete","onsuccess","onabort","defaultGetStoreFunc","defaultGetStore","dbName","storeName","indexedDB","onupgradeneeded","createObjectStore","dbp","txMode","db","transaction","objectStore","createStore","customStore","del","eachCursor","openCursor","continue","items","MenuItem","destructive","useLang","handleKeyDown","keyCode","data-char","origin","role","onKeyDown","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","EMPTY_IMAGE_DATA_URI","webpToPng","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","WebpWorker","onmessage","handleLibWebpMessage","label","success","readOnly","placeholder","autoComplete","inputMode","maxLength","onChange","onInput","onKeyPress","onBlur","labelText","htmlFor","subLabel","checked","blocking","onCheck","handleChange","captureEscKeyListener","captureKeyboardListener","onEsc","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","prevDeps","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","DecoderWorker","wavWorker","WavWorker","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","DataUri","Stream","memoryCache","fetchPromises","mediaFormat","onProgress","progressiveUrl","getProgressive","mediaPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","URL","createObjectURL","sourceBuffer","addSourceBuffer","endOfStream","appendBuffer","revokeObjectURL","getFromMemory","cancelProgress","mediaData","fullSize","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","IS_LANDSCAPE","isLandscape","windowSize","updateSizes","handleResize","vh","setProperty","utf16","len","RangeError","adapt","delta","numpoints","firsttime","decode","preserveCase","case_flags","input_length","out","bias","basic","j","ic","oldi","w","digit","lastIndexOf","cp","toUnicode","domain_array","ensureProtocol","getDomain","decodedHref","decodeURI","convertPunycode","toggleSafeLinkModal","openTelegramLink","isNotSafe","ctrlKey","altKey","shiftKey","metaKey","classNames","getFileSizeString","bytes","ONE_GIGABYTE","ONE_MEGABYTE","getDocumentExtension","getFileExtension","getColorFromExtension","extension","STRIPE_ERRORS","missing_payment_information","field","fieldError","invalid_number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","SHIPPING_ERRORS","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","getShippingError","errors","cur","currentInstance","animateSingle","tick","instance","isCancelled","animate","DropdownMenu","dropdownRef","setIsOpen","menu","focusedElement","activeElement","elementChildren","onTrigger","onSelectWithEnter","itemSelector","noCaptureFocus","focusedIndex","setFocusedIndex","querySelectorAll","newIndex","RE_EMOJI_ONLY","twemojiRegex","DETECT_UP_TO","emojiCount","EXCLUDE_EMOJIS","unifiedToNative","unified","codePoints","parseInt","fromCodePoint","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","updateComponent","setupComponentUpdateListener","initComponent","node","createNode","childNodes","insertBefore","replaceChild","areComponents","nextSibling","newKeys","removeAttribute","addAttribute","oldValue","updateAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","$currentChild","newChildKey","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","createDocumentFragment","renderChildren","$firstChild","createTextNode","$child","$fragmentChild","cssText","render","headId","$head","openUserInfo","handleMessageClick","openChat","targetUser","targetMessage","textOptions","maxTextLength","unprocessed","processed","processPlaceholder","isEmbedded","renderChatContent","renderUserContent","renderOriginContent","showQuotes","messageText","renderMessageContent","renderProductContent","renderMigratedContent","replaceValue","placeholderPosition","MESSAGE_DELETED","openChatByUsername","isInitialized","HEX_COLOR_REGEX","lerp","start","end","interpolationRatio","colors","themeColors","hexToRgb","hex","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","transition","updateAppBadge","setAppBadge","contains","animationLevel","messageTextSize","switchTheme","uiReadyState","authPhoneNumber","authRememberMe","authError","apiUpdate","authIsLoading","password","file","authIsLoadingQrCode","reset","langCachePrefix","langCacheVersion","init","connectionState","authNearestCountry","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","run","marker","runClearTimeout","Item","noop","nextTick","arguments","apply","browser","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","binding","cwd","chdir","umask","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","saveSession","onUpdateSession","currentUser","sessionUserAuth","updateSessionUserId","onUpdateCurrentUser","showError","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","handleWorkerMessage","register","INITIAL_STATE","isLeftColumnShown","activeChatFolder","recentEmojis","added","recent","featured","saved","topPeers","audioPlayer","notifications","activeSessions","messageSendKeyCombo","shouldSuggestStickers","light","isBlurred","patternColor","dark","privacy","updateCacheThrottled","isAllowed","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","loadCache","initialState","time","timeEnd","readCache","idsToSave","cid","chatIdsToSave","mainThread","history","replaceState","tabKey","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","mediaLoader","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","background","backgroundColor","hasCustomBackground","hasCustomBackgroundColor","isRightColumnShown","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","safePreload","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","getFilteredList","countryId","firstElementChild","dataset","handleInput","handleInputKeyDown","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","data-country-id","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","clearAuthError","gotToAuthQrCode","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","setSelectionRange","handlePhoneNumberChange","selectionStart","selectionEnd","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","AuthQrCode","AppInactive","appInactivePath","renderMain","disconnect","isInactive","markInactive","TeactDOM"],"mappings":"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","file":"main.30f39d7692fbe2ac267b.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t2: 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".\" + {\"0\":\"21ca60653ccd8108472e\",\"1\":\"6e0d9af6c6bece6b9cdc\",\"3\":\"e4377d3a1cfc9dfc19d1\",\"4\":\"456420358e011b532a42\",\"5\":\"aa91dcb7dfbeffe6a6d4\",\"6\":\"f1076ac830ca341fe8f5\",\"7\":\"9d6fc4de315f7ea02ecf\",\"8\":\"0f335b3262096195e347\",\"9\":\"335be8bec194eb142e9f\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"0\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"21ca60653ccd8108472e\",\"1\":\"6e0d9af6c6bece6b9cdc\",\"3\":\"e4377d3a1cfc9dfc19d1\",\"4\":\"456420358e011b532a42\",\"5\":\"aa91dcb7dfbeffe6a6d4\",\"6\":\"f1076ac830ca341fe8f5\",\"7\":\"9d6fc4de315f7ea02ecf\",\"8\":\"0f335b3262096195e347\",\"9\":\"335be8bec194eb142e9f\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 102);\n","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, onTickEnd, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\nimport { removeAllDelegatedListeners } from './dom-events';\n\nexport type Props = AnyLiteral;\nexport type FC

= (props: P) => any;\nexport type FC_withDebug = FC & {\n DEBUG_contentComponentName?: string;\n};\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n}\n\ninterface VirtualElementEmpty {\n type: VirtualElementTypesEnum.Empty;\n target?: Node;\n}\n\ninterface VirtualElementText {\n type: VirtualElementTypesEnum.Text;\n target?: Node;\n value: string;\n}\n\nexport interface VirtualElementTag {\n type: VirtualElementTypesEnum.Tag;\n target?: Node;\n tag: string;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport interface VirtualElementComponent {\n type: VirtualElementTypesEnum.Component;\n componentInstance: ComponentInstance;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter = (newValue: ((current: T) => T) | T) => void;\n\ninterface ComponentInstance {\n $element: VirtualElementComponent;\n Component: FC;\n name: string;\n props: Props;\n renderedValue?: any;\n isMounted: boolean;\n hooks: {\n state: {\n cursor: number;\n byCursor: {\n value: any;\n nextValue: any;\n setter: StateHookSetter;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n current: any;\n dependencies: any[];\n }[];\n };\n };\n prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement = VirtualElementEmpty | VirtualElementText | VirtualElementTag | VirtualElementComponent;\nexport type VirtualRealElement = VirtualElementTag | VirtualElementComponent;\nexport type VirtualElementChildren = VirtualElement[];\n\nconst Fragment = Symbol('Fragment');\n\nlet renderingInstance: ComponentInstance;\n\nexport function isEmptyElement($element: VirtualElement): $element is VirtualElementEmpty {\n return $element.type === VirtualElementTypesEnum.Empty;\n}\n\nexport function isTextElement($element: VirtualElement): $element is VirtualElementText {\n return $element.type === VirtualElementTypesEnum.Text;\n}\n\nexport function isTagElement($element: VirtualElement): $element is VirtualElementTag {\n return $element.type === VirtualElementTypesEnum.Tag;\n}\n\nexport function isComponentElement($element: VirtualElement): $element is VirtualElementComponent {\n return $element.type === VirtualElementTypesEnum.Component;\n}\n\nexport function isRealElement($element: VirtualElement): $element is VirtualRealElement {\n return isTagElement($element) || isComponentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualRealElement | VirtualElementChildren {\n if (!props) {\n props = {};\n }\n\n children = flatten(children);\n\n if (source === Fragment) {\n return children;\n } else if (typeof source === 'function') {\n return createComponentInstance(source, props, children);\n } else {\n return buildTagElement(source, props, children);\n }\n}\n\nfunction createComponentInstance(Component: FC, props: Props, children: any[]): VirtualElementComponent {\n let parsedChildren: any | any[] | undefined;\n if (children.length === 0) {\n parsedChildren = undefined;\n } else if (children.length === 1) {\n [parsedChildren] = children;\n } else {\n parsedChildren = children;\n }\n\n const componentInstance: ComponentInstance = {\n $element: {} as VirtualElementComponent,\n Component,\n name: Component.name,\n props: {\n ...props,\n ...(parsedChildren && { children: parsedChildren }),\n },\n isMounted: false,\n hooks: {\n state: {\n cursor: 0,\n byCursor: [],\n },\n effects: {\n cursor: 0,\n byCursor: [],\n },\n memos: {\n cursor: 0,\n byCursor: [],\n },\n },\n };\n\n componentInstance.$element = buildComponentElement(componentInstance);\n\n return componentInstance.$element;\n}\n\nfunction buildComponentElement(\n componentInstance: ComponentInstance,\n children: VirtualElementChildren = [],\n): VirtualElementComponent {\n const { props } = componentInstance;\n\n return {\n componentInstance,\n type: VirtualElementTypesEnum.Component,\n props,\n children,\n };\n}\n\nfunction buildTagElement(tag: string, props: Props, children: any[]): VirtualElementTag {\n return {\n type: VirtualElementTypesEnum.Tag,\n tag,\n props,\n children: dropEmptyTail(children).map(buildChildElement),\n };\n}\n\n// We only need placeholders in the middle of collection (to ensure other elements order).\nfunction dropEmptyTail(children: any[]) {\n let i = children.length - 1;\n\n for (; i >= 0; i--) {\n if (!isEmptyPlaceholder(children[i])) {\n break;\n }\n }\n\n return i + 1 < children.length ? children.slice(0, i + 1) : children;\n}\n\nfunction isEmptyPlaceholder(child: any) {\n // eslint-disable-next-line no-null/no-null\n return child === false || child === null || child === undefined;\n}\n\nfunction buildChildElement(child: any): VirtualElement {\n if (isEmptyPlaceholder(child)) {\n return buildEmptyElement();\n } else if (isRealElement(child)) {\n return child;\n } else {\n return buildTextElement(child);\n }\n}\n\nfunction buildTextElement(value: any): VirtualElementText {\n return {\n type: VirtualElementTypesEnum.Text,\n value: String(value),\n };\n}\n\nfunction buildEmptyElement(): VirtualElementEmpty {\n return { type: VirtualElementTypesEnum.Empty };\n}\n\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('COMPONENTS', orderBy(Object.values(DEBUG_components), 'renderCount', 'desc'));\n});\n\nexport function renderComponent(componentInstance: ComponentInstance) {\n renderingInstance = componentInstance;\n componentInstance.hooks.state.cursor = 0;\n componentInstance.hooks.effects.cursor = 0;\n componentInstance.hooks.memos.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n const componentName = componentInstance.name;\n if (!DEBUG_components[componentName]) {\n DEBUG_components[componentName] = {\n componentName,\n renderCount: 0,\n renderTimes: [],\n };\n }\n\n if (DEBUG_MORE) {\n if (componentName !== 'TeactMemoWrapper' && componentName !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Render ${componentName}`);\n }\n }\n\n DEBUG_startAt = performance.now();\n }\n\n newRenderedValue = Component(props);\n\n if (DEBUG) {\n const renderTime = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (renderTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(renderTime)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(renderTime);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err) {\n handleError(err);\n\n newRenderedValue = componentInstance.renderedValue;\n }\n\n if (componentInstance.isMounted && newRenderedValue === componentInstance.renderedValue) {\n return componentInstance.$element;\n }\n\n componentInstance.renderedValue = newRenderedValue;\n\n const newChild = buildChildElement(newRenderedValue);\n componentInstance.$element = buildComponentElement(componentInstance, [newChild]);\n\n return componentInstance.$element;\n}\n\nexport function hasElementChanged($old: VirtualElement, $new: VirtualElement) {\n if (typeof $old !== typeof $new) {\n return true;\n } else if ($old.type !== $new.type) {\n return true;\n } else if (isTextElement($old) && isTextElement($new)) {\n return $old.value !== $new.value;\n } else if (isTagElement($old) && isTagElement($new)) {\n return ($old.tag !== $new.tag) || ($old.props.key !== $new.props.key);\n } else if (isComponentElement($old) && isComponentElement($new)) {\n return (\n $old.componentInstance.Component !== $new.componentInstance.Component\n ) || (\n $old.props.key !== $new.props.key\n );\n }\n\n return false;\n}\n\nexport function unmountTree($element: VirtualElement) {\n if (!isRealElement($element)) {\n return;\n }\n\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n // Trying to help GC\n // eslint-disable-next-line no-null/no-null\n $element.target = null as any;\n }\n\n $element.children.forEach(unmountTree);\n}\n\nexport function mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nfunction unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n // eslint-disable-next-line no-null/no-null\n hook.current = null;\n });\n\n componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We force cleaning as many objects as possible. Not sure this is needed at all.\nfunction helpGc(componentInstance: ComponentInstance) {\n /* eslint-disable no-null/no-null */\n\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = null as any;\n hook.effect = null as any;\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = null as any;\n hook.nextValue = null as any;\n hook.setter = null as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks = null as any;\n componentInstance.$element = null as any;\n componentInstance.Component = null as any;\n componentInstance.props = null as any;\n componentInstance.forceUpdate = null as any;\n componentInstance.onUpdate = null as any;\n\n /* eslint-enable no-null/no-null */\n}\n\nfunction prepareComponentForFrame(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = hook.nextValue;\n });\n\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(() => prepareComponentForFrame(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n\n renderComponent(componentInstance);\n\n if (componentInstance.$element !== currentElement) {\n componentInstance.onUpdate();\n }\n}\n\nexport function getTarget($element: VirtualElement): Node | undefined {\n if (isComponentElement($element)) {\n return getTarget($element.children[0]);\n } else {\n return $element.target;\n }\n}\n\nexport function setTarget($element: VirtualElement, target: Node) {\n if (isComponentElement($element)) {\n setTarget($element.children[0], target);\n } else {\n $element.target = target;\n }\n}\n\nexport function useState(initial?: T): [T, StateHookSetter] {\n const { cursor, byCursor } = renderingInstance.hooks.state;\n\n if (byCursor[cursor] === undefined) {\n byCursor[cursor] = {\n value: initial,\n nextValue: initial,\n setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => {\n if (byCursor[cursor].nextValue !== newValue) {\n byCursor[cursor].nextValue = typeof newValue === 'function'\n ? (newValue as (current: T) => T)(byCursor[cursor].value)\n : newValue;\n\n if (!componentInstance.prepareForFrame || !componentInstance.forceUpdate) {\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(\n () => prepareComponentForFrame(componentInstance),\n );\n componentInstance.forceUpdate = throttleWithRaf(\n () => forceUpdateComponent(componentInstance),\n );\n }\n\n componentInstance.prepareForFrame();\n componentInstance.forceUpdate();\n\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[Teact.useState]',\n componentInstance.name,\n // `componentInstance.Component` may be set to `null` by GC helper\n componentInstance.Component && (componentInstance.Component as FC_withDebug).DEBUG_contentComponentName\n ? `> ${(componentInstance.Component as FC_withDebug).DEBUG_contentComponentName}`\n : '',\n `Forced update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\n }\n }\n })(renderingInstance),\n };\n }\n\n renderingInstance.hooks.state.cursor++;\n\n return [\n byCursor[cursor].value,\n byCursor[cursor].setter,\n ];\n}\n\nfunction useLayoutEffectBase(\n schedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: any[],\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n const exec = () => {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n\n byCursor[cursor].cleanup = effect() as Function;\n };\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n schedulerFn(exec);\n }\n } else {\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor] ? byCursor[cursor].cleanup : undefined,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(fastRaf, effect, dependencies);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(onTickEnd, effect, dependencies);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[]): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { current } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n current = resolver();\n }\n\n byCursor[cursor] = {\n current,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return current;\n}\n\nexport function useCallback(newCallback: F, dependencies: any[]): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies);\n}\n\nexport function useRef(initial: T): { current: T };\nexport function useRef(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef(initial?: T | null) {\n return useMemo(() => ({\n current: initial,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), []);\n}\n\nexport function memo(Component: T, areEqual = arePropsShallowEqual, withDebug = false) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const propsRef = useRef(props);\n const renderedRef = useRef();\n\n if (!renderedRef.current || (propsRef.current && !areEqual(propsRef.current, props))) {\n if (DEBUG && withDebug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name}: Update is caused by:`,\n getUnequalProps(propsRef.current!, props).join(', '),\n );\n }\n\n propsRef.current = props;\n renderedRef.current = createElement(Component, props) as VirtualElementComponent;\n }\n\n return renderedRef.current;\n } as T;\n}\n\n// We need to keep it here for JSX.\nexport default {\n createElement,\n Fragment,\n};\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v4';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 500;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'];\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","import React, {\n FC, FC_withDebug, Props, useEffect, useState,\n} from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { throttleWithRaf } from '../../util/schedulers';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport { GlobalState, GlobalActions, ActionTypes } from '../../global/types';\nimport { handleError } from '../../util/handleError';\n\nexport default React;\n\ntype ActionPayload = AnyLiteral;\n\ntype Reducer = (\n global: GlobalState,\n actions: GlobalActions,\n payload: any,\n) => GlobalState | void;\n\ntype MapStateToProps = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral | null);\ntype MapActionsToProps = ((setGlobal: Function, actions: GlobalActions) => Partial | null);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map;\n mapReducersToProps: MapActionsToProps;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nfunction runCallbacks() {\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nconst runCallbacksThrottled = throttleWithRaf(runCallbacks);\n\nexport function setGlobal(newGlobal?: GlobalState) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n runCallbacksThrottled();\n }\n}\n\nexport function getGlobal() {\n return currentGlobal;\n}\n\nexport function getDispatch() {\n return actions;\n}\n\nfunction onDispatch(name: string, payload?: ActionPayload) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal);\n }\n });\n }\n}\n\nfunction updateContainers() {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const container of containers.values()) {\n const {\n mapStateToProps, mapReducersToProps, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = {\n ...mapStateToProps(currentGlobal, ownProps),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n\n return;\n }\n\n if (DEBUG) {\n if (Object.values(newMappedProps).some(Number.isNaN)) {\n // eslint-disable-next-line no-console\n console.warn(\n // eslint-disable-next-line max-len\n `[TeactN] Some of \\`${container.DEBUG_componentName}\\` mappers contain NaN values. This may cause redundant updates because of incorrect equality check.`,\n );\n }\n }\n\n if (Object.keys(newMappedProps).length && !arePropsShallowEqual(mappedProps!, newMappedProps)) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[TeactN] Will update',\n container.DEBUG_componentName,\n 'caused by',\n getUnequalProps(mappedProps!, newMappedProps).join(', '),\n );\n }\n\n container.mappedProps = newMappedProps;\n container.areMappedPropsChanged = true;\n container.DEBUG_updates++;\n\n forceUpdate();\n }\n }\n\n if (DEBUG) {\n const updateTime = performance.now() - DEBUG_startAt!;\n if (updateTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[TeactN] Slow containers update: ${Math.round(updateTime)} ms`);\n }\n }\n}\n\nexport function addReducer(name: ActionTypes, reducer: Reducer) {\n if (!reducers[name]) {\n reducers[name] = [];\n\n actions[name] = (payload?: ActionPayload) => {\n onDispatch(name, payload);\n };\n }\n\n reducers[name].push(reducer);\n}\n\nexport function addCallback(cb: Function) {\n callbacks.push(cb);\n}\n\nexport function removeCallback(cb: Function) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n}\n\nexport function withGlobal(\n mapStateToProps: MapStateToProps = () => ({}),\n mapReducersToProps: MapActionsToProps = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\n (TeactNContainer as FC_withDebug).DEBUG_contentComponentName = Component.name;\n\n const [id] = useState(generateIdFor(containers));\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n return () => {\n containers.delete(id);\n };\n }, [id]);\n\n let container = containers.get(id);\n if (!container) {\n container = {\n mapStateToProps,\n mapReducersToProps,\n ownProps: props,\n areMappedPropsChanged: false,\n forceUpdate,\n DEBUG_updates: 0,\n DEBUG_componentName: Component.name,\n };\n\n containers.set(id, container);\n }\n\n if (container.areMappedPropsChanged) {\n container.areMappedPropsChanged = false;\n }\n\n if (!container.mappedProps || !arePropsShallowEqual(container.ownProps, props)) {\n container.ownProps = props;\n\n try {\n container.mappedProps = {\n ...mapStateToProps(currentGlobal, props),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ;\n };\n };\n}\n\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL CONTAINERS', orderBy(Object.values(containers), 'DEBUG_updates', 'desc'));\n });\n}\n","type CollectionByKey = Record;\n\ntype OrderDirection = 'asc' | 'desc';\n\ninterface OrderCallback {\n (member: T): any;\n}\n\nexport function buildCollectionByKey(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues(\n byKey: CollectionByKey,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R,\n): CollectionByKey {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick);\n}\n\nexport function pickTruthy(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick);\n}\n\nexport function omit(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy(\n collection: T[],\n orderKey: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n return collection.sort((a, b) => {\n if (Array.isArray(orderKey)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderKey1, orderKey2] = orderKey;\n\n let aValue1;\n let bValue1;\n\n if (typeof orderKey1 === 'function') {\n aValue1 = orderKey1(a) || 0;\n bValue1 = orderKey1(b) || 0;\n } else if (typeof orderKey1 === 'string') {\n aValue1 = a[orderKey1] || 0;\n bValue1 = b[orderKey1] || 0;\n }\n\n if (aValue1 !== bValue1) {\n return mode1 === 'asc' ? aValue1 - bValue1 : bValue1 - aValue1;\n } else {\n let aValue2;\n let bValue2;\n\n if (typeof orderKey2 === 'function') {\n aValue2 = orderKey2(a) || 0;\n bValue2 = orderKey2(b) || 0;\n } else if (typeof orderKey2 === 'string') {\n aValue2 = a[orderKey2] || 0;\n bValue2 = b[orderKey2] || 0;\n }\n\n return mode2 === 'asc' ? aValue2 - bValue2 : bValue2 - aValue2;\n }\n }\n\n let aValue;\n let bValue;\n\n if (typeof orderKey === 'function') {\n aValue = orderKey(a) || 0;\n bValue = orderKey(b) || 0;\n } else if (typeof orderKey === 'string') {\n aValue = a[orderKey] || 0;\n bValue = b[orderKey] || 0;\n }\n\n return mode === 'asc' ? aValue - bValue : bValue - aValue;\n });\n}\n\nexport function flatten(array: any[]) {\n return array.reduce((result, member) => {\n if (Array.isArray(member)) {\n return result.concat(member);\n } else {\n result.push(member);\n return result;\n }\n }, []);\n}\n\nexport function unique(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact(array: any[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet(array: T[], set: Set): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split(array: any[], chunkSize: number) {\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\n/**\n * Returns the index of the last element in the array where predicate is true, and -1 otherwise.\n *\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLast(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\nimport { getUserFullName } from './users';\nimport { getChatTitle } from './chats';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nexport function getMessageKey(message: ApiMessage) {\n const { chatId, id } = message;\n\n return `msg${chatId}-${id}`;\n}\n\nexport function parseMessageKey(key: string) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: Number(match[1]), messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageSummaryText(lang: LangFn, message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n if (message.groupedId) {\n return `${noEmoji ? '' : '🖼 '}${text ? text.text : lang('lng_in_dlg_album')}`;\n }\n\n if (photo) {\n return `${noEmoji ? '' : '🖼 '}${text ? text.text : lang('AttachPhoto')}`;\n }\n\n if (video) {\n return `${noEmoji ? '' : '📹 '}${text ? text.text : lang(video.isGif ? 'AttachGif' : 'AttachVideo')}`;\n }\n\n if (sticker) {\n return `${sticker.emoji} ${lang('AttachSticker')} `;\n }\n\n if (audio) {\n return `${noEmoji ? '' : '🎧 '}${getMessageAudioCaption(message) || lang('AttachMusic')}`;\n }\n\n if (voice) {\n return `${noEmoji ? '' : '🎤 '}${text ? text.text : lang('AttachAudio')}`;\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${text ? text.text : document.fileName}`;\n }\n\n if (contact) {\n return lang('AttachContact');\n }\n\n if (poll) {\n return `${noEmoji ? '' : '📊 '}${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return text.text;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document || contact || poll || webPage || invoice) {\n return undefined;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageCustomShape(message: ApiMessage): boolean | number {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact,\n } = message.content;\n\n if (sticker || (video && video.isRound)) {\n return true;\n }\n\n if (!text || photo || video || audio || voice || document || poll || webPage || contact) {\n return false;\n }\n\n // This is a \"dual-intent\" method used to limit calls of `parseEmojiOnlyString`.\n return parseEmojiOnlyString(text.text) || false;\n}\n\nexport function getMessageSingleEmoji(message: ApiMessage) {\n const { text } = message.content;\n if (!(text && text.text.length <= 6)) {\n return undefined;\n }\n\n if (getMessageCustomShape(message) !== 1) {\n return undefined;\n }\n\n return text.text;\n}\n\nexport function getFirstLinkInMessage(message: ApiMessage) {\n const { text } = message.content;\n\n let match: RegExpMatchArray | null | undefined;\n if (text && text.entities) {\n let link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.TextUrl);\n if (link) {\n match = link.url!.match(RE_LINK);\n }\n\n if (!match) {\n link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url);\n if (link) {\n const { offset, length } = link;\n match = text.text.substring(offset, offset + length).match(RE_LINK);\n }\n }\n }\n\n if (!match && text) {\n match = text.text.match(RE_LINK);\n }\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function matchLinkInMessageText(message: ApiMessage) {\n const { text } = message.content;\n const match = text && text.text.match(RE_LINK);\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function isOwnMessage(message: ApiMessage) {\n return message.isOutgoing;\n}\n\nexport function isReplyMessage(message: ApiMessage) {\n return Boolean(message.replyToMessageId);\n}\n\nexport function isForwardedMessage(message: ApiMessage) {\n return Boolean(message.forwardInfo);\n}\n\nexport function isActionMessage(message: ApiMessage) {\n return !!message.content.action;\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && isMessageLocal(message);\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && message.senderId! < 0 && isOwnMessage(message);\n}\n\nexport function getSenderTitle(lang: LangFn, sender: ApiUser | ApiChat) {\n return sender.id > 0 ? getUserFullName(sender as ApiUser) : getChatTitle(lang, sender as ApiChat);\n}\n\nexport function getSendingState(message: ApiMessage) {\n if (!message.sendingState) {\n return 'succeeded';\n }\n\n return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending';\n}\n\nexport function isMessageLocal(message: ApiMessage) {\n return message.id >= LOCAL_MESSAGE_ID_BASE;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n\nexport function getMessageAudioCaption(message: ApiMessage) {\n const { audio, text } = message.content;\n\n return (audio && [audio.title, audio.performer].filter(Boolean).join(' — ')) || (text && text.text);\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo,\n} from '../../api/types';\n\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, IS_SAFARI } from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\nexport type IDimensions = {\n width: number;\n height: number;\n};\n\ntype Target = 'micro' | 'pictogram' | 'inline' | 'viewerPreview' | 'viewerFull' | 'download';\n\nconst MAX_INLINE_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\n\nexport function getMessageContent(message: ApiMessage) {\n return message.content;\n}\n\nexport function hasMessageMedia(message: ApiMessage) {\n return Boolean((\n getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageContact(message)\n || getMessagePoll(message)\n || getMessageAction(message)\n || getMessageAudio(message)\n || getMessageVoice(message)\n ));\n}\n\nexport function getMessagePhoto(message: ApiMessage) {\n return message.content.photo;\n}\n\nexport function getMessageVideo(message: ApiMessage) {\n return message.content.video;\n}\n\nexport function getMessageRoundVideo(message: ApiMessage) {\n const { video } = message.content;\n\n return video && video.isRound ? video : undefined;\n}\n\nexport function getMessageAction(message: ApiMessage) {\n return message.content.action;\n}\n\nexport function getMessageAudio(message: ApiMessage) {\n return message.content.audio;\n}\n\nexport function getMessageVoice(message: ApiMessage) {\n return message.content.voice;\n}\n\nexport function getMessageSticker(message: ApiMessage) {\n return message.content.sticker;\n}\n\nexport function getMessageDocument(message: ApiMessage) {\n return message.content.document;\n}\n\nexport function getMessageContact(message: ApiMessage) {\n return message.content.contact;\n}\n\nexport function getMessagePoll(message: ApiMessage) {\n return message.content.poll;\n}\n\nexport function getMessageInvoice(message: ApiMessage) {\n return message.content.invoice;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.photo : undefined;\n}\n\nexport function getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n const thumbnail = getMessageMediaThumbnail(message);\n\n return thumbnail ? thumbnail.dataUri : undefined;\n}\n\nexport function getMessageMediaHash(\n message: ApiMessage,\n target: Target,\n) {\n const {\n photo, video, sticker, audio, voice, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n\n if (!(photo || video || sticker || webPagePhoto || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (photo || webPagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=x`;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (video) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n if (canMessagePlayVideoInline(video)) {\n return getVideoOrAudioBaseHash(video, base);\n }\n\n return `${base}?size=z`;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(video, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (sticker) {\n switch (target) {\n case 'micro':\n return undefined;\n case 'pictogram':\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n case 'download':\n return `${base}?download`;\n default:\n return getVideoOrAudioBaseHash(audio, base);\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return base;\n }\n }\n\n return undefined;\n}\n\nfunction getVideoOrAudioBaseHash(media: ApiAudio | ApiVideo, base: string) {\n if (IS_PROGRESSIVE_SUPPORTED && IS_SAFARI) {\n return `${base}?fileSize=${media.size}&mimeType=${media.mimeType}`;\n }\n\n return base;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): Exclude;\nexport function getMessageMediaFormat(message: ApiMessage, target: Target, canBeLottie: true): ApiMediaFormat;\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n sticker, video, audio, voice,\n } = message.content;\n\n if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (video && IS_PROGRESSIVE_SUPPORTED && (\n (target === 'viewerFull') || (target === 'inline' && canMessagePlayVideoInline(video))\n )) {\n return ApiMediaFormat.Progressive;\n } else if (audio || voice) {\n // Safari\n if (voice && !IS_OPUS_SUPPORTED) {\n return ApiMediaFormat.BlobUrl;\n }\n\n return ApiMediaFormat.Progressive;\n }\n\n return ApiMediaFormat.BlobUrl;\n}\n\nexport function getMessageMediaFilename(message: ApiMessage) {\n const { photo, video, webPage } = message.content;\n\n if (photo || (webPage && webPage.photo)) {\n return `photo${message.date}.jpeg`;\n }\n\n if (video) {\n return video.fileName;\n }\n\n return undefined;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo && photo.blobUrl) || (video && video.blobUrl) || (document && document.previewBlobUrl);\n}\n\nexport function canMessagePlayVideoInline(video: ApiVideo): boolean {\n return video.isGif || video.isRound || video.size <= MAX_INLINE_VIDEO_SIZE;\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], reverseOrder = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, 'media');\n\n return reverseOrder ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): IDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'z')\n || photo.sizes.find((size) => size.type === 'y')\n || getPhotoInlineDimensions(photo)\n );\n}\n\nexport function getPhotoInlineDimensions(photo: ApiPhoto): IDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'x')\n || photo.sizes.find((size) => size.type === 'm')\n || photo.sizes.find((size) => size.type === 's')\n || photo.thumbnail\n );\n}\n\nexport function getVideoDimensions(video: ApiVideo): IDimensions | undefined {\n if (video.width && video.height) {\n return video as IDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isDownloadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isDownloadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record, messageIds: number[], contentType: ApiMessageSearchType,\n) {\n let validator: Function;\n\n switch (contentType) {\n case 'media':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessagePhoto(message) || (video && !video.isRound && !video.isGif);\n };\n break;\n\n case 'documents':\n validator = getMessageDocument;\n break;\n\n case 'links':\n validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message);\n break;\n\n case 'audio':\n validator = getMessageAudio;\n break;\n\n default:\n return [] as Array;\n }\n\n return messageIds.reduce((result, messageId) => {\n if (messages[messageId] && validator(messages[messageId])) {\n result.push(messageId);\n }\n\n return result;\n }, [] as Array);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video;\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: number, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","export * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\nexport * from './misc';\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: number): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectUserByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.users.byId).find(\n (user) => user.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectNotifySettings(global: GlobalState) {\n return global.settings.byKey;\n}\n\nexport function selectNotifyExceptions(global: GlobalState) {\n return global.settings.notifyExceptions;\n}\n","import { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isChatPrivate, isHistoryClearMessage, isUserBot, isUserOnline, selectIsChatMuted,\n} from '../helpers';\nimport { selectUser } from './users';\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE } from '../../config';\nimport { selectNotifyExceptions, selectNotifySettings } from './settings';\n\nexport function selectChat(global: GlobalState, chatId: number): ApiChat | undefined {\n return global.chats.byId[chatId];\n}\n\nexport function selectChatUser(global: GlobalState, chat: ApiChat) {\n const userId = getPrivateChatUserId(chat);\n if (!userId) {\n return false;\n }\n\n return selectUser(global, userId);\n}\n\nexport function selectIsChatWithSelf(global: GlobalState, chatId: number) {\n return chatId === global.currentUserId;\n}\n\nexport function selectIsChatWithBot(global: GlobalState, chat: ApiChat) {\n const user = selectChatUser(global, chat);\n return user && isUserBot(user);\n}\n\nexport function selectSupportChat(global: GlobalState) {\n return Object.values(global.chats.byId).find(({ isSupport }: ApiChat) => isSupport);\n}\n\nexport function selectChatOnlineCount(global: GlobalState, chat: ApiChat) {\n if (isChatPrivate(chat.id) || isChatChannel(chat) || !chat.fullInfo) {\n return undefined;\n }\n\n if (!chat.fullInfo.members || chat.fullInfo.members.length === MEMBERS_LOAD_SLICE) {\n return chat.fullInfo.onlineCount;\n }\n\n return chat.fullInfo.members.reduce((onlineCount, { userId }) => {\n if (global.users.byId[userId] && isUserOnline(global.users.byId[userId]) && userId !== global.currentUserId) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const userId = chat && getPrivateChatUserId(chat);\n const user = userId && selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const bot = selectChatBot(global, chatId);\n if (!chat || !bot) {\n return false;\n }\n\n if (chat.lastMessage && isHistoryClearMessage(chat.lastMessage)) {\n return true;\n }\n\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return false;\n }\n\n const { listedIds } = messageInfo.threadsById[MAIN_THREAD_ID] || {};\n return listedIds && !listedIds.length;\n}\n\nexport function selectAreActiveChatsLoaded(global: GlobalState): boolean {\n return Boolean(global.chats.listIds.active);\n}\n\nexport function selectIsChatListed(global: GlobalState, chatId: number, type?: 'active' | 'archived'): boolean {\n const { listIds } = global.chats;\n if (type) {\n const targetList = listIds[type];\n return Boolean(targetList && targetList.includes(chatId));\n }\n\n return Object.values(listIds).some((list) => list && list.includes(chatId));\n}\n\nexport function selectChatListType(global: GlobalState, chatId: number): 'active' | 'archived' | undefined {\n const chat = selectChat(global, chatId);\n if (!chat || !selectIsChatListed(global, chatId)) {\n return undefined;\n }\n\n return chat.folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n}\n\nexport function selectChatFolder(global: GlobalState, folderId: number) {\n return global.chatFolders.byId[folderId];\n}\n\nexport function selectTotalChatCount(global: GlobalState, listType: 'active' | 'archived'): number {\n const { totalCount } = global.chats;\n const allChatsCount = totalCount.all;\n const archivedChatsCount = totalCount.archived || 0;\n\n if (listType === 'archived') {\n return archivedChatsCount;\n }\n\n return allChatsCount ? allChatsCount - archivedChatsCount : 0;\n}\n\nexport function selectIsChatPinned(global: GlobalState, chatId: number, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return !!active && active.includes(chatId);\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return !!archived && archived.includes(chatId);\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return !!pinnedChatIds && pinnedChatIds.includes(chatId);\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectChatByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.chats.byId).find(\n (chat) => chat.username && chat.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectCountNotMutedUnread(global: GlobalState) {\n const activeChatIds = global.chats.listIds.active;\n if (!activeChatIds) {\n return 0;\n }\n\n const chats = global.chats.byId;\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (\n chat\n && chat.unreadCount\n && !selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n ) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker } from '../../api/types';\nimport { LangCode, EmojiKeywords } from '../../types';\n\nexport function selectIsStickerFavorite(global: GlobalState, sticker: ApiSticker) {\n const { stickers } = global.stickers.favorite;\n return stickers && stickers.some(({ id }) => id === sticker.id);\n}\n\nexport function selectCurrentStickerSearch(global: GlobalState) {\n return global.stickers.search;\n}\n\nexport function selectCurrentGifSearch(global: GlobalState) {\n return global.gifs.search;\n}\n\nexport function selectStickerSet(global: GlobalState, id: string) {\n return global.stickers.setsById[id];\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const stickerSets = Object.values(global.stickers.setsById);\n let stickersForEmoji: ApiSticker[] = [];\n stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n const stickers = packs[emoji];\n if (stickers) {\n stickersForEmoji = stickersForEmoji.concat(stickers);\n }\n });\n return stickersForEmoji;\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n const cleanedEmoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectEmojiKeywords(global: GlobalState, language: LangCode): EmojiKeywords | undefined {\n return global.emojiKeywords[language] && global.emojiKeywords[language] !== undefined\n ? global.emojiKeywords[language] as EmojiKeywords\n : undefined;\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport {\n ApiChat,\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isChatPrivate,\n isForwardedMessage,\n getCanPostInChat,\n isUserRightBanned,\n getHasAdminRight,\n isChatBasicGroup,\n isCommonBoxChat,\n isServiceNotificationMessage,\n isOwnMessage,\n isActionMessage,\n isChatGroup,\n isChatSuperGroup,\n getMessageVideo,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\n\nconst MESSAGE_EDIT_ALLOWED_TIME_MS = 172800000; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (messageLists && messageLists.length) {\n return messageLists[messageLists.length - 1];\n }\n\n return undefined;\n}\n\nexport function selectCurrentChat(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n return chatId ? selectChat(global, chatId) : undefined;\n}\n\nexport function selectChatMessages(global: GlobalState, chatId: number) {\n const messages = global.messages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: number) {\n const messages = global.scheduledMessages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectThreadParam(\n global: GlobalState,\n chatId: number,\n threadId: number,\n key: K,\n) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const thread = messageInfo.threadsById[threadId];\n if (!thread) {\n return undefined;\n }\n\n return thread[key];\n}\n\nexport function selectListedIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n switch (messageListType) {\n case 'thread':\n return selectViewportIds(global, chatId, threadId);\n case 'pinned':\n return selectPinnedIds(global, chatId);\n case 'scheduled':\n return selectScheduledIds(global, chatId);\n }\n\n return undefined;\n}\n\nexport function selectViewportIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return selectChat(global, chatId);\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return selectChat(global, threadInfo.originChannelId || chatId);\n}\n\nexport function selectThreadTopMessageId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return undefined;\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return threadInfo.topMessageId;\n}\n\nexport function selectThreadByMessage(global: GlobalState, chatId: number, message: ApiMessage) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const { replyToMessageId, replyToTopMessageId } = message;\n if (!replyToMessageId && !replyToTopMessageId) {\n return undefined;\n }\n\n return Object.values(messageInfo.threadsById).find((thread) => {\n return thread.threadInfo && (\n (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId)\n || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId)\n );\n });\n}\n\nexport function isMessageInCurrentMessageList(global: GlobalState, chatId: number, message: ApiMessage) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return false;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n return (\n chatId === currentMessageList.chatId\n && (\n (currentMessageList.threadId === MAIN_THREAD_ID)\n || (threadInfo && currentMessageList.threadId === threadInfo.threadId)\n )\n );\n}\n\nexport function selectIsViewportNewest(global: GlobalState, chatId: number, threadId: number) {\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!viewportIds || !viewportIds.length) {\n return true;\n }\n\n let lastMessageId: number;\n\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return true;\n }\n\n lastMessageId = chat.lastMessage.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || !threadInfo.lastMessageId) {\n return undefined;\n }\n\n lastMessageId = threadInfo.lastMessageId;\n }\n\n // Edge case: outgoing `lastMessage` is updated with a delay to optimize animation\n if (lastMessageId >= LOCAL_MESSAGE_ID_BASE && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n if (messageListType === 'scheduled') {\n const messageId = selectEditingScheduledId(global, chatId);\n return messageId ? selectScheduledMessage(global, chatId, messageId) : undefined;\n } else {\n const messageId = selectEditingId(global, chatId, threadId);\n return messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n }\n}\n\nexport function selectChatMessageByPollId(global: GlobalState, pollId: string) {\n let messageWithPoll: ApiMessage | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const chatMessages of Object.values(global.messages.byChatId)) {\n const { byId } = chatMessages;\n messageWithPoll = Object.values(byId).find((message) => {\n return message.content.poll && message.content.poll.id === pollId;\n });\n if (messageWithPoll) {\n break;\n }\n }\n\n return messageWithPoll;\n}\n\nexport function selectFocusedMessageId(global: GlobalState, chatId: number) {\n const { chatId: focusedChatId, messageId } = global.focusedMessage || {};\n\n return focusedChatId === chatId ? messageId : undefined;\n}\n\nexport function selectIsMessageFocused(global: GlobalState, message: ApiMessage) {\n const focusedId = selectFocusedMessageId(global, message.chatId);\n\n return focusedId ? focusedId === message.id || focusedId === message.previousLocalId : false;\n}\n\nexport function selectIsMessageUnread(global: GlobalState, message: ApiMessage) {\n const { lastReadOutboxMessageId } = selectChat(global, message.chatId) || {};\n return isMessageLocal(message) || !lastReadOutboxMessageId || lastReadOutboxMessageId < message.id;\n}\n\nexport function selectOutgoingStatus(\n global: GlobalState, message: ApiMessage, isScheduledList = false,\n): ApiMessageOutgoingStatus {\n if (!selectIsMessageUnread(global, message) && !isScheduledList) {\n return 'read';\n }\n\n return getSendingState(message);\n}\n\nexport function selectSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return senderId > 0 ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectForwardedSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { forwardInfo } = message;\n if (!forwardInfo) {\n return undefined;\n }\n\n if (forwardInfo.isChannelPost && forwardInfo.fromChatId) {\n return selectChat(global, forwardInfo.fromChatId);\n } else if (forwardInfo.senderUserId) {\n return selectUser(global, forwardInfo.senderUserId);\n }\n\n return undefined;\n}\n\nexport function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) {\n const chat = selectChat(global, message.chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n const isPrivate = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, message.chatId);\n const isBasicGroup = isChatBasicGroup(chat);\n const isSuperGroup = isChatSuperGroup(chat);\n const isChannel = isChatChannel(chat);\n const isServiceNotification = isServiceNotificationMessage(message);\n\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n const isMessageEditable = (\n (isChatWithSelf || Date.now() - message.date * 1000 < MESSAGE_EDIT_ALLOWED_TIME_MS)\n && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video && content.video.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = getCanPostInChat(chat, threadId) && !isServiceNotification;\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isAction && hasPinPermission;\n let canUnpin = false;\n\n const pinnedMessageIds = selectPinnedIds(global, chat.id);\n\n if (canPin) {\n canUnpin = Boolean(pinnedMessageIds && pinnedMessageIds.includes(message.id));\n canPin = !canUnpin;\n }\n\n const canDelete = isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages');\n\n const canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages')\n ))\n );\n\n const canEdit = !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isAction && !isServiceNotification;\n\n const hasSticker = Boolean(message.content.sticker);\n const hasFavoriteSticker = hasSticker && selectIsStickerFavorite(global, message.content.sticker!);\n const canFaveSticker = !isAction && hasSticker && !hasFavoriteSticker;\n const canUnfaveSticker = !isAction && hasFavoriteSticker;\n const canCopy = !isAction;\n const canCopyLink = !isAction && (isChannel || isSuperGroup);\n const canSelect = !isAction;\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\nexport function selectCanDeleteSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return {};\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return {\n canDelete: messageActions.every((actions) => actions.canDelete),\n canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll),\n };\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n const fileTransfer = global.fileUploads.byMessageLocalId[message.previousLocalId || message.id];\n\n return fileTransfer ? fileTransfer.progress : undefined;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n // `lastReadInboxMessageId` is empty for new chats\n if (!chat.lastReadInboxMessageId) {\n return undefined;\n }\n\n if (!chat.lastMessage) {\n return chat.lastReadInboxMessageId;\n }\n\n if (isMessageLocal(chat.lastMessage)) {\n return chat.lastMessage.id;\n }\n\n // Some previously read messages may be deleted\n return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId);\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n if (!threadInfo.lastReadInboxMessageId) {\n return threadInfo.topMessageId;\n }\n\n // Some previously read messages may be deleted\n return Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId || Infinity);\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: number, threadId: number) {\n const chat = selectChat(global, chatId);\n\n if (threadId === MAIN_THREAD_ID) {\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId) {\n return undefined;\n }\n }\n\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const byId = selectChatMessages(global, chatId);\n if (!byId || !(outlyingIds || listedIds)) {\n return undefined;\n }\n\n const lastReadId = selectRealLastReadId(global, chatId, threadId);\n if (!lastReadId && chat && chat.isNotJoined) {\n return undefined;\n }\n\n if (outlyingIds) {\n const found = !lastReadId ? outlyingIds[0] : outlyingIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = !lastReadId ? listedIds[0] : listedIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nexport function selectIsPollResultsOpen(global: GlobalState) {\n const { pollResults } = global;\n return Boolean(pollResults.messageId);\n}\n\nexport function selectIsForwardModalOpen(global: GlobalState) {\n const { forwardMessages } = global;\n return Boolean(forwardMessages.isModalShown);\n}\n\nexport function selectCommonBoxChatId(global: GlobalState, messageId: number) {\n const fromLastMessage = Object.values(global.chats.byId).find((chat) => (\n isCommonBoxChat(chat) && chat.lastMessage && chat.lastMessage.id === messageId\n ));\n if (fromLastMessage) {\n return fromLastMessage.id;\n }\n\n const { byChatId } = global.messages;\n return Number(Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, Number(chatId));\n return chat && isCommonBoxChat(chat) && byChatId[chat.id].byId[messageId];\n }));\n}\n\nexport function selectIsInSelectMode(global: GlobalState) {\n const { selectedMessages } = global;\n\n return Boolean(selectedMessages);\n}\n\nexport function selectIsMessageSelected(global: GlobalState, messageId: number) {\n const { messageIds } = global.selectedMessages || {};\n if (!messageIds) {\n return false;\n }\n\n return messageIds.includes(messageId);\n}\n\nexport function selectForwardedMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.values(chatMessages)\n .filter((message) => message.groupedId === groupedId && message.forwardInfo)\n .map(({ forwardInfo }) => forwardInfo!.fromMessageId);\n}\n\nexport function selectMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.keys(chatMessages)\n .map(Number)\n .filter((id) => chatMessages[id].groupedId === groupedId);\n}\n\nexport function selectIsDocumentGroupSelected(global: GlobalState, chatId: number, groupedId: string) {\n const { messageIds: selectedIds } = global.selectedMessages || {};\n if (!selectedIds) {\n return false;\n }\n\n const groupIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n return groupIds && groupIds.every((id) => selectedIds.includes(id));\n}\n\nexport function selectSelectedMessagesCount(global: GlobalState) {\n const { messageIds } = global.selectedMessages || {};\n\n return messageIds ? messageIds.length : 0;\n}\n\nexport function selectNewestMessageWithBotKeyboardButtons(\n global: GlobalState, chatId: number,\n): ApiMessage | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (!selectIsChatWithBot(global, chat)) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, MAIN_THREAD_ID);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const messageId = findLast(viewportIds, (id) => {\n return !chatMessages[id].isOutgoing && Boolean(chatMessages[id].keyboardButtons);\n });\n\n const replyHideMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id].shouldHideKeyboardButtons);\n });\n\n if (messageId && replyHideMessageId && replyHideMessageId > messageId) {\n return undefined;\n }\n\n return messageId ? chatMessages[messageId] : undefined;\n}\n\nexport function selectShouldAutoLoadMedia(\n global: GlobalState, message: ApiMessage, chat: ApiChat, sender?: ApiChat | ApiUser,\n) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n } = global.settings.byKey;\n\n return Boolean(\n (shouldAutoDownloadMediaInPrivateChats && isChatPrivate(chat.id))\n || (shouldAutoDownloadMediaInGroups && isChatGroup(chat))\n || (shouldAutoDownloadMediaInChannels && isChatChannel(chat))\n || (shouldAutoDownloadMediaFromContacts && sender && (\n sender.id === global.currentUserId\n || selectIsUserOrChatContact(global, sender)\n )),\n );\n}\n\nexport function selectShouldAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (shouldAutoPlayVideos && !asGif) || (shouldAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n","import { GlobalState } from '../../global/types';\nimport { selectCurrentMessageList } from './messages';\nimport { buildChatThreadKey } from '../helpers';\n\nexport function selectCurrentTextSearch(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const currentSearch = global.localTextSearch.byChatThreadKey[chatThreadKey];\n if (!currentSearch || !currentSearch.isActive) {\n return undefined;\n }\n\n return currentSearch;\n}\n\nexport function selectCurrentMediaSearchPeerId(global: GlobalState) {\n const { byChatId } = global.localMediaSearch;\n const { chatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = global.users.selectedId;\n\n return currentProfileUserId && byChatId[currentProfileUserId] ? currentProfileUserId : chatId;\n}\n\nexport function selectCurrentMediaSearch(global: GlobalState) {\n const peerId = selectCurrentMediaSearchPeerId(global);\n if (!peerId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[peerId];\n}\n","import { GlobalState } from '../../global/types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isChatPrivate } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: number) {\n return global.management.byChatId[chatId];\n}\n\nexport function selectCurrentManagement(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const currentManagement = global.management.byChatId[chatId];\n if (!currentManagement || !currentManagement.isActive) {\n return undefined;\n }\n\n return currentManagement;\n}\n\nexport function selectCurrentManagementType(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n if (isChatPrivate(chatId)) {\n return 'user';\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (isChatGroup(chat)) {\n return 'group';\n }\n\n return 'channel';\n}\n","import { GlobalState } from '../../global/types';\nimport { RightColumnContent } from '../../types';\n\nimport { IS_MOBILE_SCREEN } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectAreActiveChatsLoaded } from './chats';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.messageId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n const {\n users,\n isChatInfoShown,\n } = global;\n\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_MOBILE_SCREEN && selectCurrentTextSearch(global));\n const isManagement = selectCurrentManagement(global);\n const stickerSearch = selectCurrentStickerSearch(global);\n const isStickerSearch = stickerSearch.query !== undefined;\n const gifSearch = selectCurrentGifSearch(global);\n const isGifSearch = gifSearch.query !== undefined;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = users.selectedId;\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n const isUserInfo = Boolean(currentProfileUserId && areActiveChatsLoaded);\n const isChatShown = Boolean(currentChatId && areActiveChatsLoaded);\n const isChatInfo = isChatShown && isChatInfoShown;\n\n return isPollResults ? (\n RightColumnContent.PollResults\n ) : isSearch ? (\n RightColumnContent.Search\n ) : isManagement ? (\n RightColumnContent.Management\n ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isUserInfo ? (\n RightColumnContent.UserInfo\n ) : isChatInfo ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","\nimport { GlobalState } from '../../global/types';\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams ? global.payment.nativeParams.publishableKey : undefined;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n","import {\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n IS_TEST,\n} from '../config';\n\nexport function getPlatform() {\n const { userAgent, platform } = window.navigator;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os: 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'Mac OS';\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS';\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows';\n } else if (/Android/.test(userAgent)) {\n os = 'Android';\n } else if (/Linux/.test(platform)) {\n os = 'Linux';\n }\n\n return os;\n}\n\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'Mac OS';\nexport const IS_IOS = PLATFORM_ENV === 'iOS';\nexport const IS_ANDROID = PLATFORM_ENV === 'Android';\nexport const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_MOBILE_SCREEN = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = (navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n));\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS);\nexport const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator;\n// TODO Consider failed service worker\nexport const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED;\nexport const IS_STREAMING_SUPPORTED = 'MediaSource' in window;\nexport const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus'));\nexport const IS_CANVAS_FILTER_SUPPORTED = (\n !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {})\n);\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\n\nlet isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise {\n return new Promise((resolve) => {\n const webp = new Image();\n // eslint-disable-next-line max-len\n webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n const handleLoadOrError = () => {\n resolve(webp.height === 2);\n };\n webp.onload = handleLoadOrError;\n webp.onerror = handleLoadOrError;\n });\n}\n\ntestWebp().then((hasWebp) => {\n isWebpSupportedCache = hasWebp;\n});\n","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\n};\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n","import Worker from 'worker-loader!./worker';\n\nimport { ApiOnProgress, ApiSessionData, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, ThenArg, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nlet worker: Worker;\nconst requestStates = new Map();\nconst requestStatesByCallback = new Map();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, sessionData?: ApiSessionData) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD WORKER');\n }\n\n worker = new Worker();\n subscribeToWorker(onUpdate);\n }\n\n return makeRequest({\n type: 'initApi',\n args: [sessionData],\n });\n}\n\nexport function callApi(fnName: T, ...args: MethodArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('API is not initialized');\n }\n\n return undefined;\n }\n\n return makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n }) as MethodResponse;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n\n const { messageId } = requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n}\n\nfunction subscribeToWorker(onUpdate: OnApiUpdate) {\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'update') {\n onUpdate(data.update);\n } else if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n const requestState = requestStates.get(data.messageId);\n if (requestState && requestState.callback) {\n requestState.callback(...data.callbackArgs);\n }\n } else if (data.type === 'unhandledError') {\n throw data.error;\n }\n });\n}\n\nfunction makeRequest(message: OriginRequest) {\n const messageId = generateIdFor(requestStates);\n const payload: OriginRequest = {\n messageId,\n ...message,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (typeof payload.args[1] === 'function') {\n const callback = payload.args.pop() as AnyToVoidFunction;\n requestState.callback = callback;\n requestStatesByCallback.set(callback, requestState);\n }\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n\n if (requestState.callback) {\n requestStatesByCallback.delete(requestState.callback);\n }\n });\n\n worker.postMessage(payload);\n\n return promise;\n}\n","import { DEBUG } from '../config';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra\n}\n\ninterface ImportedBundles {\n [Bundles.Auth]: typeof import('../bundles/auth');\n [Bundles.Main]: typeof import('../bundles/main');\n [Bundles.Extra]: typeof import('../bundles/extra');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise\n};\n\nexport type BundleModules = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial = {};\nconst MEMORY_CACHE: Partial = {};\n\nexport async function loadModule>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import('../bundles/auth');\n break;\n case Bundles.Main:\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD MAIN BUNDLE');\n }\n\n LOAD_PROMISES[Bundles.Main] = import('../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import('../bundles/extra');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise).then(handleBundleLoad);\n }\n\n const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B];\n\n if (!MEMORY_CACHE[bundleName]) {\n MEMORY_CACHE[bundleName] = bundle;\n }\n\n return getModuleFromMemory(bundleName, moduleName);\n}\n\nexport function getModuleFromMemory>(bundleName: B, moduleName: M) {\n const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B];\n\n if (!bundle) {\n return undefined;\n }\n\n return bundle[moduleName];\n}\n\nconst listeners: NoneToVoidFunction[] = [];\n\nexport function addLoadListener(listener: NoneToVoidFunction) {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n}\n\nfunction handleBundleLoad() {\n listeners.forEach((listener) => {\n listener();\n });\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n}\n\nexport async function fetch(cacheName: string, key: string, type: Type) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const request = new Request(key);\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.substr(0, 7) === 'sticker') {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n // iOS Safari fails to preserve `type` in cache\n if (!blob.type) {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n return new Blob([blob], { type: contentType });\n }\n }\n\n return blob;\n }\n case Type.Json:\n return await response.json();\n default:\n return undefined;\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n const request = new Request(key);\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function clear(cacheName: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n return await cacheApi.delete(cacheName);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n new Promise((resolve, reject) => {\n video.onseeked = () => {\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","export default __webpack_public_path__ + \"en-extra.e73049da90714ecdae3233e8ffa74d39.json\";","export default __webpack_public_path__ + \"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json\";","export default __webpack_public_path__ + \"it-extra.78e5568451a888818c7e2209e05a9602.json\";","export default __webpack_public_path__ + \"pl-extra.38fd67a6c26e58f5c912568332c7c074.json\";","export default __webpack_public_path__ + \"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json\";","import { ApiLangPack } from '../api/types';\n\nimport { DEBUG, LANG_CACHE_NAME, LANG_PACKS } from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { mapValues } from './iteratees';\n\nimport enExtraJson from '../assets/lang/en-extra.json';\nimport esExtraJson from '../assets/lang/es-extra.json';\nimport itExtraJson from '../assets/lang/it-extra.json';\nimport plExtraJson from '../assets/lang/pl-extra.json';\nimport ruExtraJson from '../assets/lang/ru-extra.json';\nimport { formatInteger } from './textFormat';\nimport { getGlobal } from '../lib/teact/teactn';\n\ninterface LangFn {\n (key: string, value?: any, format?: 'i'): any;\n\n isRtl?: boolean;\n}\n\nconst EXTRA_PACK_PATHS: Record = {\n en: enExtraJson as unknown as string,\n es: esExtraJson as unknown as string,\n it: itExtraJson as unknown as string,\n pl: plExtraJson as unknown as string,\n ru: ruExtraJson as unknown as string,\n};\n\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\nconst PLURAL_RULES = {\n /* eslint-disable max-len */\n en: (n: number) => (n !== 1 ? 6 : 2),\n ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6),\n ca: (n: number) => (n !== 1 ? 6 : 2),\n de: (n: number) => (n !== 1 ? 6 : 2),\n es: (n: number) => (n !== 1 ? 6 : 2),\n fa: (n: number) => (n > 1 ? 6 : 2),\n fr: (n: number) => (n > 1 ? 6 : 2),\n id: () => 0,\n it: (n: number) => (n !== 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nl: (n: number) => (n !== 1 ? 6 : 2),\n pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n pt_BR: (n: number) => (n > 1 ? 6 : 2),\n ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n tr: (n: number) => (n > 1 ? 6 : 2),\n uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n uz: (n: number) => (n > 1 ? 6 : 2),\n /* eslint-enable max-len */\n};\n\nconst cache = new Map();\n\nlet langPack: ApiLangPack;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\n\nexport const getTranslation: LangFn = (key: string, value?: any, format?: 'i') => {\n if (value !== undefined) {\n const cached = cache.get(`${key}_${value}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack) {\n return key;\n }\n\n const langString = langPack[key];\n if (!langString) {\n return key;\n }\n\n const template = langString[typeof value === 'number' ? getPluralOption(value) : 'value'];\n if (!template || !template.trim()) {\n const parts = key.split('.');\n\n return parts[parts.length - 1];\n }\n\n if (value !== undefined) {\n const formattedValue = format === 'i' ? formatInteger(value) : value;\n const result = processTemplate(template, formattedValue);\n cache.set(`${key}_${value}_${format}`, result);\n return result;\n }\n\n return template;\n};\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n const newLangPack = await fetchFromCacheOrRemote(langCode);\n if (!newLangPack) {\n return;\n }\n\n if (EXTRA_PACK_PATHS[langCode]) {\n try {\n const response = await fetch(EXTRA_PACK_PATHS[langCode]);\n const pairs = await response.json();\n const extraLangPack = mapValues(pairs, (value, key) => ({ key, value }));\n\n Object.assign(newLangPack, extraLangPack);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n const { languages } = getGlobal().settings.byKey;\n const langInfo = languages ? languages.find((l) => l.langCode === langCode) : undefined;\n getTranslation.isRtl = Boolean(langInfo && langInfo.rtl);\n\n if (callback) {\n callback();\n }\n\n runCallbacks(langPack);\n}\n\nasync function fetchFromCacheOrRemote(langCode: string): Promise {\n const cached = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (cached) {\n return cached;\n }\n\n const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode });\n if (remote) {\n await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack);\n return remote.langPack;\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const optionIndex = currentLangCode && PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n return template.replace(/%\\d?\\$?[sdf@]/, String(value));\n}\n","export function createCallbackManager() {\n const callbacks: AnyToVoidFunction[] = [];\n\n function addCallback(cb: AnyToVoidFunction) {\n callbacks.push(cb);\n\n return () => {\n removeCallback(cb);\n };\n }\n\n function removeCallback(cb: AnyToVoidFunction) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n\n function runCallbacks(...args: any[]) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n };\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 2c193ce 28.05.2021\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n// eslint-disable-next-line max-len\nexport default /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\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]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91])|(?:\\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]|[\\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\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black';\n};\n\nconst Loading: FC = ({ color = 'blue' }) => {\n return (\n

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

Sign in to Telegram

\n

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

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

Such error, many tabs

\n
\n Telegram supports only one active tab with the app.\n
\n Please reload this page to continue using this tab or close it.\n
\n
\n \n
\n
\n
\n );\n};\n\nexport default AppInactive;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from './global/types';\n\nimport {\n LEGACY_SESSION_KEY, INACTIVE_MARKER, SESSION_USER_KEY, PAGE_TITLE,\n} from './config';\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport useFlag from './hooks/useFlag';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\nimport AppInactive from './components/main/AppInactive';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst App: FC = ({ authState, disconnect }) => {\n const [isInactive, markInactive] = useFlag(false);\n\n useEffect(() => {\n updateSizes();\n addActiveTabChangeListener(() => {\n disconnect();\n document.title = `${PAGE_TITLE}${INACTIVE_MARKER}`;\n\n markInactive();\n });\n }, [disconnect, markInactive]);\n\n // return ;\n\n if (isInactive) {\n return ;\n }\n\n if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n case 'authorizationStateWaitCode':\n case 'authorizationStateWaitPassword':\n case 'authorizationStateWaitRegistration':\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n return renderMain();\n }\n }\n\n const hasSession = localStorage.getItem(SESSION_USER_KEY) || localStorage.getItem(LEGACY_SESSION_KEY);\n\n return hasSession ? renderMain() : ;\n};\n\nfunction renderMain() {\n return (\n \n
\n \n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (setGlobal, actions): DispatchProps => pick(actions, ['disconnect']),\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React, { getDispatch, getGlobal } from './lib/teact/teactn';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport './global';\n\nimport { DEBUG } from './config';\n\nimport App from './App';\n\nimport './styles/index.scss';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> INIT');\n}\n\ngetDispatch().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nTeactDOM.render(\n ,\n document.getElementById('root'),\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL STATE', getGlobal());\n});\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/report.html b/dist/report.html index 810d4ad97..58e73e837 100644 --- a/dist/report.html +++ b/dist/report.html @@ -3,7 +3,7 @@ - telegram-t [17 Jun 2021 at 13:45] + telegram-t [18 Jun 2021 at 00:59] diff --git a/src/index-perf.html b/src/index-perf.html deleted file mode 100644 index d9bfa072b..000000000 --- a/src/index-perf.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - Telegram - - - -
- - - - - diff --git a/src/index-perf.tsx b/src/index-perf.tsx deleted file mode 100644 index e520f48e4..000000000 --- a/src/index-perf.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, { getGlobal, setGlobal } from './lib/teact/teactn'; -import TeactDOM from './lib/teact/teact-dom'; -// import './store'; - -import { Bundles, loadModule } from './util/moduleLoader'; - -import App from './App'; - -import './styles/index.scss'; - -function renderApp() { - return TeactDOM.render( - , - document.getElementById('root'), - ); -} - -function renderNothing() { - TeactDOM.render( -
, - document.getElementById('root'), - ); -} - -function preloadMainBundle() { - return loadModule(Bundles.Main, 'Main'); -} - -// getDispatch().init(); -// renderApp(); - -(window as any).perf = { - getGlobal, - setGlobal, - renderApp, - renderNothing, - preloadMainBundle, -};